From babdf102730557452e966ee96253d564f4c6ac21 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 22 Dec 2024 13:26:41 +0200 Subject: [PATCH 001/146] Bump version to 2.9.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3e2698acc..225e8bf2f 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: '2.9.0' + majorVersion: '2.9.1' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 166f87ae6861d8cadbc9caf61e76d90616aee765 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 10 Oct 2024 21:15:27 +0300 Subject: [PATCH 002/146] Include exception message in LidarrAPI failure message (cherry picked from commit 1e89a1a3cb8fa83e4415b047513cbecacbebc59c) Closes #5176 --- frontend/src/Search/AddNewItem.js | 4 +++- src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/src/Search/AddNewItem.js b/frontend/src/Search/AddNewItem.js index 5ec065149..e335ef4c2 100644 --- a/frontend/src/Search/AddNewItem.js +++ b/frontend/src/Search/AddNewItem.js @@ -1,5 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import Alert from 'Components/Alert'; import TextInput from 'Components/Form/TextInput'; import Icon from 'Components/Icon'; import Button from 'Components/Link/Button'; @@ -130,7 +131,8 @@ class AddNewItem extends Component {
{translate('FailedLoadingSearchResults')}
-
{getErrorMessage(error)}
+ + {getErrorMessage(error)} : null } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 726c383f6..a197e0e18 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -228,17 +228,17 @@ namespace NzbDrone.Core.MetadataSource.SkyHook catch (HttpException ex) { _logger.Warn(ex); - throw new SkyHookException("Search for '{0}' failed. Unable to communicate with LidarrAPI.", ex, title); + throw new SkyHookException("Search for '{0}' failed. Unable to communicate with LidarrAPI. {1}", ex, title, ex.Message); } catch (WebException ex) { _logger.Warn(ex); - throw new SkyHookException("Search for '{0}' failed. Unable to communicate with LidarrAPI.", ex, title, ex.Message); + throw new SkyHookException("Search for '{0}' failed. Unable to communicate with LidarrAPI. {1}", ex, title, ex.Message); } catch (Exception ex) { - _logger.Warn(ex, ex.Message); - throw new SkyHookException("Search for '{0}' failed. Invalid response received from LidarrAPI.", ex, title); + _logger.Warn(ex); + throw new SkyHookException("Search for '{0}' failed. Invalid response received from LidarrAPI. {1}", ex, title, ex.Message); } } From 7255126af5559cd00aa25d946af4be93387196f5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 15 Nov 2024 04:59:25 +0200 Subject: [PATCH 003/146] New: Labels support for Transmission 4.0 (cherry picked from commit 675e3cd38a14ea33c27f2d66a4be2bf802e17d88) --- .../TransmissionTests/TransmissionFixture.cs | 10 +- .../TransmissionFixtureBase.cs | 5 +- .../Clients/Transmission/Transmission.cs | 48 ++++++- .../Clients/Transmission/TransmissionBase.cs | 62 ++++++--- .../Clients/Transmission/TransmissionProxy.cs | 123 +++++++++++++----- .../Transmission/TransmissionSettings.cs | 12 +- .../Transmission/TransmissionTorrent.cs | 4 + .../Download/Clients/Vuze/Vuze.cs | 5 +- 8 files changed, 201 insertions(+), 68 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs index 47e916a32..d7028e611 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs @@ -13,6 +13,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests [TestFixture] public class TransmissionFixture : TransmissionFixtureBase { + [SetUp] + public void Setup_Transmission() + { + Mocker.GetMock() + .Setup(v => v.GetClientVersion(It.IsAny(), It.IsAny())) + .Returns("4.0.6"); + } + [Test] public void queued_item_should_have_required_properties() { @@ -272,7 +280,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests public void should_only_check_version_number(string version) { Mocker.GetMock() - .Setup(s => s.GetClientVersion(It.IsAny())) + .Setup(s => s.GetClientVersion(It.IsAny(), true)) .Returns(version); Subject.Test().IsValid.Should().BeTrue(); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs index 5b1b5aac0..a11375d98 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixtureBase.cs @@ -29,7 +29,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests Host = "127.0.0.1", Port = 2222, Username = "admin", - Password = "pass" + Password = "pass", + MusicCategory = "" }; Subject.Definition = new DownloadClientDefinition(); @@ -152,7 +153,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } Mocker.GetMock() - .Setup(s => s.GetTorrents(It.IsAny())) + .Setup(s => s.GetTorrents(null, It.IsAny())) .Returns(torrents); } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs index bf4dd8c29..88fdb0f41 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/Transmission.cs @@ -1,8 +1,10 @@ using System; +using System.Linq; using System.Text.RegularExpressions; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Core.Blocklisting; using NzbDrone.Core.Configuration; @@ -13,6 +15,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission { public class Transmission : TransmissionBase { + public override string Name => "Transmission"; + public override bool SupportsLabels => HasClientVersion(4, 0); + public Transmission(ITransmissionProxy proxy, ITorrentFileInfoReader torrentFileInfoReader, IHttpClient httpClient, @@ -25,9 +30,48 @@ namespace NzbDrone.Core.Download.Clients.Transmission { } + public override void MarkItemAsImported(DownloadClientItem downloadClientItem) + { + if (!SupportsLabels) + { + throw new NotSupportedException($"{Name} does not support marking items as imported"); + } + + // set post-import category + if (Settings.MusicImportedCategory.IsNotNullOrWhiteSpace() && + Settings.MusicImportedCategory != Settings.MusicCategory) + { + var hash = downloadClientItem.DownloadId.ToLowerInvariant(); + var torrent = _proxy.GetTorrents(new[] { hash }, Settings).FirstOrDefault(); + + if (torrent == null) + { + _logger.Warn("Could not find torrent with hash \"{0}\" in Transmission.", hash); + return; + } + + try + { + var labels = torrent.Labels.ToHashSet(StringComparer.InvariantCultureIgnoreCase); + labels.Add(Settings.MusicImportedCategory); + + if (Settings.MusicCategory.IsNotNullOrWhiteSpace()) + { + labels.Remove(Settings.MusicCategory); + } + + _proxy.SetTorrentLabels(hash, labels, Settings); + } + catch (DownloadClientException ex) + { + _logger.Warn(ex, "Failed to set post-import torrent label \"{0}\" for {1} in Transmission.", Settings.MusicImportedCategory, downloadClientItem.Title); + } + } + } + protected override ValidationFailure ValidateVersion() { - var versionString = _proxy.GetClientVersion(Settings); + var versionString = _proxy.GetClientVersion(Settings, true); _logger.Debug("Transmission version information: {0}", versionString); @@ -41,7 +85,5 @@ namespace NzbDrone.Core.Download.Clients.Transmission return null; } - - public override string Name => "Transmission"; } } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index 9a9c95e6f..2dc9dd14e 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; @@ -17,6 +18,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission { public abstract class TransmissionBase : TorrentClientBase { + public abstract bool SupportsLabels { get; } + protected readonly ITransmissionProxy _proxy; public TransmissionBase(ITransmissionProxy proxy, @@ -35,7 +38,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission public override IEnumerable GetItems() { var configFunc = new Lazy(() => _proxy.GetConfig(Settings)); - var torrents = _proxy.GetTorrents(Settings); + var torrents = _proxy.GetTorrents(null, Settings); var items = new List(); @@ -43,36 +46,45 @@ namespace NzbDrone.Core.Download.Clients.Transmission { var outputPath = new OsPath(torrent.DownloadDir); - if (Settings.MusicDirectory.IsNotNullOrWhiteSpace()) + if (Settings.MusicCategory.IsNotNullOrWhiteSpace() && SupportsLabels && torrent.Labels is { Count: > 0 }) { - if (!new OsPath(Settings.MusicDirectory).Contains(outputPath)) + if (!torrent.Labels.Contains(Settings.MusicCategory, StringComparer.InvariantCultureIgnoreCase)) { continue; } } - else if (Settings.MusicCategory.IsNotNullOrWhiteSpace()) + else { - var directories = outputPath.FullPath.Split('\\', '/'); - if (!directories.Contains(Settings.MusicCategory)) + if (Settings.MusicDirectory.IsNotNullOrWhiteSpace()) { - continue; + if (!new OsPath(Settings.MusicDirectory).Contains(outputPath)) + { + continue; + } + } + else if (Settings.MusicCategory.IsNotNullOrWhiteSpace()) + { + var directories = outputPath.FullPath.Split('\\', '/'); + if (!directories.Contains(Settings.MusicCategory)) + { + continue; + } } } outputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, outputPath); - var item = new DownloadClientItem(); - item.DownloadId = torrent.HashString.ToUpper(); - item.Category = Settings.MusicCategory; - item.Title = torrent.Name; - - item.DownloadClientInfo = DownloadClientItemClientInfo.FromDownloadClient(this, false); - - item.OutputPath = GetOutputPath(outputPath, torrent); - item.TotalSize = torrent.TotalSize; - item.RemainingSize = torrent.LeftUntilDone; - item.SeedRatio = torrent.DownloadedEver <= 0 ? 0 : - (double)torrent.UploadedEver / torrent.DownloadedEver; + var item = new DownloadClientItem + { + DownloadId = torrent.HashString.ToUpper(), + Category = Settings.MusicCategory, + Title = torrent.Name, + DownloadClientInfo = DownloadClientItemClientInfo.FromDownloadClient(this, Settings.MusicImportedCategory.IsNotNullOrWhiteSpace() && SupportsLabels), + OutputPath = GetOutputPath(outputPath, torrent), + TotalSize = torrent.TotalSize, + RemainingSize = torrent.LeftUntilDone, + SeedRatio = torrent.DownloadedEver <= 0 ? 0 : (double)torrent.UploadedEver / torrent.DownloadedEver + }; if (torrent.Eta >= 0) { @@ -297,7 +309,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission { try { - _proxy.GetTorrents(Settings); + _proxy.GetTorrents(null, Settings); } catch (Exception ex) { @@ -307,5 +319,15 @@ namespace NzbDrone.Core.Download.Clients.Transmission return null; } + + protected bool HasClientVersion(int major, int minor) + { + var rawVersion = _proxy.GetClientVersion(Settings); + + var versionResult = Regex.Match(rawVersion, @"(?= new Version(major, minor); + } } } diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs index 2c2334f44..f9a5054be 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; +using System.Collections.ObjectModel; +using System.Linq; using System.Net; using Newtonsoft.Json.Linq; using NLog; @@ -12,15 +15,16 @@ namespace NzbDrone.Core.Download.Clients.Transmission { public interface ITransmissionProxy { - List GetTorrents(TransmissionSettings settings); + IReadOnlyCollection GetTorrents(IReadOnlyCollection hashStrings, TransmissionSettings settings); void AddTorrentFromUrl(string torrentUrl, string downloadDirectory, TransmissionSettings settings); void AddTorrentFromData(byte[] torrentData, string downloadDirectory, TransmissionSettings settings); void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, TransmissionSettings settings); TransmissionConfig GetConfig(TransmissionSettings settings); string GetProtocolVersion(TransmissionSettings settings); - string GetClientVersion(TransmissionSettings settings); + string GetClientVersion(TransmissionSettings settings, bool force = false); void RemoveTorrent(string hash, bool removeData, TransmissionSettings settings); void MoveTorrentToTopInQueue(string hashString, TransmissionSettings settings); + void SetTorrentLabels(string hash, IEnumerable labels, TransmissionSettings settings); } public class TransmissionProxy : ITransmissionProxy @@ -28,50 +32,66 @@ namespace NzbDrone.Core.Download.Clients.Transmission private readonly IHttpClient _httpClient; private readonly Logger _logger; - private ICached _authSessionIDCache; + private readonly ICached _authSessionIdCache; + private readonly ICached _versionCache; public TransmissionProxy(ICacheManager cacheManager, IHttpClient httpClient, Logger logger) { _httpClient = httpClient; _logger = logger; - _authSessionIDCache = cacheManager.GetCache(GetType(), "authSessionID"); + _authSessionIdCache = cacheManager.GetCache(GetType(), "authSessionID"); + _versionCache = cacheManager.GetCache(GetType(), "versions"); } - public List GetTorrents(TransmissionSettings settings) + public IReadOnlyCollection GetTorrents(IReadOnlyCollection hashStrings, TransmissionSettings settings) { - var result = GetTorrentStatus(settings); + var result = GetTorrentStatus(hashStrings, settings); - var torrents = ((JArray)result.Arguments["torrents"]).ToObject>(); + var torrents = ((JArray)result.Arguments["torrents"]).ToObject>(); return torrents; } public void AddTorrentFromUrl(string torrentUrl, string downloadDirectory, TransmissionSettings settings) { - var arguments = new Dictionary(); - arguments.Add("filename", torrentUrl); - arguments.Add("paused", settings.AddPaused); + var arguments = new Dictionary + { + { "filename", torrentUrl }, + { "paused", settings.AddPaused } + }; if (!downloadDirectory.IsNullOrWhiteSpace()) { arguments.Add("download-dir", downloadDirectory); } + if (settings.MusicCategory.IsNotNullOrWhiteSpace()) + { + arguments.Add("labels", new List { settings.MusicCategory }); + } + ProcessRequest("torrent-add", arguments, settings); } public void AddTorrentFromData(byte[] torrentData, string downloadDirectory, TransmissionSettings settings) { - var arguments = new Dictionary(); - arguments.Add("metainfo", Convert.ToBase64String(torrentData)); - arguments.Add("paused", settings.AddPaused); + var arguments = new Dictionary + { + { "metainfo", Convert.ToBase64String(torrentData) }, + { "paused", settings.AddPaused } + }; if (!downloadDirectory.IsNullOrWhiteSpace()) { arguments.Add("download-dir", downloadDirectory); } + if (settings.MusicCategory.IsNotNullOrWhiteSpace()) + { + arguments.Add("labels", new List { settings.MusicCategory }); + } + ProcessRequest("torrent-add", arguments, settings); } @@ -82,8 +102,10 @@ namespace NzbDrone.Core.Download.Clients.Transmission return; } - var arguments = new Dictionary(); - arguments.Add("ids", new[] { hash }); + var arguments = new Dictionary + { + { "ids", new List { hash } } + }; if (seedConfiguration.Ratio != null) { @@ -97,6 +119,12 @@ namespace NzbDrone.Core.Download.Clients.Transmission arguments.Add("seedIdleMode", 1); } + // Avoid extraneous request if no limits are to be set + if (arguments.All(arg => arg.Key == "ids")) + { + return; + } + ProcessRequest("torrent-set", arguments, settings); } @@ -107,11 +135,16 @@ namespace NzbDrone.Core.Download.Clients.Transmission return config.RpcVersion; } - public string GetClientVersion(TransmissionSettings settings) + public string GetClientVersion(TransmissionSettings settings, bool force = false) { - var config = GetConfig(settings); + var cacheKey = $"version:{$"{GetBaseUrl(settings)}:{settings.Password}".SHA256Hash()}"; - return config.Version; + if (force) + { + _versionCache.Remove(cacheKey); + } + + return _versionCache.Get(cacheKey, () => GetConfig(settings).Version, TimeSpan.FromHours(6)); } public TransmissionConfig GetConfig(TransmissionSettings settings) @@ -124,21 +157,36 @@ namespace NzbDrone.Core.Download.Clients.Transmission public void RemoveTorrent(string hashString, bool removeData, TransmissionSettings settings) { - var arguments = new Dictionary(); - arguments.Add("ids", new string[] { hashString }); - arguments.Add("delete-local-data", removeData); + var arguments = new Dictionary + { + { "ids", new List { hashString } }, + { "delete-local-data", removeData } + }; ProcessRequest("torrent-remove", arguments, settings); } public void MoveTorrentToTopInQueue(string hashString, TransmissionSettings settings) { - var arguments = new Dictionary(); - arguments.Add("ids", new string[] { hashString }); + var arguments = new Dictionary + { + { "ids", new List { hashString } } + }; ProcessRequest("queue-move-top", arguments, settings); } + public void SetTorrentLabels(string hash, IEnumerable labels, TransmissionSettings settings) + { + var arguments = new Dictionary + { + { "ids", new List { hash } }, + { "labels", labels.ToImmutableHashSet() } + }; + + ProcessRequest("torrent-set", arguments, settings); + } + private TransmissionResponse GetSessionVariables(TransmissionSettings settings) { // Retrieve transmission information such as the default download directory, bandwidth throttling and seed ratio. @@ -150,14 +198,9 @@ namespace NzbDrone.Core.Download.Clients.Transmission return ProcessRequest("session-stats", null, settings); } - private TransmissionResponse GetTorrentStatus(TransmissionSettings settings) - { - return GetTorrentStatus(null, settings); - } - private TransmissionResponse GetTorrentStatus(IEnumerable hashStrings, TransmissionSettings settings) { - var fields = new string[] + var fields = new List { "id", "hashString", // Unique torrent ID. Use this instead of the client id? @@ -177,11 +220,14 @@ namespace NzbDrone.Core.Download.Clients.Transmission "seedRatioMode", "seedIdleLimit", "seedIdleMode", - "fileCount" + "fileCount", + "labels" }; - var arguments = new Dictionary(); - arguments.Add("fields", fields); + var arguments = new Dictionary + { + { "fields", fields } + }; if (hashStrings != null) { @@ -193,9 +239,14 @@ namespace NzbDrone.Core.Download.Clients.Transmission return result; } + private string GetBaseUrl(TransmissionSettings settings) + { + return HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase); + } + private HttpRequestBuilder BuildRequest(TransmissionSettings settings) { - var requestBuilder = new HttpRequestBuilder(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase) + var requestBuilder = new HttpRequestBuilder(GetBaseUrl(settings)) .Resource("rpc") .Accept(HttpAccept.Json); @@ -210,11 +261,11 @@ namespace NzbDrone.Core.Download.Clients.Transmission { var authKey = string.Format("{0}:{1}", requestBuilder.BaseUrl, settings.Password); - var sessionId = _authSessionIDCache.Find(authKey); + var sessionId = _authSessionIdCache.Find(authKey); if (sessionId == null || reauthenticate) { - _authSessionIDCache.Remove(authKey); + _authSessionIdCache.Remove(authKey); var authLoginRequest = BuildRequest(settings).Build(); authLoginRequest.SuppressHttpError = true; @@ -242,7 +293,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission _logger.Debug("Transmission authentication succeeded."); - _authSessionIDCache.Set(authKey, sessionId); + _authSessionIdCache.Set(authKey, sessionId); } requestBuilder.SetHeader("X-Transmission-Session-Id", sessionId); diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index 0ff781998..49293822d 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -33,6 +33,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission Host = "localhost"; Port = 9091; UrlBase = "/transmission/"; + MusicCategory = "lidarr"; } [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)] @@ -56,16 +57,19 @@ namespace NzbDrone.Core.Download.Clients.Transmission [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional. Creates a [category] subdirectory in the output directory.")] public string MusicCategory { get; set; } - [FieldDefinition(7, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] + [FieldDefinition(7, Label = "PostImportCategory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsPostImportCategoryHelpText")] + public string MusicImportedCategory { get; set; } + + [FieldDefinition(8, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] public string MusicDirectory { get; set; } - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(9, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] public int RecentMusicPriority { get; set; } - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(10, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] public int OlderMusicPriority { get; set; } - [FieldDefinition(10, Label = "Add Paused", Type = FieldType.Checkbox)] + [FieldDefinition(11, Label = "Add Paused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs index 9e97b94bc..2bd9f14c9 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs @@ -1,3 +1,6 @@ +using System; +using System.Collections.Generic; + namespace NzbDrone.Core.Download.Clients.Transmission { public class TransmissionTorrent @@ -9,6 +12,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission public long TotalSize { get; set; } public long LeftUntilDone { get; set; } public bool IsFinished { get; set; } + public IReadOnlyCollection Labels { get; set; } = Array.Empty(); public long Eta { get; set; } public TransmissionTorrentStatus Status { get; set; } public long SecondsDownloading { get; set; } diff --git a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs index 5ee5d6206..9f5897495 100644 --- a/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs +++ b/src/NzbDrone.Core/Download/Clients/Vuze/Vuze.cs @@ -14,6 +14,9 @@ namespace NzbDrone.Core.Download.Clients.Vuze { private const int MINIMUM_SUPPORTED_PROTOCOL_VERSION = 14; + public override string Name => "Vuze"; + public override bool SupportsLabels => false; + public Vuze(ITransmissionProxy proxy, ITorrentFileInfoReader torrentFileInfoReader, IHttpClient httpClient, @@ -65,7 +68,5 @@ namespace NzbDrone.Core.Download.Clients.Vuze return null; } - - public override string Name => "Vuze"; } } From 25a80aa29d90758fe7c3498224dc89419b95f0e1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 27 Nov 2024 23:55:50 +0200 Subject: [PATCH 004/146] Avoid default category on existing Transmission configurations Co-authored-by: Mark McDowall (cherry picked from commit bd656ae7f66fc9224ef2a57857152ee5d54d54f8) --- .../Clients/Transmission/TransmissionSettings.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index 49293822d..55fffe9cd 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -1,3 +1,4 @@ +using System.Text.Json.Serialization; using System.Text.RegularExpressions; using FluentValidation; using NzbDrone.Common.Extensions; @@ -28,6 +29,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission { private static readonly TransmissionSettingsValidator Validator = new TransmissionSettingsValidator(); + // This constructor is used when creating a new instance, such as the user adding a new Transmission client. public TransmissionSettings() { Host = "localhost"; @@ -36,6 +38,18 @@ namespace NzbDrone.Core.Download.Clients.Transmission MusicCategory = "lidarr"; } + // TODO: Remove this in v3 + // This constructor is used when deserializing from JSON, it will set the + // category to the deserialized value, defaulting to null. + [JsonConstructor] + public TransmissionSettings(string musicCategory = null) + { + Host = "localhost"; + Port = 9091; + UrlBase = "/transmission/"; + MusicCategory = musicCategory; + } + [FieldDefinition(0, Label = "Host", Type = FieldType.Textbox)] public string Host { get; set; } From 1a40839202a98e9b1356bb5ea1076e149fbc7d44 Mon Sep 17 00:00:00 2001 From: Mika <1054229+mikabytes@users.noreply.github.com> Date: Sun, 5 May 2024 03:53:47 +0200 Subject: [PATCH 005/146] Add file-count for Transmission RPC (cherry picked from commit 23c741fd001582fa363c2723eff9facd3091618b) --- .../Download/Clients/Transmission/TransmissionProxy.cs | 1 + .../Download/Clients/Transmission/TransmissionTorrent.cs | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs index f9a5054be..d728a60a1 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs @@ -221,6 +221,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission "seedIdleLimit", "seedIdleMode", "fileCount", + "file-count", "labels" }; diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs index 2bd9f14c9..687bab40b 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Newtonsoft.Json; namespace NzbDrone.Core.Download.Clients.Transmission { @@ -24,6 +25,12 @@ namespace NzbDrone.Core.Download.Clients.Transmission public int SeedRatioMode { get; set; } public long SeedIdleLimit { get; set; } public int SeedIdleMode { get; set; } - public int FileCount { get; set; } + public int FileCount => TransmissionFileCount ?? VuzeFileCount ?? 0; + + [JsonProperty(PropertyName = "file-count")] + public int? TransmissionFileCount { get; set; } + + [JsonProperty(PropertyName = "fileCount")] + public int? VuzeFileCount { get; set; } } } From 47e504fbc9a097ecbad9037a0e6c71c2e49b49ee Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 22 Dec 2024 17:06:32 +0200 Subject: [PATCH 006/146] Add translations for some download client settings --- src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs | 6 +++--- .../Clients/FreeboxDownload/FreeboxDownloadSettings.cs | 4 ++-- .../Download/Clients/NzbVortex/NzbVortexSettings.cs | 4 ++-- src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs | 4 ++-- .../Download/Clients/QBittorrent/QBittorrentSettings.cs | 6 +++--- .../Download/Clients/Sabnzbd/SabnzbdSettings.cs | 4 ++-- .../Download/Clients/Transmission/TransmissionSettings.cs | 4 ++-- .../Download/Clients/rTorrent/RTorrentSettings.cs | 6 +++--- .../Download/Clients/uTorrent/UTorrentSettings.cs | 6 +++--- src/NzbDrone.Core/Localization/Core/en.json | 6 ++++++ 10 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs index 058654854..57a752907 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs @@ -47,13 +47,13 @@ namespace NzbDrone.Core.Download.Clients.Deluge [FieldDefinition(5, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(6, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Lidarr to set after it has imported the download. Lidarr will not remove torrents in that category even if seeding finished. Leave blank to keep same category.")] + [FieldDefinition(6, Label = "PostImportCategory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsPostImportCategoryHelpText")] public string MusicImportedCategory { get; set; } - [FieldDefinition(7, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(7, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(8, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(8, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(DelugePriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox)] diff --git a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs index 431183092..1fc40b6dc 100644 --- a/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/FreeboxDownload/FreeboxDownloadSettings.cs @@ -70,10 +70,10 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload [FieldDefinition(7, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated non-Lidarr downloads (will create a [category] subdirectory in the output directory)")] public string Category { get; set; } - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "Priority to use when grabbing albums that released within the last 14 days")] + [FieldDefinition(8, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentPriority { get; set; } - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "Priority to use when grabbing albums that released over 14 days ago")] + [FieldDefinition(9, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(FreeboxDownloadPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderPriority { get; set; } [FieldDefinition(10, Label = "Add Paused", Type = FieldType.Checkbox)] diff --git a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs index d993b829f..b02380e5f 100644 --- a/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/NzbVortex/NzbVortexSettings.cs @@ -51,10 +51,10 @@ namespace NzbDrone.Core.Download.Clients.NzbVortex [FieldDefinition(4, Label = "Group", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(5, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(5, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(6, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(6, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(NzbVortexPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs index 2b815d8a5..713379d57 100644 --- a/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Nzbget/NzbgetSettings.cs @@ -57,10 +57,10 @@ namespace NzbDrone.Core.Download.Clients.Nzbget [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(7, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(7, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(8, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(8, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(NzbgetPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox, HelpText = "This option requires at least NzbGet version 16.0")] diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs index fa2f37453..c2881508a 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentSettings.cs @@ -51,13 +51,13 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(7, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Lidarr to set after it has imported the download. Lidarr will not remove torrents in that category even if seeding finished. Leave blank to keep same category.")] + [FieldDefinition(7, Label = "PostImportCategory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsPostImportCategoryHelpText")] public string MusicImportedCategory { get; set; } - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(8, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(9, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(QBittorrentPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(10, Label = "Initial State", Type = FieldType.Select, SelectOptions = typeof(QBittorrentState), HelpText = "Initial state for torrents added to qBittorrent")] diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs index 285ea7389..6f5573557 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdSettings.cs @@ -69,10 +69,10 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd [FieldDefinition(7, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(8, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(9, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(SabnzbdPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } public NzbDroneValidationResult Validate() diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs index 55fffe9cd..7532acfa1 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionSettings.cs @@ -77,10 +77,10 @@ namespace NzbDrone.Core.Download.Clients.Transmission [FieldDefinition(8, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default Transmission location")] public string MusicDirectory { get; set; } - [FieldDefinition(9, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(9, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(10, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(10, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(TransmissionPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(11, Label = "Add Paused", Type = FieldType.Checkbox)] diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs index 0e1c40212..aeaee3fa9 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs @@ -52,16 +52,16 @@ namespace NzbDrone.Core.Download.Clients.RTorrent [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated non-Lidarr downloads. Using a category is optional, but strongly recommended.")] public string MusicCategory { get; set; } - [FieldDefinition(7, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Lidarr to set after it has imported the download. Lidarr will not remove torrents in that category even if seeding finished. Leave blank to keep same category.")] + [FieldDefinition(7, Label = "PostImportCategory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsPostImportCategoryHelpText")] public string MusicImportedCategory { get; set; } [FieldDefinition(8, Label = "Directory", Type = FieldType.Textbox, Advanced = true, HelpText = "Optional location to put downloads in, leave blank to use the default rTorrent location")] public string MusicDirectory { get; set; } - [FieldDefinition(9, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(9, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(10, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(10, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(RTorrentPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(11, Label = "Add Stopped", Type = FieldType.Checkbox, HelpText = "Enabling will add torrents and magnets to rTorrent in a stopped state. This may break magnet files.")] diff --git a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs index ef1f9d4da..0bc82e6ad 100644 --- a/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/uTorrent/UTorrentSettings.cs @@ -49,13 +49,13 @@ namespace NzbDrone.Core.Download.Clients.UTorrent [FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Lidarr avoids conflicts with unrelated downloads, but it's optional")] public string MusicCategory { get; set; } - [FieldDefinition(7, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Lidarr to set after it has imported the download. Lidarr will not remove torrents in that category even if seeding finished. Leave blank to keep same category.")] + [FieldDefinition(7, Label = "PostImportCategory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientSettingsPostImportCategoryHelpText")] public string MusicImportedCategory { get; set; } - [FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "Priority to use when grabbing albums released within the last 14 days")] + [FieldDefinition(8, Label = "DownloadClientSettingsRecentPriority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "DownloadClientSettingsRecentPriorityAlbumHelpText")] public int RecentMusicPriority { get; set; } - [FieldDefinition(9, Label = "Older Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "Priority to use when grabbing albums released over 14 days ago")] + [FieldDefinition(9, Label = "DownloadClientSettingsOlderPriority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "DownloadClientSettingsOlderPriorityAlbumHelpText")] public int OlderMusicPriority { get; set; } [FieldDefinition(10, Label = "Initial State", Type = FieldType.Select, SelectOptions = typeof(UTorrentState), HelpText = "Initial state for torrents added to uTorrent")] diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 1c3ec897b..06cfeefcc 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -388,6 +388,11 @@ "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)", "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {0} is set to remove completed downloads. This can result in downloads being removed from your client before {1} can import them.", "DownloadClientSettings": "Download Client Settings", + "DownloadClientSettingsOlderPriority": "Older Priority", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Priority to use when grabbing albums released over 14 days ago", + "DownloadClientSettingsPostImportCategoryHelpText": "Category for {appName} to set after it has imported the download. {appName} will not remove torrents in that category even if seeding finished. Leave blank to keep same category.", + "DownloadClientSettingsRecentPriority": "Recent Priority", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Priority to use when grabbing albums released within the last 14 days", "DownloadClientSortingCheckMessage": "Download client {0} has {1} sorting enabled for {appName}'s category. You should disable sorting in your download client to avoid import issues.", "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", @@ -890,6 +895,7 @@ "Playlist": "Playlist", "Port": "Port", "PortNumber": "Port Number", + "PostImportCategory": "Post-Import Category", "PosterOptions": "Poster Options", "PosterSize": "Poster Size", "Posters": "Posters", From e6388cab94d8e69f0a32cf5b36c863fce1f0f877 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 21 Dec 2024 13:40:50 +0000 Subject: [PATCH 007/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: Tommy Au Co-authored-by: Weblate Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_TW/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ar.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/bg.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/ca.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/cs.json | 3 ++- src/NzbDrone.Core/Localization/Core/da.json | 12 ++++++++++- src/NzbDrone.Core/Localization/Core/de.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/el.json | 3 ++- src/NzbDrone.Core/Localization/Core/es.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/fi.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/fr.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/he.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/hi.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/hr.json | 3 ++- src/NzbDrone.Core/Localization/Core/hu.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/id.json | 3 ++- src/NzbDrone.Core/Localization/Core/is.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/it.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/ja.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/ko.json | 4 +++- src/NzbDrone.Core/Localization/Core/nl.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/pl.json | 3 ++- src/NzbDrone.Core/Localization/Core/pt.json | 7 ++++++- .../Localization/Core/pt_BR.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/ro.json | 3 ++- src/NzbDrone.Core/Localization/Core/ru.json | 8 ++++++- src/NzbDrone.Core/Localization/Core/sv.json | 3 ++- src/NzbDrone.Core/Localization/Core/th.json | 3 ++- src/NzbDrone.Core/Localization/Core/tr.json | 21 ++++++++++--------- src/NzbDrone.Core/Localization/Core/uk.json | 7 ++++++- src/NzbDrone.Core/Localization/Core/vi.json | 3 ++- .../Localization/Core/zh_CN.json | 3 ++- .../Localization/Core/zh_TW.json | 14 +++++++++++-- 32 files changed, 166 insertions(+), 42 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 4efd0bcee..46cca04dd 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -753,5 +753,10 @@ "EditReleaseProfile": "تحرير ملف تعريف التأخير", "AddReleaseProfile": "تحرير ملف تعريف التأخير", "Season": "السبب", - "AddDelayProfileError": "غير قادر على إضافة ملف تعريف جودة جديد ، يرجى المحاولة مرة أخرى." + "AddDelayProfileError": "غير قادر على إضافة ملف تعريف جودة جديد ، يرجى المحاولة مرة أخرى.", + "Max": "ماكس", + "Min": "دقيقة", + "Preferred": "يفضل", + "Today": "اليوم", + "MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index f8feea85f..b43fc0d6f 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -753,5 +753,10 @@ "AddReleaseProfile": "Редактиране на профил за забавяне", "UnmappedFiles": "Немапирани папки", "Season": "Причина", - "AddDelayProfileError": "Не може да се добави нов качествен профил, моля, опитайте отново." + "AddDelayProfileError": "Не може да се добави нов качествен профил, моля, опитайте отново.", + "Max": "Макс", + "Min": "Мин", + "Preferred": "Предпочитан", + "Today": "Днес", + "MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 42dce3dc6..371445055 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -964,5 +964,10 @@ "AddArtistWithName": "Afegeix {artistName}", "AddNewAlbumSearchForNewAlbum": "Inicia la cerca de nous àlbums", "AddMissing": "Afegeix faltants", - "AddNewAlbum": "Afegeix nou àlbum" + "AddNewAlbum": "Afegeix nou àlbum", + "Max": "Màx", + "Min": "Min", + "Preferred": "Preferit", + "Today": "Avui", + "MappedNetworkDrivesWindowsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 065a121b3..37c9442fc 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -887,5 +887,6 @@ "Max": "Max", "Min": "Min", "Preferred": "Upřednostňováno", - "Today": "Dnes" + "Today": "Dnes", + "MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v častých dotazech" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index a557dd20a..be5a06f3b 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -787,5 +787,15 @@ "AddDelayProfileError": "Kan ikke tilføje en ny forsinkelsesprofil. Prøv igen.", "RegularExpressionsCanBeTested": "Regulære udtryk kan testes [her]({url}).", "AddToDownloadQueue": "Føj til downloadkø", - "AddedToDownloadQueue": "Føjet til downloadkø" + "AddedToDownloadQueue": "Føjet til downloadkø", + "Artist": "kunstner", + "Max": "Maks.", + "Preferred": "Foretrukket", + "AutoTaggingSpecificationTag": "Etiket", + "TBA": "Afventer", + "MappedNetworkDrivesWindowsService": "Tilsluttede netværksdrev er ikke tilgængelige, når programmet kører som en Windows-tjeneste. Se FAQ'en ({url}) for mere information.", + "Today": "I dag", + "Episode": "afsnit", + "MetadataProfile": "metadataprofil", + "Min": "Min" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index d36ac9047..462fd39f1 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -1281,5 +1281,10 @@ "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-Pfad, wird verwendet, um Serienpfade zu ändern, wenn {serviceName} den Bibliothekspfad anders sieht als {appName} (benötigt 'Bibliothek aktualisieren')", "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-Pfad, wird verwendet, um Serienpfade zu ändern, wenn {serviceName} den Bibliothekspfad anders sieht als {appName} (benötigt 'Bibliothek aktualisieren')", "DashOrSpaceDashDependingOnName": "Dash oder Space Dash je nach Name", - "NotificationsEmbySettingsUpdateLibraryHelpText": "Bibliothek bei Import, Umbenennung oder Löschung aktualisieren" + "NotificationsEmbySettingsUpdateLibraryHelpText": "Bibliothek bei Import, Umbenennung oder Löschung aktualisieren", + "Preferred": "Bevorzugt", + "Max": "Max", + "Min": "Min", + "Today": "Heute", + "MappedNetworkDrivesWindowsService": "Zugriff auf gemappte Netzlaufwerke ist nicht verfügbar, wenn als Windows-Dienst ausgeführt. Weitere Informationen findest du in den [FAQ]({url})." } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index d99bab6d8..6f5e6e3a9 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1119,5 +1119,6 @@ "Max": "Μέγιστη", "Preferred": "Προνομιούχος", "Min": "Ελάχ", - "Today": "Σήμερα" + "Today": "Σήμερα", + "MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index c9810235b..b389a2e69 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1335,5 +1335,10 @@ "DefaultDelayProfileArtist": "Este es el perfil predeterminado. Se aplica a todos los artistas que no tienen un perfil explícito.", "DelayProfileArtistTagsHelpText": "Se aplica a los artistas con al menos una etiqueta coincidente", "NotificationsTagsArtistHelpText": "Envía notificaciones solo para artistas con al menos una etiqueta coincidente", - "ICalTagsArtistHelpText": "El canal solo contendrá artistas con al menos una etiqueta coincidente" + "ICalTagsArtistHelpText": "El canal solo contendrá artistas con al menos una etiqueta coincidente", + "Preferred": "Preferido", + "Max": "Máximo", + "Today": "Hoy", + "Min": "Min", + "MappedNetworkDrivesWindowsService": "Los discos de red mapeados no están disponibles cuando se ejecutan como un servicio de Windows, consulta el [FAQ]({url}) para más información." } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index c10f01a1c..926d1f0b9 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1263,5 +1263,10 @@ "Shutdown": "Sammuta", "UpdateAppDirectlyLoadError": "{appName}ia ei voida päivittää suoraan,", "AddDelayProfileError": "Virhe lisättäessä viiveporofiilia. Yritä uudelleen.", - "ImportListTagsHelpText": "Tunnisteet, joilla tältä tuontilistalta lisätyt kohteet merkitään." + "ImportListTagsHelpText": "Tunnisteet, joilla tältä tuontilistalta lisätyt kohteet merkitään.", + "Min": "Alin", + "Preferred": "Tavoite", + "Max": "Korkein", + "Today": "Tänään", + "MappedNetworkDrivesWindowsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja [UKK:sta]({url})." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 41603ccf9..f3aa8abf2 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1329,5 +1329,10 @@ "SkipFreeSpaceCheckHelpText": "Utiliser quand {appName} ne parvient pas à détecter l'espace disponible de votre dossier racine", "LastSearched": "Dernière recherche", "AddDelayProfileError": "Impossible d'ajouter un nouveau profil de délai, veuillez réessayer.", - "ImportListTagsHelpText": "Balises qui seront ajoutées lors de l'importation à partir de cette liste" + "ImportListTagsHelpText": "Balises qui seront ajoutées lors de l'importation à partir de cette liste", + "Max": "Max", + "Min": "Min", + "Preferred": "Préféré", + "Today": "Aujourd'hui", + "MappedNetworkDrivesWindowsService": "Les lecteurs réseau mappés ne sont pas disponibles lors de l'exécution en tant que service Windows, consultez la [FAQ]({url}) pour plus d'informations." } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index d34fd9395..4de044452 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -791,5 +791,10 @@ "EditReleaseProfile": "ערוך פרופיל עיכוב", "Season": "סיבה", "AddDelayProfileError": "לא ניתן להוסיף פרופיל איכות חדש, נסה שוב.", - "AddCondition": "הוסף תנאי" + "AddCondition": "הוסף תנאי", + "Today": "היום", + "Max": "מקסימום", + "Min": "דקה", + "Preferred": "מועדף", + "MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 1dbb46dea..748b2585a 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -747,5 +747,10 @@ "Clone": "बंद करे", "EditReleaseProfile": "देरी प्रोफ़ाइल संपादित करें", "Season": "कारण", - "AddDelayProfileError": "नई गुणवत्ता प्रोफ़ाइल जोड़ने में असमर्थ, कृपया पुनः प्रयास करें।" + "AddDelayProfileError": "नई गुणवत्ता प्रोफ़ाइल जोड़ने में असमर्थ, कृपया पुनः प्रयास करें।", + "Max": "मैक्स", + "Min": "मिनट", + "Preferred": "पसंदीदा", + "Today": "आज", + "MappedNetworkDrivesWindowsService": "विंडोज सर्विस के रूप में चलने पर मैप्ड नेटवर्क ड्राइव उपलब्ध नहीं हैं। अधिक जानकारी के लिए कृपया FAQ देखें" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index a57121e08..9a6cab200 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -305,5 +305,6 @@ "Reason": "Sezona", "Clone": "Zatvori", "DeleteSelectedTrackFilesMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?", - "AddDelayProfileError": "Neuspješno dodavanje profila odgode, molimo pokušaj ponovno." + "AddDelayProfileError": "Neuspješno dodavanje profila odgode, molimo pokušaj ponovno.", + "Today": "Danas" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index a6e8199b1..d0d3dbb87 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -1221,5 +1221,10 @@ "Shutdown": "Leállitás", "UpdateAppDirectlyLoadError": "Nem lehetséges közvetlenül frissíteni a {appName}-t", "ImportListTagsHelpText": "Címkék, amelyek a listáról történő importáláskor kerülnek hozzáadásra", - "AddDelayProfileError": "Nem sikerült új késleltetési profilt hozzáadni, próbálkozzon újra." + "AddDelayProfileError": "Nem sikerült új késleltetési profilt hozzáadni, próbálkozzon újra.", + "MappedNetworkDrivesWindowsService": "A leképezett hálózati meghajtók nem érhetők el, ha Windows szolgáltatásként futnak, lásd a [GYIK]({url}) for more information.", + "Max": "Max", + "Min": "Min", + "Preferred": "Előnyben részesített", + "Today": "Ma" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index edb56c64a..ff7cf1bad 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -132,5 +132,6 @@ "AptUpdater": "Gunakan apt untuk memasang pembaruan", "Clone": "Tutup", "EnableSSL": "Aktifkan RSS", - "AddDelayProfile": "Tambah Delay Profile" + "AddDelayProfile": "Tambah Delay Profile", + "Today": "Hari Ini" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 2101d7eea..6d99043e0 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -748,5 +748,10 @@ "Clone": "Lokaðu", "AddReleaseProfile": "Breyta seinkunarprófíl", "Season": "Ástæða", - "AddDelayProfileError": "Ekki er hægt að bæta við nýjum gæðaprófíl, reyndu aftur." + "AddDelayProfileError": "Ekki er hægt að bæta við nýjum gæðaprófíl, reyndu aftur.", + "Max": "Hámark", + "Min": "Mín", + "Preferred": "Æskilegt", + "Today": "Í dag", + "MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 7855e262e..d775c91ef 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -1041,5 +1041,10 @@ "UnmappedFiles": "Cartelle Non Mappate", "MissingAlbums": "Albums esistente", "MonitorMissingAlbums": "Albums esistente", - "AddDelayProfileError": "Impossibile aggiungere un nuovo profilo di ritardo, riprova." + "AddDelayProfileError": "Impossibile aggiungere un nuovo profilo di ritardo, riprova.", + "Preferred": "Preferito", + "Max": "Massimo", + "Min": "Min", + "Today": "Oggi", + "MappedNetworkDrivesWindowsService": "Le unità di rete mappate non sono disponibili eseguendo come servizio di Windows. Vedere le FAQ per maggiori informazioni" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 28c880719..6bcd640ed 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -748,5 +748,10 @@ "Clone": "閉じる", "AddReleaseProfile": "遅延プロファイルの編集", "Season": "理由", - "AddDelayProfileError": "新しい品質プロファイルを追加できません。再試行してください。" + "AddDelayProfileError": "新しい品質プロファイルを追加できません。再試行してください。", + "Max": "マックス", + "Min": "最小", + "Preferred": "優先", + "Today": "今日", + "MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index aed304b50..9e938390c 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -742,5 +742,7 @@ "AddAutoTag": "자동 태그 추가", "AddCondition": "조건 추가", "AddImportList": "가져오기 목록 추가", - "UpdateAvailableHealthCheckMessage": "새 업데이트 사용 가능: {version}" + "UpdateAvailableHealthCheckMessage": "새 업데이트 사용 가능: {version}", + "Today": "오늘", + "MappedNetworkDrivesWindowsService": "Windows 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다. 자세한 내용은 FAQ를 참조하십시오." } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index cba23376a..1b4b4d5a2 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -897,5 +897,10 @@ "ExternalUpdater": "{appName} is geconfigureerd om een extern update mechanisme te gebruiken", "UpdateAppDirectlyLoadError": "Kan {appName} niet rechtstreeks updaten,", "UnmappedFiles": "Niet-toegewezen Mappen", - "AddDelayProfileError": "Mislukt om vertragingsprofiel toe te voegen, probeer het later nog eens." + "AddDelayProfileError": "Mislukt om vertragingsprofiel toe te voegen, probeer het later nog eens.", + "Max": "Max", + "Today": "Vandaag", + "Min": "Min", + "Preferred": "Voorkeur gegeven", + "MappedNetworkDrivesWindowsService": "Toegewezen netwerkstation is niet beschikbaar wanneer Prowlarr wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 5ac318cac..2e4699389 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -851,5 +851,6 @@ "Max": "Maks", "Min": "Min", "Preferred": "Preferowane", - "Today": "Dzisiaj" + "Today": "Dzisiaj", + "MappedNetworkDrivesWindowsService": "Zmapowane dyski sieciowe nie są dostępne, gdy działają jako usługa systemu Windows. Więcej informacji można znaleźć w FAQ" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 0986c3f19..5db5dd615 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -1018,5 +1018,10 @@ "UpdateAppDirectlyLoadError": "Não foi possível atualizar o {appName} diretamente,", "DockerUpdater": "atualize o contentor do Docker para receber a atualização", "DownloadImported": "Transferência Ignorada", - "AddDelayProfileError": "Não foi possível adicionar um novo perfil de qualidade, tenta novamente." + "AddDelayProfileError": "Não foi possível adicionar um novo perfil de qualidade, tenta novamente.", + "Max": "Máx.", + "Min": "Mín.", + "Preferred": "Preferido", + "Today": "Hoje", + "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Veja as Perguntas mais frequentes para obter mais informações" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ace24dc09..3b023698c 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1335,5 +1335,10 @@ "ICalTagsArtistHelpText": "O feed conterá apenas artistas com pelo menos uma etiqueta correspondente", "NotificationsTagsArtistHelpText": "Envie notificações apenas para artistas com pelo menos uma etiqueta correspondente", "ReleaseProfileTagArtistHelpText": "Os perfis de lançamento serão aplicados as artistas com pelo menos uma etiqueta correspondente. Deixe em branco para aplicar a todos os artistas", - "DelayProfileArtistTagsHelpText": "Aplica-se a artistas com pelo menos uma etiqueta correspondente" + "DelayProfileArtistTagsHelpText": "Aplica-se a artistas com pelo menos uma etiqueta correspondente", + "Min": "Mín.", + "Today": "Hoje", + "Max": "Máx.", + "Preferred": "Preferido", + "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as [FAQ]({url}) para obter mais informações." } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 02fade757..ece8c88b4 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -797,5 +797,6 @@ "Min": "Min", "Preferred": "Preferat", "Max": "Max", - "Today": "Astăzi" + "Today": "Astăzi", + "MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați [FAQ]({url}) pentru mai multe informații" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index d3c447627..a98be9385 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -1078,5 +1078,11 @@ "DownloadImported": "Загрузка игнорируется", "AddAlbumWithTitle": "rus", "AddDelayProfileError": "Не удалось добавить новый профиль задержки. Повторите попытку.", - "ImportListTagsHelpText": "Теги, которые будут добавлены при импорте из этого списка" + "ImportListTagsHelpText": "Теги, которые будут добавлены при импорте из этого списка", + "Max": "Максимально", + "Preferred": "Предпочтительный", + "RegularExpressionsTutorialLink": "Более подробную информацию о регулярных выражениях можно найти [здесь]({url}).", + "Today": "Сегодня", + "Min": "Минимум", + "MappedNetworkDrivesWindowsService": "Подключенные сетевые диски недоступны при работе в качестве службы Windows. Дополнительную информацию см. в [FAQ]({url})." } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 6d73fbd5b..9ec355ea1 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -924,5 +924,6 @@ "Max": "Max", "Min": "Min", "Preferred": "Föredraget", - "Today": "Idag" + "Today": "Idag", + "MappedNetworkDrivesWindowsService": "Mappade nätverksenheter är inte tillgängliga när de körs som en Windows-tjänst. Se FAQ för mer information" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 5c88cd33e..2507257b0 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -749,5 +749,6 @@ "Max": "สูงสุด", "Min": "นาที", "Preferred": "ที่ต้องการ", - "Today": "วันนี้" + "Today": "วันนี้", + "MappedNetworkDrivesWindowsService": "ไดรฟ์เครือข่ายที่แมปไม่พร้อมใช้งานเมื่อเรียกใช้เป็นบริการ Windows โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 5d9d86d2e..6aef6cf70 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -69,7 +69,7 @@ "ArtistAlbumClickToChangeTrack": "Filmi değiştirmek için tıklayın", "Authentication": "Doğrulama", "AuthenticationMethodHelpText": "{appName}'e erişmek için Kullanıcı Adı ve Parola gereklidir", - "AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın", + "AutoRedownloadFailedHelpText": "Farklı bir sürümü otomatik olarak ara ve indirmeyi dene", "BackupFolderHelpText": "Bağıl yollar {appName}'ın AppData dizini altında olacak", "BackupNow": "Şimdi Yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski otomatik yedeklemeler otomatik olarak temizlenecektir", @@ -172,7 +172,7 @@ "Filename": "Dosya adı", "FileNames": "Dosya Adları", "Files": "Dosyalar", - "FirstDayOfWeek": "Haftanın ilk günü", + "FirstDayOfWeek": "Haftanın İlk Günü", "Fixed": "Düzeltilen", "Folder": "Klasör", "Folders": "Klasörler", @@ -354,8 +354,8 @@ "ShowPath": "Yolu Göster", "ShowQualityProfile": "Kalite Profilini Göster", "ShowQualityProfileHelpText": "Poster altında kalite profilini göster", - "ShowRelativeDates": "Göreli Tarihleri Göster", - "ShowRelativeDatesHelpText": "Göreli (Bugün / Dün / vb.) Veya mutlak tarihleri göster", + "ShowRelativeDates": "İlgili Tarihleri Göster", + "ShowRelativeDatesHelpText": "Göreceli (Bugün/Dün/vb.) veya mutlak tarihleri göster", "ShowSearch": "Aramayı Göster", "ShowSearchActionHelpText": "Fareyle üzerine gelindiğinde arama düğmesini göster", "ShowSizeOnDisk": "Diskte Boyutu Göster", @@ -372,7 +372,7 @@ "StartTypingOrSelectAPathBelow": "Yazmaya başlayın veya aşağıdan bir yol seçin", "StartupDirectory": "Başlangıç Dizini", "Status": "Durum", - "Style": "Tarz", + "Style": "Stil", "SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", "SuccessMyWorkIsDoneNoFilesToRetag": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", @@ -716,7 +716,7 @@ "Unlimited": "Sınırsız", "IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et", "RemoveQueueItemConfirmation": "'{sourceTitle}' dosyasını kuyruktan kaldırmak istediğinizden emin misiniz?", - "AutoRedownloadFailed": "Yeniden İndirme Başarısız", + "AutoRedownloadFailed": "Başarısız İndirmeleri Yenile", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", "AddImportList": "İçe Aktarım Listesi Ekle", "AddReleaseProfile": "Yayın Profili Ekle", @@ -767,8 +767,8 @@ "AuthenticationMethodHelpTextWarning": "Lütfen geçerli bir kimlik doğrulama yöntemi seçin", "AuthenticationRequired": "Kimlik Doğrulama", "AuthenticationRequiredHelpText": "İstekler için Kimlik doğrulamanın gereklilik ayarını değiştirin. Riskleri anlamadığınız sürece değiştirmeyin.", - "AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Aramadan Yeniden İndirme Başarısız Oldu", - "AutoRedownloadFailedFromInteractiveSearchHelpText": "Başarısız indirmeler, etkileşimli aramada bulunduğunda otomatik olarak farklı bir versiyonu arayın ve indirmeyi deneyin", + "AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Arama'dan Başarısız İndirmeleri Yenile", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etkileşimli aramadan başarısız bir sürüm alındığında otomatik olarak farklı bir sürümü arayın ve indirmeye çalışın", "AutoTaggingRequiredHelpText": "Otomatik etiketleme kuralının uygulanabilmesi için bu {implementationName} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {implementationName} eşleşmesi yeterlidir.", "AutomaticAdd": "Otomatik Ekle", "BlocklistAndSearch": "Engellenenler Listesi ve Arama", @@ -894,7 +894,7 @@ "ThereWasAnErrorLoadingThisItem": "Bu öğe yüklenirken bir hata oluştu", "NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv ile kimlik doğrulaması yapın", "NotificationsSettingsUpdateLibrary": "Kitaplığı Güncelle", - "NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Jetonu", + "NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Token'ı", "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} yolu, {serviceName} kitaplık yolu konumunu {appName}'dan farklı gördüğünde seri yollarını değiştirmek için kullanılır ('Kütüphaneyi Güncelle' gerektirir)", "NotificationsSettingsUpdateMapPathsTo": "Harita Yolları", "NotificationsSettingsUseSslHelpText": "{serviceName} hizmetine HTTP yerine HTTPS üzerinden bağlanın", @@ -1077,5 +1077,6 @@ "Max": "Max", "Preferred": "Tercihli", "Today": "Bugün", - "Min": "Min" + "Min": "Min", + "MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın." } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 068e9caf0..0f1352941 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -911,5 +911,10 @@ "Season": "Причина", "CountCustomFormatsSelected": "Користувацькі формати обрано {count}", "AutoTaggingRequiredHelpText": "Ця умова {0} має збігатися, щоб користувацький формат застосовувався. В іншому випадку достатньо одного збігу {1}.", - "AddDelayProfileError": "Неможливо додати новий профіль затримки, будь ласка спробуйте ще." + "AddDelayProfileError": "Неможливо додати новий профіль затримки, будь ласка спробуйте ще.", + "Today": "Сьогодні", + "Min": "Мінімум", + "Preferred": "Бажано", + "Max": "Максимальний", + "MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index dfda4c95e..d8dc68941 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -786,5 +786,6 @@ "Max": "Max", "Min": "Min", "Preferred": "Ưu tiên", - "Today": "Hôm nay" + "Today": "Hôm nay", + "MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 5f58a179d..2a38e129c 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1330,5 +1330,6 @@ "Max": "最大的", "Min": "最小的", "Preferred": "首选的", - "Today": "今天" + "Today": "今天", + "MappedNetworkDrivesWindowsService": "作为 Windows 服务运行时,映射的网络驱动器不可用,请参阅 [FAQ]({url}) 获取更多信息。" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index bcf2fabcd..73c315634 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -1,6 +1,6 @@ { "About": "關於", - "Actions": "執行", + "Actions": "動作", "AddingTag": "新增標籤", "Analytics": "分析", "All": "全部", @@ -235,5 +235,15 @@ "UiLanguage": "使用者介面語言", "UnableToLoadHistory": "無法載入歷史記錄", "UiLanguageHelpText": "{appName} 介面所使用的語言", - "AddDelayProfileError": "無法加入新的條件,請重新嘗試。" + "AddDelayProfileError": "無法加入新的條件,請重新嘗試。", + "AutoRedownloadFailed": "失敗時重新下載", + "AuthenticationRequiredPasswordHelpTextWarning": "請輸入新密碼", + "AuthenticationRequiredHelpText": "更改需要進行驗證的請求。除非你了解其中的風險,否則請勿修改。", + "AuthenticationMethodHelpTextWarning": "請選擇一個有效的驗證方式", + "AuthenticationMethod": "驗證方式", + "AuthenticationRequiredWarning": "為防止未經認證的遠程訪問,{appName} 現需要啟用身份認證。您可以選擇禁用本地地址的身份認證。", + "AuthenticationRequired": "需要驗證", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "確認新密碼", + "AuthenticationRequiredUsernameHelpTextWarning": "請輸入新用戶名", + "AutoRedownloadFailedFromInteractiveSearch": "失敗時重新下載來自手動搜索的資源" } From 0e19c03e9a137cb049d8a9fce25a0d72cc3f3939 Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Tue, 27 Feb 2024 00:30:32 -0500 Subject: [PATCH 008/146] Update Sentry SDK add features Co-authored-by: Stefan Jandl (cherry picked from commit 6377c688fc7b35749d608bf62796446bb5bcb11b) --- src/Directory.Build.props | 29 ++++++++++++ .../SentryTargetFixture.cs | 3 +- .../Instrumentation/NzbDroneLogger.cs | 6 +-- .../Instrumentation/Sentry/SentryTarget.cs | 47 +++++++++++++++---- src/NzbDrone.Common/Lidarr.Common.csproj | 2 +- 5 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index adc1a01b7..f9853bdd5 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -99,6 +99,35 @@ $(MSBuildProjectName.Replace('Lidarr','NzbDrone')) + + + + + + + + + + + + + + + + + + true + + + + true + + true + + diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs index a2400c55b..2c730bd93 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs @@ -4,6 +4,7 @@ using System.Linq; using FluentAssertions; using NLog; using NUnit.Framework; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Instrumentation.Sentry; using NzbDrone.Test.Common; @@ -27,7 +28,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests [SetUp] public void Setup() { - _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111"); + _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111", Mocker.GetMock().Object); } private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message) diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs index 74883c959..bfb404e98 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Common.Instrumentation RegisterDebugger(); } - RegisterSentry(updateApp); + RegisterSentry(updateApp, appFolderInfo); if (updateApp) { @@ -65,7 +65,7 @@ namespace NzbDrone.Common.Instrumentation LogManager.ReconfigExistingLoggers(); } - private static void RegisterSentry(bool updateClient) + private static void RegisterSentry(bool updateClient, IAppFolderInfo appFolderInfo) { string dsn; @@ -80,7 +80,7 @@ namespace NzbDrone.Common.Instrumentation : "https://0522924d625c497f86fc2a1b22aaf21d@sentry.servarr.com/16"; } - var target = new SentryTarget(dsn) + var target = new SentryTarget(dsn, appFolderInfo) { Name = "sentryTarget", Layout = "${message}" diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs index 39b0a920a..49ad4b464 100644 --- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs @@ -9,6 +9,7 @@ using NLog; using NLog.Common; using NLog.Targets; using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Extensions; using Sentry; namespace NzbDrone.Common.Instrumentation.Sentry @@ -99,7 +100,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry public bool FilterEvents { get; set; } public bool SentryEnabled { get; set; } - public SentryTarget(string dsn) + public SentryTarget(string dsn, IAppFolderInfo appFolderInfo) { _sdk = SentrySdk.Init(o => { @@ -107,9 +108,33 @@ namespace NzbDrone.Common.Instrumentation.Sentry o.AttachStacktrace = true; o.MaxBreadcrumbs = 200; o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}"; - o.BeforeSend = x => SentryCleanser.CleanseEvent(x); - o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x); + o.SetBeforeSend(x => SentryCleanser.CleanseEvent(x)); + o.SetBeforeBreadcrumb(x => SentryCleanser.CleanseBreadcrumb(x)); o.Environment = BuildInfo.Branch; + + // Crash free run statistics (sends a ping for healthy and for crashes sessions) + o.AutoSessionTracking = true; + + // Caches files in the event device is offline + // Sentry creates a 'sentry' sub directory, no need to concat here + o.CacheDirectoryPath = appFolderInfo.GetAppDataPath(); + + // default environment is production + if (!RuntimeInfo.IsProduction) + { + if (RuntimeInfo.IsDevelopment) + { + o.Environment = "development"; + } + else if (RuntimeInfo.IsTesting) + { + o.Environment = "testing"; + } + else + { + o.Environment = "other"; + } + } }); InitializeScope(); @@ -127,7 +152,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry { SentrySdk.ConfigureScope(scope => { - scope.User = new User + scope.User = new SentryUser { Id = HashUtil.AnonymousToken() }; @@ -169,9 +194,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry private void OnError(Exception ex) { - var webException = ex as WebException; - - if (webException != null) + if (ex is WebException webException) { var response = webException.Response as HttpWebResponse; var statusCode = response?.StatusCode; @@ -290,13 +313,21 @@ namespace NzbDrone.Common.Instrumentation.Sentry } } + var level = LoggingLevelMap[logEvent.Level]; var sentryEvent = new SentryEvent(logEvent.Exception) { - Level = LoggingLevelMap[logEvent.Level], + Level = level, Logger = logEvent.LoggerName, Message = logEvent.FormattedMessage }; + if (level is SentryLevel.Fatal && logEvent.Exception is not null) + { + // Usages of 'fatal' here indicates the process will crash. In Sentry this is represented with + // the 'unhandled' exception flag + logEvent.Exception.SetSentryMechanism("Logger.Fatal", "Logger.Fatal was called", false); + } + sentryEvent.SetExtras(extras); sentryEvent.SetFingerprint(fingerPrint); diff --git a/src/NzbDrone.Common/Lidarr.Common.csproj b/src/NzbDrone.Common/Lidarr.Common.csproj index 1fd93ffdb..383149c37 100644 --- a/src/NzbDrone.Common/Lidarr.Common.csproj +++ b/src/NzbDrone.Common/Lidarr.Common.csproj @@ -12,7 +12,7 @@ - + From 79b29f39f9f3ab457d8b42f68f0424e1071bc973 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 26 Dec 2024 12:37:45 -0800 Subject: [PATCH 009/146] Don't send session information to Sentry (cherry picked from commit fae24e98fb9230c2f3701caef457332952c6723f) --- src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs index 49ad4b464..3f8d4c227 100644 --- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs @@ -113,7 +113,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry o.Environment = BuildInfo.Branch; // Crash free run statistics (sends a ping for healthy and for crashes sessions) - o.AutoSessionTracking = true; + o.AutoSessionTracking = false; // Caches files in the event device is offline // Sentry creates a 'sentry' sub directory, no need to concat here From 35a46eca7bb266b4d66e44062d1027e454375fc2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 30 Dec 2024 01:01:47 +0200 Subject: [PATCH 010/146] Bump version to 2.9.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 225e8bf2f..af33c02ee 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: '2.9.1' + majorVersion: '2.9.2' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 39f0e4d989c235253b01220e873c5e112616cd2f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 28 Dec 2024 15:32:04 +0200 Subject: [PATCH 011/146] Suggest adding IP to RPC whitelist for on failed Transmission auth (cherry picked from commit f05e552e8e6dc02cd26444073ab9a678dcb36492) --- .../Clients/Transmission/TransmissionProxy.cs | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs index d728a60a1..8eccc47e4 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionProxy.cs @@ -7,6 +7,7 @@ using System.Net; using Newtonsoft.Json.Linq; using NLog; using NzbDrone.Common.Cache; +using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; @@ -260,7 +261,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission private void AuthenticateClient(HttpRequestBuilder requestBuilder, TransmissionSettings settings, bool reauthenticate = false) { - var authKey = string.Format("{0}:{1}", requestBuilder.BaseUrl, settings.Password); + var authKey = $"{requestBuilder.BaseUrl}:{settings.Password}"; var sessionId = _authSessionIdCache.Find(authKey); @@ -272,24 +273,26 @@ namespace NzbDrone.Core.Download.Clients.Transmission authLoginRequest.SuppressHttpError = true; var response = _httpClient.Execute(authLoginRequest); - if (response.StatusCode == HttpStatusCode.MovedPermanently) - { - var url = response.Headers.GetSingleValue("Location"); - throw new DownloadClientException("Remote site redirected to " + url); - } - else if (response.StatusCode == HttpStatusCode.Conflict) + switch (response.StatusCode) { - sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id"); + case HttpStatusCode.MovedPermanently: + var url = response.Headers.GetSingleValue("Location"); - if (sessionId == null) - { - throw new DownloadClientException("Remote host did not return a Session Id."); - } - } - else - { - throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission."); + throw new DownloadClientException("Remote site redirected to " + url); + case HttpStatusCode.Forbidden: + throw new DownloadClientException($"Failed to authenticate with Transmission. It may be necessary to add {BuildInfo.AppName}'s IP address to RPC whitelist."); + case HttpStatusCode.Conflict: + sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id"); + + if (sessionId == null) + { + throw new DownloadClientException("Remote host did not return a Session Id."); + } + + break; + default: + throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission."); } _logger.Debug("Transmission authentication succeeded."); From 40dab8deb9b7ea5cd3627636ba63f42ef83cc8a2 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 30 Dec 2024 04:09:48 +0200 Subject: [PATCH 012/146] Check if backup folder is writable on backup (cherry picked from commit 8aad79fd3e14eb885724a5e5790803c289be2f25) Closes #5348 --- src/NzbDrone.Common/ArchiveService.cs | 19 ++++++++++--------- src/NzbDrone.Core/Backup/BackupService.cs | 11 +++++++++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Common/ArchiveService.cs b/src/NzbDrone.Common/ArchiveService.cs index 800d240ab..d420bbbc0 100644 --- a/src/NzbDrone.Common/ArchiveService.cs +++ b/src/NzbDrone.Common/ArchiveService.cs @@ -42,17 +42,18 @@ namespace NzbDrone.Common public void CreateZip(string path, IEnumerable files) { - using (var zipFile = ZipFile.Create(path)) + _logger.Debug("Creating archive {0}", path); + + using var zipFile = ZipFile.Create(path); + + zipFile.BeginUpdate(); + + foreach (var file in files) { - zipFile.BeginUpdate(); - - foreach (var file in files) - { - zipFile.Add(file, Path.GetFileName(file)); - } - - zipFile.CommitUpdate(); + zipFile.Add(file, Path.GetFileName(file)); } + + zipFile.CommitUpdate(); } private void ExtractZip(string compressedFile, string destination) diff --git a/src/NzbDrone.Core/Backup/BackupService.cs b/src/NzbDrone.Core/Backup/BackupService.cs index 6c1431188..3bfe78c85 100644 --- a/src/NzbDrone.Core/Backup/BackupService.cs +++ b/src/NzbDrone.Core/Backup/BackupService.cs @@ -66,12 +66,19 @@ namespace NzbDrone.Core.Backup { _logger.ProgressInfo("Starting Backup"); + var backupFolder = GetBackupFolder(backupType); + _diskProvider.EnsureFolder(_backupTempFolder); - _diskProvider.EnsureFolder(GetBackupFolder(backupType)); + _diskProvider.EnsureFolder(backupFolder); + + if (!_diskProvider.FolderWritable(backupFolder)) + { + throw new UnauthorizedAccessException($"Backup folder {backupFolder} is not writable"); + } var dateNow = DateTime.Now; var backupFilename = $"lidarr_backup_v{BuildInfo.Version}_{dateNow:yyyy.MM.dd_HH.mm.ss}.zip"; - var backupPath = Path.Combine(GetBackupFolder(backupType), backupFilename); + var backupPath = Path.Combine(backupFolder, backupFilename); Cleanup(); From 17c5c66e549a16ede12c826c7c17a73b31c02a90 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 Jan 2025 13:16:11 +0200 Subject: [PATCH 013/146] Bump version to 2.9.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index af33c02ee..eaadb74cc 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: '2.9.2' + majorVersion: '2.9.3' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 7cfcf01ae3171eef6ef9df94092cb2a06b770cc1 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sun, 5 Jan 2025 02:56:49 +0100 Subject: [PATCH 014/146] Fixed: qBittorrent Ratio Limit Check (cherry picked from commit 4dcc015fb19ceb57d2e8f4985c5137e765829d1c) --- .../QBittorrentTests/QBittorrentFixture.cs | 48 +++++++++++++++++++ .../Clients/QBittorrent/QBittorrent.cs | 4 +- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index fe6abc535..33ec5d964 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -710,6 +710,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeTrue(); } + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_after_rounding_and_paused(string state) + { + GivenGlobalSeedLimits(1.0f); + GivenCompletedTorrent(state, ratio: 1.1006066990976857f); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_just_under_max_ratio_reached_after_rounding_and_paused(string state) + { + GivenGlobalSeedLimits(1.0f); + GivenCompletedTorrent(state, ratio: 0.9999f); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + [TestCase("pausedUP")] [TestCase("stoppedUP")] public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state) @@ -722,6 +746,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeTrue(); } + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_after_rounding_and_paused(string state) + { + GivenGlobalSeedLimits(2.0f); + GivenCompletedTorrent(state, ratio: 1.1006066990976857f, ratioLimit: 1.1f); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_just_under_overridden_max_ratio_reached_after_rounding_and_paused(string state) + { + GivenGlobalSeedLimits(2.0f); + GivenCompletedTorrent(state, ratio: 0.9999f, ratioLimit: 1.0f); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + [TestCase("pausedUP")] [TestCase("stoppedUP")] public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state) diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 745f6f72f..75587513a 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -621,14 +621,14 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent { if (torrent.RatioLimit >= 0) { - if (torrent.Ratio >= torrent.RatioLimit) + if (torrent.RatioLimit - torrent.Ratio <= 0.001f) { return true; } } else if (torrent.RatioLimit == -2 && config.MaxRatioEnabled) { - if (Math.Round(torrent.Ratio, 2) >= config.MaxRatio) + if (config.MaxRatio - torrent.Ratio <= 0.001f) { return true; } From 4ff6c714568e604fb1fe8952a7eaef24d23b9866 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sun, 5 Jan 2025 02:58:24 +0100 Subject: [PATCH 015/146] Fixed: Listening on all IPv4 Addresses (cherry picked from commit 035c474f10c257331a5f47e863d24af82537e335) --- src/Lidarr.Api.V1/Config/HostConfigController.cs | 1 - src/NzbDrone.Core/Validation/IpValidation.cs | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/Lidarr.Api.V1/Config/HostConfigController.cs b/src/Lidarr.Api.V1/Config/HostConfigController.cs index 9046943e8..00e705325 100644 --- a/src/Lidarr.Api.V1/Config/HostConfigController.cs +++ b/src/Lidarr.Api.V1/Config/HostConfigController.cs @@ -33,7 +33,6 @@ namespace Lidarr.Api.V1.Config SharedValidator.RuleFor(c => c.BindAddress) .ValidIpAddress() - .NotListenAllIp4Address() .When(c => c.BindAddress != "*" && c.BindAddress != "localhost"); SharedValidator.RuleFor(c => c.Port).ValidPort(); diff --git a/src/NzbDrone.Core/Validation/IpValidation.cs b/src/NzbDrone.Core/Validation/IpValidation.cs index eb5863caa..f4afa1f66 100644 --- a/src/NzbDrone.Core/Validation/IpValidation.cs +++ b/src/NzbDrone.Core/Validation/IpValidation.cs @@ -1,5 +1,4 @@ using FluentValidation; -using FluentValidation.Validators; using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Validation @@ -10,10 +9,5 @@ namespace NzbDrone.Core.Validation { return ruleBuilder.Must(x => x.IsValidIpAddress()).WithMessage("Must contain wildcard (*) or a valid IP Address"); } - - public static IRuleBuilderOptions NotListenAllIp4Address(this IRuleBuilder ruleBuilder) - { - return ruleBuilder.SetValidator(new RegularExpressionValidator(@"^(?!0\.0\.0\.0)")).WithMessage("Use * instead of 0.0.0.0"); - } } } From 554cf8ec559d86d172d762345f82ebabf5bb79ef Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 4 Jan 2025 12:19:17 +0000 Subject: [PATCH 016/146] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Alexander Balya Co-authored-by: Ano10 Co-authored-by: Fixer Co-authored-by: GkhnGRBZ Co-authored-by: Havok Dan Co-authored-by: Matti Meikäläinen Co-authored-by: Oskari Lavinto Co-authored-by: Tommy Au Co-authored-by: Weblate Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: marapavelka Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_TW/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ar.json | 3 +- src/NzbDrone.Core/Localization/Core/bg.json | 3 +- src/NzbDrone.Core/Localization/Core/ca.json | 3 +- src/NzbDrone.Core/Localization/Core/cs.json | 67 +- src/NzbDrone.Core/Localization/Core/da.json | 3 +- src/NzbDrone.Core/Localization/Core/de.json | 6 +- src/NzbDrone.Core/Localization/Core/el.json | 3 +- src/NzbDrone.Core/Localization/Core/es.json | 8 +- src/NzbDrone.Core/Localization/Core/fi.json | 588 ++++++++++-------- src/NzbDrone.Core/Localization/Core/fr.json | 12 +- src/NzbDrone.Core/Localization/Core/he.json | 3 +- src/NzbDrone.Core/Localization/Core/hi.json | 3 +- src/NzbDrone.Core/Localization/Core/hr.json | 3 +- src/NzbDrone.Core/Localization/Core/hu.json | 5 +- src/NzbDrone.Core/Localization/Core/is.json | 3 +- src/NzbDrone.Core/Localization/Core/it.json | 3 +- src/NzbDrone.Core/Localization/Core/ja.json | 3 +- src/NzbDrone.Core/Localization/Core/ko.json | 3 +- .../Localization/Core/nb_NO.json | 3 +- src/NzbDrone.Core/Localization/Core/nl.json | 3 +- src/NzbDrone.Core/Localization/Core/pl.json | 3 +- src/NzbDrone.Core/Localization/Core/pt.json | 3 +- .../Localization/Core/pt_BR.json | 8 +- src/NzbDrone.Core/Localization/Core/ro.json | 4 +- src/NzbDrone.Core/Localization/Core/ru.json | 8 +- src/NzbDrone.Core/Localization/Core/sk.json | 3 +- src/NzbDrone.Core/Localization/Core/sv.json | 3 +- src/NzbDrone.Core/Localization/Core/th.json | 3 +- src/NzbDrone.Core/Localization/Core/tr.json | 78 +-- src/NzbDrone.Core/Localization/Core/uk.json | 3 +- src/NzbDrone.Core/Localization/Core/vi.json | 3 +- .../Localization/Core/zh_CN.json | 6 +- .../Localization/Core/zh_TW.json | 7 +- 33 files changed, 500 insertions(+), 360 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 46cca04dd..5ad2cc4ea 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -758,5 +758,6 @@ "Min": "دقيقة", "Preferred": "يفضل", "Today": "اليوم", - "MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات" + "MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات", + "DownloadClientSettingsRecentPriority": "أولوية العميل" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index b43fc0d6f..9c26c08a8 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -758,5 +758,6 @@ "Min": "Мин", "Preferred": "Предпочитан", "Today": "Днес", - "MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация" + "MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация", + "DownloadClientSettingsRecentPriority": "Приоритет на клиента" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 371445055..ebad70482 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -969,5 +969,6 @@ "Min": "Min", "Preferred": "Preferit", "Today": "Avui", - "MappedNetworkDrivesWindowsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació" + "MappedNetworkDrivesWindowsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació", + "DownloadClientSettingsRecentPriority": "Prioritat del client" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 37c9442fc..55a029045 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -11,15 +11,15 @@ "ArtistAlbumClickToChangeTrack": "Kliknutím změníte film", "Authentication": "Ověřování", "AutoRedownloadFailedHelpText": "Automatické vyhledání a pokus o stažení jiného vydání", - "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti {appName}", + "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData {appName}u", "BindAddressHelpTextWarning": "Vyžaduje restart, aby se projevilo", "BlocklistRelease": "Blocklist pro vydání", "Branch": "Větev", "Calendar": "Kalendář", "CalendarWeekColumnHeaderHelpText": "Zobrazuje se nad každým sloupcem, když je aktivní zobrazení týden", "Cancel": "Zrušit", - "CancelPendingTask": "Opravdu chcete zrušit tento nevyřízený úkol?", - "CertificateValidation": "Ověření certifikátu", + "CancelPendingTask": "Opravdu chcete zrušit tento úkol čekající na vyřízení?", + "CertificateValidation": "Ověřování certifikátu", "CertificateValidationHelpText": "Změňte přísnost ověřování certifikátů HTTPS. Neměňte, pokud nerozumíte rizikům.", "ChangeFileDate": "Změnit datum souboru", "ChangeHasNotBeenSavedYet": "Změna ještě nebyla uložena", @@ -32,7 +32,7 @@ "ChmodFolder": "Složka chmod", "ChmodFolderHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil {appName}, je vlastníkem souboru. Je lepší zajistit, aby klient pro stahování správně nastavil oprávnění.", "ChownGroupHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil {appName}, je vlastníkem souboru. Je lepší zajistit, aby klient stahování používal stejnou skupinu jako {appName}.", - "AddingTag": "Přidání značky", + "AddingTag": "Přidávání štítku", "AgeWhenGrabbed": "Stáří (kdy bylo získáno)", "AlbumIsDownloadingInterp": "Film se stahuje - {0}% {1}", "ClickToChangeQuality": "Kliknutím změníte kvalitu", @@ -67,11 +67,11 @@ "AlternateTitleslength1Title": "Titul", "AlternateTitleslength1Titles": "Tituly", "Analytics": "Analýzy", - "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", + "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky webového rozhraní {appName}u používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k určení priorit funkcí a oprav chyb.", "AnalyticsEnabledHelpTextWarning": "Vyžaduje restart, aby se projevilo", "ApiKeyHelpTextWarning": "Vyžaduje restart, aby se projevilo", "AppDataDirectory": "Adresář AppData", - "ApplyTags": "Použít značky", + "ApplyTags": "Použít štítky", "IncludeUnknownArtistItemsHelpText": "Zobrazit položky bez filmu ve frontě. To by mohlo zahrnovat odstraněné filmy nebo cokoli jiného v kategorii {appName}", "IncludeUnmonitored": "Zahrnout Nesledováno", "Indexer": "Indexer", @@ -144,13 +144,13 @@ "Time": "Čas", "TorrentDelayHelpText": "Zpoždění v minutách čekání před popadnutím torrentu", "TotalFileSize": "Celková velikost souboru", - "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}", + "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}u", "Automatic": "Automatický", - "BackupNow": "Ihned zálohovat", + "BackupNow": "Zálohovat nyní", "BypassProxyForLocalAddresses": "Obcházení proxy serveru pro místní adresy", "ConnectSettings": "Nastavení připojení", "DatabaseMigration": "Migrace databáze", - "Dates": "Termíny", + "Dates": "Data", "DelayingDownloadUntil": "Zpoždění stahování do {0} o {1}", "Delete": "Vymazat", "DeleteBackup": "Odstranit zálohu", @@ -306,10 +306,10 @@ "Backups": "Zálohy", "BindAddress": "Vázat adresu", "Blocklist": "Blocklist", - "BindAddressHelpText": "Platná IP adresa, localhost nebo '*' pro všechna rozhraní", + "BindAddressHelpText": "Platná IP adresa, localhost nebo ‚*‘ pro všechna rozhraní", "ChmodFolderHelpText": "Octal, aplikováno během importu / přejmenování na mediální složky a soubory (bez provádění bitů)", "ChownGroupHelpText": "Název skupiny nebo gid. Použijte gid pro vzdálené systémy souborů.", - "Clear": "Vyčistit", + "Clear": "Vymazat", "ClientPriority": "Priorita klienta", "CloneIndexer": "Klonovat indexátor", "CompletedDownloadHandling": "Zpracování stahování bylo dokončeno", @@ -474,9 +474,9 @@ "BeforeUpdate": "Před aktualizací", "Close": "Zavřít", "Connect": "Připojit", - "Custom": "Zvyk", + "Custom": "Vlastní", "CustomFilters": "Vlastní filtry", - "Date": "datum", + "Date": "Datum", "DoNotPrefer": "Nepřednostňovat", "DoNotUpgradeAutomatically": "Neupgradovat automaticky", "DownloadFailed": "Stažení se nezdařilo", @@ -635,9 +635,9 @@ "RemovingTag": "Odebírání značky", "Required": "Požadované", "SetTags": "Nastavit značky", - "ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu", - "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky", - "ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)", + "ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků", + "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky", + "ApplyTagsHelpTextReplace": "Nahradit: Nahradit štítky zadanými štítky (prázdné pole vymaže všechny štítky)", "DeleteSelectedIndexers": "Odstranit indexer", "NoEventsFound": "Nebyly nalezeny žádné události", "Yes": "Ano", @@ -647,7 +647,7 @@ "DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?", "ApplyTagsHelpTextHowToApplyArtists": "Jak použít značky na vybrané umělce", "ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu", - "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery", + "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery", "DeleteSelectedImportListsMessageText": "Opravdu chcete smazat {count} vybraných seznamů k importu?", "ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování", "SuggestTranslationChange": "Navrhnout změnu překladu", @@ -655,9 +655,9 @@ "AllResultsAreHiddenByTheAppliedFilter": "Všechny výsledky jsou schovány použitým filtrem", "NoResultsFound": "Nebyly nalezeny žádné výsledky", "SomeResultsAreHiddenByTheAppliedFilter": "Některé výsledky jsou použitým filtrem skryty", - "ConnectionLost": "Spojení ztraceno", + "ConnectionLost": "Ztráta spojení", "ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.", - "ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.", + "ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.", "RecentChanges": "Nedávné změny", "WhatsNew": "Co je nového?", "NotificationStatusSingleClientHealthCheckMessage": "Seznamy nejsou k dispozici z důvodu selhání: {0}", @@ -670,7 +670,7 @@ "Clone": "Klonovat", "AddConnection": "Přidat spojení", "AddReleaseProfile": "Přidat profil vydání", - "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL", + "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základu URL", "ApplyChanges": "Použít změny", "AutoAdd": "Přidat automaticky", "AutomaticAdd": "Přidat automaticky", @@ -678,11 +678,11 @@ "AutomaticUpdatesDisabledDocker": "Automatické aktualizace nejsou při použití aktualizačního mechanismu Docker přímo podporovány. Obraz kontejneru je nutné aktualizovat mimo {appName} nebo použít skript", "ApplicationURL": "URL aplikace", "AddConditionImplementation": "Přidat podmínku - {implementationName}", - "AddConnectionImplementation": "Přidat spojení - {implementationName}", - "AddDownloadClientImplementation": "Přidat klienta pro stahování - {implementationName}", + "AddConnectionImplementation": "Přidat spojení – {implementationName}", + "AddDownloadClientImplementation": "Přidat klienta pro stahování – {implementationName}", "AddImportList": "Přidat importované položky", "AddImportListImplementation": "Přidat seznam k importu - {implementationName}", - "AddIndexerImplementation": "Přidat indexer - {implementationName}", + "AddIndexerImplementation": "Přidat indexer – {implementationName}", "Absolute": "Úplné", "AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}", "Label": "Etiketa", @@ -746,10 +746,10 @@ "AlbumStudio": "Studio alba", "DisabledForLocalAddresses": "Zakázáno pro místní adresy", "AuthenticationMethod": "Metoda ověřování", - "AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování", - "AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo", - "AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno", - "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.", + "AuthenticationMethodHelpTextWarning": "Vyberte platnou metodu ověřování", + "AuthenticationRequiredPasswordHelpTextWarning": "Zadejte nové heslo", + "AuthenticationRequiredUsernameHelpTextWarning": "Zadejte nové uživatelské jméno", + "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName}, aby bylo povoleno ověřování. Volitelně můžete zakázat ověřování z místních adres.", "Auto": "Auto", "AddAutoTag": "Přidat automatickou značku", "AddCondition": "Přidat podmínku", @@ -789,8 +789,8 @@ "Table": "Stůl", "AuthBasic": "Základní (vyskakovací okno prohlížeče)", "AuthForm": "Formuláře (přihlašovací stránka)", - "AuthenticationRequired": "Vyžadované ověření", - "AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Pokud nerozumíte rizikům, neměňte je.", + "AuthenticationRequired": "Vyžadováno ověření", + "AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Neměňte, pokud nerozumíte rizikům.", "AddNewArtistSearchForMissingAlbums": "Začněte hledat chybějící film", "DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorii {appName}. Ve svém klientovi pro stahování byste měli třídění zakázat, abyste se vyhnuli problémům s importem.", "Negate": "Negovat", @@ -840,10 +840,10 @@ "UiSettingsSummary": "Možnosti kalendáře, data a barev", "CustomFormatsSettingsSummary": "Vlastní formáty a nastavení", "ArtistIndexFooterDownloading": "Stahování", - "AutomaticSearch": "Vyhledat automaticky", + "AutomaticSearch": "Automatické vyhledávání", "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} nebyl schopen určit, pro který film je toto vydání určeno. {appName} nemusí být schopen toto vydání automaticky importovat. Chcete chytit „{0}“?", "IndexerFlags": "Příznaky indexeru", - "CustomFilter": "Vlastní filtry", + "CustomFilter": "Vlastní filtr", "FormatAgeHour": "hodina", "FormatAgeHours": "hodin", "FormatAgeMinute": "minuta", @@ -874,7 +874,7 @@ "DeleteSelectedCustomFormats": "Odstranění vlastního formátu", "DeleteSelectedCustomFormatsMessageText": "Opravdu chcete smazat {count} vybraných seznamů k importu?", "IncludeCustomFormatWhenRenaming": "Při přejmenování zahrnout vlastní formát", - "AptUpdater": "K instalaci aktualizace použijte apt", + "AptUpdater": "K instalaci aktualizace používat apt", "DockerUpdater": "aktualizujte kontejner dockeru, abyste aktualizaci obdrželi", "InstallLatest": "Nainstalujte nejnovější", "Shutdown": "Vypnout", @@ -888,5 +888,6 @@ "Min": "Min", "Preferred": "Upřednostňováno", "Today": "Dnes", - "MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v častých dotazech" + "MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v častých dotazech", + "DownloadClientSettingsRecentPriority": "Priorita klienta" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index be5a06f3b..ada9bc159 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -797,5 +797,6 @@ "Today": "I dag", "Episode": "afsnit", "MetadataProfile": "metadataprofil", - "Min": "Min" + "Min": "Min", + "DownloadClientSettingsRecentPriority": "Kundens prioritet" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 462fd39f1..5a4c66524 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -1286,5 +1286,9 @@ "Max": "Max", "Min": "Min", "Today": "Heute", - "MappedNetworkDrivesWindowsService": "Zugriff auf gemappte Netzlaufwerke ist nicht verfügbar, wenn als Windows-Dienst ausgeführt. Weitere Informationen findest du in den [FAQ]({url})." + "MappedNetworkDrivesWindowsService": "Zugriff auf gemappte Netzlaufwerke ist nicht verfügbar, wenn als Windows-Dienst ausgeführt. Weitere Informationen findest du in den [FAQ]({url}).", + "DownloadClientSettingsOlderPriority": "Ältere Priorität", + "DownloadClientSettingsPostImportCategoryHelpText": "Kategorie für {appName}, die nach dem Importieren des Downloads festgelegt wird. {appName} wird Torrents in dieser Kategorie nicht entfernen, auch wenn das Seeding beendet ist. Leer lassen, um dieselbe Kategorie beizubehalten.", + "DownloadClientSettingsRecentPriority": "Neueste Priorität", + "PostImportCategory": "Post-Import-Kategorie" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 6f5e6e3a9..d1bed1f99 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1120,5 +1120,6 @@ "Preferred": "Προνομιούχος", "Min": "Ελάχ", "Today": "Σήμερα", - "MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες" + "MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες", + "DownloadClientSettingsRecentPriority": "Προτεραιότητα πελάτη" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index b389a2e69..e7bf4a4a4 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1340,5 +1340,11 @@ "Max": "Máximo", "Today": "Hoy", "Min": "Min", - "MappedNetworkDrivesWindowsService": "Los discos de red mapeados no están disponibles cuando se ejecutan como un servicio de Windows, consulta el [FAQ]({url}) para más información." + "MappedNetworkDrivesWindowsService": "Los discos de red mapeados no están disponibles cuando se ejecutan como un servicio de Windows, consulta el [FAQ]({url}) para más información.", + "DownloadClientSettingsOlderPriority": "Priorizar más antiguos", + "DownloadClientSettingsPostImportCategoryHelpText": "Categoría para que {appName} establezca una vez se haya importado la descarga. {appName} no eliminará torrents en esa categoría incluso si finalizó el sembrado. Dejar en blanco para mantener la misma categoría.", + "DownloadClientSettingsRecentPriority": "Priorizar recientes", + "PostImportCategory": "Categoría de post-importación", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados en los últimos 14 días", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados hace más de 14 días" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 926d1f0b9..5044f48de 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -13,16 +13,16 @@ "Host": "Osoite", "IllRestartLater": "Käynnistän uudelleen myöhemmin", "EnableRSS": "RSS-syöte", - "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle", + "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "Tämän tietolähteen kanssa ei voida käyttää RSS-syötettä.", "Logging": "Lokikirjaus", "ProxyBypassFilterHelpText": "Erota aliverkkotunnukset pilkuilla ja käytä jokerimerkkinä tähteä ja pistettä (*.). Esimerkki: www.esimerkki.fi,*.esimerkki.fi).", "UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.", "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Lue lisää tietolähteestä painamalla 'Lisätietoja'.", - "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Saat tietoja yksittäisistä lataustyökaluista painamalla niiden ohessa olevia lisätietopainikkeita.", - "RssSyncIntervalHelpText": "Aikaväli minuutteina. Arvo \"0\" (nolla) kytkee toiminnon pois käytöstä pysäyttäen automaattisen julkaisukaappauksen täysin.", + "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.", + "RssSyncIntervalHelpText": "Aikaväli minuutteina. Poista toiminto käytöstä asettamalla arvoksi 0, joka pysäyttää automaattisen julkaisukaappauksen täysin.", "DefaultLidarrTags": "Oletusarvoiset {appName}-oletustunnisteet", "DefaultTagsHelpText": "Kansiosta löydetyille esittäjille oletusarvoisesti määritettävät {appName}-tunnisteet.", - "IsTagUsedCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä", + "IsTagUsedCannotBeDeletedWhileInUse": "Tunnistetta ei voida poistaa kun se on käytössä.", "LidarrTags": "{appName}-tunnisteet", "RemoveTagRemovingTag": "Tunniste poistetaan", "ChmodFolderHelpText": "Octal, sovelletaan tuonnin/nimeämisen yhteydessä mediakansioihin ja -tiedostoihin (ilman suoritusbittejä).", @@ -37,41 +37,41 @@ "NoLeaveIt": "Ei, anna olla", "Torrents": "Torrentit", "InteractiveSearch": "Etsi manuaalisesti", - "BackupRetentionHelpText": "Säilytysjaksoa vanhemmat varmuuskopiot siivotaan automaattisesti.", - "ConnectSettings": "Kytkösasetukset", + "BackupRetentionHelpText": "Säilytysaikaa vanhemmat varmuuskopiot siivotaan automaattisesti.", + "ConnectSettings": "Ilmoituspavelun asetukset", "DatabaseMigration": "Tietokannan siirto", "DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?", "DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?", - "EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset lataustyökalusta automaattisesti.", + "EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset latauspalvelusta automaattisesti.", "Indexer": "Tietolähde", - "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", + "UnableToAddANewDownloadClientPleaseTryAgain": "Latauspalvelun lisääminen epäonnistui. Yritä uudelleen.", "CalendarWeekColumnHeaderHelpText": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.", - "NotificationTriggers": "Laukaisimet", + "NotificationTriggers": "Ilmoituksen laukaisijat", "PackageVersion": "Paketin versio", "Port": "Portti", "Indexers": "Tietolähteet", - "ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että lataustyökalu käyttää samaa ryhmää kuin {appName}.", + "ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että latauspalvelu käyttää samaa ryhmää kuin {appName}.", "CopyUsingHardlinksHelpText": "Hardlink-kytkösten avulla {appName} voi tuoda jaettavat torrentit ilman niiden täyttä kopiointia ja levytilan kaksinkertaista varausta. Tämä toimii vain lähde- ja kohdesijaintien ollessa samalla tallennusmedialla.", "CopyUsingHardlinksHelpTextWarning": "Tiedostojen käsittelystä johtuvat lukitukset saattavat joskus estää jaettavien tiedostojen uudelleennimeämisen. Voit keskeyttää jakamisen väliaikaisesti ja käyttää {appName}in nimeämistoimintoa.", "DeleteImportListMessageText": "Haluatko varmasti poistaa listan \"{name}\"?", "DeleteIndexerMessageText": "Haluatko varmasti poistaa tietolähteen '{name}'?", "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?", - "TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.", + "TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.", "Security": "Suojaus", - "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös monia muita alla lueteltuja tietolähteitä.", + "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} tukee kaikkien Newznab-yhteensopivien tietolähteiden ohella myös monia muita alla listattuja tietolähteitä.", "Actions": "Toiminnot", "AddListExclusion": "Lisää listapoikkeus", - "ApiKeyHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "ApiKeyHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "APIKey": "Rajapinnan avain", "AppDataDirectory": "AppData-kansio", "Authentication": "Tunnistautuminen", - "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana", - "AutoRedownloadFailedHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti.", + "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", + "AutoRedownloadFailedHelpText": "Etsi ja pyri lataamaan korvaava julkaisu automaattisesti.", "BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.", - "BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", + "BackupIntervalHelpText": "{appName}in tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", "BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.", - "BindAddressHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "BindAddressHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "BackupNow": "Varmuuskopioi nyt", "Backups": "Varmuuskopiot", "Blocklist": "Estolista", @@ -81,26 +81,26 @@ "Branch": "Haara", "ClickToChangeQuality": "Vaihda laatua painamalla tästä", "ChownGroupHelpText": "Ryhmän nimi tai GID. Käytä GID:tä etätiedostojärjestelmille.", - "ChmodFolderHelpTextWarning": "Tämä toimii vain, jos käyttäjä suorittaa {appName}in tiedoston omistajana. Parempi vaihtoehto on varmistaa, että lataustyökalu asettaa oikeudet oikein.", + "ChmodFolderHelpTextWarning": "Toimii vain, jos käyttäjä suorittaa {appName}in tiedoston omistajana. Parempi vaihtoehto on varmistaa, että latauspalvelu asettaa oikeudet oikein.", "BlocklistRelease": "Lisää julkaisu estolistalle", "Columns": "Sarakkeet", "Calendar": "Kalenteri", "CompletedDownloadHandling": "Valmistuneiden latausten käsittely", "CloneIndexer": "Monista tietolähde", - "CancelPendingTask": "Haluatko varmasti perua tämän odottavan tehtävän?", + "CancelPendingTask": "Haluatko varmasti perua odottavan tehtävän?", "CertificateValidation": "Varmenteen vahvistus", "CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muta, jos et ymmärrä riskejä.", - "ClientPriority": "Lataustyökalun painotus", + "ClientPriority": "Latauspalvelun painotus", "CloneProfile": "Monista profiili", "ChangeFileDate": "Muuta tiedoston päiväys", "ChangeHasNotBeenSavedYet": "Muutosta ei ole vielä tallennettu", "Component": "Komponentti", - "Connections": "Yhteydet", + "Connections": "Ilmoituspalvelut", "CreateGroup": "Luo ryhmä", - "CutoffHelpText": "Kun tämä laatu on saavutettu, {appName} ei enää lataa elokuvia", + "CutoffHelpText": "Kun tämä laatutaso on saavutettu, ei {appName} enää kaappaa albumeita.", "DelayProfile": "Viiveprofiili", "Delete": "Poista", - "CutoffUnmet": "Katkaisutasoa ei savutettu", + "CutoffUnmet": "Katkaisutasoa ei saavutettu", "Dates": "Päiväykset", "DelayProfiles": "Viiveprofiilit", "DeleteBackup": "Poista varmuuskopio", @@ -112,10 +112,10 @@ "DeleteImportListExclusionMessageText": "Haluatko varmasti poistaa tuontilistapoikkeuksen?", "DeleteFilesHelpText": "Poista kappaletiedostot ja esittäjäkansio", "DeleteImportList": "Poista tuontilista", - "DeleteDownloadClient": "Poista lataustyökalu", - "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?", + "DeleteDownloadClient": "Poista latauspalvelu", + "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa latauspalvelun \"{name}\"?", "DeleteIndexer": "Poista tietolähde", - "DeleteNotification": "Poista ilmoitus", + "DeleteNotification": "Poista ilmoituspalvelu", "DeleteQualityProfile": "Poista laatuprofiili", "DeleteQualityProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin \"{name}\"?", "DeleteReleaseProfile": "Poista julkaisuprofiili", @@ -126,13 +126,13 @@ "Docker": "Docker", "DetailedProgressBar": "Yksityiskohtainen tilapalkki", "DetailedProgressBarHelpText": "Näytä teksti edistymispalkissa.", - "DownloadClient": "Lataustyökalu", - "DownloadClients": "Lataustyökalut", + "DownloadClient": "Latauspalvelu", + "DownloadClients": "Latauspalvelut", "DiskSpace": "Levytila", - "DownloadFailedCheckDownloadClientForMoreDetails": "Lataus epäonnistui: Katso tarkemmat tiedot lataustyökalusta", + "DownloadFailedCheckDownloadClientForMoreDetails": "Lataus epäonnistui: katso tarkemmat tiedot latauspalvelusta.", "DownloadFailedInterp": "Lataus epäonnistui: {0}", - "DownloadPropersAndRepacksHelpTexts1": "Määrittää päivitetäänkö tiedostot automaattisesti Proper- ja Repack-julkaisuihin (kunnollinen/uudelleenpaketoitu).", - "DownloadWarningCheckDownloadClientForMoreDetails": "Latausvaroitus: Katso tarkempia tietoja lataustyökalusta", + "DownloadPropersAndRepacksHelpTexts1": "Määrittää päivitetäänkö tiedostot automaattisesti Proper-/Repack-julkaisuihin.", + "DownloadWarningCheckDownloadClientForMoreDetails": "Latausvaroitus: katso tarkemmat tiedot latauspalvelusta.", "DeleteTag": "Poista tunniste", "EnableColorImpairedMode": "Heikentyneen värinäön tila", "EnableAutomaticSearch": "Käytä automaattihakua", @@ -140,7 +140,7 @@ "EnableHelpText": "Luo metatietotiedostot tälle metatietotyypille.", "ExistingTagsScrubbed": "Olemassa olevat tunnisteet on poistettu", "EnableSSL": "SSL-salaus", - "EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.", + "EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvalvojan oikeuksilla.", "ErrorLoadingContents": "Virhe ladattaessa sisältöjä", "FirstDayOfWeek": "Viikon ensimmäinen päivä", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Lue lisää tuontilistoista painamalla 'Lisätietoja'.", @@ -150,10 +150,10 @@ "Group": "Ryhmä", "Hostname": "Osoite", "Importing": "Tuodaan", - "IncludeUnknownArtistItemsHelpText": "Näytä jonossa kohteet, joissa ei ole esittäjää. Tämä voi sisältää poistettuja esittäjiä, kappaleita tai mitä tahansa muuta {appName}ille luokiteltua.", + "IncludeUnknownArtistItemsHelpText": "Näytä jonossa kohteet, joissa ei ole esittäjää. Tämä voi sisältää poistettuja esittäjiä, albumeita tai mitä tahansa muuta {appName}ille luokiteltua.", "Interval": "Ajoitus", "IndexerSettings": "Tietolähdeasetukset", - "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Monet torrent- ja Usenet-lataajat ovat tuettuja.", + "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "{appName} tukee monia torrent- ja Usenet-lataajia.", "MetadataSettings": "Metatietoasetukset", "MediaManagementSettings": "Medianhallinnan asetukset", "MaximumSizeHelpText": "Kaapattavien julkaisujen enimmäiskoko megatavuina. Arvo \"0\" (nolla) poistaa rajoituksen.", @@ -172,10 +172,10 @@ "Queue": "Jono", "QualityDefinitions": "Laatumääritykset", "Reload": "Lataa uudelleen", - "RemotePathHelpText": "Lataustyökalun käyttämän kansion juurisijainti.", + "RemotePathHelpText": "Latauspalvelun käyttämän kansion juurisijainti.", "RemoveTagExistingTag": "Tunniste on jo olemassa", - "ReplaceIllegalCharactersHelpText": "Korvaa laittomat merkit vaihtoehtoisella merkinnällä. Jos ei valittu, ne poistetaan.", - "RequiresRestartToTakeEffect": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "ReplaceIllegalCharactersHelpText": "Korvaa laittomat merkit vaihtoehtoisella merkinnällä. Jos ei valittu, {appName} poistaa ne.", + "RequiresRestartToTakeEffect": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "Reset": "Uudista", "Restore": "Palauta", "RSSSync": "Synkronoi RSS", @@ -188,31 +188,31 @@ "ShowRelativeDatesHelpText": "Korvaa absoluuttiset päiväykset suhteellisilla päiväyksillä (tänään/eilen/yms.).", "ShowSearch": "Näytä haku", "ShowSizeOnDisk": "Näytä koko levyllä", - "ShowTitleHelpText": "Näytä esittäjän nimi julisteen alla", - "SslCertPasswordHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", - "SslCertPathHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", - "SslPortHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "ShowTitleHelpText": "Näytä esittäjän nimi julisteen alla.", + "SslCertPasswordHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", + "SslCertPathHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", + "SslPortHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "ShowUnknownArtistItems": "Näytä 'Tuntematon esittäjä' -kohde", "StartupDirectory": "Käynnistyskansio", "StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Profiilia käytetään manuaalihakuun.", "Tags": "Tunnisteet", "TestAll": "Kaikkien testaus", - "TestAllClients": "Lataustyökalujen testaus", + "TestAllClients": "Koesta latauspalvelut", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.", "TagAudioFilesWithMetadata": "Tallenna metatiedot äänitiedostoihin", "TestAllIndexers": "Tietolähteiden testaus", - "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui", - "UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu", - "UnableToLoadGeneralSettings": "Virhe ladattaessa yleisiä asetuksia", - "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui.", - "UnableToLoadIndexerOptions": "Tietolähdeasetusten lataus ei onnistu", + "UnableToLoadBackups": "Varmuuskopioinnin lataus epäonnistui", + "UnableToLoadDownloadClients": "Latauspalveluiden lataus epäonnistui", + "UnableToLoadGeneralSettings": "Yleisasetusten lataus epäonnistui", + "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui", + "UnableToLoadIndexerOptions": "Tietolähdeasetusten lataus epäonnistui", "UnableToLoadImportListExclusions": "Tuontilistapoikkeusten lataus epäonnistui", "UnableToLoadHistory": "Historian lataus epäonnistui", - "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", - "UnableToLoadQualityDefinitions": "Virhe ladattaessa laatumäärityksiä", + "UnableToLoadTags": "Tunnisteiden lataus epäonnistui", + "UnableToLoadQualityDefinitions": "Laatumääritysten lataus epäonnistui", "UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.", - "UrlBaseHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "UrlBaseHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.", "Version": "Versio", "Uptime": "Käyttöaika", @@ -227,10 +227,10 @@ "AlternateTitleslength1Title": "Nimike", "Analytics": "Analytiikka", "AlternateTitleslength1Titles": "Nimikkeet", - "AnalyticsEnabledHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "AnalyticsEnabledHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "Automatic": "Automaattinen", "Clear": "Tyhjennä", - "DelayingDownloadUntil": "Lataus on siirretty alkamaan {0} klo {1}", + "DelayingDownloadUntil": "Lataus on lykätty alkamaan {date} klo {time}", "ScrubAudioTagsHelpText": "Poista olemassa olevat tagit tiedostoista säilyttäen vain {appName}in lisäämät tagit.", "ScrubExistingTags": "Tyhjennä olemassa olevat tunnisteet", "ScriptPath": "Komentosarjan sijainti", @@ -239,14 +239,14 @@ "SkipFreeSpaceCheck": "Ohita vapaan tilan tarkastus", "WeekColumnHeader": "Viikkosarakkeen otsikko", "ChmodFolder": "chmod-kansio", - "UnableToAddANewNotificationPleaseTryAgain": "Kytköksen lisäys epäonnistui. Yritä uudelleen.", + "UnableToAddANewNotificationPleaseTryAgain": "Ilmoituspalvelun lisääminen epäonnistui. Yritä uudelleen.", "ApplyTags": "Tunnistetoimenpide", - "UnableToLoadNotifications": "Virhe ladattaessa kytköksiä", - "DownloadClientSettings": "Lataustyökalujen asetukset", + "UnableToLoadNotifications": "Ilmoituspalveluiden lataus epäonnistui", + "DownloadClientSettings": "Latauspalveluasetukset", "GeneralSettings": "Yleiset asetukset", "QualitySettings": "Laatuasetukset", "Settings": "Asetukset", - "UnableToLoadUISettings": "Virhe ladattaesssa käyttöliittymän asetuksia", + "UnableToLoadUISettings": "Käyttöliittymäasetusten lataus epäonnistui", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Filename": "Tiedostonimi", "YesCancel": "Kyllä, peru", @@ -291,18 +291,18 @@ "TorrentDelayHelpText": "Minuuttiviive, joka odotetaan ennen julkaisun Torrent-kaappausta.", "UnableToAddANewQualityProfilePleaseTryAgain": "Laatuprofiilin lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewRemotePathMappingPleaseTryAgain": "Etäsijainnin kohdistuksen lisäys epäonnistui. Yritä uudelleen.", - "UnableToLoadBlocklist": "Estonlistan lataus epäonnistui.", - "UnableToLoadDelayProfiles": "Virhe ladattaessa viiveprofiileja", - "UnableToLoadDownloadClientOptions": "Lataustyökalun asetusten lataus epäonnistui", - "UnableToLoadLists": "Tuontilistojen lataus epäonnistui.", - "UnableToLoadRootFolders": "Pääkansioiden lataus epäonnistui.", - "UnableToLoadTheCalendar": "Kalenterin lataus epäonnistui.", + "UnableToLoadBlocklist": "Estolistan lataus epäonnistui", + "UnableToLoadDelayProfiles": "Viiveprofiilien lataus epäonnistui", + "UnableToLoadDownloadClientOptions": "Latauspalveluasetusten lataus epäonnistui", + "UnableToLoadLists": "Listojen lataus epäonnistui", + "UnableToLoadRootFolders": "Juurikansioiden lataus epäonnistui", + "UnableToLoadTheCalendar": "Kalenterin lataus epäonnistui", "Unmonitored": "Valvomattomat", - "UnableToLoadMediaManagementSettings": "Virhe ladattaessa mediatiedostojen hallinta-asetuksia", - "UnableToLoadMetadata": "Virhe ladattaessa metatietoja", - "UnableToLoadNamingSettings": "Virhe ladattaessa nimeämisasetuksia", - "UnableToLoadQualities": "Laatujen lataus epäonnistui.", - "UnableToLoadQualityProfiles": "Virhe ladattaessa laatuprofiileja", + "UnableToLoadMediaManagementSettings": "Mediatiedostojen hallinta-asetusten lataus epäonnistui", + "UnableToLoadMetadata": "Metatietojen lataus epäonnistui", + "UnableToLoadNamingSettings": "Nimeämisasetusten lataus epäonnistui", + "UnableToLoadQualities": "Laatujen lataus epäonnistui", + "UnableToLoadQualityProfiles": "Laatuprofiilien lataus epäonnistui", "UnableToLoadRemotePathMappings": "Etäsijaintien kohdistusten lataus epäonnistui", "UnmonitoredHelpText": "Sisällytä ei-valvotut albumit iCal-syötteeseen.", "UpdateAll": "Päivitä kaikki", @@ -311,15 +311,15 @@ "UseHardlinksInsteadOfCopy": "Käytä hardlink-kytköksiä", "MinimumFreeSpaceWhenImportingHelpText": "Estä tuonti, jos sen jälkeinen vapaa levytila olisi tässä määritettyä pienempi.", "Folders": "Kansiot", - "RecycleBinCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattisen tyhjennyksen käytöstä.", + "RecycleBinCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi 0.", "RecycleBinCleanupDaysHelpTextWarning": "Määritettyä päiväystä vanhemmat tiedostot poistetaan roskakorista automaattisesti.", "RootFolders": "Juurikansiot", "Path": "Tiedostosijainti", "TorrentDelay": "Torrent-viive", "SearchForMissing": "Etsi puuttuvia", - "Source": "Lähdekoodi", + "Source": "Lähde", "ShowCutoffUnmetIconHelpText": "Näytä kuvake tiedostoille, joiden määritettyä katkaisutasoa ei ole vielä saavutettu.", - "ShowMonitoredHelpText": "Näytä valvonnan tila julisteen alla.", + "ShowMonitoredHelpText": "Näytä valvontatila julisteen alla.", "ShowMonitored": "Näytä valvontatila", "ShouldMonitorHelpText": "Valvo tältä tuontilistalta lisättyjä uusia esittäjiä ja albumeita.", "TimeFormat": "Kellonajan esitys", @@ -337,25 +337,25 @@ "AllowArtistChangeClickToChangeArtist": "Paina vaihtaaksesi kirjailijaa", "Season": "Kausi", "ArtistAlbumClickToChangeTrack": "Vaihda kirjaa painamalla", - "ArtistFolderFormat": "Esittäjäkansion kaava", - "ArtistNameHelpText": "Poissuljettavan kirjailijan/kirjan nimi (voi olla mitä tahansa merkityksellistä)", + "ArtistFolderFormat": "Esittäjäkansioiden kaava", + "ArtistNameHelpText": "Ohitettavan esittäjän tai albumin nimi (voi olla mitä tahansa merkityksellistä).", "CreateEmptyArtistFoldersHelpText": "Luo puuttuvat kirjailijakansiot kirjastotarkistusten yhteydessä", "DefaultMetadataProfileIdHelpText": "Kansiosta löydetyille esittäjille oletustusarvoisesti asetettava metatietoprofiili.", "DefaultQualityProfileIdHelpText": "Kansiosta löydetyille esittäjille oletustusarvoisesti asetettava laatuprofiili.", "History": "Historia", - "HostHelpText": "Sama osoite, joka on määritty etälataustyökalulle.", + "HostHelpText": "Sama osoite, joka on määritetty etälatauspalvelulle.", "ICalFeed": "iCal-syöte", "ImportFailedInterp": "Tuonti epäonnistui: {0}", "RestartLidarr": "Käynnistä {appName} uudelleen", "RestartNow": "Käynnistä uudelleen nyt", "RestoreBackup": "Palauta varmuuskopio", - "RetentionHelpText": "Vain Usenet: Aseta nollaan asettamaan rajoittamaton säilytys", - "RetryingDownloadOn": "Yritetään ladata uudelleen {0} osoitteessa {1}", + "RetentionHelpText": "Vain Usenet: määritä rajoittamaton säilytys asettamalla arvoksi 0.", + "RetryingDownloadOn": "Yritetään latausta uudelleen {date} klo {time}", "TestAllLists": "Kaikkien listojen testaus", "Time": "Aika", "TotalFileSize": "Kokonaistiedostokoko", "Track": "Valvo", - "UnableToLoadReleaseProfiles": "Viiveprofiileja ei voi ladata", + "UnableToLoadReleaseProfiles": "Julkaisuprofiilien lataus epäonnistui", "UsenetDelayHelpText": "Minuuttiviive, joka odotetaan ennen julkaisun Usenet-kaappausta.", "UseProxy": "Käytä välityspalvelinta", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.", @@ -386,7 +386,7 @@ "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Päivitä, kunnes tämä laatu saavutetaan tai ylitetään", "Level": "Taso", "LocalPath": "Paikallinen sijainti", - "LocalPathHelpText": "Polku, jonka kautta etäsijaintia tulee käyttää paikallisesti.", + "LocalPathHelpText": "Sijainti, jonka kautta {appName}in tulee käyttää etäsijaintia paikallisesti.", "LogFiles": "Lokitiedostot", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Jäljityskirjausta tulee käyttää vain tilapäisesti.", "LongDateFormat": "Pitkän päiväyksen esitys", @@ -396,7 +396,7 @@ "MaximumSize": "Enimmäiskoko", "Mechanism": "Mekanismi", "MediaInfo": "Median tiedot", - "Medium": "Keskikoko", + "Medium": "Keskikokoinen", "Message": "Viesti", "MinimumAge": "Vähimmäisikä", "MinimumAgeHelpText": "Vain Usenet: NZB:n vähimmäisikä minuutteina, ennen niiden kaappausta. Tämän avulla uusille julkaisuille voidaan antaa aikaa levitä Usenet-palveluntarjoajalle.", @@ -426,22 +426,22 @@ "Reason": "Syy", "Redownload": "Lataa uudelleen", "RefreshScan": "Päivitä ja tarkista", - "ReleaseDate": "Julkaisupäivät", + "ReleaseDate": "Julkaisupäivä", "ReleaseGroup": "Julkaisuryhmä", - "ReleaseRejected": "Vapautus hylätty", + "ReleaseRejected": "Julkaisu hylättiin", "ReleaseStatuses": "Julkaisutila", "ReleaseWillBeProcessedInterp": "Julkaisu käsitellään {0}", "RemotePath": "Etäsijainti", "RemotePathMappings": "Etäsijaintien kohdistukset", "Remove": "Poista", - "RemoveCompletedDownloadsHelpText": "Poista tuodut lataukset lataustyökalun historiasta", + "RemoveCompletedDownloadsHelpText": "Poista tuodut lataukset latauspalvelun historiasta", "RemovedFromTaskQueue": "Poistettu tehtäväjonosta", - "RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset lataustyökalun historiasta.", + "RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset latauspalvelun historiasta.", "RemoveFilter": "Poista suodatin", - "RemoveFromDownloadClient": "Poista lataustyökalusta", + "RemoveFromDownloadClient": "Poista latauspalvelusta", "RemoveFromQueue": "Poista jonosta", "RemoveSelected": "Poista valitut", - "RenameTracksHelpText": "Jos uudelleennimeäminen ei ole käytössä, käytetään nykyistä tiedostonimeä.", + "RenameTracksHelpText": "Jos uudelleennimeäminen ei ole käytössä, {appName} käyttää nykyistä tiedostonimeä.", "Reorder": "Järjestä uudelleen", "RescanArtistFolderAfterRefresh": "Tarkista kirjailijakansio päivityksen jälkeen uudelleen", "ResetAPIKeyMessageText": "Haluatko varmasti korvata rajapinnan avaimen uudella?", @@ -450,12 +450,12 @@ "RootFolder": "Juurikansio", "SSLCertPassword": "SSL-varmenteen salasana", "SslCertPasswordHelpText": "Pfx-tiedoston salasana", - "SslCertPathHelpText": "PFX-tiedoston sijainti", + "SslCertPathHelpText": "Pfx-tiedoston sijainti", "SSLPort": "SSL-portti", "StandardTrackFormat": "Tavallisten kappaleiden kaava", "Status": "Tila", - "SuccessMyWorkIsDoneNoFilesToRename": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.", - "SuccessMyWorkIsDoneNoFilesToRetag": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.", + "SuccessMyWorkIsDoneNoFilesToRename": "Valmis! Toiminto on suoritettu, eikä uudelleennimettäviä tiedostoja ole.", + "SuccessMyWorkIsDoneNoFilesToRetag": "Valmis! Toiminto on suoritettu, eikä tagimuutoksia vaativia tiedostoja ole.", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Tämä tietolähde ei tue hakua.", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Profiilia käytetään automaattihaun yhteydessä, kun haku suoritetaan käyttöliittymästä tai {appName}in toimesta.", "Tasks": "Tehtävät", @@ -468,10 +468,10 @@ "UsenetDelay": "Usenet-viive", "NETCore": ".NET", "UiLanguageHelpText": "{appName}in käyttöliittymän kieli.", - "UiLanguageHelpTextWarning": "Selaimen sivupäivitys vaaditaan", + "UiLanguageHelpTextWarning": "Vaatii selaimen sivupäivityksen (F5).", "Ungroup": "Pura ryhmä", "WriteMetadataToAudioFiles": "Kirjoita metatiedot äänitiedostoihin", - "AlbumIsDownloadingInterp": "Kirjaa ladataan - {0} % {1}", + "AlbumIsDownloadingInterp": "Albumia ladataan – {0} % {1}", "AnyReleaseOkHelpText": "{appName} vaihtaa automaattisesti versioon, joka vastaa ladattuja tiedostoja parhaiten", "Label": "Nimi", "SourcePath": "Lähdesijainti", @@ -486,7 +486,7 @@ "AllArtistAlbums": "Kaikki artistin albumit", "MetadataProfile": "Metatietoprofiili", "OnApplicationUpdate": "Kun sovellus päivitetään", - "PathHelpTextWarning": "Tämä ei voi olla sama kansio, johon lataustyökalusi tallentaa tiedostot.", + "PathHelpTextWarning": "Tämä ei voi olla sama kansio, johon latauspalvelusi tallentaa tiedostot.", "QualityProfileIdHelpText": "Laatuprofiili, joka listalta lisätyille kohteille tulee asettaa.", "IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "Esittäjään tai tuontilistaan liitettyä metatietoprofiilia ei voi poistaa.", "IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "Esittäjään tai tuontilistaan liitettyä laatuprofiilia ei voi poistaa.", @@ -501,10 +501,10 @@ "ExpandSingleByDefaultHelpText": "Singlet", "MetadataProfileIdHelpText": "Metatietoprofiili, joka listalta lisätyille kohteille tulee asettaa.", "MetadataProfiles": "Metatietoprofiilit", - "PathHelpText": "Musiikkikokoelmasi pääkansio.", + "PathHelpText": "Musiikkikokoelmasi sisältävä juurikansio.", "RemoveCompleted": "Poisto on suoritettu", "OnUpgrade": "Päivitettäessä", - "RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevan taulukon lataustyökalukohtaisiin asetuksiin.", + "RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevan taulukon latauspalvelukohtaisiin asetuksiin.", "SearchForAllMissingAlbums": "Etsi kaikkia puuttuvia albumeita", "OnGrab": "Kun julkaisu kaapataan", "OnHealthIssue": "Vakausongelmat", @@ -538,7 +538,7 @@ "Backup": "Varmuuskopiointi", "BeforeUpdate": "Ennen päivitystä", "Close": "Sulje", - "Connect": "Kytkökset", + "Connect": "Ilmoituspalvelut", "Custom": "Mukautettu", "CustomFilters": "Omat suodattimet", "Date": "Päiväys", @@ -568,7 +568,7 @@ "Info": "Informatiivinen", "InstanceName": "Instanssin nimi", "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.", - "InteractiveImport": "Manuaalituonti", + "InteractiveImport": "Manuaalinen tuonti", "LastDuration": "Edellinen kesto", "LastExecution": "Edellinen suoritus", "LastUsed": "Viimeksi käytetty", @@ -597,7 +597,7 @@ "RejectionCount": "Hylkäysmäärä", "ReleaseTitle": "Julkaisun nimike", "Replace": "Korvaa", - "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii in uudelleenkäynnistyksen.", + "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", "RestoreBackupAdditionalInfo": "Huomioi: {appName} käynnistyy palautusprosessin aikana automaattisesti uudelleen.", "Save": "Tallenna", "Seeders": "Jakajat", @@ -620,11 +620,11 @@ "UnmonitoredOnly": "Vain valvomattomat", "UpgradesAllowed": "Päivitykset sallitaan", "Wanted": "Halutut", - "Warn": "Varoitus", + "Warn": "Varoita", "WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?", "AddRemotePathMapping": "Lisää etäsijainnin kohdistus", "FreeSpace": "Vapaa tila", - "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.", + "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä latauspalvelu.", "Ok": "Ok", "Organize": "Järjestä", "OutputPath": "Tallennussijainti", @@ -632,17 +632,17 @@ "Activity": "Tapahtumat", "EditDelayProfile": "Muokkaa viiveprofiilia", "Add": "Lisää", - "AddConnection": "Lisää yhteys", + "AddConnection": "Lisää ilmoituspavelu", "EditMetadataProfile": "Muokkaa metatietoprofiilia", "Database": "Tietokanta", "AllowFingerprinting": "Salli piiloleimaus", - "MassAlbumsCutoffUnmetWarning": "Haluatko varmasti etsiä '{0}' albumia, joiden katkaisutasoa ei ole saavutettu?", + "MassAlbumsCutoffUnmetWarning": "Haluatko varmasti etsiä kaikkia {0} albumia, joiden katkaisutasoa ei ole saavutettu?", "PastDaysHelpText": "Päivien määrä, jonka verran menneisyyteen iCal-syötettä seurataan.", "PrimaryTypes": "Ensisijaiset tyypit", "TrackNaming": "Kappaleiden nimeäminen", "DeleteRootFolder": "Poista juurikansio", "DeleteTrackFile": "Poista kappaletiedosto", - "DiscNumber": "Levyn numero", + "DiscNumber": "Levynumero", "DiscCount": "Levyjen määrä", "EnableProfile": "Käytä profiilia", "MissingAlbums": "Puuttuvat albumit", @@ -666,8 +666,8 @@ "TrackFilesCountMessage": "Kappaletiedostoja ei ole", "TrackImported": "Kappale tuotiin", "TrackMissingFromDisk": "Levyltä puuttuu kappale", - "TrackNumber": "Kappaleiden numero", - "UnableToLoadMetadataProviderSettings": "Metatietolähteen asetuksia ei voitu ladata", + "TrackNumber": "Kappalenumero", + "UnableToLoadMetadataProviderSettings": "Metatietolädeasetusten lataus epäonnistui", "UnmappedFiles": "Kohdistamattomat tiedostot", "FutureDays": "Tulevat päivät", "FutureDaysHelpText": "Päivien määrä, jonka verran tulevaisuuteen iCal-syötettä seurataan.", @@ -679,7 +679,7 @@ "EditGroups": "Muokkaa ryhmiä", "FirstAlbum": "Ensimmäinen albumi", "FirstAlbumData": "Seuraa ensimmäisiä albumeita. Muita albumeita ei huomioida.", - "ForeignIdHelpText": "Ohitettavan esittäjän/albumin MusicBrainz-tunniste.", + "ForeignIdHelpText": "Ohitettavan esittäjän tai albumin MusicBrainz-tunniste.", "FutureAlbums": "Tulevat albumit", "GoToArtistListing": "Avaa esittäjälistaus", "IsExpandedHideFileInfo": "Piilota tiedostojen tiedot", @@ -731,7 +731,7 @@ "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "Yhteensä {0} kappaletta. {1} kappaleelle on tiedostoja.", "TrackArtist": "Kappaleen esittäjä", "TrackCount": "Kappaleiden määrä", - "TrackDownloaded": "Kappale ladattu", + "TrackDownloaded": "Kappale on ladattu", "TrackProgress": "Kappaleiden edistyminen", "TrackStatus": "Kappaleiden tila", "TrackTitle": "Kappaleiden nimi", @@ -740,8 +740,8 @@ "WriteMetadataTags": "Tallenna metatietotagit", "ContinuingAllTracksDownloaded": "Jatkuva (kaikki kappaleet on ladattu)", "Continuing": "Jatkuu", - "ContinuingMoreAlbumsAreExpected": "Albumeita odotetaan lisää", - "ContinuingNoAdditionalAlbumsAreExpected": "Abumeita ei odoteta lisää", + "ContinuingMoreAlbumsAreExpected": "Albumeita odotetaan tulevan lisää", + "ContinuingNoAdditionalAlbumsAreExpected": "Uusia abumeita ei tiettävästi ole tulossa", "OnDownloadFailure": "Latauksen epäonnistuessa", "Artist": "Esittäjä", "ArtistClickToChangeAlbum": "Vaihda albumia painamalla", @@ -776,7 +776,7 @@ "ImportFailed": "Tuonti epäonnistui", "ImportFailures": "Tuontivirheet", "ImportLists": "Tuontilistat", - "ImportListSettings": "Tuontilistojen yleiset asetukset", + "ImportListSettings": "Tuontilistojen yleisasetukset", "HideAlbums": "Piilota albumit", "HideTracks": "Piilota kappaleet", "LatestAlbum": "Uusin albumi", @@ -789,14 +789,14 @@ "Playlist": "Soittolista", "Proceed": "Jatka", "RootFolderPath": "Juurikansion sijainti", - "SceneNumberHasntBeenVerifiedYet": "Kohtauksen numeroa ei ole vielä vahvistettu", + "SceneNumberHasntBeenVerifiedYet": "Kohtausnumeroa ei ole vielä vahvistettu", "SearchBoxPlaceHolder": "esim. Breaking Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25", "SearchForAllCutoffUnmetAlbums": "Etsi kaikkia albumeita, joiden katkaisutasoa ei ole savutettu", "SearchAlbum": "Etsi albumia", "SelectAlbum": "Valitse albumi", "SelectAlbumRelease": "Valitse albumin julkaisu", "FutureAlbumsData": "Valvo albumeita, joita ei ole vielä julkaistu.", - "SearchForAllMissingAlbumsConfirmationCount": "Haluatko varmasti etsiä '{0}' puuttuvaa albumia?", + "SearchForAllMissingAlbumsConfirmationCount": "Haluatko varmasti etsiä kaikkia {totalRecords} puuttuvaa albumia?", "EditArtist": "Muokkaa esittäjää", "DeleteSelected": "Poista valitut", "ClickToChangeReleaseGroup": "Vaihda julkaisuryhmää painamalla tästä", @@ -807,38 +807,38 @@ "AllMonitoringOptionHelpText": "Valvo jokaista tuontilistalla olevaa esittäjää ja heidän kaikkia albumeitaan.", "ContinuingOnly": "Vain jatkuvat", "EntityName": "Entiteetin nimi", - "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Jaksolla ei ole tarkkaa jaksonumeroa", + "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Jaksolle ei ole absoluuttista numeroa.", "IndexerIdHelpTextWarning": "Yksittäisen tietolähteen käyttö sanapainotuksen kanssa saattaa aiheuttaa julkaisujen kaksoiskappaleiden kaappauksia.", "AllowFingerprintingHelpText": "Tarkenna kappaleiden tunnistustarkkuutta piiloleimauksen avulla.", "BlocklistReleaseHelpText": "Estää {appName}ia lataamasta näitä tiedostoja uudelleen.", - "RemotePathMappingCheckFilesGenericPermissions": "Lataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta {appName} ei näe sitä. Kansion käyttöoikeuksia on ehkä muokattava.", - "RemotePathMappingCheckGenericPermissions": "Lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta {appName} ei näe sitä. Kansion käyttöoikeuksia on ehkä muokattava.", + "RemotePathMappingCheckFilesGenericPermissions": "Latauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta {appName} ei näe sitä. Kansion käyttöoikeuksia on ehkä muokattava.", + "RemotePathMappingCheckGenericPermissions": "Latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta {appName} ei näe sitä. Kansion käyttöoikeuksia on ehkä muokattava.", "RemotePathMappingCheckFolderPermissions": "{appName} näkee ladatauskansion \"{0}\", mutta ei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", - "DownloadedUnableToImportCheckLogsForDetails": "Ladattu - Tuonti ei onnistu: Katso tarkemmat tiedot lokista.", + "DownloadedUnableToImportCheckLogsForDetails": "Ladattu – Tuonti ei onnistu: näet lisätietoja lokista.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää", "IndexerRssHealthCheckNoIndexers": "RSS-synkronointia varten ei ole määritetty tietolähteitä ja tämän vuoksi {appName} ei kaappaa uusia julkaisuja automaattisesti.", "IndexerSearchCheckNoAutomaticMessage": "Automaattihakua varten ei ole määritetty tietolähteitä ja tämän vuoksi {appName}in automaattihaku ei löydä tuloksia.", - "IndexerSearchCheckNoInteractiveMessage": "Manuaalihaulle ei ole määritetty tietolähteitä, eikä se sen vuoksi löydä tuloksia.", - "RecycleBinUnableToWriteHealthCheck": "Määritettyyn roskakorikansioon ei voida tallentaa: {0}. Varmista, että sijainti on olemassa ja että käyttäjällä on kirjoitusoikeus kansioon.", - "RemotePathMappingCheckDownloadPermissions": "{appName} näkee ladatun albumin \"{0}\", mutta ei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", - "RemotePathMappingCheckImportFailed": "{appName} ei voinut tuoda julkaisua. Katso tarkemmat tiedot lokista.", + "IndexerSearchCheckNoInteractiveMessage": "Manuaalihaulle ei ole määritetty tietolähteitä, eikä {appName} sen vuoksi löydä sillä tuloksia.", + "RecycleBinUnableToWriteHealthCheck": "Roskakoriksi määritettyyn sijaintiin ei voida tallentaa: {0}. Varmista, että se on olemassa ja että {appName}in suorittavalla käyttäjällä on kirjoitusoikeus kansioon.", + "RemotePathMappingCheckDownloadPermissions": "{appName} näkee ladatun musiikin \"{0}\", muttei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", + "RemotePathMappingCheckImportFailed": "{appName} ei voinut tuoda musiikkia. Näet lisätietoja lokista.", "AddAutoTagError": "Virhe lisättäessä automaattimerkintää. Yritä uudelleen.", "AddCondition": "Lisää ehto", "AddConditionError": "Virhe lisättäessä ehtoa. Yritä uudelleen.", - "AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}", - "AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}", + "AddIndexerImplementation": "Lisätään tietolähdettä – {implementationName}", + "AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}", "AddImportList": "Lisää tuontilista", "AddAutoTag": "Lisää automaattinen tunniste", - "CountDownloadClientsSelected": "{selectedCount} lataustyökalu(a) on valittu", - "ApplyTagsHelpTextHowToApplyDownloadClients": "Tunnisteiden käyttö valituissa lataustyökaluissa", - "NotificationStatusAllClientHealthCheckMessage": "Mikään ilmoituspavelu ei ole ongelmien vuoksi käytettävissä.", + "CountDownloadClientsSelected": "{selectedCount} latauspalvelu(a) on valittu", + "ApplyTagsHelpTextHowToApplyDownloadClients": "Tunnisteiden käyttö valituille latauspalveluille", + "NotificationStatusAllClientHealthCheckMessage": "Ilmoituspalvelut eivät ole ongelmien vuoksi käytettävissä.", "AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.", "DownloadClientQbittorrentSettingsContentLayout": "Sisällön rakenne", - "EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}", - "DownloadPropersAndRepacksHelpTextWarning": "Käytä mukautettuja muotoja automaattisiin Proper- ja Repack-päivityksiin.", + "EditDownloadClientImplementation": "Muokataan latauspalvelua – {implementationName}", + "DownloadPropersAndRepacksHelpTextWarning": "Käytä mukautettuja muotoja automaattisiin Proper-/Repack-päivityksiin.", "PreferredSize": "Toivottu koko", - "RemotePathMappingCheckFilesBadDockerPath": "Käytät Dockeria ja lataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja lataustyökalun asetukset.", - "RemotePathMappingCheckLocalWrongOSPath": "Paikallinen lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista lataustyökalun asetukset.", + "RemotePathMappingCheckFilesBadDockerPath": "Käytät Dockeria ja latauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", + "RemotePathMappingCheckLocalWrongOSPath": "Paikallinen latauspalvelu {0} tallentaa lataukset sijaintiin \"{1}\", mutta tämä ei ole kelvollinen {2}-sijainti. Tarkista latauspalvelun asetukset.", "RemoveSelectedItemQueueMessageText": "Haluatko varmasti poistaa jonosta 1 kohteen?", "RemoveTagsAutomatically": "Poista tunnisteet automaattisesti", "RemoveTagsAutomaticallyHelpText": "Poista tunnisteet automaattisesti, jos ehdot eivät täyty.", @@ -854,32 +854,32 @@ "BypassIfHighestQualityHelpText": "Ohitusviive kun julkaisun laatu vastaa laatuprofiilin korkeinta käytössä olevaa laatua halutulla protokollalla.", "BlocklistReleases": "Lisää julkaisut estolistalle", "CloneCondition": "Monista ehto", - "ConnectionLost": "Ei yhteyttä", + "ConnectionLost": "Yhteys menetettiin", "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", "CustomFormat": "Mukautettu muoto", "DeleteConditionMessageText": "Haluatko varmasti poistaa ehdon \"{name}\"?", "DeleteFormatMessageText": "Haluatko varmasti poistaa muototunnisteen \"{name}\"?", "DeleteSelectedImportListsMessageText": "Haluatko varmasti poistaa valitut {count} tuontilistaa?", - "DownloadClientCheckUnableToCommunicateMessage": "Viestintä lataustyökalun \"{0}\" kanssa ei onnistu.", - "DownloadClientSortingCheckMessage": "Lataustyökalun \"{0}\" {1} on kytketty käyttöön {appName}in kategorialle ja tuontiongelmien välttämiseksi se tulisi poistaa käytöstä.", - "EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja", + "DownloadClientCheckUnableToCommunicateMessage": "Viestintä latauspalvelun \"{0}\" kanssa epäonnistui.", + "DownloadClientSortingCheckMessage": "Latauspalvelun \"{0}\" {1} on kytketty käyttöön {appName}in kategorialle ja tuontiongelmien välttämiseksi se tulisi poistaa käytöstä.", + "EditSelectedDownloadClients": "Muokkaa valittuja latauspalveluita", "ErrorLoadingContent": "Virhe ladattaessa tätä sisältöä", "IncludeCustomFormatWhenRenamingHelpText": "Mahdollista tämän muodon käyttö \"{Custom Formats}\" -nimeämiskaavan kanssa.", "No": "Ei", - "NoDownloadClientsFound": "Lataustyökaluja ei löytynyt", + "NoDownloadClientsFound": "Latauspalveluita ei löytynyt", "NoHistoryBlocklist": "Estohistoriaa ei ole.", - "NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Ilmoituspalvelut eivät ole ongelmien vuoksi käytettävissä: {0}.", "PreferProtocol": "Suosi {preferredProtocol}-protokollaa", "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", "QueueIsEmpty": "Jono on tyhjä", "RecentChanges": "Uusimmat muutokset", - "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä", - "RemotePathMappingCheckBadDockerPath": "Käytät Dockeria ja lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja lataustyökalun asetukset.", + "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituille tietolähteille", + "RemotePathMappingCheckBadDockerPath": "Käytät Dockeria ja latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", "DeleteSelectedIndexers": "Poista tietoläh(de/teet)", - "RemotePathMappingCheckFilesWrongOSPath": "Etälataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etsijaintien kohdistukset lataustyökalun asetukset.", - "RemotePathMappingCheckRemoteDownloadClient": "Etälataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.", - "RemotePathMappingCheckWrongOSPath": "Etälataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja lataustyökalun asetukset.", - "RemotePathMappingsInfo": "Etäsijaintien kohdistuksia tarvitaan harvoin ja jos {appName} ja lataustyökalu suoritetaan samassa järjestelmässä, on parempi käyttää paikallisia polkuja. Lue lisää [wikistä]({wikiLink}).", + "RemotePathMappingCheckFilesWrongOSPath": "Etälatauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista määritetyt etäsijainnit ja latauspalvelun asetukset.", + "RemotePathMappingCheckRemoteDownloadClient": "Etälatauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.", + "RemotePathMappingCheckWrongOSPath": "Etälatauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", + "RemotePathMappingsInfo": "Etäsijaintien kohdistuksia tarvitaan harvoin ja jos {appName} ja latauspalvelu suoritetaan samassa järjestelmässä, on parempi käyttää paikallisia sijainteja. Lue lisää [wikistä]({wikiLink}).", "RemoveSelectedItem": "Poista valittu kohde", "ReplaceWithDash": "Korvaa yhdysmerkillä", "ReplaceWithSpaceDash": "Korvaa yhdistelmällä \"välilyönti yhdysmerkki\"", @@ -890,57 +890,57 @@ "WhatsNew": "Mikä on uutta?", "Yes": "Kyllä", "CustomFormats": "Mukautetut muodot", - "CutoffFormatScoreHelpText": "Kun albumi saavuttaa laaturajoituksen tai tämän mukautetun muodon pisteytyksen, ei siihen enää kaapata uusia julkaisuja tai tuoda päivityksiä.", + "CutoffFormatScoreHelpText": "Kun tämä mukautetun muodon pisteytys on saavutettu, ei {appName} enää kaappaa albumeita.", "DeleteCustomFormat": "Poista mukautettu muoto", "DeleteCustomFormatMessageText": "Haluatko varmasti poistaa mukautetun muodon \"{name}\"?", "Disabled": "Ei käytössä", - "DownloadClientCheckDownloadingToRoot": "Lataustyökalu \"{0}\" tallentaa lataukset juurikansioon \"{1}\", mutta ne tulisi tallentaa muualle.", - "DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä", + "DownloadClientCheckDownloadingToRoot": "Latauspalvelu {0} tallentaa lataukset juurikansioon \"{1}\", mutta niitä ei tulisi tallentaa sinne.", + "DownloadClientStatusCheckAllClientMessage": "Latauspalveluita ei ole ongelmien vuoksi käytettävissä", "GroupInformation": "Ryhmän tiedot", "MinimumCustomFormatScore": "Mukautetun muodon vähimmäispisteytys", "Monitor": "Valvonta", - "DownloadClientTagHelpText": "Lataustyökalua käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille. Käytä kaikille jättämällä tyhjäksi.", + "DownloadClientTagHelpText": "Tätä latauspalvelua käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille. Käytä kaikille jättämällä tyhjäksi.", "MinFormatScoreHelpText": "Mukautetun muodon vähimmäispisteytys, jolla lataus sallitaan.", - "ExtraFileExtensionsHelpTextsExamples": "Esimerkiksi '\"sub, .nfo\" tai \"sub,nfo\".", + "ExtraFileExtensionsHelpTextsExamples": "Esimerkiksi \"sub, .nfo\" tai \"sub,nfo\".", "ExtraFileExtensionsHelpText": "Pilkuin eroteltu listaus tuotavista oheistiedostoista (.nfo-tiedostot tuodaan \".nfo-orig\"-nimellä).", "Conditions": "Ehdot", "CountIndexersSelected": "{selectedCount} tietolähde(ttä) on valittu", - "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valit(n/tua) lataustyökalu(n/a)?", + "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valittua latauspalvelua?", "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?", "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", "Negated": "Kielletty", "NegateHelpText": "Jos käytössä, ei mukautettua muotoa sovelleta tämän \"{0}\" -ehdon täsmätessä.", "NoChange": "Ei muutosta", - "DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}", + "DownloadClientStatusCheckSingleClientMessage": "Latauspalveluita ei ole ongelmien vuoksi käytettävissä: {0}", "Clone": "Monista", "CloneCustomFormat": "Monista mukautettu muoto", "BypassIfAboveCustomFormatScore": "Ohita, jos ylittää mukautetun muodon pisteytyksen", "RemoveSelectedItemsQueueMessageText": "Haluatko varmasti poistaa jonosta {0} kohdetta?", "RemoveFailedDownloads": "Poista epäonnistuneet lataukset", "RemoveCompletedDownloads": "Poista valmistuneet lataukset", - "AddImportListImplementation": "Lisätään tuontilistaa - {implementationName}", - "AddConditionImplementation": "Lisätään ehtoa - {implementationName}", - "AddConnectionImplementation": "Lisätään kytköstä - {implementationName}", - "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.", + "AddImportListImplementation": "Lisätään tuontilistaa – {implementationName}", + "AddConditionImplementation": "Lisätään ehtoa – {implementationName}", + "AddConnectionImplementation": "Lisätään ilmoituspavelua – {implementationName}", + "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä latauspalveluilla: {0}.", "IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", "MinimumCustomFormatScoreHelpText": "Mukautetun muodon vähimmäispisteytys, jolla ensisijaisen protokollan viiveen ohitus sallitaan.", "Monitoring": "Valvotaan", "NoIndexersFound": "Tietolähteitä ei löytynyt", - "RemotePathMappingCheckFilesLocalWrongOSPath": "Paikallinen lataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista lataustyökalun asetukset.", + "RemotePathMappingCheckFilesLocalWrongOSPath": "Paikallinen latauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista latauspalvelun asetukset.", "Formats": "Muodot", - "AuthBasic": "Perus (ponnahdusikkuna)", + "AuthBasic": "Perus (selaimen ponnahdus)", "AuthForm": "Lomake (kirjautumissivu)", - "DeleteSelectedDownloadClients": "Poista lataustyökalu(t)", + "DeleteSelectedDownloadClients": "Poista valitut latauspalvelu(t)", "AllResultsAreHiddenByTheAppliedFilter": "Aktiivinen suodatin piilottaa kaikki tulokset.", "ColonReplacement": "Kaksoispisteen korvaus", "GrabId": "Kaappauksen tunniste", "InfoUrl": "Tietojen URL", - "EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}", - "DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille", + "EditIndexerImplementation": "Muokataan tietolähdettä – {implementationName}", + "DisabledForLocalAddresses": "Ei käytössä paikallisissa osoitteissa", "ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi", "AutoTagging": "Automaattinen tunnistemerkintä", "AutoTaggingNegateHelpText": "Jos käytössä, ei automaattista merkintäsääntöä käytetä tämän \"{implementationName}\" -ehdon täsmätessä.", - "AutoTaggingLoadError": "Virhe ladattaessa automaattimerkintää", + "AutoTaggingLoadError": "Automaattimerkinnän lataus epäonnistui", "ClearBlocklist": "Tyhjennä estolista", "ChownGroup": "chown-ryhmä", "ClearBlocklistMessageText": "Haluatko varmasti tyhjentää kaikki estolistan kohteet?", @@ -954,45 +954,45 @@ "DeleteSelectedImportLists": "Poista tuontilista(t)", "DeleteSpecificationHelpText": "Haluatko varmasti poistaa määrityksen \"{name}\"?", "DeleteSpecification": "Poista määritys", - "DownloadClientCheckNoneAvailableMessage": "Lataustyökaluja ei ole käytettävissä", - "EditConditionImplementation": "Muokataan ehtoa - {implementationName}", - "EditConnectionImplementation": "Muokataan kytköstä - {implementationName}", + "DownloadClientCheckNoneAvailableMessage": "Latauspalveluita ei ole käytettävissä", + "EditConditionImplementation": "Muokataan ehtoa – {implementationName}", + "EditConnectionImplementation": "Muokataan ilmoituspalvelua – {implementationName}", "EditAutoTag": "Muokkaa automaattimerkintää", "ManageIndexers": "Hallitse tietolähteitä", - "RenameFiles": "Nimeä tiedostot", + "RenameFiles": "Nimeä tiedostot uudelleen", "Small": "Pieni", "RemoveSelectedItems": "Poista valitut kohteet", "ResetTitles": "Palauta nimet", "AddNewArtistRootFolderHelpText": "\"{folder}\" -alikansio luodaan automaattisesti.", "AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus", "AutoAdd": "Automaattilisäys", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Lataustyökalu \"{0}\" on määritetty poistamaan valmistuneet lataukset, jonka seuraksena ne saatetaan poistaa ennen kuin {1} ehtii tuoda niitä.", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Latauspalvelu {0} on määritetty poistamaan valmistuneet lataukset, jonka seuraksena ne saatetaan poistaa ennen kuin {1} ehtii tuoda niitä.", "Enabled": "Käytössä", - "RemotePathMappingCheckLocalFolderMissing": "Etälataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.", - "UpdateAvailableHealthCheckMessage": "Uusi päivitys on saatavilla", - "UpdateMonitoring": "Päivitä valvontatila", - "ApplyTagsHelpTextHowToApplyImportLists": "Tunnisteiden käyttö valituissa tuontilistoissa", - "AutomaticUpdatesDisabledDocker": "Automaattisia päivityksiä ei tueta suoraan käytettäessä Dockerin päivitysmekanismia. Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava komentosarjalla.", + "RemotePathMappingCheckLocalFolderMissing": "Etälatauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.", + "UpdateAvailableHealthCheckMessage": "Uusi päivitys on saatavilla: {version}", + "UpdateMonitoring": "Vaihda valvontatilaa", + "ApplyTagsHelpTextHowToApplyImportLists": "Tunnisteiden käyttö valituille tuontilistoille", + "AutomaticUpdatesDisabledDocker": "Automaattisia päivityksiä ei tueta suoraan käytettäessä Dockerin päivitysmekanismia. Docker-säiliö on päivitettävä {appName}in ulkopuolella, tai päivitys on suoritettava komentosarjalla.", "UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".", "AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa", "AuthenticationMethod": "Tunnistautumistapa", "AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.", "AuthenticationRequired": "Vaadi tunnistautuminen", "CustomFormatScore": "Mukautetun muodon pisteytys", - "EditImportListImplementation": "Muokataan tuontilistaa - {implementationName}", - "Overview": "Yleiskatsaus", + "EditImportListImplementation": "Muokataan tuontilistaa – {implementationName}", + "Overview": "Tiivistelmä", "Posters": "Julisteet", "PosterOptions": "Julistenäkymän asetukset", - "OverviewOptions": "Yleiskatsauksen asetukset", - "RemotePathMappingCheckDockerFolderMissing": "Käytät Dockeria ja lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei löydy Docker-säiliöstä. Tarkista etäsijaintien kohdistukset ja säiliön tallennusmedian asetukset.", + "OverviewOptions": "Tiivistelmänäkymän asetukset", + "RemotePathMappingCheckDockerFolderMissing": "Käytät Dockeria ja latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei löydy Docker-säiliöstä. Tarkista etäsijaintien kohdistukset ja säiliön tallennusmedian asetukset.", "ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?", - "SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.", - "UnableToLoadInteractiveSearch": "Tämän albumihaun tulosten lataus ei onnistu. Yritä uudelleen.", + "SystemTimeCheckMessage": "Järjestelmän aika on ainakin vuorokauden pielessä, eivätkä ajoitetut tehtävät toimi oikein ennen kuin se on korjattu.", + "UnableToLoadInteractiveSearch": "Tämän albumihaun tulosten lataus epäonnistui. Yritä myöhemmin uudelleen.", "AutoTaggingRequiredHelpText": "Tämän \"{implementationName}\" -ehdon on täsmättävä automaattimerkinnän säännön käyttämiseksi. Muutoin yksittäinen \"{implementationName}\" -vastaavuus riittää.", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana", "Connection": "Yhteys", "Large": "Suuri", - "ManageDownloadClients": "Hallitse lataustyökaluja", + "ManageDownloadClients": "Hallitse latauspalveluita", "AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana", "Table": "Taulukko", "BypassIfAboveCustomFormatScoreHelpText": "Käytä ohitusta, kun julkaisun pisteytys on määritetyn mukautetun muodon vähimmäispisteytystä korkeampi.", @@ -1009,27 +1009,27 @@ "ManageImportLists": "Tuontilistojen hallinta", "SelectReleaseGroup": "Aseta julkaisuryhmä", "InvalidUILanguage": "Käytöliittymän kielivalinta on virheellinen. Korjaa se ja tallenna asetukset.", - "HealthMessagesInfoBox": "Saat lisätietoja näiden vakausviestien syistä painamalla rivin lopussa olevaa wikilinkkiä (kirjakuvake) tai tarkastelemalla [lokitietoja]({link}). Mikäli kohtaat ongelmia näiden viestien tulkinnassa, tavoitat tukemme alla olevilla linkkeillä.", + "HealthMessagesInfoBox": "Saat lisätietoja näiden vakausviestien syistä painamalla rivin lopussa olevaa wikilinkkiä (kirjakuvake) tai tarkastelemalla [lokitietoja]({link}). Mikäli et osaa tulkita näitä viestejä, tavoitat tukemme alla olevilla linkeillä.", "ManageLists": "Listojen hallunta", "PasswordConfirmation": "Salasanan vahvistus", "QueueFilterHasNoItems": "Mikään kohde ei vastaa valittua jonon suodatinta", "EditSelectedImportLists": "Muokkaa valittuja tuontilistoja", - "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti vaikka epäonnistunut julkaisu oli kaapattu manuaalihaun tuloksista.", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi ja lataa uusi vastaava julkaisu, kun epäonnistunut lataus on valittu manuaalihaun tuloksista.", "IgnoreDownload": "Ohita lataus", "IgnoreDownloadHint": "Estää {appName}ia käsittelemästä tätä latausta jatkossa.", "IgnoreDownloads": "Ohita lataukset", "IgnoreDownloadsHint": "Estää {appName}ia käsittelemästä näitä latauksia jatkossa.", "ListRefreshInterval": "Listan päivityksen ajoitus", "IndexerSettingsRejectBlocklistedTorrentHashes": "Hylkää estetyt torrent-hajautusarvot kaapattaessa", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Jos torrent on estetty hajautusarvon perusteella sitä ei välttämättä hylätä oikein etsittäessä joiltakin tietolähteiltä RSS-syötteen tai haun välityksellä. Tämä mahdollistaa tällaisten torrentien hylkäämisen kaappauksen jälkeen, mutta ennen välitystä lataustyökalulle.", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Jos torrent on estetty hajautusarvon perusteella sitä ei välttämättä hylätä oikein joidenkin tietolähteiden RSS-syötteestä tai hausta. Tämän käyttöönotto mahdollistaa tällaisten torrentien hylkäämisen kaappauksen jälkeen, kuitenkin ennen kuin niitä välitetään latauspalvelulle.", "ListWillRefreshEveryInterp": "Lista päivitetään {0} välein", "NoImportListsFound": "Tuotilistoja ei löytynyt", "ManageClients": "Hallitse työkaluja", "CustomFormatsSpecificationRegularExpressionHelpText": "Mukautetun muodon säännöllisen lausekkeen kirjainkokoa ei huomioida.", - "DownloadClientPriorityHelpText": "Lautaustyökalujen painotus, 1– 50 (korkein-alin). Oletusarvo on 1 ja tasaveroiset erotetaan Round-Robin-tekniikalla.", - "SkipRedownloadHelpText": "Estää {appName}ia lataamasta vaihtoehtoisia julkaisuja poistetuille kohteille.", + "DownloadClientPriorityHelpText": "Useiden latauspalveluiden painotus, 1–50 (korkein-alin). Oletusarvo on 1 ja tasaveroiset erotetaan Round-Robin-tekniikalla.", + "SkipRedownloadHelpText": "Estää {appName}ia lataamasta kohteille vaihtoehtoisia julkaisuja.", "BypassIfHighestQuality": "Ohita, jos korkein laatu", - "RemoveQueueItemRemovalMethodHelpTextWarning": "\"Poista lataustyökalusta\" poistaa latauksen ja sen tiedostot.", + "RemoveQueueItemRemovalMethodHelpTextWarning": "\"Poista latauspalvelusta\" poistaa latauksen ja sen tiedostot.", "UpdateFiltered": "Päivitä suodatetut", "BlocklistAndSearch": "Estolista ja haku", "BlocklistAndSearchHint": "Etsi korvaavaa kohdetta kun kohde lisätään estolistalle.", @@ -1042,10 +1042,10 @@ "Deceased": "Kuollut", "DoNotBlocklist": "Älä estä", "DoNotBlocklistHint": "Poista lisäämättä estolistalle.", - "RemoveFromDownloadClientHint": "Poistaa latauksen ja ladatut tiedostot lataustyökalusta.", - "RemoveMultipleFromDownloadClientHint": "Poistaa latauksen ja ladatut tiedostot lataustyökalusta.", + "RemoveFromDownloadClientHint": "Poistaa latauksen ja tiedostot latauspalvelusta.", + "RemoveMultipleFromDownloadClientHint": "Poistaa lataukset ja tiedostot latauspalvelusta.", "RemoveQueueItemRemovalMethod": "Poistotapa", - "RemoveQueueItemsRemovalMethodHelpTextWarning": "\"Poista lataustyökalusta\" poistaa lataukset ja niiden tiedostot.", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "\"Poista latauspalvelusta\" poistaa lataukset ja niiden tiedostot.", "ThereWasAnErrorLoadingThisItem": "Virhe ladattaessa kohdetta", "ThereWasAnErrorLoadingThisPage": "Virhe ladattaessa sivua", "FilterAlbumPlaceholder": "Suodata albumeja", @@ -1059,10 +1059,10 @@ "RemotePathMappingCheckFileRemoved": "Tiedosto \"{0}\" poistettiin kesken käsittelyn.", "AddListExclusionHelpText": "Estä {appName}ia lisäämästä esittäjää listoilta.", "ArtistsEditRootFolderHelpText": "Siirtämällä esittäjät samaan juurikansioon voidaan niiden kansioiden nimet päivittää vastaamaan päivittynyttä nimikettä tai nimeämiskaavaa.", - "DownloadClientAriaSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.", + "DownloadClientAriaSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Aria2:n oletusta jättämällä tyhjäksi.", "DeleteArtistFoldersHelpText": "Poista esittäjäkansiot ja niiden kaikki sisältö.", - "ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi lataustyökalun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.", - "ChangeCategoryMultipleHint": "Vaihtaa latausten kategoriaksi lataustyökalun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.", + "ChangeCategoryHint": "Vaihtaa latauksen kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.", + "ChangeCategoryMultipleHint": "Vaihtaa latausten kategoriaksi latauspalvelun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.", "AutoRedownloadFailedFromInteractiveSearch": "Uudelleenlataus manuaalihaun tuloksista epäonnistui", "ImportListRootFolderMissingRootHealthCheckMessage": "Tuontilistalta tai -listoilta puuttuu juurikansio: {0}.", "HiddenClickToShow": "Piilotettu, näytä painamalla tästä", @@ -1074,7 +1074,7 @@ "FailedToLoadQueue": "Jonon lataus epäonnistui", "NoMissingItems": "Puuttuvia kohteita ei ole.", "SpecificMonitoringOptionHelpText": "Valvo esittäjiä, mutta vain erikseen listalle lisättyjä albumeita.", - "UnableToLoadCustomFormats": "Virhe ladattaessa mukautettuja muotoja", + "UnableToLoadCustomFormats": "Mukautettujen muotojen lataus epäonnistui", "Customformat": "Mukautettu muoto", "ExportCustomFormat": "Vie mukautettu muoto", "MountArtistHealthCheckMessage": "Kohteen sijainnin sisältävä media on kytketty vain luku -tilassa: ", @@ -1099,21 +1099,21 @@ "SupportedAutoTaggingProperties": "{appName} tukee automaattimerkinnän säännöissä seuraavia arvoja", "RemoveSelectedItemBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?", "ResetDefinitions": "Palauta määritykset", - "NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä.", - "ClickToChangeIndexerFlags": "Vaihda tietolähteen lippuja painamalla tästä", + "NotificationsSettingsUseSslHelpText": "Muodosta yhteys palveluun {serviceName} SSL-protokollan välityksellä.", + "ClickToChangeIndexerFlags": "Muuta tietolähteen lippuja painamalla tästä", "CustomFormatsSpecificationFlag": "Lippu", "SelectIndexerFlags": "Valitse tietolähteen liput", "SetIndexerFlags": "Aseta tietolähteen liput", - "CustomFilter": "Oma suodatin", + "CustomFilter": "Mukautettu suodatin", "LabelIsRequired": "Nimi on pakollinen", - "ImportList": "Lista", - "CountImportListsSelected": "{selectedCount} esittäjä(ä) on valittu", - "DeleteArtistFolder": "Poista esittäjäkansiot", + "ImportList": "Tuontilista", + "CountImportListsSelected": "{selectedCount} tuontilista(a) on valittu", + "DeleteArtistFolder": "Poista esittäjäkansio", "FormatAgeMinutes": "minuuttia", "IndexerFlags": "Tietolähteen liput", "Logout": "Kirjaudu ulos", - "NotificationsEmbySettingsSendNotifications": "Lähetä ilmoitukset", - "NotificationsEmbySettingsSendNotificationsHelpText": "Ohjeista palvelinta välittämään ilmoitukset sen määritettyihin kohteisiin.", + "NotificationsEmbySettingsSendNotifications": "Lähetä ilmoituksia", + "NotificationsEmbySettingsSendNotificationsHelpText": "Ohjeista Embyä ilmoittamaan myös siihen kytketyille palveluille.", "NotificationsKodiSettingAlwaysUpdateHelpText": "Määrittää päivitetäänkö kirjasto myös videotoiston aikana.", "NotificationsKodiSettingsGuiNotification": "Ilmoita käyttöliittymässä", "NotificationsPlexSettingsAuthToken": "Todennustunniste", @@ -1121,9 +1121,9 @@ "NotificationsSettingsUpdateMapPathsFrom": "Kohdista sijainnit lähteeseen", "NotificationsSettingsUpdateMapPathsTo": "Kohdista sijainnit kohteeseen", "Rejections": "Hylkäykset", - "RemoveQueueItem": "Poistetaan - {sourceTitle}", + "RemoveQueueItem": "Poistetaan – {sourceTitle}", "Uppercase": "Isot kirjaimet", - "PreferUsenet": "Mieluummin Usenet", + "PreferUsenet": "Suosi Usenetiä", "AppUpdated": "{appName} on päivitetty", "InteractiveSearchModalHeader": "Manuaalihaku", "Lowercase": "Pienet kirjaimet", @@ -1131,72 +1131,72 @@ "TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.", "Tomorrow": "Huomenna", "DefaultCase": "Oletusarvoinen kirjainkoko", - "DeleteArtistFolderHelpText": "Poista elokuvakansio ja sen sisältö", + "DeleteArtistFolderHelpText": "Poista esittäjäkansio ja sen sisältö", "MonitorAllAlbums": "Kaikki albumit", "MonitorNewAlbums": "Uudet albumit", "MonitorExistingAlbums": "Olemassa olevat albumit", - "NoLimitForAnyDuration": "Ei toistoajan rajoitusta", + "NoLimitForAnyDuration": "Ei toistoaikojen rajoituksia", "SuggestTranslationChange": "Ehdota käännösmuutosta", "Loading": "Ladataan", "ApplyTagsHelpTextHowToApplyArtists": "Tunnisteisiin kohdistettavat toimenpiteet:", - "CouldntFindAnyResultsForTerm": "Haku '{0}' ei tuottanut tuloksia.", + "CouldntFindAnyResultsForTerm": "Haku \"{0}\" ei tuottanut tuloksia.", "ImportListStatusCheckAllClientMessage": "Mitkään listat eivät ole virheiden vuoksi käytettävissä", - "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Uuden elokuvan lisäys on helppoa. Aloita vain haluamasi elokuvan nimen kirjoitus.", - "IndexerLongTermStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi", - "NoMinimumForAnyDuration": "Ei toistoajan vähimmäiskestoa", + "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Uuden esittäjän lisääminen on helppoa. Aloita vain haluamasi esittäjän nimen kirjoittaminen.", + "IndexerLongTermStatusCheckAllClientMessage": "Mikään tietolähde ei ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", + "NoMinimumForAnyDuration": "Ei toistoaikojen vähimmäiskestoja", "RemoveQueueItemConfirmation": "Haluatko varmasti poistaa kohteen \"{sourceTitle}\" jonosta?", - "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}", + "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole virheiden vuoksi käytettävissä: {0}", "AutoTaggingSpecificationTag": "Tunniste", - "DashOrSpaceDashDependingOnName": "Yhdysmerkki tai välilyönti nimen perusteella", - "DownloadClientsSettingsSummary": "Lataustyökalut, latausten käsittely ja etäsijaintien kohdistukset.", - "IndexerSearchCheckNoAvailableIndexersMessage": "Haussa käytettävät tietolähteet eivät ole käytettävissä hiljattaisten virheiden vuoksi", + "DashOrSpaceDashDependingOnName": "\"Yhdysmerkki\" tai \"Välilyönti Yhdysmerkki\" nimen perusteella.", + "DownloadClientsSettingsSummary": "Latauspalvelut, latausten käsittely ja etäsijaintien kohdistukset.", + "IndexerSearchCheckNoAvailableIndexersMessage": "Hakua tukevat tietolähteet eivät ole hiljattaisten tietolähdevirheiden vuoksi tilapaisesti käytettävissä.", "NotificationsEmbySettingsUpdateLibraryHelpText": "Määrittää päivitetäänkö palvelimen kirjasto tuonnin, uudelleennimeämisen tai poiston yhteydessä.", "NotificationsKodiSettingAlwaysUpdate": "Päivitä aina", - "OrganizeSelectedArtists": "Järjestele valittu sarja", + "OrganizeSelectedArtists": "Järjestele valitut esittäjät", "MonitoredStatus": "Valvottu/tila", - "FileNameTokens": "Tiedostonimen muuttujat", + "FileNameTokens": "Tiedostonimimuuttujat", "FormatDateTime": "{formattedDate} {formattedTime}", "FormatRuntimeHours": "{hours} t", "FormatRuntimeMinutes": "{minutes} m", - "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} ei tunnista mihin sarjalle ja jaksolle julkaisu kuuluu, eikä sen automaattinen tuonti onnistu. Haluatko kaapata julkaisun \"{title}\"?", - "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} ei tunnistanut julkaisun esittäjää ja albumia, eikä sen vuoksi voi tuoda sitä automaattisesti. Haluatko kaapata julkaisun \"{title}\"?", + "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-sijainti, jonka perusteella esittäjien sijainteja muutetaan kun {serviceName} näkemä kirjastosijainti poikkeaa {appName}in sijainnista (vaatii \"Päivitä kirjasto\" -asetuksen).", "NotificationsKodiSettingsCleanLibraryHelpText": "Siivoa kirjasto päivityksen jälkeen.", "NotificationsKodiSettingsDisplayTime": "Näytä aika", - "NotificationsKodiSettingsUpdateLibraryHelpText": "Määrittää päivitetäänkö Kodin kirjasto tuonnin tai uudelleennimeämisen yhteydessä.", - "NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv-tunnistautuminen", - "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).", + "NotificationsKodiSettingsUpdateLibraryHelpText": "Määrittää päivitetäänkö Kodin kirjasto tuonnin ja uudelleennimeämisen yhteydessä.", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "Tunnistaudu Plexillä", + "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-sijainti, jonka perusteella esittäjien sijainteja muutetaan kun {serviceName} näkemä kirjastosijainti poikkeaa {appName}in sijainnista (vaatii \"Päivitä kirjasto\" -asetuksen).", "QualitiesHelpText": "Listalla ylempänä olevia laatuja painotetaan enemmän vaikkei niitä ole valittu. Samoissa ryhmissä olevat laadut ovat tasaveroisia. Valitse vain halutut laadut.", "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", - "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", + "UrlBaseHelpText": "Käänteisen välityspalvelimen tukea varten. Oletusarvo on tyhjä.", "ImportListStatusCheckSingleClientMessage": "Listat eivät ole virheiden vuoksi käytettävissä: {0}", - "IndexerRssHealthCheckNoAvailableIndexers": "RSS-syötteissä käytettävät tietolähteet eivät ole käytettävissä hiljattaisten virheiden vuoksi", + "IndexerRssHealthCheckNoAvailableIndexers": "RSS-syötteitä tukevat tietolähteet eivät ole hiljattaisten tietolähdevirheiden vuoksi tilapaisesti käytettävissä.", "IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", - "MassSearchCancelWarning": "Tätä ei ole mahdollista pysäyttää kuin käynnistämällä {appName}ia uudelleen tai poistamalla kaikki tietolähteet käytöstä.", - "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Haluatko varmasti etsiä kaikkia {totalRecords} katkaisutasoa saavuttamattomia jaksoja?", + "MassSearchCancelWarning": "Tämä on mahdollista keskeyttää vain käynnistämällä {appName} uudelleen tai poistamalla kaikki tietolähteet käytöstä.", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Haluatko varmasti etsiä kaikkia {totalRecords} albumia, joiden katkaisutasoa ei ole saavutettu?", "MonitorNoAlbums": "Ei mitään", - "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.", - "IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi.", + "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.", + "IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi.", "NotificationsKodiSettingsCleanLibrary": "Siivoa kirjasto", - "AddNewArtistSearchForMissingAlbums": "Käynnistä puuttuvan elokuvan haku", - "ConnectSettingsSummary": "Ilmoitukset, kuten viestintä mediapalvelimille ja soittimille, sekä omat komentosarjat.", + "AddNewArtistSearchForMissingAlbums": "Käynnistä puuttuvien albumien haku", + "ConnectSettingsSummary": "Yhteydet ilmoituspalveluihin, mediapalvelimiin ja soittimiin, sekä mukautetut komentosarjat.", "CustomFormatsSettings": "Mukautettujen muotojen asetukset", "CustomFormatsSettingsSummary": "Mukautetut muodot ja niiden asetukset.", "Donate": "Lahjoita", "GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjätunnus ja salasana, välityspalvelin, analytiikka ja päivitykset.", "QualitySettingsSummary": "Laatukoot ja nimeäminen", - "PreferTorrent": "Mieluummin Torrent", - "CountArtistsSelected": "{count} tuotilistaa on valittu", - "AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.", + "PreferTorrent": "Suosi torrentia", + "CountArtistsSelected": "{count} esittäjä(ä) on valittu", + "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ä.", "Auto": "Automaattinen", "CustomFormatRequiredHelpText": "Tämän \"{0}\" -ehdon on täsmättävä mukautetun muodon käyttämiseksi. Muutoin riittää yksi \"{0}\" -vastaavuus.", - "DeleteArtistFolderCountConfirmation": "Haluatko varmasti poistaa {count} valittua sarjaa?", - "DeleteArtistFolderCountWithFilesConfirmation": "Haluatko varmasti poistaa {count} valittua sarjaa ja niiden kaiken sisällön?", - "ReleaseProfile": "Julkaisuprofiilit", + "DeleteArtistFolderCountConfirmation": "Haluatko varmasti poistaa {count} valittua esittäjää?", + "DeleteArtistFolderCountWithFilesConfirmation": "Haluatko varmasti poistaa {count} valittua esittäjää ja niiden kaiken sisällön?", + "ReleaseProfile": "Julkaisuprofiili", "IncludeHealthWarnings": "Sisällytä kuntovaroitukset", - "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} tukee useita listoja, joilta sarjoja voidaan tuoda tietokantaan.", + "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} tukee useita listoja, joiden avulla esittäjiä ja albumeita voidaan tuoda tietokantaan.", "Priority": "Painotus", - "AlbumsLoadError": "Varmuuskopioiden lataus epäonnistui", - "ArtistIsUnmonitored": "Kirjailijaa ei valvota", + "AlbumsLoadError": "Albumien lataus epäonnistui", + "ArtistIsUnmonitored": "Esittäjää ei valvota", "FormatAgeDay": "päivä", "FormatAgeDays": "päivää", "FormatAgeHour": "tunti", @@ -1207,11 +1207,11 @@ "FormatShortTimeSpanSeconds": "{seconds} sekunti(a)", "FormatTimeSpanDays": "{days} pv {time}", "IndexersSettingsSummary": "Tietolähteet ja niiden asetukset.", - "ImportListsSettingsSummary": "Sisällön tuonti muista {appName}-instansseista tai Trakt-listoilta, ja listapoikkeusten hallinta.", - "ImportMechanismHealthCheckMessage": "Käytä valmiiden latausten käsittelyä", + "ImportListsSettingsSummary": "Sisällön tuonti muista {appName}-instansseista tai palveluista, ja poikkeuslistojen hallinta.", + "ImportMechanismHealthCheckMessage": "Käytä valmistuneiden latausten käsittelyä", "KeyboardShortcuts": "Pikanäppäimet", - "MediaManagementSettingsSummary": "Tiedostojen nimeämisen, hallinnan ja juurikansioiden asetukset.", - "MetadataSettingsArtistSummary": "Luo metatietotiedostot kun kirjoja tuodaan tai kirjailijoiden tietoja päivitetään.", + "MediaManagementSettingsSummary": "Tiedostojen nimeämis- ja hallinta-asetukset, sekä kirjaston juurikansiot.", + "MetadataSettingsArtistSummary": "Luo metatietotiedostot kun kappaleita tuodaan tai esittäjien tietoja päivitetään.", "MonitorFirstAlbum": "Ensimmäinen albumi", "MonitorFutureAlbums": "Tulevat albumit", "MonitorLastestAlbum": "Uusin albumi", @@ -1220,39 +1220,39 @@ "UiSettingsSummary": "Kalenterin, päiväyksen ja kellonajan, sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.", "Yesterday": "Eilen", "AddToDownloadQueue": "Lisää latausjonoon", - "AddedToDownloadQueue": "Lisätty latausjonoon", - "ShowNextAlbum": "Näytä viimeinen albumi", + "AddedToDownloadQueue": "Lisättiin latausjonoon", + "ShowNextAlbum": "Näytä seuraava albumi", "Unlimited": "Rajoittamaton", "ArtistIndexFooterDownloading": "Ladataan", "UseSsl": "Käytä SSL-salausta", - "DeleteSelectedArtists": "Poista valittu esittäjä", + "DeleteSelectedArtists": "Poista valitut esittäjät", "Links": "Linkit", - "IndexerJackettAll": "Jackettin ei-tuettua 'all'-päätettä käyttävät tietolähteet: {0}", + "IndexerJackettAll": "Jackettin ei-tuettua \"all\"-päätettä käyttävät tietolähteet: {0}", "AutomaticSearch": "Automaattihaku", - "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", - "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.", - "ConnectionSettingsUrlBaseHelpText": "Lisää etuliite lataustuökalun {clientName} URL-osoitteeseen, kuten {url}.", - "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.", - "DownloadClientDelugeSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.", + "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen ({0}) IP-osoitteen selvitys epäonnistui.", + "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. {appName} käyttää edelleen kaikkia käytössä olevia tietolähteitä RSS-synkronointiin ja hakuun.", + "ConnectionSettingsUrlBaseHelpText": "Lisää palvelimen {connectionName} URL-osoitteeseen etuliitteen, esim. \"{url}\".", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Vaihtoehtoinen sijainti, johon valmistuneet lataukset siirretään. Käytä Delugen oletusta jättämällä tyhjäksi.", + "DownloadClientDelugeSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Delugen oletusta jättämällä tyhjäksi.", "IndexerSettingsSeedRatio": "Jakosuhde", "IndexerSettingsSeedTime": "Jakoaika", - "ArtistIsMonitored": "Kirjailijaa ei valvota", + "ArtistIsMonitored": "Esittäjää valvotaan", "False": "Epätosi", "Parse": "Jäsennä", "ParseModalErrorParsing": "Virhe jäsennettäessä. Yritä uudelleen.", - "ParseModalHelpText": "Syötä julkaisunimike yllä olevaan kenttään.", - "ParseModalHelpTextDetails": "{appName} pyrkii jäsentämään nimikkeen ja näyttämään sen tiedot.", + "ParseModalHelpText": "Syötä julkaisun nimi yllä olevaan kenttään.", + "ParseModalHelpTextDetails": "{appName} pyrkii jäsentämään nimen ja näyttämään sen tiedot.", "ParseModalUnableToParse": "Annetun nimikkeen jäsennys ei onnistunut. Yritä uudelleen.", "Repack": "Uudelleenpaketoitu", "TestParsing": "Testaa jäsennystä", "True": "Tosi", - "Any": "Mikä vain", + "Any": "Mikä tahansa", "BuiltIn": "Sisäänrakennettu", - "Script": "Skripti", - "DeleteSelectedCustomFormats": "Poista mukautettu muoto", - "DeleteSelectedCustomFormatsMessageText": "Haluatko varmasti poistaa valitut {count} tuontilistaa?", - "IncludeCustomFormatWhenRenaming": "Sisällytä mukautetut muodot uudelleennimetessä", - "IndexerSettingsApiUrl": "Rajapinnan URL-osoite", + "Script": "Komentosarja", + "DeleteSelectedCustomFormats": "Poista mukautetut muodot", + "DeleteSelectedCustomFormatsMessageText": "Haluatko varmasti poistaa valitut {count} mukautettua muotoa?", + "IncludeCustomFormatWhenRenaming": "Sisällytä mukautetut muodot uudelleennimettäessä", + "IndexerSettingsApiUrl": "Rajapinnan URL", "IndexerSettingsApiUrlHelpText": "Älä muuta tätä, jos et tiedä mitä teet, koska rajapinta-avaimesi lähetetään kyseiselle palvelimelle.", "AptUpdater": "Asenna päivitys APT-työkalun avulla", "DockerUpdater": "Hanki päivitys päivittämällä Docker-säiliö", @@ -1264,9 +1264,87 @@ "UpdateAppDirectlyLoadError": "{appName}ia ei voida päivittää suoraan,", "AddDelayProfileError": "Virhe lisättäessä viiveporofiilia. Yritä uudelleen.", "ImportListTagsHelpText": "Tunnisteet, joilla tältä tuontilistalta lisätyt kohteet merkitään.", - "Min": "Alin", - "Preferred": "Tavoite", - "Max": "Korkein", + "Min": "Pienin", + "Preferred": "Suosittu", + "Max": "Suurin", "Today": "Tänään", - "MappedNetworkDrivesWindowsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja [UKK:sta]({url})." + "MappedNetworkDrivesWindowsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta ({url}).", + "DownloadClientSettingsOlderPriority": "Vanhojen painotus", + "DownloadClientSettingsPostImportCategoryHelpText": "Kategoria, jonka {appName} asettaa tuonnin jälkeen. {appName} ei poista tämän kategorian torrenteja vaikka jakaminen olisi päättynyt. Säilytä alkuperäinen kategoria jättämällä tyhjäksi.", + "DownloadClientSettingsRecentPriority": "Uusien painotus", + "PostImportCategory": "Tuonnin jälkeinen kategoria", + "ShowNextAlbumHelpText": "Näytä seuraava albumi julisteen alla.", + "DownloadClientDelugeSettingsDirectory": "Latauskansio", + "InteractiveSearchModalHeaderTitle": "Manuaalihaku – {title}", + "CustomFormatsSettingsTriggerInfo": "Mukautettua muotoa sovelletaan julkaisuun tai tiedostoon, kun ainakin yksi valituista ehtotyypeistä täsmää.", + "NotificationsTelegramSettingsIncludeAppName": "Sisällytä {appName} otsikkoon", + "DownloadClientDelugeSettingsDirectoryCompleted": "Kansio, johon valmistuneet siirretään", + "EditSelectedCustomFormats": "Muokkaa valittuja mukautettuja muotoja", + "Install": "Asenna", + "SmartReplace": "Älykäs korvaus", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Yli 14 päivää sitten julkaistujen albumien kaappauksille käytettävä painotus.", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "14 päivän sisällä julkaistujen albumien kaappauksille käytettävä painotus.", + "InstallMajorVersionUpdate": "Asenna päivitys", + "InstallMajorVersionUpdateMessage": "Tämä päivitys asentaa uuden pääversion, joka ei välttämättä ole yhteensopiva laitteistosi kanssa. Haluatko varmasti asentaa päivityksen?", + "InstallMajorVersionUpdateMessageLink": "Saat lisätietoja osoitteesta [{domain}]({url}).", + "LogSizeLimit": "Lokin kokorajoitus", + "LogSizeLimitHelpText": "Lokitiedoston enimmäiskoko ennen pakkausta. Oletusarvo on 1 Mt.", + "ManageCustomFormats": "Hallitse mukautettuja muotoja", + "ManageFormats": "Hallitse muotoja", + "NoCustomFormatsFound": "Mukautettuja muotoja ei löytynyt", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Ilmoitukset voidaan tarvittaessa erottaa muista sovelluksista lisäämällä niiden eteen \"{appName}\".", + "SkipFreeSpaceCheckHelpText": "Käytä, kun {appName} ei kykene tunnistamaan juurikansiosi käytettävissä olevaa vapaata tallennustilaa.", + "CountCustomFormatsSelected": "{count} mukautettu(a) muoto(a) on valittu", + "LastSearched": "Edellinen haku", + "Total": "Kaikkiaan", + "WithFiles": "Tiedostoineen", + "BannerOptions": "Bannerinäkymän asetukset", + "AllowFingerprintingHelpTextWarning": "Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvattaa levyn tai verkon kuormitusta tarkistusten aikana.", + "EmbedCoverArtHelpText": "Sisällytä Lidarrin albumikuvitukset äänitiedostoihin kun niiden tagit tallennetaan.", + "ForeignId": "Vieras ID", + "MonitorAlbum": "Valvo albumia", + "AddNewArtist": "Lisää uusi esittäjä", + "DownloadedWaitingToImport": "Ladattu – Odottaa tuontia", + "ArtistProgressBarText": "{trackFileCount}/{trackCount} (kaikkiaan: {totalTrackCount}, latauksessa: {downloadingCount})", + "DownloadedImporting": "Ladattu – Tuodaan", + "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Jos et lisää tuontillistapoikkeusta ja esittäjän metatietoprofiili on muu kuin \"Ei mitään\", saatetaan albumi lisätä uudelleen kun esittäjä seuraavan kerran päivitetään.", + "MatchedToArtist": "Kohdistettu esittäjään", + "TrackFileRenamedTooltip": "Kappaletiedosto nimettiin uudelleen", + "TrackFileTagsUpdatedTooltip": "Kappaletiedoston tagit päivitettiin", + "OneAlbum": "1 albumi", + "MonitorNoNewAlbums": "Uusia albumeita ei ole", + "NoAlbums": "Albumeita ei ole", + "OnTrackRetag": "Kun kappaleen tagit muuttuvat", + "DeleteFormat": "Poista muoto", + "EmbedCoverArtInAudioFiles": "Sisällytä kuvat äänitiedostoihin", + "OnArtistAdd": "Kun esittäjä lisätään", + "OnArtistDelete": "Kun esittäjä poistetaan", + "PreviewRetag": "Esikatsele tagimuutoksia", + "AddAlbumWithTitle": "Lisää {albumTitle}", + "AddArtistWithName": "Lisää {artistName}", + "RetagSelectedArtists": "Päivitä valittujen esittäjien tagit", + "TrackFileDeletedTooltip": "Kappaletiedosto poistettiin", + "TrackFiles": "Kappaletiedostot", + "OnAlbumDelete": "Kun albumi poistetaan", + "DownloadPropersAndRepacksHelpTexts2": "\"Älä suosi\" käyttää Proper-/Repack-julkaisujen sijaan haluttua sanapisteytystä.", + "EditSelectedArtists": "Muokkaa valittuja esittäjiä", + "ICalTagsArtistHelpText": "Syöte sisältää vain vähintään yhdellä täsmäävällä tunnisteella merkityt esittäjät.", + "MatchedToAlbums": "Täsmätty albumeihin", + "NoTracksInThisMedium": "Kappaleita ei ole tässä muodossa", + "ReleaseProfileTagArtistHelpText": "Julkaisuprofiileja sovelletaan esittäjiin, jotka on merkitty ainakin yhdellä täsmäävällä tunnisteella. Käytä kaikille esittäjille jättämällä tyhjäksi.", + "TrackFileMissingTooltip": "Kappaletiedosto puuttuu", + "TrackFilesLoadError": "Kappaletiedostojen lataus epäonnistui", + "AddNewAlbum": "Lisää uusi albumi", + "AddNewAlbumSearchForNewAlbum": "Käynnistä uusien albumien haku", + "AlbumCount": "Abumien määrä", + "AlbumDetails": "Albumin tiedot", + "AlbumInfo": "Albumin tiedot", + "AnchorTooltip": "Tämä tiedosto on jo kirjastossasi julkaisussa, jota olet juuri tuomassa.", + "ArtistMonitoring": "Esittäjän valvonta", + "Banners": "Bannerit", + "CountAlbums": "{albumCount} albumia", + "DefaultDelayProfileArtist": "Tämä on oletusprofiili, joka pätee kaikkii esittäjiin, joille ei ole erikseen määritetty profiilia.", + "DelayProfileArtistTagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille.", + "Disambiguation": "Yksinkertaistaminen", + "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index f3aa8abf2..a6fb5b43c 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -301,7 +301,7 @@ "ShownAboveEachColumnWhenWeekIsTheActiveView": "Affiché au dessus de chaque colonne quand \"Semaine\" est l'affichage actif", "ShowPath": "Afficher le chemin", "ShowQualityProfile": "Afficher le profil de qualité", - "ShowQualityProfileHelpText": "Afficher le profil de qualité sous l'affiche", + "ShowQualityProfileHelpText": "Affiche le profil de qualité sous l'affiche", "ShowRelativeDates": "Afficher les dates relatives", "ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/Hier/etc) ou absolues", "ShowSearch": "Afficher la recherche", @@ -441,8 +441,8 @@ "ShortDateFormat": "Format de date courte", "ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte", "ShowDateAdded": "Afficher la date d'ajout", - "ShowMonitored": "Afficher le chemin", - "ShowMonitoredHelpText": "Afficher l'état de surveillance sous le poster", + "ShowMonitored": "Afficher l'état de surveillance", + "ShowMonitoredHelpText": "Affiche l'état de surveillance sous le poster", "Size": " Taille", "SkipFreeSpaceCheck": "Ignorer la vérification de l'espace libre", "SorryThatAlbumCannotBeFound": "Désolé, ce film est introuvable.", @@ -1334,5 +1334,9 @@ "Min": "Min", "Preferred": "Préféré", "Today": "Aujourd'hui", - "MappedNetworkDrivesWindowsService": "Les lecteurs réseau mappés ne sont pas disponibles lors de l'exécution en tant que service Windows, consultez la [FAQ]({url}) pour plus d'informations." + "MappedNetworkDrivesWindowsService": "Les lecteurs réseau mappés ne sont pas disponibles lors de l'exécution en tant que service Windows, consultez la [FAQ]({url}) pour plus d'informations.", + "DownloadClientSettingsOlderPriority": "Priorité plus ancienne", + "DownloadClientSettingsPostImportCategoryHelpText": "Catégorie que {appName} doit définir après avoir importé le téléchargement. {appName} ne supprimera pas les torrents de cette catégorie même si l'ensemencement est terminé. Laisser vide pour conserver la même catégorie.", + "DownloadClientSettingsRecentPriority": "Priorité récente", + "PostImportCategory": "Catégorie après l'importation" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 4de044452..5a5885200 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -796,5 +796,6 @@ "Max": "מקסימום", "Min": "דקה", "Preferred": "מועדף", - "MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף" + "MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף", + "DownloadClientSettingsRecentPriority": "עדיפות לקוח" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 748b2585a..bf15aee60 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -752,5 +752,6 @@ "Min": "मिनट", "Preferred": "पसंदीदा", "Today": "आज", - "MappedNetworkDrivesWindowsService": "विंडोज सर्विस के रूप में चलने पर मैप्ड नेटवर्क ड्राइव उपलब्ध नहीं हैं। अधिक जानकारी के लिए कृपया FAQ देखें" + "MappedNetworkDrivesWindowsService": "विंडोज सर्विस के रूप में चलने पर मैप्ड नेटवर्क ड्राइव उपलब्ध नहीं हैं। अधिक जानकारी के लिए कृपया FAQ देखें", + "DownloadClientSettingsRecentPriority": "ग्राहक प्राथमिकता" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index 9a6cab200..d2dd93826 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -306,5 +306,6 @@ "Clone": "Zatvori", "DeleteSelectedTrackFilesMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?", "AddDelayProfileError": "Neuspješno dodavanje profila odgode, molimo pokušaj ponovno.", - "Today": "Danas" + "Today": "Danas", + "DownloadClientSettingsRecentPriority": "Prioritet Klijenata" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index d0d3dbb87..58c4efa7f 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -1226,5 +1226,8 @@ "Max": "Max", "Min": "Min", "Preferred": "Előnyben részesített", - "Today": "Ma" + "Today": "Ma", + "DownloadClientSettingsOlderPriority": "Régebbi prioritás", + "DownloadClientSettingsRecentPriority": "Legutóbbi prioritás", + "PostImportCategory": "Import utáni kategória" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 6d99043e0..c6e686ea2 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -753,5 +753,6 @@ "Min": "Mín", "Preferred": "Æskilegt", "Today": "Í dag", - "MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar" + "MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar", + "DownloadClientSettingsRecentPriority": "Forgangur viðskiptavinar" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index d775c91ef..e7758d439 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -1046,5 +1046,6 @@ "Max": "Massimo", "Min": "Min", "Today": "Oggi", - "MappedNetworkDrivesWindowsService": "Le unità di rete mappate non sono disponibili eseguendo come servizio di Windows. Vedere le FAQ per maggiori informazioni" + "MappedNetworkDrivesWindowsService": "Le unità di rete mappate non sono disponibili eseguendo come servizio di Windows. Vedere le FAQ per maggiori informazioni", + "DownloadClientSettingsRecentPriority": "Priorità Client" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 6bcd640ed..345ca116e 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -753,5 +753,6 @@ "Min": "最小", "Preferred": "優先", "Today": "今日", - "MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください" + "MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください", + "DownloadClientSettingsRecentPriority": "クライアントの優先順位" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 9e938390c..6681d82ae 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -744,5 +744,6 @@ "AddImportList": "가져오기 목록 추가", "UpdateAvailableHealthCheckMessage": "새 업데이트 사용 가능: {version}", "Today": "오늘", - "MappedNetworkDrivesWindowsService": "Windows 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다. 자세한 내용은 FAQ를 참조하십시오." + "MappedNetworkDrivesWindowsService": "Windows 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다. 자세한 내용은 FAQ를 참조하십시오.", + "DownloadClientSettingsRecentPriority": "클라이언트 우선 순위" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 8169786a0..a6fff2291 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -276,5 +276,6 @@ "AptUpdater": "Bruk apt til å installere oppdateringen", "Clone": "Lukk", "Reason": "Sesong", - "AddDelayProfileError": "Ikke mulig å legge til ny betingelse, vennligst prøv igjen" + "AddDelayProfileError": "Ikke mulig å legge til ny betingelse, vennligst prøv igjen", + "DownloadClientSettingsRecentPriority": "Klientprioritet" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 1b4b4d5a2..884b68fe7 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -902,5 +902,6 @@ "Today": "Vandaag", "Min": "Min", "Preferred": "Voorkeur gegeven", - "MappedNetworkDrivesWindowsService": "Toegewezen netwerkstation is niet beschikbaar wanneer Prowlarr wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie" + "MappedNetworkDrivesWindowsService": "Toegewezen netwerkstation is niet beschikbaar wanneer Prowlarr wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie", + "DownloadClientSettingsRecentPriority": "Client Prioriteit" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 2e4699389..67fcc1a37 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -852,5 +852,6 @@ "Min": "Min", "Preferred": "Preferowane", "Today": "Dzisiaj", - "MappedNetworkDrivesWindowsService": "Zmapowane dyski sieciowe nie są dostępne, gdy działają jako usługa systemu Windows. Więcej informacji można znaleźć w FAQ" + "MappedNetworkDrivesWindowsService": "Zmapowane dyski sieciowe nie są dostępne, gdy działają jako usługa systemu Windows. Więcej informacji można znaleźć w FAQ", + "DownloadClientSettingsRecentPriority": "Priorytet klienta" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 5db5dd615..becbfd941 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -1023,5 +1023,6 @@ "Min": "Mín.", "Preferred": "Preferido", "Today": "Hoje", - "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Veja as Perguntas mais frequentes para obter mais informações" + "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Veja as Perguntas mais frequentes para obter mais informações", + "DownloadClientSettingsRecentPriority": "Prioridade do cliente" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 3b023698c..7405d800e 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1340,5 +1340,11 @@ "Today": "Hoje", "Max": "Máx.", "Preferred": "Preferido", - "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as [FAQ]({url}) para obter mais informações." + "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as [FAQ]({url}) para obter mais informações.", + "DownloadClientSettingsPostImportCategoryHelpText": "Categoria para o {appName} definir após importar o download. O {appName} não removerá torrents nessa categoria mesmo que a semeadura esteja concluída. Deixe em branco para manter a mesma categoria.", + "DownloadClientSettingsOlderPriority": "Priorizar mais antigos", + "DownloadClientSettingsRecentPriority": "Priorizar recentes", + "PostImportCategory": "Categoria Pós-Importação", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridade para usar ao pegar álbuns lançados há mais de 14 dias", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridade de uso ao adquirir álbuns lançados nos últimos 14 dias" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index ece8c88b4..c090a3fdf 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -798,5 +798,7 @@ "Preferred": "Preferat", "Max": "Max", "Today": "Astăzi", - "MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați [FAQ]({url}) pentru mai multe informații" + "MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați [FAQ]({url}) pentru mai multe informații", + "DownloadClientSettingsRecentPriority": "Prioritate recente", + "DownloadClientSettingsOlderPriority": "Prioritate mai vechi" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index a98be9385..a687c92ca 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -558,7 +558,7 @@ "Test": "Тест", "Title": "Название", "TotalSpace": "Общее сводное место", - "Ui": "Пользовательский интерфейс", + "Ui": "Интерфейс", "UnmappedFilesOnly": "Только несопоставленные файлы", "UnmonitoredOnly": "Только не отслеживаемые", "UpgradesAllowed": "Обновления разрешены", @@ -1084,5 +1084,9 @@ "RegularExpressionsTutorialLink": "Более подробную информацию о регулярных выражениях можно найти [здесь]({url}).", "Today": "Сегодня", "Min": "Минимум", - "MappedNetworkDrivesWindowsService": "Подключенные сетевые диски недоступны при работе в качестве службы Windows. Дополнительную информацию см. в [FAQ]({url})." + "MappedNetworkDrivesWindowsService": "Подключенные сетевые диски недоступны при работе в качестве службы Windows. Дополнительную информацию см. в [FAQ]({url}).", + "DownloadClientSettingsOlderPriority": "Более старый приоритет", + "DownloadClientSettingsPostImportCategoryHelpText": "Категория для приложения {appName}, которую необходимо установить после импорта загрузки. {appName} не удалит торренты в этой категории, даже если раздача завершена. Оставьте пустым, чтобы сохранить ту же категорию.", + "DownloadClientSettingsRecentPriority": "Недавний приоритет", + "PostImportCategory": "Категория после импорта" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 388e4316a..56f223b2a 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -294,5 +294,6 @@ "AptUpdater": "Použiť apt pre inštaláciu aktualizácie", "Clone": "Zatvoriť", "Reason": "Séria", - "AddDelayProfileError": "Nie je možné pridať novú podmienku, skúste to znova." + "AddDelayProfileError": "Nie je možné pridať novú podmienku, skúste to znova.", + "DownloadClientSettingsRecentPriority": "Priorita klienta" } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 9ec355ea1..eab45967f 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -925,5 +925,6 @@ "Min": "Min", "Preferred": "Föredraget", "Today": "Idag", - "MappedNetworkDrivesWindowsService": "Mappade nätverksenheter är inte tillgängliga när de körs som en Windows-tjänst. Se FAQ för mer information" + "MappedNetworkDrivesWindowsService": "Mappade nätverksenheter är inte tillgängliga när de körs som en Windows-tjänst. Se FAQ för mer information", + "DownloadClientSettingsRecentPriority": "Klient prioritet" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 2507257b0..ce352f458 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -750,5 +750,6 @@ "Min": "นาที", "Preferred": "ที่ต้องการ", "Today": "วันนี้", - "MappedNetworkDrivesWindowsService": "ไดรฟ์เครือข่ายที่แมปไม่พร้อมใช้งานเมื่อเรียกใช้เป็นบริการ Windows โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม" + "MappedNetworkDrivesWindowsService": "ไดรฟ์เครือข่ายที่แมปไม่พร้อมใช้งานเมื่อเรียกใช้เป็นบริการ Windows โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม", + "DownloadClientSettingsRecentPriority": "ลำดับความสำคัญของลูกค้า" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 6aef6cf70..4f9063901 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -125,8 +125,8 @@ "DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", "DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?", "DeleteImportListMessageText": "'{name}' listesini silmek istediğinizden emin misiniz?", - "DeleteIndexer": "Dizinleyiciyi Sil", - "DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?", + "DeleteIndexer": "İndeksleyiciyi Sil", + "DeleteIndexerMessageText": "'{name}' indeksleyicisini silmek istediğinizden emin misiniz?", "DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteNotification": "Bildirimi Sil", "DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?", @@ -207,10 +207,10 @@ "Importing": "İçe Aktarma", "IncludeUnknownArtistItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir", "IncludeUnmonitored": "Takip Edilmeyenleri Dahil Et", - "Indexer": "Dizinleyici", - "IndexerPriority": "Dizinleyici Önceliği", - "Indexers": "Dizinleyiciler", - "IndexerSettings": "Dizinleyici Ayarları", + "Indexer": "İndeksleyici", + "IndexerPriority": "İndeksleyici Önceliği", + "Indexers": "İndeksleyiciler", + "IndexerSettings": "İndeksleyici Ayarları", "InteractiveSearch": "Etkileşimli Arama", "Interval": "Periyot", "IsCutoffCutoff": "Ayırmak", @@ -259,10 +259,10 @@ "NoBackupsAreAvailable": "Kullanılabilir yedek yok", "NoHistory": "Tarih yok", "NoLeaveIt": "Hayır, Bırak", - "NoLogFiles": "Log kayıt dosyası henüz yok", + "NoLogFiles": "Log kayıt dosyası henüz oluşturulmadı", "None": "Yok", "NotificationTriggers": "Bildirim Tetikleyicileri", - "NoUpdatesAreAvailable": "Güncelleme yok", + "NoUpdatesAreAvailable": "Güncelleme bulunamadı", "OpenBrowserOnStart": "Başlangıçta tarayıcıyı aç", "Options": "Seçenekler", "Original": "Orijinal", @@ -384,7 +384,7 @@ "Tasks": "Görevler", "TestAll": "Tümünü Test Et", "TestAllClients": "Tüm İstemcileri Test Et", - "TestAllIndexers": "Dizinleyicileri Test Et", + "TestAllIndexers": "İndeksleyicileri Test Et", "TestAllLists": "Tüm Listeleri Test Et", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Bu, tüm dizin oluşturucular için geçerli olacaktır, lütfen onlar tarafından belirlenen kurallara uyun", "Time": "Zaman", @@ -405,7 +405,7 @@ "UiLanguageHelpText": "{appName}'ın arayüz için kullanacağı dil", "UiLanguageHelpTextWarning": "Tarayıcının Yeniden Yüklenmesi Gerekiyor", "UnableToAddANewImportListExclusionPleaseTryAgain": "Yeni bir liste dışlaması eklenemiyor, lütfen tekrar deneyin.", - "UnableToAddANewIndexerPleaseTryAgain": "Yeni bir dizinleyici eklenemiyor, lütfen tekrar deneyin.", + "UnableToAddANewIndexerPleaseTryAgain": "Yeni bir indeksleyici eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewListPleaseTryAgain": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewMetadataProfilePleaseTryAgain": "Yeni bir kaliteli profil eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewNotificationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.", @@ -421,7 +421,7 @@ "UnableToLoadHistory": "Geçmiş yüklenemiyor", "UnableToLoadImportListExclusions": "Hariç Tutulanlar Listesi yüklenemiyor", "UnableToLoadIndexerOptions": "Dizin oluşturucu seçenekleri yüklenemiyor", - "UnableToLoadIndexers": "Dizinleyiciler yüklenemiyor", + "UnableToLoadIndexers": "İndeksleyiciler yüklenemiyor", "UnableToLoadLists": "Listeler yüklenemiyor", "UnableToLoadMediaManagementSettings": "Medya Yönetimi ayarları yüklenemiyor", "UnableToLoadMetadata": "Meta Veriler yüklenemiyor", @@ -469,7 +469,7 @@ "Warn": "Uyar", "Connect": "Bildirimler", "Added": "Eklenme", - "AddIndexer": "Dizinleyici Ekle", + "AddIndexer": "İndeksleyici Ekle", "AddNew": "Yeni Ekle", "AddQualityProfile": "Kalite Profili Ekle", "AddRemotePathMapping": "Uzak Yol Eşleme Ekleme", @@ -596,17 +596,17 @@ "HiddenClickToShow": "Gizli, göstermek için tıklayın", "AppDataLocationHealthCheckMessage": "Güncelleme sırasında AppData'nın silinmesini önlemek için güncelleme yapılmayacaktır", "ColonReplacement": "Kolon Değiştirme", - "ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", + "ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor", "ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ImportMechanismHealthCheckMessage": "Tamamlanan İndirme İşlemini Etkinleştir", "IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", - "IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki dizinleyici hataları nedeniyle tüm rss uyumlu dizinleyiciler geçici olarak kullanılamıyor", - "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni yayınlar otomatik olarak almayacak", - "IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinleştirildiğinde hiçbir dizinleyici kullanılamaz, {appName} herhangi bir otomatik arama sonucu sağlamayacaktır", - "IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki dizinleyici hataları nedeniyle tüm arama yeteneğine sahip dizinleyiciler geçici olarak kullanılamıyor", - "IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinleştirildiğinde hiçbir dizinleyici kullanılamaz, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır", - "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", + "IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm indeksleyiciler kullanılamıyor", + "IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki indeksleyici hataları nedeniyle tüm rss uyumlu indeksleyiciler geçici olarak kullanılamıyor", + "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu indeksleyici bulunamadı, {appName} yeni yayınlar otomatik olarak almayacak", + "IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinleştirildiğinde hiçbir indeksleyici kullanılamaz, {appName} herhangi bir otomatik arama sonucu sağlamayacaktır", + "IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki indeksleyici hataları nedeniyle tüm arama yeteneğine sahip indeksleyiciler geçici olarak kullanılamıyor", + "IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinleştirildiğinde hiçbir indeksleyici kullanılamaz, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır", + "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor", "IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", "MountArtistHealthCheckMessage": "Bir film yolu içeren bağlama, salt okunur olarak bağlanır: ", "ProxyCheckBadRequestMessage": "Proxy ile test edilemedi. DurumKodu: {0}", @@ -632,7 +632,7 @@ "SetTags": "Etiketleri Ayarla", "Yes": "Evet", "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", - "DeleteSelectedIndexers": "Dizinleyicileri Sil", + "DeleteSelectedIndexers": "İndeksleyicileri Sil", "BlocklistReleases": "Kara Liste Sürümü", "DeleteConditionMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", "NoEventsFound": "Etkinlik bulunamadı", @@ -677,7 +677,7 @@ "EditConditionImplementation": "Koşulu Düzenle - {implementationName}", "Overview": "Genel Bakış", "GrabId": "ID'den Al", - "AddIndexerImplementation": "Yeni Dizinleyici Ekle - {implementationName}", + "AddIndexerImplementation": "Yeni İndeksleyici Ekle - {implementationName}", "DeleteArtistFolderHelpText": "Film klasörünü ve içeriğini silin", "DeleteAutoTagHelpText": "'{name}' etiketini otomatik silmek istediğinizden emin misiniz?", "DeleteSpecification": "Spesifikasyonu Sil", @@ -785,8 +785,8 @@ "Clone": "Klon", "CloneAutoTag": "Otomatik Etiketi Klonla", "CloneCondition": "Klon Durumu", - "ClickToChangeIndexerFlags": "Dizinleyici bayraklarını değiştirmek için tıklayın", - "IndexerFlags": "Dizinleyici Bayrakları", + "ClickToChangeIndexerFlags": "İndeksleyici bayraklarını değiştirmek için tıklayın", + "IndexerFlags": "İndeksleyici Bayrakları", "ApiKeyValidationHealthCheckMessage": "Lütfen API anahtarınızı en az {length} karakter uzunluğunda olacak şekilde güncelleyin. Bunu ayarlar veya yapılandırma dosyası aracılığıyla yapabilirsiniz", "PreferredProtocol": "Tercih Edilen Protokol", "ChooseImportMethod": "İçe Aktarma Modunu Seçin", @@ -827,8 +827,8 @@ "DeleteAutoTag": "Etiketi Otomatik Sil", "CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.", "DeleteSelectedImportListsMessageText": "Seçilen {count} içe aktarma listesini silmek istediğinizden emin misiniz?", - "DeleteSelectedIndexersMessageText": "Seçilen {count} dizinleyiciyi silmek istediğinizden emin misiniz?", - "IndexerPriorityHelpText": "Dizinleyici Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan yayınlar için eşitlik bozucu olarak yayınlar alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm dizin oluşturucuları kullanmaya devam edecek", + "DeleteSelectedIndexersMessageText": "Seçilen {count} indeksleyiciyi silmek istediğinizden emin misiniz?", + "IndexerPriorityHelpText": "İndeksleyici Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan yayınlar için eşitlik bozucu olarak yayınlar alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm indeksleyicileri kullanmaya devam edecek", "ConnectionSettingsUrlBaseHelpText": "{connectionName} URL'sine {url} gibi bir önek ekler", "Album": "Albüm", "DownloadClientQbittorrentSettingsContentLayout": "İçerik Düzeni", @@ -843,7 +843,7 @@ "NotificationsKodiSettingsDisplayTimeHelpText": "Bildirimin ne kadar süreyle görüntüleneceği (Saniye cinsinden)", "NotificationsKodiSettingsGuiNotification": "GUI Bildirimi", "NotificationsKodiSettingsUpdateLibraryHelpText": "İçe Aktarma ve Yeniden Adlandırmada kitaplık güncellensin mi?", - "IndexerDownloadClientHelpText": "Bu dizinleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin", + "IndexerDownloadClientHelpText": "Bu indeksleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin", "Never": "Asla", "HealthMessagesInfoBox": "Satırın sonundaki wiki bağlantısını (kitap simgesi) tıklayarak veya [log kayıtlarınızı]({link}) kontrol ederek bu durum kontrolü mesajlarının nedeni hakkında daha fazla bilgi bulabilirsiniz. Bu mesajları yorumlamakta zorluk yaşıyorsanız aşağıdaki bağlantılardan destek ekibimize ulaşabilirsiniz.", "Menu": "Menü", @@ -852,8 +852,8 @@ "Implementation": "Uygula", "InstanceName": "Örnek isim", "ListRefreshInterval": "Liste Yenileme Aralığı", - "EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle", - "ManageIndexers": "Dizinleyicileri Yönet", + "EditSelectedIndexers": "Seçili İndeksleyicileri Düzenle", + "ManageIndexers": "İndeksleyicileri Yönet", "NoHistoryBlocklist": "Geçmiş engellenenler listesi yok", "Label": "Etiket", "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.", @@ -878,9 +878,9 @@ "ManageClients": "İstemcileri Yönet", "ManageDownloadClients": "İndirme İstemcilerini Yönet", "InfoUrl": "Bilgi URL'si", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent hash tarafından engellenirse, bazı dizinleyiciler için RSS / Arama sırasında düzgün bir şekilde reddedilmeyebilir, bunun etkinleştirilmesi, torrent alındıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent hash tarafından engellenirse, bazı indeksleyiciler için RSS / Arama sırasında düzgün bir şekilde reddedilmeyebilir, bunun etkinleştirilmesi, torrent alındıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.", "EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle", - "NoIndexersFound": "Dizinleyici bulunamadı", + "NoIndexersFound": "İndeksleyici bulunamadı", "NotificationsEmbySettingsSendNotificationsHelpText": "MediaBrowser'ın yapılandırılmış sağlayıcılara bildirim göndermesini sağlayın", "NotificationsEmbySettingsUpdateLibraryHelpText": "İçe Aktarma, Yeniden Adlandırma veya Silme sırasında Kitaplık Güncellensin mi?", "IgnoreDownload": "İndirmeyi Yoksay", @@ -902,7 +902,7 @@ "PasswordConfirmation": "Şifre Tekrarı", "Rejections": "Reddedilenler", "ReleaseProfiles": "Yayımlama Profilleri", - "SelectIndexerFlags": "Dizinleyici Bayraklarını Seçin", + "SelectIndexerFlags": "İndeksleyici Bayraklarını Seçin", "UpdateFiltered": "Filtrelenenleri Güncelle", "UseSsl": "SSL kullan", "RemoveCompletedDownloads": "Tamamlanan İndirmeleri Kaldır", @@ -930,7 +930,7 @@ "RemotePathMappingCheckImportFailed": "{appName} filmi içe aktaramadı. Ayrıntılar için günlüklerinizi kontrol edin.", "RemoveSelectedItem": "Seçilen Öğeyi Kaldır", "ResetDefinitionTitlesHelpText": "Değerlerin yanı sıra tanım başlıklarını da sıfırlayın", - "SetIndexerFlags": "Dizinleyici Bayraklarını Ayarla", + "SetIndexerFlags": "İndeksleyici Bayraklarını Ayarla", "SkipRedownload": "Yeniden İndirmeyi Atla", "SupportedAutoTaggingProperties": "{appName}, otomatik etiketleme kuralları için takip özelliklerini destekler", "ThemeHelpText": "Uygulama Kullanıcı Arayüzü Temasını Değiştirin, 'Otomatik' Teması, Açık veya Koyu modu ayarlamak için İşletim Sistemi Temanızı kullanacaktır. Theme.Park'tan ilham alındı", @@ -945,7 +945,7 @@ "RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır", "RegularExpressionsTutorialLink": "Düzenli ifadeler hakkında daha fazla ayrıntıyı [burada]({url}) bulabilirsiniz.", "SelectReleaseGroup": "Yayımlama Grubunu Seçin", - "QueueFilterHasNoItems": "Seçilen kuyruk filtresinde hiç öğe yok", + "QueueFilterHasNoItems": "Seçilen kuyruk filtresinde hiç öğe bulunamadı", "NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları", "PreferProtocol": "{preferredProtocol}'u tercih edin", "IndexerSettingsSeedTime": "Seed Süresi", @@ -954,7 +954,7 @@ "IndexerSettingsSeedRatioHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır", "External": "Harici", "InteractiveSearchModalHeaderTitle": "İnteraktif Arama - {title}", - "MassSearchCancelWarning": "Bu işlem, {appName} yeniden başlatılmadan veya tüm dizin oluşturucularınız devre dışı bırakılmadan başlatılır ise iptal edilemez.", + "MassSearchCancelWarning": "Bu, {appName} uygulamasını yeniden başlatmadan veya tüm İndeksleyiciler devre dışı bırakılmadan başlatılır ise iptal edilemez.", "Albums": "Albüm", "InteractiveSearchModalHeader": "Etkileşimli Arama", "NoMissingItems": "Eksik öğe yok", @@ -1057,7 +1057,7 @@ "Other": "Diğer", "MediaManagementSettingsSummary": "Adlandırma ve dosya yönetimi ayarları", "EndedOnly": "Sadece Biten", - "IndexersSettingsSummary": "Dizinleyiciler ve yayımlama kısıtlamaları", + "IndexersSettingsSummary": "İndeksleyiciler ve indeksleyici seçenekleri", "ContinuingOnly": "Sadece Devam Eden", "IndexerSettingsApiUrlHelpText": "Ne yaptığınızı bilmiyorsanız bunu değiştirmeyin. API anahtarınız ana sunucuya gönderilecektir.", "ShowBanners": "Bannerları Göster", @@ -1078,5 +1078,9 @@ "Preferred": "Tercihli", "Today": "Bugün", "Min": "Min", - "MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın." + "MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın.", + "DownloadClientSettingsPostImportCategoryHelpText": "{appName}'in indirmeyi içe aktardıktan sonra ayarlayacağı kategori. {appName}, seed tamamlanmış olsa bile bu kategorideki torrentleri kaldırmayacaktır. Aynı kategoriyi korumak için boş bırakın.", + "DownloadClientSettingsRecentPriority": "Yeni Önceliği", + "PostImportCategory": "İçe Aktarma Sonrası Kategorisi", + "DownloadClientSettingsOlderPriority": "Eski Önceliği" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 0f1352941..55677cd4b 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -916,5 +916,6 @@ "Min": "Мінімум", "Preferred": "Бажано", "Max": "Максимальний", - "MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ" + "MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ", + "DownloadClientSettingsRecentPriority": "Пріоритет клієнта" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index d8dc68941..25450ad91 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -787,5 +787,6 @@ "Min": "Min", "Preferred": "Ưu tiên", "Today": "Hôm nay", - "MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin" + "MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin", + "DownloadClientSettingsRecentPriority": "Ưu tiên khách hàng" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 2a38e129c..af927630d 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1331,5 +1331,9 @@ "Min": "最小的", "Preferred": "首选的", "Today": "今天", - "MappedNetworkDrivesWindowsService": "作为 Windows 服务运行时,映射的网络驱动器不可用,请参阅 [FAQ]({url}) 获取更多信息。" + "MappedNetworkDrivesWindowsService": "作为 Windows 服务运行时,映射的网络驱动器不可用,请参阅 [FAQ]({url}) 获取更多信息。", + "DownloadClientSettingsOlderPriority": "最早优先", + "DownloadClientSettingsPostImportCategoryHelpText": "导入下载后要设置的 {appName} 的分类。 即使做种完成,{appName} 也不会删除该分类中的种子。 留空以保留同一分类。", + "DownloadClientSettingsRecentPriority": "最近优先", + "PostImportCategory": "导入后分类" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index 73c315634..588f596ab 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -235,7 +235,7 @@ "UiLanguage": "使用者介面語言", "UnableToLoadHistory": "無法載入歷史記錄", "UiLanguageHelpText": "{appName} 介面所使用的語言", - "AddDelayProfileError": "無法加入新的條件,請重新嘗試。", + "AddDelayProfileError": "無法加入新的延遲配置,請重新嘗試。", "AutoRedownloadFailed": "失敗時重新下載", "AuthenticationRequiredPasswordHelpTextWarning": "請輸入新密碼", "AuthenticationRequiredHelpText": "更改需要進行驗證的請求。除非你了解其中的風險,否則請勿修改。", @@ -245,5 +245,8 @@ "AuthenticationRequired": "需要驗證", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "確認新密碼", "AuthenticationRequiredUsernameHelpTextWarning": "請輸入新用戶名", - "AutoRedownloadFailedFromInteractiveSearch": "失敗時重新下載來自手動搜索的資源" + "AutoRedownloadFailedFromInteractiveSearch": "失敗時重新下載來自手動搜索的資源", + "IgnoredPlaceHolder": "加入新的限制", + "RequiredPlaceHolder": "加入新的限制", + "UnableToAddANewRemotePathMappingPleaseTryAgain": "無法加入新的遠程路徑對應,請重試。" } From 5cbb2848c79738eb2b270abf47358b43c932de4d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 12 Jan 2025 15:17:02 +0200 Subject: [PATCH 017/146] Bump version to 2.9.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index eaadb74cc..19f3f83f2 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: '2.9.3' + majorVersion: '2.9.4' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 014f8a58b19356b6beaa816e8b8adde651c82841 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 12 Jan 2025 09:33:21 +0000 Subject: [PATCH 018/146] Multiple Translations updated by Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ignore-downstream Co-authored-by: Mickaël O Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/cs.json | 4 +++- src/NzbDrone.Core/Localization/Core/fi.json | 16 ++++++++-------- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 55a029045..91b18b3dd 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -889,5 +889,7 @@ "Preferred": "Upřednostňováno", "Today": "Dnes", "MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v častých dotazech", - "DownloadClientSettingsRecentPriority": "Priorita klienta" + "DownloadClientSettingsRecentPriority": "Priorita klienta", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Pokud je torrent blokován pomocí hash, nemusí být u některých indexerů správně odmítnut během RSS/vyhledávání. Povolení této funkce umožní jeho odmítnutí po zachycení torrentu, ale před jeho odesláním klientovi.", + "IndexerSettingsApiUrl": "URL API" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 5044f48de..5fc047848 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -59,7 +59,7 @@ "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?", "TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.", "Security": "Suojaus", - "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} tukee kaikkien Newznab-yhteensopivien tietolähteiden ohella myös monia muita alla listattuja tietolähteitä.", + "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} tukee kaikkien Newznab-yhteensopivien hakupalveluiden ohella myös monia muita alla listattuja palveluita.", "Actions": "Toiminnot", "AddListExclusion": "Lisää listapoikkeus", "ApiKeyHelpTextWarning": "Käyttöönotto vaatii sovelluksen uudelleenkäynnistyksen.", @@ -564,7 +564,7 @@ "HideAdvanced": "Piilota lisäasetukset", "Ignored": "Ohitettu", "Import": "Tuo", - "IndexerTagHelpText": "Tietolähdettä käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille. Käytä kaikille jättämällä tyhjäksi.", + "IndexerTagHelpText": "Hakupalvelua käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille. Käytä kaikille jättämällä tyhjäksi.", "Info": "Informatiivinen", "InstanceName": "Instanssin nimi", "InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa.", @@ -652,8 +652,8 @@ "MissingTracksArtistNotMonitored": "Puuttuvat kappaleet (esittäjää ei valvota)", "MonitorArtist": "Valvo esittäjää", "MonitoringOptions": "Valvonta-asetukset", - "MusicBrainzAlbumID": "MusicBrainz-albumitunniste", - "MusicBrainzArtistID": "MusicBrainz-esittäjätunniste", + "MusicBrainzAlbumID": "Albumin MusicBrainz ID", + "MusicBrainzArtistID": "Esittäjän MusicBrainz ID", "MusicbrainzId": "MusicBrainz-tunniste", "MusicBrainzRecordingID": "MusicBrainz-tallennetunniste", "MusicBrainzReleaseID": "MusicBrainz-julkaisutunniste", @@ -745,7 +745,7 @@ "OnDownloadFailure": "Latauksen epäonnistuessa", "Artist": "Esittäjä", "ArtistClickToChangeAlbum": "Vaihda albumia painamalla", - "ArtistEditor": "Esittäjäeditori", + "ArtistEditor": "Esittäjien monivalinta", "Artists": "Esittäjät", "Country": "Maa", "AddReleaseProfile": "Lisää jukaisuprofiili", @@ -904,7 +904,7 @@ "ExtraFileExtensionsHelpTextsExamples": "Esimerkiksi \"sub, .nfo\" tai \"sub,nfo\".", "ExtraFileExtensionsHelpText": "Pilkuin eroteltu listaus tuotavista oheistiedostoista (.nfo-tiedostot tuodaan \".nfo-orig\"-nimellä).", "Conditions": "Ehdot", - "CountIndexersSelected": "{selectedCount} tietolähde(ttä) on valittu", + "CountIndexersSelected": "{selectedCount} hakupalvelu(a) on valittu", "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valittua latauspalvelua?", "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?", "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", @@ -1170,8 +1170,8 @@ "UrlBaseHelpText": "Käänteisen välityspalvelimen tukea varten. Oletusarvo on tyhjä.", "ImportListStatusCheckSingleClientMessage": "Listat eivät ole virheiden vuoksi käytettävissä: {0}", "IndexerRssHealthCheckNoAvailableIndexers": "RSS-syötteitä tukevat tietolähteet eivät ole hiljattaisten tietolähdevirheiden vuoksi tilapaisesti käytettävissä.", - "IndexerLongTermStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}", - "MassSearchCancelWarning": "Tämä on mahdollista keskeyttää vain käynnistämällä {appName} uudelleen tai poistamalla kaikki tietolähteet käytöstä.", + "IndexerLongTermStatusCheckSingleClientMessage": "Hakupalvelut eivät ole käytettävissä yli kuusi tuntia kestäneiden virheiden vuoksi: {0}.", + "MassSearchCancelWarning": "Tämä on mahdollista keskeyttää vain käynnistämällä {appName} uudelleen tai poistamalla kaikki hakupalvelut käytöstä.", "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Haluatko varmasti etsiä kaikkia {totalRecords} albumia, joiden katkaisutasoa ei ole saavutettu?", "MonitorNoAlbums": "Ei mitään", "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index a6fb5b43c..d01b39743 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -64,7 +64,7 @@ "Component": "Composant", "Connections": "Connexions", "ConnectSettings": "Paramètres de connexion", - "CopyUsingHardlinksHelpText": "Les liens fixes permettent à {appName} d'importer des torrents seedés dans le dossier de l'artiste sans prendre d'espace disque supplémentaire ou copier tout le contenu du fichier. Les liens fixes ne fonctionnent que si la source et la destination se trouvent sur le même volume.", + "CopyUsingHardlinksHelpText": "Les liens fixes permettent à {appName} d'importer des torrents seedés dans le dossier de l'artiste sans prendre d'espace disque supplémentaire ou copier tout le contenu du fichier. Les liens fixes ne fonctionnent que si la source et la destination se trouvent sur le même volume", "CopyUsingHardlinksHelpTextWarning": "De temps en temps, des verrouillages de fichiers peuvent empêcher de renommer des fichiers qui sont en cours de partage. Vous pouvez temporairement arrêter le partage et utiliser la fonction de renommage de {appName} comme solution de contournement.", "CreateEmptyArtistFolders": "Créer des dossiers d'artistes vides", "CreateEmptyArtistFoldersHelpText": "Créer les dossiers films manquants pendant le scan du disque", From 82e0b628cc808591573409f1e3a9d117ed887f37 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 11 Feb 2021 17:00:11 -0800 Subject: [PATCH 019/146] Fixed: Parsing of release names with colon in the title (cherry picked from commit ec698c2cf7df1e1182ffa2f4505fe0872e2d08bc) --- src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs | 5 ++++- src/NzbDrone.Core/Parser/Parser.cs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs index b4c1052c2..0ff82804b 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs @@ -143,7 +143,7 @@ namespace NzbDrone.Core.Test.ParserTests // [TestCase("ADELE 25 CD FLAC 2015 PERFECT", "Adele", "25")] [TestCase("A.I. - Sex & Robots [2007/MP3/V0(VBR)]", "A I", "Sex & Robots")] - [TestCase("Jay-Z - 4:44 (Deluxe Edition) (2017) 320", "Jay-Z", "444")] + [TestCase("Jay-Z - 4:44 (Deluxe Edition) (2017) 320", "Jay-Z", "4:44")] // [TestCase("Roberta Flack 2006 - The Very Best of", "Roberta Flack", "The Very Best of")] [TestCase("VA - NOW Thats What I Call Music 96 (2017) [Mp3~Kbps]", "VA", "NOW Thats What I Call Music 96")] @@ -175,6 +175,9 @@ namespace NzbDrone.Core.Test.ParserTests [TestCase("(Heavy Metal) Aria - Discography(46 CD) [1985 - 2015], FLAC(image + .cue), lossless", "Aria", "Discography", true)] [TestCase("(Heavy Metal) [CD] Forces United - Discography(6 CDs), 2014-2016, FLAC(image + .cue), lossless", "Forces United", "Discography", true)] [TestCase("Gorillaz - The now now - 2018 [FLAC]", "Gorillaz", "The now now")] + [TestCase("Bone Thugs-n-Harmony - UNI5: The World's Enemy (2010) [Album] [FLAC Lossless / CD / Log (100%) / Cue]", "Bone Thugs-n-Harmony", "UNI5: The World's Enemy")] + [TestCase("Guru - Jazzmatazz, Volume 3: Streetsoul (2000) [Album] [FLAC Lossless / CD / Log (100%) / Cue]", "Guru", "Jazzmatazz, Volume 3: Streetsoul")] + [TestCase("Bad Movie Cast - Bad: The Soundtrack (2024) [FLAC (M4A) Lossless] [WEB]", "Bad Movie Cast", "Bad: The Soundtrack")] // Regex Works on below, but ParseAlbumMatchCollection cleans the "..." and converts it to spaces // [TestCase("Metallica - ...And Justice for All (1988) [FLAC Lossless]", "Metallica", "...And Justice for All")] diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index 382b33d7f..2ca2f5ac8 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -164,7 +164,7 @@ namespace NzbDrone.Core.Parser RegexOptions.IgnoreCase | RegexOptions.Compiled); // TODO Rework this Regex for Music - private static readonly RegexReplace SimpleTitleRegex = new RegexReplace(@"(?:(480|720|1080|2160|320)[ip]|[xh][\W_]?26[45]|DD\W?5\W1|[<>*:|]|848x480|1280x720|1920x1080|3840x2160|4096x2160|(8|10)b(it)?)\s*", + private static readonly RegexReplace SimpleTitleRegex = new RegexReplace(@"(?:(480|720|1080|2160|320)[ip]|[xh][\W_]?26[45]|DD\W?5\W1|[<>*|]|848x480|1280x720|1920x1080|3840x2160|4096x2160|(8|10)b(it)?)\s*", string.Empty, RegexOptions.IgnoreCase | RegexOptions.Compiled); From 02166167386cefb37a836bee4a86ba6adaf2195d Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 30 Dec 2024 22:22:19 -0600 Subject: [PATCH 020/146] Bump SonarCloud azure extension to 3.X (cherry picked from commit 5fac3486130df3b316dd882d676ca13ecb697b59) --- azure-pipelines.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 19f3f83f2..598dee6f7 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1208,12 +1208,12 @@ stages: submodules: true - powershell: Set-Service SCardSvr -StartupType Manual displayName: Enable Windows Test Service - - task: SonarCloudPrepare@2 + - task: SonarCloudPrepare@3 condition: eq(variables['System.PullRequest.IsFork'], 'False') inputs: SonarCloud: 'SonarCloud' organization: 'lidarr' - scannerMode: 'MSBuild' + scannerMode: 'dotnet' projectKey: 'lidarr_Lidarr' projectName: 'Lidarr' projectVersion: '$(lidarrVersion)' @@ -1226,7 +1226,7 @@ stages: ./build.sh --backend -f net6.0 -r win-x64 TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage displayName: Coverage Unit Tests - - task: SonarCloudAnalyze@2 + - task: SonarCloudAnalyze@3 condition: eq(variables['System.PullRequest.IsFork'], 'False') displayName: Publish SonarCloud Results - task: reportgenerator@5.3.11 From 396b2ae7c10c7df749ea23ea93608b56482175a1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 14 Jan 2025 10:47:59 +0200 Subject: [PATCH 021/146] Bump SonarCloud azure extension for UI analysis to 3.X --- azure-pipelines.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 598dee6f7..13b3b8743 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1120,19 +1120,19 @@ stages: vmImage: ${{ variables.windowsImage }} steps: - checkout: self # Need history for Sonar analysis - - task: SonarCloudPrepare@2 + - task: SonarCloudPrepare@3 env: SONAR_SCANNER_OPTS: '' inputs: SonarCloud: 'SonarCloud' organization: 'lidarr' - scannerMode: 'CLI' + scannerMode: 'cli' configMode: 'manual' cliProjectKey: 'lidarr_Lidarr.UI' cliProjectName: 'LidarrUI' cliProjectVersion: '$(lidarrVersion)' cliSources: './frontend' - - task: SonarCloudAnalyze@2 + - task: SonarCloudAnalyze@3 - job: Api_Docs displayName: API Docs From 739019498ff23e65d13b9df9ab8c706897de585a Mon Sep 17 00:00:00 2001 From: Gauthier Date: Fri, 15 Nov 2024 04:01:05 +0100 Subject: [PATCH 022/146] New: Add headers setting in webhook connection (cherry picked from commit 78fb20282de73c0ea47375895a807235385d90e3) Closes #5242 --- .../src/Components/Form/FormInputGroup.js | 6 +- .../src/Components/Form/KeyValueListInput.js | 156 ------------------ .../src/Components/Form/KeyValueListInput.tsx | 104 ++++++++++++ .../Components/Form/KeyValueListInputItem.css | 14 +- .../Form/KeyValueListInputItem.css.d.ts | 3 +- .../Components/Form/KeyValueListInputItem.js | 124 -------------- .../Components/Form/KeyValueListInputItem.tsx | 89 ++++++++++ .../Components/Form/ProviderFieldFormGroup.js | 2 + frontend/src/Helpers/Props/inputTypes.js | 4 +- frontend/src/typings/inputs.ts | 7 + .../Reflection/ReflectionExtensions.cs | 3 +- .../Annotations/FieldDefinitionAttribute.cs | 3 +- src/NzbDrone.Core/Localization/Core/en.json | 1 + .../Notifications/Webhook/WebhookProxy.cs | 5 + .../Notifications/Webhook/WebhookSettings.cs | 7 +- 15 files changed, 237 insertions(+), 291 deletions(-) delete mode 100644 frontend/src/Components/Form/KeyValueListInput.js create mode 100644 frontend/src/Components/Form/KeyValueListInput.tsx delete mode 100644 frontend/src/Components/Form/KeyValueListInputItem.js create mode 100644 frontend/src/Components/Form/KeyValueListInputItem.tsx diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index 79f5aaf0e..3173b493d 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -49,12 +49,12 @@ function getComponent(type) { case inputTypes.DEVICE: return DeviceInputConnector; - case inputTypes.PLAYLIST: - return PlaylistInputConnector; - case inputTypes.KEY_VALUE_LIST: return KeyValueListInput; + case inputTypes.PLAYLIST: + return PlaylistInputConnector; + case inputTypes.MONITOR_ALBUMS_SELECT: return MonitorAlbumsSelectInput; diff --git a/frontend/src/Components/Form/KeyValueListInput.js b/frontend/src/Components/Form/KeyValueListInput.js deleted file mode 100644 index 3e73d74f3..000000000 --- a/frontend/src/Components/Form/KeyValueListInput.js +++ /dev/null @@ -1,156 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import KeyValueListInputItem from './KeyValueListInputItem'; -import styles from './KeyValueListInput.css'; - -class KeyValueListInput extends Component { - - // - // Lifecycle - - constructor(props, context) { - super(props, context); - - this.state = { - isFocused: false - }; - } - - // - // Listeners - - onItemChange = (index, itemValue) => { - const { - name, - value, - onChange - } = this.props; - - const newValue = [...value]; - - if (index == null) { - newValue.push(itemValue); - } else { - newValue.splice(index, 1, itemValue); - } - - onChange({ - name, - value: newValue - }); - }; - - onRemoveItem = (index) => { - const { - name, - value, - onChange - } = this.props; - - const newValue = [...value]; - newValue.splice(index, 1); - - onChange({ - name, - value: newValue - }); - }; - - onFocus = () => { - this.setState({ - isFocused: true - }); - }; - - onBlur = () => { - this.setState({ - isFocused: false - }); - - const { - name, - value, - onChange - } = this.props; - - const newValue = value.reduce((acc, v) => { - if (v.key || v.value) { - acc.push(v); - } - - return acc; - }, []); - - if (newValue.length !== value.length) { - onChange({ - name, - value: newValue - }); - } - }; - - // - // Render - - render() { - const { - className, - value, - keyPlaceholder, - valuePlaceholder, - hasError, - hasWarning - } = this.props; - - const { isFocused } = this.state; - - return ( -
- { - [...value, { key: '', value: '' }].map((v, index) => { - return ( - - ); - }) - } -
- ); - } -} - -KeyValueListInput.propTypes = { - className: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - value: PropTypes.arrayOf(PropTypes.object).isRequired, - hasError: PropTypes.bool, - hasWarning: PropTypes.bool, - keyPlaceholder: PropTypes.string, - valuePlaceholder: PropTypes.string, - onChange: PropTypes.func.isRequired -}; - -KeyValueListInput.defaultProps = { - className: styles.inputContainer, - value: [] -}; - -export default KeyValueListInput; diff --git a/frontend/src/Components/Form/KeyValueListInput.tsx b/frontend/src/Components/Form/KeyValueListInput.tsx new file mode 100644 index 000000000..f5c6ac19b --- /dev/null +++ b/frontend/src/Components/Form/KeyValueListInput.tsx @@ -0,0 +1,104 @@ +import classNames from 'classnames'; +import React, { useCallback, useState } from 'react'; +import { InputOnChange } from 'typings/inputs'; +import KeyValueListInputItem from './KeyValueListInputItem'; +import styles from './KeyValueListInput.css'; + +interface KeyValue { + key: string; + value: string; +} + +export interface KeyValueListInputProps { + className?: string; + name: string; + value: KeyValue[]; + hasError?: boolean; + hasWarning?: boolean; + keyPlaceholder?: string; + valuePlaceholder?: string; + onChange: InputOnChange; +} + +function KeyValueListInput({ + className = styles.inputContainer, + name, + value = [], + hasError = false, + hasWarning = false, + keyPlaceholder, + valuePlaceholder, + onChange, +}: KeyValueListInputProps): JSX.Element { + const [isFocused, setIsFocused] = useState(false); + + const handleItemChange = useCallback( + (index: number | null, itemValue: KeyValue) => { + const newValue = [...value]; + + if (index === null) { + newValue.push(itemValue); + } else { + newValue.splice(index, 1, itemValue); + } + + onChange({ name, value: newValue }); + }, + [value, name, onChange] + ); + + const handleRemoveItem = useCallback( + (index: number) => { + const newValue = [...value]; + newValue.splice(index, 1); + onChange({ name, value: newValue }); + }, + [value, name, onChange] + ); + + const onFocus = useCallback(() => setIsFocused(true), []); + + const onBlur = useCallback(() => { + setIsFocused(false); + + const newValue = value.reduce((acc: KeyValue[], v) => { + if (v.key || v.value) { + acc.push(v); + } + return acc; + }, []); + + if (newValue.length !== value.length) { + onChange({ name, value: newValue }); + } + }, [value, name, onChange]); + + return ( +
+ {[...value, { key: '', value: '' }].map((v, index) => ( + + ))} +
+ ); +} + +export default KeyValueListInput; diff --git a/frontend/src/Components/Form/KeyValueListInputItem.css b/frontend/src/Components/Form/KeyValueListInputItem.css index dca2882a8..ed82db459 100644 --- a/frontend/src/Components/Form/KeyValueListInputItem.css +++ b/frontend/src/Components/Form/KeyValueListInputItem.css @@ -5,13 +5,19 @@ &:last-child { margin-bottom: 0; + border-bottom: 0; } } -.inputWrapper { +.keyInputWrapper { flex: 1 0 0; } +.valueInputWrapper { + flex: 1 0 0; + min-width: 40px; +} + .buttonWrapper { flex: 0 0 22px; } @@ -20,6 +26,10 @@ .valueInput { width: 100%; border: none; - background-color: var(--inputBackgroundColor); + background-color: transparent; color: var(--textColor); + + &::placeholder { + color: var(--helpTextColor); + } } diff --git a/frontend/src/Components/Form/KeyValueListInputItem.css.d.ts b/frontend/src/Components/Form/KeyValueListInputItem.css.d.ts index 35baf55cd..aa0c1be13 100644 --- a/frontend/src/Components/Form/KeyValueListInputItem.css.d.ts +++ b/frontend/src/Components/Form/KeyValueListInputItem.css.d.ts @@ -2,10 +2,11 @@ // Please do not change this file! interface CssExports { 'buttonWrapper': string; - 'inputWrapper': string; 'itemContainer': string; 'keyInput': string; + 'keyInputWrapper': string; 'valueInput': string; + 'valueInputWrapper': string; } export const cssExports: CssExports; export default cssExports; diff --git a/frontend/src/Components/Form/KeyValueListInputItem.js b/frontend/src/Components/Form/KeyValueListInputItem.js deleted file mode 100644 index 5379c2129..000000000 --- a/frontend/src/Components/Form/KeyValueListInputItem.js +++ /dev/null @@ -1,124 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import IconButton from 'Components/Link/IconButton'; -import { icons } from 'Helpers/Props'; -import TextInput from './TextInput'; -import styles from './KeyValueListInputItem.css'; - -class KeyValueListInputItem extends Component { - - // - // Listeners - - onKeyChange = ({ value: keyValue }) => { - const { - index, - value, - onChange - } = this.props; - - onChange(index, { key: keyValue, value }); - }; - - onValueChange = ({ value }) => { - // TODO: Validate here or validate at a lower level component - - const { - index, - keyValue, - onChange - } = this.props; - - onChange(index, { key: keyValue, value }); - }; - - onRemovePress = () => { - const { - index, - onRemove - } = this.props; - - onRemove(index); - }; - - onFocus = () => { - this.props.onFocus(); - }; - - onBlur = () => { - this.props.onBlur(); - }; - - // - // Render - - render() { - const { - keyValue, - value, - keyPlaceholder, - valuePlaceholder, - isNew - } = this.props; - - return ( -
-
- -
- -
- -
- -
- { - isNew ? - null : - - } -
-
- ); - } -} - -KeyValueListInputItem.propTypes = { - index: PropTypes.number, - keyValue: PropTypes.string.isRequired, - value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, - keyPlaceholder: PropTypes.string.isRequired, - valuePlaceholder: PropTypes.string.isRequired, - isNew: PropTypes.bool.isRequired, - onChange: PropTypes.func.isRequired, - onRemove: PropTypes.func.isRequired, - onFocus: PropTypes.func.isRequired, - onBlur: PropTypes.func.isRequired -}; - -KeyValueListInputItem.defaultProps = { - keyPlaceholder: 'Key', - valuePlaceholder: 'Value' -}; - -export default KeyValueListInputItem; diff --git a/frontend/src/Components/Form/KeyValueListInputItem.tsx b/frontend/src/Components/Form/KeyValueListInputItem.tsx new file mode 100644 index 000000000..c63ad50a9 --- /dev/null +++ b/frontend/src/Components/Form/KeyValueListInputItem.tsx @@ -0,0 +1,89 @@ +import React, { useCallback } from 'react'; +import IconButton from 'Components/Link/IconButton'; +import { icons } from 'Helpers/Props'; +import TextInput from './TextInput'; +import styles from './KeyValueListInputItem.css'; + +interface KeyValueListInputItemProps { + index: number; + keyValue: string; + value: string; + keyPlaceholder?: string; + valuePlaceholder?: string; + isNew: boolean; + onChange: (index: number, itemValue: { key: string; value: string }) => void; + onRemove: (index: number) => void; + onFocus: () => void; + onBlur: () => void; +} + +function KeyValueListInputItem({ + index, + keyValue, + value, + keyPlaceholder = 'Key', + valuePlaceholder = 'Value', + isNew, + onChange, + onRemove, + onFocus, + onBlur, +}: KeyValueListInputItemProps): JSX.Element { + const handleKeyChange = useCallback( + ({ value: keyValue }: { value: string }) => { + onChange(index, { key: keyValue, value }); + }, + [index, value, onChange] + ); + + const handleValueChange = useCallback( + ({ value }: { value: string }) => { + onChange(index, { key: keyValue, value }); + }, + [index, keyValue, onChange] + ); + + const handleRemovePress = useCallback(() => { + onRemove(index); + }, [index, onRemove]); + + return ( +
+
+ +
+ +
+ +
+ +
+ {isNew ? null : ( + + )} +
+
+ ); +} + +export default KeyValueListInputItem; diff --git a/frontend/src/Components/Form/ProviderFieldFormGroup.js b/frontend/src/Components/Form/ProviderFieldFormGroup.js index fcdd4f2bc..311f1bbbd 100644 --- a/frontend/src/Components/Form/ProviderFieldFormGroup.js +++ b/frontend/src/Components/Form/ProviderFieldFormGroup.js @@ -14,6 +14,8 @@ function getType({ type, selectOptionsProviderAction }) { return inputTypes.CHECK; case 'device': return inputTypes.DEVICE; + case 'keyValueList': + return inputTypes.KEY_VALUE_LIST; case 'playlist': return inputTypes.PLAYLIST; case 'password': diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index 1d08c762f..44115c787 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -2,8 +2,8 @@ export const AUTO_COMPLETE = 'autoComplete'; export const CAPTCHA = 'captcha'; export const CHECK = 'check'; export const DEVICE = 'device'; -export const PLAYLIST = 'playlist'; export const KEY_VALUE_LIST = 'keyValueList'; +export const PLAYLIST = 'playlist'; export const MONITOR_ALBUMS_SELECT = 'monitorAlbumsSelect'; export const MONITOR_NEW_ITEMS_SELECT = 'monitorNewItemsSelect'; export const FLOAT = 'float'; @@ -34,8 +34,8 @@ export const all = [ CAPTCHA, CHECK, DEVICE, - PLAYLIST, KEY_VALUE_LIST, + PLAYLIST, MONITOR_ALBUMS_SELECT, MONITOR_NEW_ITEMS_SELECT, FLOAT, diff --git a/frontend/src/typings/inputs.ts b/frontend/src/typings/inputs.ts index c0fda305c..7d202cd44 100644 --- a/frontend/src/typings/inputs.ts +++ b/frontend/src/typings/inputs.ts @@ -1,3 +1,10 @@ +export type InputChanged = { + name: string; + value: T; +}; + +export type InputOnChange = (change: InputChanged) => void; + export type CheckInputChanged = { name: string; value: boolean; diff --git a/src/NzbDrone.Common/Reflection/ReflectionExtensions.cs b/src/NzbDrone.Common/Reflection/ReflectionExtensions.cs index 8f016450d..a47137bfd 100644 --- a/src/NzbDrone.Common/Reflection/ReflectionExtensions.cs +++ b/src/NzbDrone.Common/Reflection/ReflectionExtensions.cs @@ -34,7 +34,8 @@ namespace NzbDrone.Common.Reflection || type == typeof(string) || type == typeof(DateTime) || type == typeof(Version) - || type == typeof(decimal); + || type == typeof(decimal) + || (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)); } public static bool IsReadable(this PropertyInfo propertyInfo) diff --git a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs index ed5879e5e..c87449003 100644 --- a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs +++ b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs @@ -87,7 +87,8 @@ namespace NzbDrone.Core.Annotations RootFolder, QualityProfile, MetadataProfile, - ArtistTag + ArtistTag, + KeyValueList, } public enum HiddenType diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 06cfeefcc..1738d25fb 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -844,6 +844,7 @@ "NotificationsSettingsUpdateMapPathsTo": "Map Paths To", "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName} path, used to modify series paths when {serviceName} sees library path location differently from {appName} (Requires 'Update Library')", "NotificationsSettingsUseSslHelpText": "Connect to {serviceName} over HTTPS instead of HTTP", + "NotificationsSettingsWebhookHeaders": "Headers", "NotificationsTagsArtistHelpText": "Only send notifications for artists with at least one matching tag", "NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title", "NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications", diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookProxy.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookProxy.cs index 23a7fbdc8..a7a7025e7 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookProxy.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookProxy.cs @@ -43,6 +43,11 @@ namespace NzbDrone.Core.Notifications.Webhook request.Credentials = new BasicNetworkCredential(settings.Username, settings.Password); } + foreach (var header in settings.Headers) + { + request.Headers.Add(header.Key, header.Value); + } + _httpClient.Execute(request); } catch (HttpException ex) diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookSettings.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookSettings.cs index dd850e5d5..0d7560142 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookSettings.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookSettings.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Generic; using FluentValidation; using NzbDrone.Core.Annotations; using NzbDrone.Core.ThingiProvider; @@ -21,6 +22,7 @@ namespace NzbDrone.Core.Notifications.Webhook public WebhookSettings() { Method = Convert.ToInt32(WebhookMethod.POST); + Headers = new List>(); } [FieldDefinition(0, Label = "URL", Type = FieldType.Url)] @@ -35,6 +37,9 @@ namespace NzbDrone.Core.Notifications.Webhook [FieldDefinition(3, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } + [FieldDefinition(4, Label = "NotificationsSettingsWebhookHeaders", Type = FieldType.KeyValueList, Advanced = true)] + public IEnumerable> Headers { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From e2f8753a6a3cf8075811f78bf7424f005103125f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 17 Jan 2025 00:42:08 +0200 Subject: [PATCH 023/146] Improve messaging for no mediums on album details --- frontend/src/Album/Details/AlbumDetails.js | 23 +++++++++++++++++++-- src/NzbDrone.Core/Localization/Core/en.json | 2 ++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/frontend/src/Album/Details/AlbumDetails.js b/frontend/src/Album/Details/AlbumDetails.js index b581c1d77..fe007e168 100644 --- a/frontend/src/Album/Details/AlbumDetails.js +++ b/frontend/src/Album/Details/AlbumDetails.js @@ -205,6 +205,7 @@ class AlbumDetails extends Component { isFetching, isPopulated, albumsError, + tracksError, trackFilesError, hasTrackFiles, shortDateFormat, @@ -552,8 +553,9 @@ class AlbumDetails extends Component {
{ - !isPopulated && !albumsError && !trackFilesError && - + !isPopulated && !albumsError && !tracksError && !trackFilesError ? + : + null } { @@ -564,6 +566,14 @@ class AlbumDetails extends Component { null } + { + !isFetching && tracksError ? + + {translate('TracksLoadError')} + : + null + } + { !isFetching && trackFilesError ? @@ -592,6 +602,14 @@ class AlbumDetails extends Component {
} + { + isPopulated && !media.length ? + + {translate('NoMediumInformation')} + : + null + } + Date: Sun, 19 Jan 2025 17:16:09 +0200 Subject: [PATCH 024/146] Bump version to 2.9.5 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 13b3b8743..870038455 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: '2.9.4' + majorVersion: '2.9.5' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From ef2c6366c47d8f37639324e1daefa4e038a7db52 Mon Sep 17 00:00:00 2001 From: jcassette Date: Sat, 18 Jan 2025 04:55:37 +0100 Subject: [PATCH 025/146] New: reflink support for ZFS (cherry picked from commit a840bb542362d58006b6cc27affd58ee6b965b80) Closes #5369 --- src/NzbDrone.Common/Disk/DiskTransferService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Disk/DiskTransferService.cs b/src/NzbDrone.Common/Disk/DiskTransferService.cs index 9bfb5a7c1..c0c506c09 100644 --- a/src/NzbDrone.Common/Disk/DiskTransferService.cs +++ b/src/NzbDrone.Common/Disk/DiskTransferService.cs @@ -21,7 +21,7 @@ namespace NzbDrone.Common.Disk private readonly IDiskProvider _diskProvider; private readonly Logger _logger; - private static readonly string[] _reflinkFilesystems = { "btrfs", "xfs" }; + private static readonly string[] ReflinkFilesystems = { "btrfs", "xfs", "zfs" }; public DiskTransferService(IDiskProvider diskProvider, Logger logger) { @@ -343,7 +343,7 @@ namespace NzbDrone.Common.Disk var targetDriveFormat = targetMount?.DriveFormat ?? string.Empty; var isCifs = targetDriveFormat == "cifs"; - var tryReflink = sourceDriveFormat == targetDriveFormat && _reflinkFilesystems.Contains(sourceDriveFormat); + var tryReflink = sourceDriveFormat == targetDriveFormat && ReflinkFilesystems.Contains(sourceDriveFormat); if (mode.HasFlag(TransferMode.Copy)) { From 5a1092b5112960846f1081f5070b1ea2cc5e9f23 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 21 Jan 2025 16:13:18 +0200 Subject: [PATCH 026/146] Prevent page crash on console.error being used with non-string values (cherry picked from commit 963395b9695a28af6bc7dd398e9eea18c834c3c9) --- frontend/src/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/index.ts b/frontend/src/index.ts index b57a3fa98..37e780919 100644 --- a/frontend/src/index.ts +++ b/frontend/src/index.ts @@ -23,12 +23,13 @@ const error = console.error; function logError(...parameters: any[]) { const filter = parameters.find((parameter) => { return ( - parameter.includes( + typeof parameter === 'string' && + (parameter.includes( 'Support for defaultProps will be removed from function components in a future major release' ) || - parameter.includes( - 'findDOMNode is deprecated and will be removed in the next major release' - ) + parameter.includes( + 'findDOMNode is deprecated and will be removed in the next major release' + )) ); }); From 917f7056952055631a35b41445d29f2ae26ac3ed Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 27 Jan 2025 11:33:23 +0000 Subject: [PATCH 027/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Lizandra Candido da Silva Co-authored-by: Oskari Lavinto Co-authored-by: Pieterjan Van Saet Co-authored-by: Weblate Co-authored-by: Weblate Co-authored-by: ahgharaghani Co-authored-by: fordas Co-authored-by: warkurre86 Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fa/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_Hans/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/bg.json | 61 ++++++- src/NzbDrone.Core/Localization/Core/ca.json | 3 +- src/NzbDrone.Core/Localization/Core/cs.json | 28 +++- src/NzbDrone.Core/Localization/Core/de.json | 3 +- src/NzbDrone.Core/Localization/Core/es.json | 5 +- src/NzbDrone.Core/Localization/Core/fa.json | 30 +++- src/NzbDrone.Core/Localization/Core/fi.json | 105 ++++++------ src/NzbDrone.Core/Localization/Core/fr.json | 4 +- src/NzbDrone.Core/Localization/Core/ko.json | 156 +++++++++++++++++- .../Localization/Core/nb_NO.json | 10 +- src/NzbDrone.Core/Localization/Core/nl.json | 6 +- .../Localization/Core/pt_BR.json | 41 ++--- src/NzbDrone.Core/Localization/Core/tr.json | 3 +- .../Localization/Core/zh_CN.json | 3 +- .../Localization/Core/zh_Hans.json | 3 +- 15 files changed, 376 insertions(+), 85 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 9c26c08a8..36db88c56 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -759,5 +759,64 @@ "Preferred": "Предпочитан", "Today": "Днес", "MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация", - "DownloadClientSettingsRecentPriority": "Приоритет на клиента" + "DownloadClientSettingsRecentPriority": "Приоритет на клиента", + "AddedToDownloadQueue": "Добавен към опашката за изтегляне", + "AppUpdated": "{appName} Актуализиранa", + "AutoTaggingRequiredHelpText": "Това условие {implementationName} трябва да съответства, за да се приложи правилото за автоматично маркиране. В противен случай е достатъчно едно съвпадение на {implementationName}.", + "CustomFormatsSettingsTriggerInfo": "Персонализиран формат ще бъде приложен към издание или файл, когато съвпада с поне един от всеки от избраните различни типове условия.", + "AuthenticationRequiredHelpText": "Променете за кои заявки се изисква удостоверяване. Не променяйте, освен ако не разбирате рисковете.", + "AuthenticationRequiredWarning": "За да предотврати отдалечен достъп без удостоверяване, {appName} вече изисква удостоверяването да бъде активирано. По желание можете да деактивирате удостоверяването от локални адреси.", + "CustomFormatsSpecificationRegularExpressionHelpText": "Персонализираният формат RegEx не е чувствителен към главни и малки букви", + "Auto": "Авто", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Потвърдете новата парола", + "AddDownloadClientImplementation": "Добави клиент за изтегляне - {implementationName}", + "AddAutoTag": "Добави автоматичен таг", + "AddCondition": "Добави условие", + "BlocklistOnlyHint": "Списък за блокиране без търсене на заместител", + "DownloadClientDelugeSettingsDirectoryCompleted": "Директория за вече завършените изтегляния", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Незадължителна локация за преместване на вече завършените изтегляния, оставете празно, за да използвате мястото по подразбиране на Deluge", + "ApplicationUrlHelpText": "Външният URL адрес на това приложение, включително http(s)://, порт и основно URL", + "CustomFormatsSpecificationFlag": "Флаг", + "DownloadClientDelugeSettingsDirectory": "Директория за изтегляне", + "DoNotBlocklist": "Не блокирайте", + "AddImportList": "Добави списък за импортиране", + "AddImportListImplementation": "Добави списък за импортиране - {implementationName}", + "AddIndexerImplementation": "Добави индексатор - {implementationName}", + "AddToDownloadQueue": "Добави към опашката за изтегляне", + "AppUpdatedVersion": "{appName} е актуализиранa до версия `{version}`, за да получите най-новите промени, ще трябва да презаредите {appName}", + "ApplicationURL": "URL адрес на приложението", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "Автоматично търсене и опит за изтегляне на различно издание, когато неуспешното издание е било взето от интерактивно търсене", + "AutoTagging": "Автоматично етикетиране", + "AutoTaggingLoadError": "Не може да се зареди автоматичното маркиране", + "AutomaticUpdatesDisabledDocker": "Автоматичните актуализации не се поддържат директно при използване на механизма за актуализация на Docker. Ще трябва да актуализирате Image-a на контейнера извън {appName} или да използвате скрипт", + "BlocklistAndSearchMultipleHint": "Започнете търсене на заместители след блокиране", + "BlocklistOnly": "Само списък за блокиране", + "DoNotBlocklistHint": "Премахване без блокиране", + "Dash": "Тире", + "DownloadClientAriaSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2", + "Donate": "Дарете", + "Database": "База данни", + "ApplyChanges": "Прилагане на промените", + "AuthenticationRequiredPasswordHelpTextWarning": "Въведете нова парола", + "NoCutoffUnmetItems": "Няма неизпълнени елементи за прекъсване", + "AutomaticAdd": "Автоматично добавяне", + "MinimumCustomFormatScoreHelpText": "Минимална резултат на персонализирания формат, необходима за пропускане на забавянето за предпочитания протокол", + "AuthenticationRequiredUsernameHelpTextWarning": "Въведете ново потребителско име", + "AuthenticationRequired": "Изисква се удостоверяване", + "BlocklistAndSearchHint": "Започнете търсене на заместител след блокиране", + "BlocklistMultipleOnlyHint": "Списък за блокиране без търсене на заместители", + "AddConditionImplementation": "Добави условие - {implementationName}", + "AddConnectionImplementation": "Добави връзка - {implementationName}", + "AddConnection": "Добави връзка", + "Any": "Всякакви", + "AuthenticationMethod": "Метод за удостоверяване", + "AuthenticationMethodHelpTextWarning": "Моля, изберете валиден метод за удостоверяване", + "AutoRedownloadFailedFromInteractiveSearch": "Неуспешно повторно изтегляне от интерактивното търсене", + "BypassIfAboveCustomFormatScore": "Пропусни, ако е над рейтинга на персонализирания формат", + "BypassIfAboveCustomFormatScoreHelpText": "Активиране на пропускане, когато изданието има резултат, по-висок от конфигурирания минимален резултат за потребителски формат", + "AutoTaggingSpecificationTag": "Етикет", + "BlocklistAndSearch": "Списък за блокиране и търсене", + "CustomFormatsSpecificationRegularExpression": "Регулярни изрази", + "DownloadClientDelugeSettingsDirectoryHelpText": "Незадължителна локация за изтеглянията, оставете празно, за да използвате мястото по подразбиране на Deluge", + "Absolute": "Абсолютен" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index ebad70482..b1487962c 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -970,5 +970,6 @@ "Preferred": "Preferit", "Today": "Avui", "MappedNetworkDrivesWindowsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació", - "DownloadClientSettingsRecentPriority": "Prioritat del client" + "DownloadClientSettingsRecentPriority": "Prioritat del client", + "AddNewArtist": "Afegeix Nou Artista" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 91b18b3dd..ff6c2c16f 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -891,5 +891,31 @@ "MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v častých dotazech", "DownloadClientSettingsRecentPriority": "Priorita klienta", "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Pokud je torrent blokován pomocí hash, nemusí být u některých indexerů správně odmítnut během RSS/vyhledávání. Povolení této funkce umožní jeho odmítnutí po zachycení torrentu, ale před jeho odesláním klientovi.", - "IndexerSettingsApiUrl": "URL API" + "IndexerSettingsApiUrl": "URL API", + "AddArtistWithName": "Přidat{artistName}", + "AddAlbumWithTitle": "Přidat {albumTitle}", + "DownloadClientDelugeSettingsDirectory": "Adresář stahování", + "ClickToChangeIndexerFlags": "Kliknutím změníte značky indexeru", + "CustomFormatsSpecificationRegularExpression": "Běžný výraz", + "Donate": "Daruj", + "Implementation": "Implementace", + "NoCutoffUnmetItems": "Žádné neodpovídající nesplněné položky", + "HealthMessagesInfoBox": "Další informace o příčině těchto zpráv o kontrole zdraví najdete kliknutím na odkaz wiki (ikona knihy) na konci řádku nebo kontrolou [logů]({link}). Pokud máte potíže s interpretací těchto zpráv, můžete se obrátit na naši podporu, a to na níže uvedených odkazech.", + "External": "Externí", + "RegularExpressionsCanBeTested": "Regulární výrazy lze testovat [zde]({url}).", + "AllExpandedCollapseAll": "Sbalit Všechny", + "AllExpandedExpandAll": "Rozbal Všechny", + "AllowFingerprinting": "Povol Digitální Otisk (Fingerprinting)", + "BlocklistAndSearchHint": "Začne hledat náhradu po blokaci", + "BlocklistAndSearchMultipleHint": "Začne vyhledávat náhrady po blokaci", + "BlocklistOnly": "Pouze seznam blokování", + "ChangeCategoryHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client", + "ChangeCategoryMultipleHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client", + "CountCustomFormatsSelected": "{count} vybraný vlastní formát(y)", + "DeleteSelected": "Smazat vybrané", + "DoNotBlocklist": "Nepřidávat do Seznamu blokování", + "DoNotBlocklistHint": "Odstraň bez přidání do seznamu blokování", + "DownloadClientAriaSettingsDirectoryHelpText": "Volitelné umístění pro stahování, pokud chcete použít výchozí umístění Aria2, ponechte prázdné", + "DownloadClientQbittorrentSettingsContentLayout": "Rozvržení obsahu", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Zda použít rozvržení obsahu nakonfigurované v qBittorrentu, původní rozvržení z torrentu nebo vždy vytvořit podsložku (qBittorrent 4.3.2+)" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 5a4c66524..72f1170a9 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -1290,5 +1290,6 @@ "DownloadClientSettingsOlderPriority": "Ältere Priorität", "DownloadClientSettingsPostImportCategoryHelpText": "Kategorie für {appName}, die nach dem Importieren des Downloads festgelegt wird. {appName} wird Torrents in dieser Kategorie nicht entfernen, auch wenn das Seeding beendet ist. Leer lassen, um dieselbe Kategorie beizubehalten.", "DownloadClientSettingsRecentPriority": "Neueste Priorität", - "PostImportCategory": "Post-Import-Kategorie" + "PostImportCategory": "Post-Import-Kategorie", + "NotificationsSettingsWebhookHeaders": "Header" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index e7bf4a4a4..f062a3f92 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1346,5 +1346,8 @@ "DownloadClientSettingsRecentPriority": "Priorizar recientes", "PostImportCategory": "Categoría de post-importación", "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados en los últimos 14 días", - "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados hace más de 14 días" + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados hace más de 14 días", + "NotificationsSettingsWebhookHeaders": "Cabeceras", + "NoMediumInformation": "Ninguna información del medio disponible.", + "TracksLoadError": "No se pudo cargar las pistas" } diff --git a/src/NzbDrone.Core/Localization/Core/fa.json b/src/NzbDrone.Core/Localization/Core/fa.json index 0967ef424..7c7449870 100644 --- a/src/NzbDrone.Core/Localization/Core/fa.json +++ b/src/NzbDrone.Core/Localization/Core/fa.json @@ -1 +1,29 @@ -{} +{ + "AddAutoTag": "افزودن برچسب خودکار", + "AddCondition": "افزودن شرط", + "AddConditionError": "افزودن شرط جدید ناموفق بود، لطفا مجددا تلاش کنید.", + "AddAutoTagError": "افزودن برچسب خودکار جدید ناموفق بود، لطفا مجددا تلاش کنید.", + "AddDelayProfile": "افزودن نمایه تاخیر", + "AddDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}", + "AddImportList": "افزودن لیست واردات", + "AddArtistWithName": "افزودن {artistName}", + "AddAlbumWithTitle": "افزودن {albumTitle}", + "AddDelayProfileError": "افزودن نمایه تاخیر جدید ناموفق بود، لطفا مجددا تلاش کنید.", + "AddImportListExclusion": "افزودن لیست واردات مستثنی", + "Docker": "Docker", + "NETCore": ".NET", + "Torrents": "تورنت ها", + "45MinutesFourtyFive": "۴۵ دقیقه: {0}", + "20MinutesTwenty": "۲۰ دقیقه: {0}", + "60MinutesSixty": "۶۰ دقیقه: {0}", + "Absolute": "مطلق", + "AddConditionImplementation": "افزودن شرط - {implementationName}", + "AddConnection": "افزودن پیوند", + "AddConnectionImplementation": "افزودن پیوند - {implementationName}", + "APIKey": "کلید API", + "Actions": "اقدامات", + "Activity": "فعالیت", + "Add": "افزودن", + "Usenet": "Usenet", + "About": "درباره" +} diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 5fc047848..e8936b8c1 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -4,7 +4,7 @@ "ShowSearchActionHelpText": "Näytä hakupainike osoitettaessa.", "DeleteImportListExclusion": "Poista tuontilistapoikkeus", "EnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.", - "IndexerPriority": "Tietolähteiden painotus", + "IndexerPriority": "Hakupalveluiden painotus", "ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", "UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.", "ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.", @@ -13,11 +13,11 @@ "Host": "Osoite", "IllRestartLater": "Käynnistän uudelleen myöhemmin", "EnableRSS": "RSS-syöte", - "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "Tämän tietolähteen kanssa ei voida käyttää RSS-syötettä.", + "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "Tämän hakupalvelun kanssa ei voida käyttää RSS-syötettä.", "Logging": "Lokikirjaus", "ProxyBypassFilterHelpText": "Erota aliverkkotunnukset pilkuilla ja käytä jokerimerkkinä tähteä ja pistettä (*.). Esimerkki: www.esimerkki.fi,*.esimerkki.fi).", "UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.", - "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Lue lisää tietolähteestä painamalla 'Lisätietoja'.", + "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Saat lisätietoja yksittäisistä palveluista niiden ohessa olevilla painikkeilla.", "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.", "RssSyncIntervalHelpText": "Aikaväli minuutteina. Poista toiminto käytöstä asettamalla arvoksi 0, joka pysäyttää automaattisen julkaisukaappauksen täysin.", "DefaultLidarrTags": "Oletusarvoiset {appName}-oletustunnisteet", @@ -43,19 +43,19 @@ "DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?", "DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?", "EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset latauspalvelusta automaattisesti.", - "Indexer": "Tietolähde", + "Indexer": "Hakupalvelu", "UnableToAddANewDownloadClientPleaseTryAgain": "Latauspalvelun lisääminen epäonnistui. Yritä uudelleen.", "CalendarWeekColumnHeaderHelpText": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Näkyy jokaisen sarakkeen yläpuolella käytettäessä viikkonäkymää.", "NotificationTriggers": "Ilmoituksen laukaisijat", "PackageVersion": "Paketin versio", "Port": "Portti", - "Indexers": "Tietolähteet", + "Indexers": "Hakupalvelut", "ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että latauspalvelu käyttää samaa ryhmää kuin {appName}.", "CopyUsingHardlinksHelpText": "Hardlink-kytkösten avulla {appName} voi tuoda jaettavat torrentit ilman niiden täyttä kopiointia ja levytilan kaksinkertaista varausta. Tämä toimii vain lähde- ja kohdesijaintien ollessa samalla tallennusmedialla.", "CopyUsingHardlinksHelpTextWarning": "Tiedostojen käsittelystä johtuvat lukitukset saattavat joskus estää jaettavien tiedostojen uudelleennimeämisen. Voit keskeyttää jakamisen väliaikaisesti ja käyttää {appName}in nimeämistoimintoa.", "DeleteImportListMessageText": "Haluatko varmasti poistaa listan \"{name}\"?", - "DeleteIndexerMessageText": "Haluatko varmasti poistaa tietolähteen '{name}'?", + "DeleteIndexerMessageText": "Haluatko varmasti poistaa hakupalvelun \"{name}\"?", "DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?", "TagIsNotUsedAndCanBeDeleted": "Tunniste ei ole käytössä ja voidaan poistaa.", "Security": "Suojaus", @@ -114,7 +114,7 @@ "DeleteImportList": "Poista tuontilista", "DeleteDownloadClient": "Poista latauspalvelu", "DeleteDownloadClientMessageText": "Haluatko varmasti poistaa latauspalvelun \"{name}\"?", - "DeleteIndexer": "Poista tietolähde", + "DeleteIndexer": "Poista hakupalvelu", "DeleteNotification": "Poista ilmoituspalvelu", "DeleteQualityProfile": "Poista laatuprofiili", "DeleteQualityProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin \"{name}\"?", @@ -152,7 +152,7 @@ "Importing": "Tuodaan", "IncludeUnknownArtistItemsHelpText": "Näytä jonossa kohteet, joissa ei ole esittäjää. Tämä voi sisältää poistettuja esittäjiä, albumeita tai mitä tahansa muuta {appName}ille luokiteltua.", "Interval": "Ajoitus", - "IndexerSettings": "Tietolähdeasetukset", + "IndexerSettings": "Hakupalveluasetukset", "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "{appName} tukee monia torrent- ja Usenet-lataajia.", "MetadataSettings": "Metatietoasetukset", "MediaManagementSettings": "Medianhallinnan asetukset", @@ -199,7 +199,7 @@ "Tags": "Tunnisteet", "TestAll": "Kaikkien testaus", "TestAllClients": "Koesta latauspalvelut", - "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.", + "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia hakupalveluita. Noudata niiden asettamia sääntöjä.", "TagAudioFilesWithMetadata": "Tallenna metatiedot äänitiedostoihin", "TestAllIndexers": "Tietolähteiden testaus", "UnableToLoadBackups": "Varmuuskopioinnin lataus epäonnistui", @@ -291,8 +291,8 @@ "TorrentDelayHelpText": "Minuuttiviive, joka odotetaan ennen julkaisun Torrent-kaappausta.", "UnableToAddANewQualityProfilePleaseTryAgain": "Laatuprofiilin lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewRemotePathMappingPleaseTryAgain": "Etäsijainnin kohdistuksen lisäys epäonnistui. Yritä uudelleen.", - "UnableToLoadBlocklist": "Estolistan lataus epäonnistui", - "UnableToLoadDelayProfiles": "Viiveprofiilien lataus epäonnistui", + "UnableToLoadBlocklist": "Virhe ladattaessa estolistaa.", + "UnableToLoadDelayProfiles": "Virhe ladattaessa viiveprofiileja.", "UnableToLoadDownloadClientOptions": "Latauspalveluasetusten lataus epäonnistui", "UnableToLoadLists": "Listojen lataus epäonnistui", "UnableToLoadRootFolders": "Juurikansioiden lataus epäonnistui", @@ -456,12 +456,12 @@ "Status": "Tila", "SuccessMyWorkIsDoneNoFilesToRename": "Valmis! Toiminto on suoritettu, eikä uudelleennimettäviä tiedostoja ole.", "SuccessMyWorkIsDoneNoFilesToRetag": "Valmis! Toiminto on suoritettu, eikä tagimuutoksia vaativia tiedostoja ole.", - "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Tämä tietolähde ei tue hakua.", + "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Tämä hakupalvelu ei tue hakutoimintoa.", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Profiilia käytetään automaattihaun yhteydessä, kun haku suoritetaan käyttöliittymästä tai {appName}in toimesta.", "Tasks": "Tehtävät", "Type": "Tyyppi", "UnableToAddANewImportListExclusionPleaseTryAgain": "Uuden luettelon poissulkemisen lisääminen epäonnistui, yritä uudelleen.", - "UnableToAddANewMetadataProfilePleaseTryAgain": "Uutta laatuprofiilia ei voi lisätä, yritä uudelleen.", + "UnableToAddANewMetadataProfilePleaseTryAgain": "Virhe lisättäessä metatietoprofiilia. Yritä uudelleen.", "UnableToAddANewRootFolderPleaseTryAgain": "Uutta mukautettua muotoa ei voi lisätä, yritä uudelleen.", "UnableToLoadMetadataProfiles": "Metatietoprofiilien lataus epäonnistui", "Updates": "Päivitykset", @@ -479,10 +479,10 @@ "Album": "Albumi", "AlbumHasNotAired": "Albumia ei ole julkaistu", "AlbumIsDownloading": "Albumia ladataan", - "AlbumIsNotMonitored": "Albumia ei seurata", + "AlbumIsNotMonitored": "Albumia ei valvota", "AlbumStudio": "Albumin studio", "AllAlbums": "Kaikki albumit", - "AllAlbumsData": "Seuraa kaikkia albumeita, erikoisalbumeita lukuunottamatta", + "AllAlbumsData": "Valvo ensimmäisiä albumeita erikoisalbumit pois lukien.", "AllArtistAlbums": "Kaikki artistin albumit", "MetadataProfile": "Metatietoprofiili", "OnApplicationUpdate": "Kun sovellus päivitetään", @@ -624,7 +624,7 @@ "WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?", "AddRemotePathMapping": "Lisää etäsijainnin kohdistus", "FreeSpace": "Vapaa tila", - "IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä latauspalvelu.", + "IndexerDownloadClientHelpText": "Määritä tästä hakupalvelusta kaapattaessa käytettävä latauspalvelu.", "Ok": "Ok", "Organize": "Järjestä", "OutputPath": "Tallennussijainti", @@ -648,9 +648,9 @@ "MissingAlbums": "Puuttuvat albumit", "MissingAlbumsData": "Valvo albumeita, joille ei ole tiedostoja tai joita ei ole vielä julkaistu.", "MissingTracks": "Puuttuvat kappaleet", - "MissingTracksArtistMonitored": "Puuttuvat kappaleet (esittäjää valvotaan)", - "MissingTracksArtistNotMonitored": "Puuttuvat kappaleet (esittäjää ei valvota)", - "MonitorArtist": "Valvo esittäjää", + "MissingTracksArtistMonitored": "Kappaleita puuttuu (esittäjää valvotaan)", + "MissingTracksArtistNotMonitored": "Kappaleita puuttuu (esittäjää ei valvota)", + "MonitorArtist": "Esittäjän valvonta", "MonitoringOptions": "Valvonta-asetukset", "MusicBrainzAlbumID": "Albumin MusicBrainz ID", "MusicBrainzArtistID": "Esittäjän MusicBrainz ID", @@ -673,12 +673,12 @@ "FutureDaysHelpText": "Päivien määrä, jonka verran tulevaisuuteen iCal-syötettä seurataan.", "AlbumStatus": "Albumin tila", "CatalogNumber": "Luettelonumero", - "MonitorNewItems": "Valvo uusia albumeita", + "MonitorNewItems": "Uusien albumien valvonta", "ImportListSpecificSettings": "Tuotilistakohtaiset asetukset", "DoneEditingGroups": "Lopeta ryhmien muokkaus", "EditGroups": "Muokkaa ryhmiä", "FirstAlbum": "Ensimmäinen albumi", - "FirstAlbumData": "Seuraa ensimmäisiä albumeita. Muita albumeita ei huomioida.", + "FirstAlbumData": "Valvo ensimmäisiä albumeita. Muita albumeita ei huomioida.", "ForeignIdHelpText": "Ohitettavan esittäjän tai albumin MusicBrainz-tunniste.", "FutureAlbums": "Tulevat albumit", "GoToArtistListing": "Avaa esittäjälistaus", @@ -715,7 +715,7 @@ "SelectedCountArtistsSelectedInterp": "{selectedCount} esittäjä(ä) on valittu", "SelectTracks": "Valitse kappaleet", "ShouldSearch": "Etsi uusia kohteita", - "ShouldSearchHelpText": "Etsi tietolähteistä hiljattain lisättyjä kohteita. Käytä suurien listojen kanssa varoen.", + "ShouldSearchHelpText": "Etsi hakupalveluista hiljattain lisättyjä kohteita. Käytä suurten listojen kanssa varoen.", "ShowAlbumCount": "Näytä albumimäärä", "ShowBanners": "Näytä bannerit", "ShowBannersHelpText": "Korvaa nimet bannerikuvilla.", @@ -781,7 +781,7 @@ "HideTracks": "Piilota kappaleet", "LatestAlbum": "Uusin albumi", "LatestAlbumData": "Valvo uusimpia ja tulevia albumeita", - "ManageTracks": "Hallitse kappaleita", + "ManageTracks": "Kappaleiden hallinta", "ManualDownload": "Manuaalinen lataus", "NewAlbums": "Uudet albumit", "NoneMonitoringOptionHelpText": "Älä valvo esittäjiä äläkä albumeita.", @@ -801,14 +801,14 @@ "DeleteSelected": "Poista valitut", "ClickToChangeReleaseGroup": "Vaihda julkaisuryhmää painamalla tästä", "EnableAutomaticAddHelpText": "Lisää esittäjät/albumit {appName}iin kun synkronointi suoritetaan käyttöliittymästä tai {appName}in toimesta.", - "IndexerIdHelpText": "Määritä mitä tietolähdettä profiili koskee.", + "IndexerIdHelpText": "Määritä mitä hakupalvelua profiili koskee.", "Inactive": "Ei aktiivinen", "EnableRssHelpText": "Käytetään {appName}in etsiessä julkaisuja ajoitetusti RSS-synkronoinnilla.", "AllMonitoringOptionHelpText": "Valvo jokaista tuontilistalla olevaa esittäjää ja heidän kaikkia albumeitaan.", "ContinuingOnly": "Vain jatkuvat", "EntityName": "Entiteetin nimi", "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Jaksolle ei ole absoluuttista numeroa.", - "IndexerIdHelpTextWarning": "Yksittäisen tietolähteen käyttö sanapainotuksen kanssa saattaa aiheuttaa julkaisujen kaksoiskappaleiden kaappauksia.", + "IndexerIdHelpTextWarning": "Yksittäisen hakupalvelun käyttö sanapainotuksen kanssa saattaa aiheuttaa julkaisujen kaksoiskappaleiden kaappauksia.", "AllowFingerprintingHelpText": "Tarkenna kappaleiden tunnistustarkkuutta piiloleimauksen avulla.", "BlocklistReleaseHelpText": "Estää {appName}ia lataamasta näitä tiedostoja uudelleen.", "RemotePathMappingCheckFilesGenericPermissions": "Latauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta {appName} ei näe sitä. Kansion käyttöoikeuksia on ehkä muokattava.", @@ -816,9 +816,9 @@ "RemotePathMappingCheckFolderPermissions": "{appName} näkee ladatauskansion \"{0}\", mutta ei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", "DownloadedUnableToImportCheckLogsForDetails": "Ladattu – Tuonti ei onnistu: näet lisätietoja lokista.", "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää", - "IndexerRssHealthCheckNoIndexers": "RSS-synkronointia varten ei ole määritetty tietolähteitä ja tämän vuoksi {appName} ei kaappaa uusia julkaisuja automaattisesti.", - "IndexerSearchCheckNoAutomaticMessage": "Automaattihakua varten ei ole määritetty tietolähteitä ja tämän vuoksi {appName}in automaattihaku ei löydä tuloksia.", - "IndexerSearchCheckNoInteractiveMessage": "Manuaalihaulle ei ole määritetty tietolähteitä, eikä {appName} sen vuoksi löydä sillä tuloksia.", + "IndexerRssHealthCheckNoIndexers": "RSS-synkronoinnille ei ole määritetty hakupalveluita, eikä {appName} tämän vuoksi kaappaa uusia julkaisuja automaattisesti.", + "IndexerSearchCheckNoAutomaticMessage": "Automaattihaulle ei ole määritetty hakupalveluita, eikä {appName}in automaattihaku tämän vuoksi löydä tuloksia.", + "IndexerSearchCheckNoInteractiveMessage": "Manuaalihaulle ei ole määritetty hakupalveluita, eikä {appName} sen vuoksi löydä sillä tuloksia.", "RecycleBinUnableToWriteHealthCheck": "Roskakoriksi määritettyyn sijaintiin ei voida tallentaa: {0}. Varmista, että se on olemassa ja että {appName}in suorittavalla käyttäjällä on kirjoitusoikeus kansioon.", "RemotePathMappingCheckDownloadPermissions": "{appName} näkee ladatun musiikin \"{0}\", muttei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", "RemotePathMappingCheckImportFailed": "{appName} ei voinut tuoda musiikkia. Näet lisätietoja lokista.", @@ -875,7 +875,7 @@ "RecentChanges": "Uusimmat muutokset", "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituille tietolähteille", "RemotePathMappingCheckBadDockerPath": "Käytät Dockeria ja latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", - "DeleteSelectedIndexers": "Poista tietoläh(de/teet)", + "DeleteSelectedIndexers": "Poista hakupalvelu(t)", "RemotePathMappingCheckFilesWrongOSPath": "Etälatauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista määritetyt etäsijainnit ja latauspalvelun asetukset.", "RemotePathMappingCheckRemoteDownloadClient": "Etälatauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.", "RemotePathMappingCheckWrongOSPath": "Etälatauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", @@ -921,11 +921,11 @@ "AddImportListImplementation": "Lisätään tuontilistaa – {implementationName}", "AddConditionImplementation": "Lisätään ehtoa – {implementationName}", "AddConnectionImplementation": "Lisätään ilmoituspavelua – {implementationName}", - "IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä latauspalveluilla: {0}.", - "IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi", + "IndexerDownloadClientHealthCheckMessage": "Hakupalvelut virheellisillä latauspalveluilla: {0}.", + "IndexerStatusCheckAllClientMessage": "Hakupalvelut eivät ole virheiden vuoksi käytettävissä.", "MinimumCustomFormatScoreHelpText": "Mukautetun muodon vähimmäispisteytys, jolla ensisijaisen protokollan viiveen ohitus sallitaan.", "Monitoring": "Valvotaan", - "NoIndexersFound": "Tietolähteitä ei löytynyt", + "NoIndexersFound": "Hakupalveluita ei löytynyt", "RemotePathMappingCheckFilesLocalWrongOSPath": "Paikallinen latauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista latauspalvelun asetukset.", "Formats": "Muodot", "AuthBasic": "Perus (selaimen ponnahdus)", @@ -935,7 +935,7 @@ "ColonReplacement": "Kaksoispisteen korvaus", "GrabId": "Kaappauksen tunniste", "InfoUrl": "Tietojen URL", - "EditIndexerImplementation": "Muokataan tietolähdettä – {implementationName}", + "EditIndexerImplementation": "Muokataan hakupalvelua – {implementationName}", "DisabledForLocalAddresses": "Ei käytössä paikallisissa osoitteissa", "ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi", "AutoTagging": "Automaattinen tunnistemerkintä", @@ -987,7 +987,7 @@ "RemotePathMappingCheckDockerFolderMissing": "Käytät Dockeria ja latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei löydy Docker-säiliöstä. Tarkista etäsijaintien kohdistukset ja säiliön tallennusmedian asetukset.", "ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?", "SystemTimeCheckMessage": "Järjestelmän aika on ainakin vuorokauden pielessä, eivätkä ajoitetut tehtävät toimi oikein ennen kuin se on korjattu.", - "UnableToLoadInteractiveSearch": "Tämän albumihaun tulosten lataus epäonnistui. Yritä myöhemmin uudelleen.", + "UnableToLoadInteractiveSearch": "Virhe ladattaessa tämän albumihaun tuloksia. Yritä myöhemmin uudelleen.", "AutoTaggingRequiredHelpText": "Tämän \"{implementationName}\" -ehdon on täsmättävä automaattimerkinnän säännön käyttämiseksi. Muutoin yksittäinen \"{implementationName}\" -vastaavuus riittää.", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana", "Connection": "Yhteys", @@ -1021,7 +1021,7 @@ "IgnoreDownloadsHint": "Estää {appName}ia käsittelemästä näitä latauksia jatkossa.", "ListRefreshInterval": "Listan päivityksen ajoitus", "IndexerSettingsRejectBlocklistedTorrentHashes": "Hylkää estetyt torrent-hajautusarvot kaapattaessa", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Jos torrent on estetty hajautusarvon perusteella sitä ei välttämättä hylätä oikein joidenkin tietolähteiden RSS-syötteestä tai hausta. Tämän käyttöönotto mahdollistaa tällaisten torrentien hylkäämisen kaappauksen jälkeen, kuitenkin ennen kuin niitä välitetään latauspalvelulle.", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Jos torrent on estetty hajautusarvon perusteella sitä ei välttämättä hylätä oikein joidenkin hakupalveluiden RSS-syötteestä tai hausta. Tämän käyttöönotto mahdollistaa tällaisten torrentien hylkäämisen kaappauksen jälkeen, kuitenkin ennen kuin niitä välitetään latauspalvelulle.", "ListWillRefreshEveryInterp": "Lista päivitetään {0} välein", "NoImportListsFound": "Tuotilistoja ei löytynyt", "ManageClients": "Hallitse työkaluja", @@ -1068,13 +1068,13 @@ "HiddenClickToShow": "Piilotettu, näytä painamalla tästä", "Dash": "Yhdysmerkki", "RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä]({url}).", - "MonitorArtists": "Valvo esittäjiä", + "MonitorArtists": "Esittäjien valvonta", "ChooseImportMethod": "Valitse tuontitapa", "NoCutoffUnmetItems": "Katkaisutasoa saavuttamattomia kohteita ei ole.", "FailedToLoadQueue": "Jonon lataus epäonnistui", "NoMissingItems": "Puuttuvia kohteita ei ole.", "SpecificMonitoringOptionHelpText": "Valvo esittäjiä, mutta vain erikseen listalle lisättyjä albumeita.", - "UnableToLoadCustomFormats": "Mukautettujen muotojen lataus epäonnistui", + "UnableToLoadCustomFormats": "Virhe ladattaessa mukautettuja muotoja.", "Customformat": "Mukautettu muoto", "ExportCustomFormat": "Vie mukautettu muoto", "MountArtistHealthCheckMessage": "Kohteen sijainnin sisältävä media on kytketty vain luku -tilassa: ", @@ -1110,7 +1110,7 @@ "CountImportListsSelected": "{selectedCount} tuontilista(a) on valittu", "DeleteArtistFolder": "Poista esittäjäkansio", "FormatAgeMinutes": "minuuttia", - "IndexerFlags": "Tietolähteen liput", + "IndexerFlags": "Hakupalvelun liput", "Logout": "Kirjaudu ulos", "NotificationsEmbySettingsSendNotifications": "Lähetä ilmoituksia", "NotificationsEmbySettingsSendNotificationsHelpText": "Ohjeista Embyä ilmoittamaan myös siihen kytketyille palveluille.", @@ -1142,14 +1142,14 @@ "CouldntFindAnyResultsForTerm": "Haku \"{0}\" ei tuottanut tuloksia.", "ImportListStatusCheckAllClientMessage": "Mitkään listat eivät ole virheiden vuoksi käytettävissä", "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Uuden esittäjän lisääminen on helppoa. Aloita vain haluamasi esittäjän nimen kirjoittaminen.", - "IndexerLongTermStatusCheckAllClientMessage": "Mikään tietolähde ei ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.", + "IndexerLongTermStatusCheckAllClientMessage": "Mikään hakupalvelu ei ole käytettävissä yli kuusi tuntia kestäneiden virheiden vuoksi.", "NoMinimumForAnyDuration": "Ei toistoaikojen vähimmäiskestoja", "RemoveQueueItemConfirmation": "Haluatko varmasti poistaa kohteen \"{sourceTitle}\" jonosta?", - "IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole virheiden vuoksi käytettävissä: {0}", + "IndexerStatusCheckSingleClientMessage": "Hakupalvelut eivät ole virheiden vuoksi käytettävissä: {0}.", "AutoTaggingSpecificationTag": "Tunniste", "DashOrSpaceDashDependingOnName": "\"Yhdysmerkki\" tai \"Välilyönti Yhdysmerkki\" nimen perusteella.", "DownloadClientsSettingsSummary": "Latauspalvelut, latausten käsittely ja etäsijaintien kohdistukset.", - "IndexerSearchCheckNoAvailableIndexersMessage": "Hakua tukevat tietolähteet eivät ole hiljattaisten tietolähdevirheiden vuoksi tilapaisesti käytettävissä.", + "IndexerSearchCheckNoAvailableIndexersMessage": "Mitkään hakua tukevat hakupalvelut eivät ole tilapäisesti käytettävissä hiljattaisten palveluvirheiden vuoksi.", "NotificationsEmbySettingsUpdateLibraryHelpText": "Määrittää päivitetäänkö palvelimen kirjasto tuonnin, uudelleennimeämisen tai poiston yhteydessä.", "NotificationsKodiSettingAlwaysUpdate": "Päivitä aina", "OrganizeSelectedArtists": "Järjestele valitut esittäjät", @@ -1169,12 +1169,12 @@ "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", "UrlBaseHelpText": "Käänteisen välityspalvelimen tukea varten. Oletusarvo on tyhjä.", "ImportListStatusCheckSingleClientMessage": "Listat eivät ole virheiden vuoksi käytettävissä: {0}", - "IndexerRssHealthCheckNoAvailableIndexers": "RSS-syötteitä tukevat tietolähteet eivät ole hiljattaisten tietolähdevirheiden vuoksi tilapaisesti käytettävissä.", + "IndexerRssHealthCheckNoAvailableIndexers": "RSS-syötteitä tukevat hakupalvelut eivät ole tilapaisesti käytettävissä hiljattaisten palveluvirheiden vuoksi.", "IndexerLongTermStatusCheckSingleClientMessage": "Hakupalvelut eivät ole käytettävissä yli kuusi tuntia kestäneiden virheiden vuoksi: {0}.", "MassSearchCancelWarning": "Tämä on mahdollista keskeyttää vain käynnistämällä {appName} uudelleen tai poistamalla kaikki hakupalvelut käytöstä.", "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Haluatko varmasti etsiä kaikkia {totalRecords} albumia, joiden katkaisutasoa ei ole saavutettu?", "MonitorNoAlbums": "Ei mitään", - "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.", + "IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa hakupalvelun sääntöjä.", "IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi.", "NotificationsKodiSettingsCleanLibrary": "Siivoa kirjasto", "AddNewArtistSearchForMissingAlbums": "Käynnistä puuttuvien albumien haku", @@ -1195,7 +1195,7 @@ "IncludeHealthWarnings": "Sisällytä kuntovaroitukset", "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} tukee useita listoja, joiden avulla esittäjiä ja albumeita voidaan tuoda tietokantaan.", "Priority": "Painotus", - "AlbumsLoadError": "Albumien lataus epäonnistui", + "AlbumsLoadError": "Virhe ladattaessa albumeita.", "ArtistIsUnmonitored": "Esittäjää ei valvota", "FormatAgeDay": "päivä", "FormatAgeDays": "päivää", @@ -1206,7 +1206,7 @@ "FormatShortTimeSpanMinutes": "{minutes} minuutti(a)", "FormatShortTimeSpanSeconds": "{seconds} sekunti(a)", "FormatTimeSpanDays": "{days} pv {time}", - "IndexersSettingsSummary": "Tietolähteet ja niiden asetukset.", + "IndexersSettingsSummary": "Hakupalvelut ja julkaisurajoitukset.", "ImportListsSettingsSummary": "Sisällön tuonti muista {appName}-instansseista tai palveluista, ja poikkeuslistojen hallinta.", "ImportMechanismHealthCheckMessage": "Käytä valmistuneiden latausten käsittelyä", "KeyboardShortcuts": "Pikanäppäimet", @@ -1227,10 +1227,10 @@ "UseSsl": "Käytä SSL-salausta", "DeleteSelectedArtists": "Poista valitut esittäjät", "Links": "Linkit", - "IndexerJackettAll": "Jackettin ei-tuettua \"all\"-päätettä käyttävät tietolähteet: {0}", + "IndexerJackettAll": "Jackettin ei-tuettua \"all\"-päätettä käyttävät hakupalvelut: {0}.", "AutomaticSearch": "Automaattihaku", "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen ({0}) IP-osoitteen selvitys epäonnistui.", - "IndexerPriorityHelpText": "Tietolähteen painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. {appName} käyttää edelleen kaikkia käytössä olevia tietolähteitä RSS-synkronointiin ja hakuun.", + "IndexerPriorityHelpText": "Hakupalvelun painotus, 1– 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen kaappauspäätökseen. {appName} käyttää edelleen kaikkia käytössä olevia hakupalveluita RSS-synkronointiin ja hakuun.", "ConnectionSettingsUrlBaseHelpText": "Lisää palvelimen {connectionName} URL-osoitteeseen etuliitteen, esim. \"{url}\".", "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Vaihtoehtoinen sijainti, johon valmistuneet lataukset siirretään. Käytä Delugen oletusta jättämällä tyhjäksi.", "DownloadClientDelugeSettingsDirectoryHelpText": "Vaihtoehtoinen latausten tallennussijainti. Käytä Delugen oletusta jättämällä tyhjäksi.", @@ -1242,9 +1242,9 @@ "ParseModalErrorParsing": "Virhe jäsennettäessä. Yritä uudelleen.", "ParseModalHelpText": "Syötä julkaisun nimi yllä olevaan kenttään.", "ParseModalHelpTextDetails": "{appName} pyrkii jäsentämään nimen ja näyttämään sen tiedot.", - "ParseModalUnableToParse": "Annetun nimikkeen jäsennys ei onnistunut. Yritä uudelleen.", + "ParseModalUnableToParse": "Virhe jäsennettäessä nimikettä. Yritä uudelleen.", "Repack": "Uudelleenpaketoitu", - "TestParsing": "Testaa jäsennystä", + "TestParsing": "Koesta jäsennys", "True": "Tosi", "Any": "Mikä tahansa", "BuiltIn": "Sisäänrakennettu", @@ -1302,7 +1302,7 @@ "AllowFingerprintingHelpTextWarning": "Tätä varten {appName}in on luettava osia tiedostoista, joka saattaa kasvattaa levyn tai verkon kuormitusta tarkistusten aikana.", "EmbedCoverArtHelpText": "Sisällytä Lidarrin albumikuvitukset äänitiedostoihin kun niiden tagit tallennetaan.", "ForeignId": "Vieras ID", - "MonitorAlbum": "Valvo albumia", + "MonitorAlbum": "Albumien valvonta", "AddNewArtist": "Lisää uusi esittäjä", "DownloadedWaitingToImport": "Ladattu – Odottaa tuontia", "ArtistProgressBarText": "{trackFileCount}/{trackCount} (kaikkiaan: {totalTrackCount}, latauksessa: {downloadingCount})", @@ -1333,7 +1333,7 @@ "NoTracksInThisMedium": "Kappaleita ei ole tässä muodossa", "ReleaseProfileTagArtistHelpText": "Julkaisuprofiileja sovelletaan esittäjiin, jotka on merkitty ainakin yhdellä täsmäävällä tunnisteella. Käytä kaikille esittäjille jättämällä tyhjäksi.", "TrackFileMissingTooltip": "Kappaletiedosto puuttuu", - "TrackFilesLoadError": "Kappaletiedostojen lataus epäonnistui", + "TrackFilesLoadError": "Virhe ladattaessa kappaletiedostoja.", "AddNewAlbum": "Lisää uusi albumi", "AddNewAlbumSearchForNewAlbum": "Käynnistä uusien albumien haku", "AlbumCount": "Abumien määrä", @@ -1346,5 +1346,6 @@ "DefaultDelayProfileArtist": "Tämä on oletusprofiili, joka pätee kaikkii esittäjiin, joille ei ole erikseen määritetty profiilia.", "DelayProfileArtistTagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille.", "Disambiguation": "Yksinkertaistaminen", - "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä." + "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä.", + "NotificationsSettingsWebhookHeaders": "Otsakkeet" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index d01b39743..c1445b2b8 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1338,5 +1338,7 @@ "DownloadClientSettingsOlderPriority": "Priorité plus ancienne", "DownloadClientSettingsPostImportCategoryHelpText": "Catégorie que {appName} doit définir après avoir importé le téléchargement. {appName} ne supprimera pas les torrents de cette catégorie même si l'ensemencement est terminé. Laisser vide pour conserver la même catégorie.", "DownloadClientSettingsRecentPriority": "Priorité récente", - "PostImportCategory": "Catégorie après l'importation" + "PostImportCategory": "Catégorie après l'importation", + "ManageFormats": "Gérer les formats", + "NotificationsSettingsWebhookHeaders": "En-têtes" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 6681d82ae..bed47dad8 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -745,5 +745,159 @@ "UpdateAvailableHealthCheckMessage": "새 업데이트 사용 가능: {version}", "Today": "오늘", "MappedNetworkDrivesWindowsService": "Windows 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다. 자세한 내용은 FAQ를 참조하십시오.", - "DownloadClientSettingsRecentPriority": "클라이언트 우선 순위" + "DownloadClientSettingsRecentPriority": "클라이언트 우선 순위", + "RemoveSelectedItem": "선택한 항목 제거", + "FormatAgeDays": "일", + "FormatAgeHour": "시간", + "AuthenticationMethod": "인증 방식", + "BlocklistAndSearch": "차단 목록 및 검색", + "CloneCondition": "조건 복제", + "ConditionUsingRegularExpressions": "이 조건은 정규 표현식을 사용하여 일치합니다. 문자 `\\^$.|?*+()[{`은(는) 특별한 의미가 있으며 `\\`으로 끝나야 합니다.", + "Release": " 출시", + "RegularExpressionsCanBeTested": "[여기]({url})에서정규식을 테스트 할 수 있습니다.", + "RemotePathMappingsInfo": "원격 경로 매핑은 거의 필요하지 않습니다. {appName}와(과) 다운로드 클라이언트가 동일한 시스템에 있는 경우 경로를 일치시키는 것이 좋습니다. 상세 내용은 [위키]({wikiLink})를 참조하세요.", + "ResetQualityDefinitionsMessageText": "품질 정의를 초기화하시겠습니까?", + "ShownClickToHide": "표시됨, 숨기려면 클릭", + "Small": "작게", + "SmartReplace": "지능형 바꾸기", + "Theme": "테마", + "ThemeHelpText": "애플리케이션 UI 테마 변경, '자동' 테마는 OS 테마를 사용하여 라이트 또는 다크 모드를 설정합니다. Theme.Park에서 영감을 받음", + "ThereWasAnErrorLoadingThisPage": "이 페이지를 로드하는 중ㅇ 오류가 발생했습니다", + "Unlimited": "무제한", + "UpdateFiltered": "업데이트에 필터 적용됨", + "RemoveTagsAutomatically": "태그 자동 제거", + "AutoRedownloadFailedFromInteractiveSearch": "상호작용 검색에서 재다운로드를 실패함", + "ClearBlocklistMessageText": "정말로 모든 항목을 차단 목록에서 지우시겠습니까?", + "Menu": "메뉴", + "PasswordConfirmation": "비밀번호 확인", + "RemoveMultipleFromDownloadClientHint": "다운로드 클라이언트에서 다운로드 및 파일을 제거합니다", + "RemoveQueueItem": "제거 - {sourceTitle}", + "RemoveQueueItemRemovalMethodHelpTextWarning": "'다운로드 클라이언트에서 제거'를 선택하면 다운로드 및 파일이 다운로드 클라이언트에서 제거됩니다.", + "RemoveSelectedItems": "선택한 항목 제거", + "Repack": "repack", + "ReplaceWithDash": "대시로 바꾸기", + "Required": "필수", + "Script": "스크립트", + "Space": "간격", + "SupportedAutoTaggingProperties": "{appName}은(는) 자동 태그 지정 규칙에 대한 다음 속성을 지원합니다", + "Table": "테이블", + "ThereWasAnErrorLoadingThisItem": "이 항목을 로드하는 중에 오류가 발생했습니다", + "ApplicationURL": "애플리케이션 URL", + "AutoTaggingRequiredHelpText": "이 {implementationName} 조건은 자동 태그 지정 규칙이 적용되도록 일치해야 합니다. 그렇지 않으면 단일 {implementationName} 일치로 충분합니다.", + "BlocklistMultipleOnlyHint": "대체 항목을 검색하지 않고 차단 목록에 추가", + "ChownGroup": "chown 그룹", + "CustomFormatsSpecificationFlag": "국기", + "CustomFormatsSpecificationRegularExpression": "일반 표현", + "Database": "데이터베이스", + "DeleteSelected": "선택된 것을 삭제", + "DownloadClientAriaSettingsDirectoryHelpText": "다운로드를 이동할 선택적 위치입니다. 기본 Aria2 위치를 사용하려면 비워두세요", + "DownloadClientQbittorrentSettingsContentLayout": "콘텐츠 레이아웃", + "Duration": "기간", + "False": "거짓", + "Dash": "대시", + "FormatAgeHours": "시간", + "FormatAgeMinute": "분", + "FormatAgeMinutes": "분", + "Install": "설치", + "Label": "라벨", + "Max": "최대", + "Min": "최소", + "Negate": "Negate", + "NoResultsFound": "결과를 찾을 수 없습니다", + "Period": "기간", + "Rejections": "거부", + "RemoveTagsAutomaticallyHelpText": "조건이 충족되지 않으면 태그를 자동으로 제거", + "ResetQualityDefinitions": "품질 정의 초기화", + "SelectIndexerFlags": "인덱서 플래그 선택", + "SelectReleaseGroup": "출시 그룹 선택", + "SetIndexerFlags": "인덱서 플래그 설정", + "SkipRedownload": "재다운로드 건너뛰기", + "TestParsing": "테스트 파싱", + "ApplyChanges": "변경 사항 적용", + "ClickToChangeIndexerFlags": "인덱서 플래그를 변경하려면 클릭", + "CloneAutoTag": "자동 태그 복제", + "ColonReplacement": "콜론 바꾸기", + "CountCustomFormatsSelected": "{count}개의 사용자 정의 형식을 선택함", + "CustomFormatsSettingsTriggerInfo": "사용자 정의 형식은 선택한 다양한 조건 유형 중 하나 이상과 일치할 경우 출시 또는 파일에 적용됩니다.", + "CustomFormatsSpecificationRegularExpressionHelpText": "사용자 정의 형식 정규표현식은 대소문자를 구분하지 않습니다", + "DeleteAutoTag": "자동 태그 삭제", + "DeleteImportList": "가져오기 목록 삭제", + "DeleteRootFolder": "루트 폴더 삭제", + "DeleteSelectedCustomFormatsMessageText": "정말로 {count}개의 선택한 사용자 정의 형식을 삭제하시겠습니까?", + "DoNotBlocklist": "차단 목록에 추가하지 않음", + "DownloadClientDelugeSettingsDirectory": "다운로드 디렉토리", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "완료된 다운로드를 이동할 선택적 위치. 기본 Deluge 위치를 사용하려면 비워두세요", + "DownloadClientDelugeSettingsDirectoryHelpText": "다운로드를 이동할 선택적 위치. 기본 Deluge 위치를 사용하려면 비워두세요", + "ReleaseProfiles": "출시 프로필", + "RemoveCompleted": "제거 완료", + "RemoveCompletedDownloads": "완료된 다운로드 제거", + "RemoveFailed": "제거 실패", + "RemoveFailedDownloads": "실패한 다운로드 제거", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "'다운로드 클라이언트에서 제거'를 선택하면 다운로드 및 파일이 다운로드 클라이언트에서 제거됩니다.", + "DoNotBlocklistHint": "차단 목록에 추가하지 않고 제거", + "Never": "절대", + "Loading": "로딩중", + "Auto": "자동", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "대화형 검색에서 실패한 출시가 잡혔을 때 다른 출시를 자동으로 검색하여 다운로드 시도", + "AutomaticAdd": "자동 추가", + "BlocklistAndSearchHint": "차단 목록에 추가한 후 대체 항목 검색 시작", + "ChangeCategoryHint": "다운로드 클라이언트에서 다운로드를 '가져오기 이후 카테고리'로 변경", + "DeleteCondition": "조건 삭제", + "DeleteRemotePathMappingMessageText": "정말로 이 원격 경로 매핑을 삭제하시겠습니까?", + "NotificationsSettingsWebhookHeaders": "헤더", + "RemoveDownloadsAlert": "제거 설정은 위 표의 개별 다운로드 클라이언트 설정으로 이동되었습니다.", + "RemoveFromDownloadClientHint": "다운로드 클라이언트에서 다운로드 및 파일을 제거합니다", + "ReplaceWithSpaceDash": "공백 대시로 바꾸기", + "ResetDefinitionTitlesHelpText": "정의 제목과 값을 초기화하세요", + "ResetDefinitions": "정의 초기화", + "ResetTitles": "제목 초기화", + "ResetTitlesHelpText": "정의 제목과 값을 초기화하세요", + "RootFolderPath": "루트 폴더 경로", + "SizeLimit": "크기 제한", + "SkipFreeSpaceCheckHelpText": "{appName}이(가) 루트 폴더의 여유 공간을 감지할 수 없는 경우 사용하세요", + "Started": "시작됨", + "True": "참", + "Underscore": "밑줄", + "UserAgentProvidedByTheAppThatCalledTheAPI": "API를 호출한 앱에서 제공하는 사용자 에이전트", + "WhatsNew": "새로운 소식?", + "AuthenticationMethodHelpTextWarning": "인증 방식을 선택해주세요", + "AuthenticationRequiredHelpText": "필수 인증을 요청하는 변경 사항. 위험을 이해하지 못한다면 변경하지 마세요.", + "AuthenticationRequiredWarning": "인증 없이 원격 액세스를 방지하기 위해 {appName}은(는) 이제 인증을 활성화해야 합니다. 선택적으로 로컬 주소에서 인증을 비활성화할 수 있습니다.", + "AutoTagging": "자동 태그 지정", + "AutoTaggingLoadError": "자동 태그 지정을 로드할 수 없음", + "AutoTaggingSpecificationTag": "태그", + "AutomaticUpdatesDisabledDocker": "Docker 업데이트 메커니즘을 사용할 때는 자동 업데이트가 직접 지원되지 않습니다. {appName} 외부에서 컨테이너 이미지를 업데이트하거나 스크립트를 사용해야 합니다", + "ChangeCategoryMultipleHint": "다운로드 클라이언트에서 다운로드를 '가져오기 이후 카테고리'로 변경", + "ClickToChangeReleaseGroup": "출시 그룹을 변경하려면 클릭", + "ConnectionSettingsUrlBaseHelpText": "{connectionName} url에 {url}와(과) 같은 접두사를 추가합니다", + "DeleteSelectedImportLists": "가져오기 목록 삭제", + "RemoveQueueItemRemovalMethod": "제거 방식", + "ReplaceWithSpaceDashSpace": "공백 대시 공백으로 바꾸기", + "DownloadClientDelugeSettingsDirectoryCompleted": "완료 후 이동할 디렉토리", + "IndexerIdHelpText": "프로필이 적용되는 인덱서를 지정하세요", + "IndexerSettingsApiUrl": "API 주소", + "IsShowingMonitoredUnmonitorSelected": "선택 항목 모니터링 해제", + "MinimumCustomFormatScoreHelpText": "선호하는 프로토콜의 지연을 우회하는 데 필요한 최소 사용자 정의 형식 점수", + "NoCutoffUnmetItems": "조건 미충족 항목 없음", + "NotificationsKodiSettingsDisplayTime": "시간 표시", + "NotificationsPlexSettingsAuthToken": "인증 토큰", + "External": "외부", + "Large": "크게", + "Logout": "로그아웃", + "ApplicationUrlHelpText": "이 애플리케이션의 외부 URL - http(s)://, port 및 URL 기반 포함", + "AuthenticationRequired": "인증 필수", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "새 비밀번호 확인", + "AuthenticationRequiredPasswordHelpTextWarning": "새 비밀번호를 입력하세요", + "AuthenticationRequiredUsernameHelpTextWarning": "새 사용자이름을 입력하세요", + "BypassIfAboveCustomFormatScore": "사용자 정의 형식 점수보다 높으면 무시", + "BypassIfAboveCustomFormatScoreHelpText": "구성된 최소 사용자 정의 형식 점수보다 출시 점수가 높을 경우 무시를 활성화합니다", + "BypassIfHighestQuality": "최고 품질일 경우 무시", + "BypassIfHighestQualityHelpText": "선호 프로토콜이 있는 품질 프로필에서 출시가 가장 높은 활성화 품질을 가질 때 지연을 무시합니다", + "BlocklistAndSearchMultipleHint": "차단 목록에 추가한 후 대체 항목 검색 시작", + "BlocklistOnly": "차단 목록만", + "BlocklistOnlyHint": "대체 항목을 검색하지 않고 차단 목록에 추가", + "ChangeCategory": "카테고리 변경", + "ClearBlocklist": "차단 목록 지우기", + "DashOrSpaceDashDependingOnName": "이름에 따라 대시 또는 띄어쓰고 대시", + "Donate": "기부하기" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index a6fff2291..eb62c4211 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -277,5 +277,13 @@ "Clone": "Lukk", "Reason": "Sesong", "AddDelayProfileError": "Ikke mulig å legge til ny betingelse, vennligst prøv igjen", - "DownloadClientSettingsRecentPriority": "Klientprioritet" + "DownloadClientSettingsRecentPriority": "Klientprioritet", + "AddDownloadClientImplementation": "Ny Nedlastingsklient - {implementationName}", + "UnableToAddANewRemotePathMappingPleaseTryAgain": "Kunne ikke legge til ny ekstern stimapping, vennligst prøv igjen.", + "RequiredPlaceHolder": "Legg til ny begrensning", + "FailedLoadingSearchResults": "Kunne ikke laste søkeresultat, vennligst prøv igjen.", + "AddImportListImplementation": "Legg til importliste - {implementationName}", + "IgnoredPlaceHolder": "Legg til ny begrensning", + "AddImportList": "Ny Importliste", + "AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 884b68fe7..24f137e4d 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -903,5 +903,9 @@ "Min": "Min", "Preferred": "Voorkeur gegeven", "MappedNetworkDrivesWindowsService": "Toegewezen netwerkstation is niet beschikbaar wanneer Prowlarr wordt uitgevoerd als een Windows Service. Bekijk de Veelgestelde Vragen voor meer informatie", - "DownloadClientSettingsRecentPriority": "Client Prioriteit" + "DownloadClientSettingsRecentPriority": "Client Prioriteit", + "AddArtistWithName": "{artistName} toevoegen", + "AddNewArtist": "Voeg nieuwe artiest toe", + "AddNewAlbum": "Voeg nieuw album toe", + "AddNewAlbumSearchForNewAlbum": "Start zoektoch voor een nieuw album" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 7405d800e..36ecd41ae 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -367,7 +367,7 @@ "PortNumber": "Número da Porta", "PosterSize": "Tamanho do pôster", "PreviewRename": "Visualizar renomeação", - "PreviewRetag": "Visualizar adição de nova tag", + "PreviewRetag": "Visualizar remarcação", "NETCore": ".NET", "PropersAndRepacks": "Propers e repacks", "Protocol": "Protocolo", @@ -410,7 +410,7 @@ "Remove": "Remover", "RemoveCompletedDownloadsHelpText": "Remover downloads importados do histórico do cliente de download", "RemoveFailedDownloadsHelpText": "Remova downloads com falha do histórico do cliente de download", - "RequiredHelpText": "O lançamento deve conter pelo menos um desses termos (sem distinção entre maiúsculas e minúsculas)", + "RequiredHelpText": "O lançamento deve conter pelo menos um destes termos (não diferencia maiúsculas e minúsculas)", "RequiredPlaceHolder": "Adicionar nova restrição", "RequiresRestartToTakeEffect": "Requer reiniciar para ter efeito", "RescanAfterRefreshHelpText": "Verificar novamente a pasta de autor após atualizar o autor", @@ -454,7 +454,7 @@ "StatusEndedContinuing": "Continuação", "Style": "Estilo", "SuccessMyWorkIsDoneNoFilesToRename": "Êba, já terminei! Não há arquivos a renomear.", - "SuccessMyWorkIsDoneNoFilesToRetag": "Êba, já terminei! Não há novas tags a adicionar a arquivos.", + "SuccessMyWorkIsDoneNoFilesToRetag": "Êba, já terminei! Não há arquivos a remarcar.", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "O RSS não é compatível com este indexador", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "A pesquisa não é compatível com este indexador", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Será usado ao realizar pesquisas automáticas pela interface ou pelo {appName}", @@ -634,7 +634,7 @@ "ExpandSingleByDefaultHelpText": "Singles", "OnApplicationUpdate": "Na Atualização do Aplicativo", "OnRename": "Ao Renomear", - "OnTrackRetag": "Ao Retag Faixa", + "OnTrackRetag": "Ao remarcar faixa", "OnUpgrade": "Ao Atualizar", "OnDownloadFailure": "Na Falha do Download", "OnGrab": "Ao obter", @@ -781,7 +781,7 @@ "ArtistName": "Nome do artista", "ArtistType": "Tipo de artista", "CombineWithExistingFiles": "Combinar com arquivos existentes", - "MonitorNewItems": "Monitorar Novos Álbuns", + "MonitorNewItems": "Monitorar novos álbuns", "DateAdded": "Data da adição", "DeleteArtist": "Excluir artista selecionado", "Discography": "Discografia", @@ -798,8 +798,8 @@ "Playlist": "Lista de Reprodução", "Proceed": "Proceder", "ReplaceExistingFiles": "Substituir Arquivos Existentes", - "Retag": "Retag", - "Retagged": "Retagged", + "Retag": "Remarcar", + "Retagged": "Remarcado", "RootFolderPath": "Caminho da Pasta Raiz", "SelectAlbum": "Selecionar Álbum", "SelectAlbumRelease": "Selecionar Lançamento do Álbum", @@ -947,7 +947,7 @@ "DeleteRemotePathMapping": "Excluir mapeamento de caminho remoto", "BlocklistReleases": "Lançamentos na lista de bloqueio", "DeleteCondition": "Excluir condição", - "DeleteConditionMessageText": "Tem certeza de que deseja excluir a condição '{name}'?", + "DeleteConditionMessageText": "Tem certeza de que deseja excluir a condição \"{name}\"?", "Negated": "Negado", "NoHistoryBlocklist": "Não há lista de bloqueio no histórico", "RemoveSelectedItemBlocklistMessageText": "Tem certeza de que deseja remover os itens selecionados da lista de bloqueio?", @@ -957,7 +957,7 @@ "ResetQualityDefinitions": "Redefinir definições de qualidade", "ResetQualityDefinitionsMessageText": "Tem certeza de que deseja redefinir as definições de qualidade?", "ResetTitlesHelpText": "Redefinir títulos de definição e valores", - "BlocklistReleaseHelpText": "Impede que o {appName} obtenha automaticamente esses arquivos novamente", + "BlocklistReleaseHelpText": "Impede que o {appName} obtenha esses arquivos novamente de forma automática", "FailedToLoadQueue": "Falha ao carregar a fila", "QueueIsEmpty": "A fila está vazia", "NoCutoffUnmetItems": "Nenhum item com limite não atingido", @@ -976,7 +976,7 @@ "AutomaticAdd": "Adição automática", "CountDownloadClientsSelected": "{selectedCount} cliente(s) de download selecionado(s)", "CountImportListsSelected": "{selectedCount} lista(s) de importação selecionada(s)", - "DeleteSelectedDownloadClients": "Excluir Cliente(s) de Download Selecionado(s)", + "DeleteSelectedDownloadClients": "Excluir cliente(s) de download selecionado(s)", "DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir o(s) {count} cliente(s) de download selecionado(s)?", "DeleteSelectedImportLists": "Excluir lista(s) de importação", "DeleteSelectedImportListsMessageText": "Tem certeza de que deseja excluir a(s) {count} lista(s) de importação selecionada(s)?", @@ -1048,9 +1048,9 @@ "ErrorLoadingContent": "Ocorreu um erro ao carregar este conteúdo", "AddNewArtist": "Adicionar Novo Artista", "AddNewAlbum": "Adicionar Novo Álbum", - "AddNewArtistRootFolderHelpText": "A subpasta '{folder}' será criada automaticamente", + "AddNewArtistRootFolderHelpText": "A subpasta \"{folder}\" será criada automaticamente", "ImportListRootFolderMissingRootHealthCheckMessage": "Pasta raiz ausente para lista(s) de importação: {0}", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Múltiplas pastas raiz estão faltando nas listas de importação: {0}", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Várias pastas raiz estão ausentes para listas de importação: {0}", "PreferProtocol": "Preferir {preferredProtocol}", "HealthMessagesInfoBox": "Para saber mais sobre a causa dessas mensagens de verificação de integridade, clique no link da wiki (ícone de livro) no final da linha ou verifique os [logs]({link}). Se tiver dificuldade em interpretar essas mensagens, entre em contato com nosso suporte nos links abaixo.", "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los.", @@ -1094,7 +1094,7 @@ "Large": "Grande", "MonitorArtists": "Monitorar Artistas", "RenameFiles": "Renomear Arquivos", - "RetagSelectedArtists": "Retag Artistas Selecionados", + "RetagSelectedArtists": "Remarcar artistas selecionados", "SetAppTags": "Definir {appName} Tags", "Small": "Pequeno", "UpdateMonitoring": "Atualizar Monitoramento", @@ -1233,7 +1233,7 @@ "MonitorFirstAlbum": "Primeiro Álbum", "MonitorFutureAlbums": "Álbuns Futuros", "MonitorLastestAlbum": "Último Álbum", - "MonitorNoAlbums": "Nada", + "MonitorNoAlbums": "Nenhum", "MonitorNoNewAlbums": "Sem Novos Álbuns", "Yesterday": "Ontem", "FormatShortTimeSpanMinutes": "{minutes} minuto(s)", @@ -1246,7 +1246,7 @@ "DownloadClientDelugeSettingsDirectoryCompleted": "Mover para o Diretório Quando Concluído", "DownloadClientDelugeSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Deluge", "NotificationsEmbySettingsSendNotifications": "Enviar Notificações", - "NotificationsEmbySettingsSendNotificationsHelpText": "Faça com que o MediaBrowser envie notificações para provedores configurados", + "NotificationsEmbySettingsSendNotificationsHelpText": "Faça com que o MediaBrowser envie notificações para os provedores configurados", "NotificationsKodiSettingAlwaysUpdate": "Sempre Atualizar", "NotificationsKodiSettingAlwaysUpdateHelpText": "Atualizar a biblioteca mesmo quando um vídeo está sendo reproduzido?", "NotificationsKodiSettingsCleanLibrary": "Limpar Biblioteca", @@ -1259,14 +1259,14 @@ "NotificationsSettingsUpdateLibrary": "Atualizar Biblioteca", "NotificationsSettingsUpdateMapPathsFrom": "Mapear Caminhos De", "NotificationsSettingsUpdateMapPathsTo": "Mapear Caminhos Para", - "NotificationsSettingsUpdateMapPathsToHelpText": "Caminho {serviceName}, usado para modificar caminhos de série quando {serviceName} vê a localização do caminho da biblioteca de forma diferente de {appName} (requer 'Atualizar Biblioteca')", + "NotificationsSettingsUpdateMapPathsToHelpText": "Caminho do {serviceName}, usado para alterar caminhos de séries quando o {serviceName} vê a localização do caminho da biblioteca de forma diferente do {appName} (requer \"Atualizar biblioteca\")", "NotificationsSettingsUseSslHelpText": "Conecte-se a {serviceName} por HTTPS em vez de HTTP", "UseSsl": "Usar SSL", "ConnectionSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL {connectionName}, como {url}", "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Local opcional para mover os downloads concluídos, deixe em branco para usar o local padrão do Deluge", - "NotificationsEmbySettingsUpdateLibraryHelpText": "Atualizar Biblioteca ao Importar, Renomear ou Excluir?", + "NotificationsEmbySettingsUpdateLibraryHelpText": "Atualizar biblioteca ao importar, renomear ou excluir?", "NotificationsKodiSettingsDisplayTimeHelpText": "Por quanto tempo a notificação será exibida (em segundos)", - "NotificationsSettingsUpdateMapPathsFromHelpText": "Caminho {appName}, usado para modificar caminhos de série quando {serviceName} vê a localização do caminho da biblioteca de forma diferente de {appName} (requer 'Atualizar Biblioteca')", + "NotificationsSettingsUpdateMapPathsFromHelpText": "Caminho do {appName}, usado para alterar caminhos de séries quando o {serviceName} vê a localização do caminho da biblioteca de forma diferente do {appName} (requer \"Atualizar biblioteca\")", "AddToDownloadQueue": "Adicionar à fila de download", "AddedToDownloadQueue": "Adicionado à fila de download", "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} não conseguiu determinar a qual artista e álbum se destinava este lançamento. {appName} pode não conseguir importar esta versão automaticamente. Você quer pegar '{title}'?", @@ -1330,7 +1330,7 @@ "InstallMajorVersionUpdateMessage": "Esta atualização instalará uma nova versão principal e pode não ser compatível com o seu sistema. Tem certeza de que deseja instalar esta atualização?", "ManageFormats": "Gerenciar Formatos", "AddDelayProfileError": "Não foi possível adicionar um novo perfil de atraso. Tente novamente.", - "ImportListTagsHelpText": "Tags que serão adicionadas ao importar esta lista", + "ImportListTagsHelpText": "Etiquetas que serão adicionadas ao importar esta lista", "DefaultDelayProfileArtist": "Este é o perfil padrão. Aplica-se a todos os artistas que não possuem um perfil explícito.", "ICalTagsArtistHelpText": "O feed conterá apenas artistas com pelo menos uma etiqueta correspondente", "NotificationsTagsArtistHelpText": "Envie notificações apenas para artistas com pelo menos uma etiqueta correspondente", @@ -1346,5 +1346,6 @@ "DownloadClientSettingsRecentPriority": "Priorizar recentes", "PostImportCategory": "Categoria Pós-Importação", "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridade para usar ao pegar álbuns lançados há mais de 14 dias", - "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridade de uso ao adquirir álbuns lançados nos últimos 14 dias" + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridade de uso ao adquirir álbuns lançados nos últimos 14 dias", + "NotificationsSettingsWebhookHeaders": "Cabeçalhos" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 4f9063901..c9c1b31f0 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -1082,5 +1082,6 @@ "DownloadClientSettingsPostImportCategoryHelpText": "{appName}'in indirmeyi içe aktardıktan sonra ayarlayacağı kategori. {appName}, seed tamamlanmış olsa bile bu kategorideki torrentleri kaldırmayacaktır. Aynı kategoriyi korumak için boş bırakın.", "DownloadClientSettingsRecentPriority": "Yeni Önceliği", "PostImportCategory": "İçe Aktarma Sonrası Kategorisi", - "DownloadClientSettingsOlderPriority": "Eski Önceliği" + "DownloadClientSettingsOlderPriority": "Eski Önceliği", + "NotificationsSettingsWebhookHeaders": "Başlıklar" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index af927630d..b02ae0ad6 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1335,5 +1335,6 @@ "DownloadClientSettingsOlderPriority": "最早优先", "DownloadClientSettingsPostImportCategoryHelpText": "导入下载后要设置的 {appName} 的分类。 即使做种完成,{appName} 也不会删除该分类中的种子。 留空以保留同一分类。", "DownloadClientSettingsRecentPriority": "最近优先", - "PostImportCategory": "导入后分类" + "PostImportCategory": "导入后分类", + "NotificationsSettingsWebhookHeaders": "标头" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_Hans.json b/src/NzbDrone.Core/Localization/Core/zh_Hans.json index b49f406e7..28374badf 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_Hans.json +++ b/src/NzbDrone.Core/Localization/Core/zh_Hans.json @@ -3,5 +3,6 @@ "About": "关于", "Always": "总是", "Analytics": "分析", - "Username": "用户名" + "Username": "用户名", + "Activity": "111" } From 51a38bc648ed1b2d703de8fc37758e3eb4b3ac6b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 28 Jan 2025 21:57:30 +0200 Subject: [PATCH 028/146] Fix logging message for directory watcher error --- src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs b/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs index 76c204e1f..447d82baf 100644 --- a/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs +++ b/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs @@ -183,7 +183,7 @@ namespace NzbDrone.Core.MediaFiles } else { - _logger.Error(ex, "Error in Directory watcher for: {0}" + dw.Path); + _logger.Error(ex, "Error in Directory watcher for: {0}", dw.Path); DisposeWatcher(dw, true); } From 477a799b8a15c56600a33ecd4940d140ab08195e Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 1 Feb 2025 18:33:23 +0000 Subject: [PATCH 029/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dani Talens Co-authored-by: Mailme Dashite Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/de/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ca.json | 4 +- src/NzbDrone.Core/Localization/Core/de.json | 86 +++++++++++++++++---- 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index b1487962c..504f4d43c 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -971,5 +971,7 @@ "Today": "Avui", "MappedNetworkDrivesWindowsService": "Les unitats de xarxa assignades no estan disponibles quan s'executen com a servei de Windows. Si us plau, consulteu les PMF per a obtenir més informació", "DownloadClientSettingsRecentPriority": "Prioritat del client", - "AddNewArtist": "Afegeix Nou Artista" + "AddNewArtist": "Afegeix Nou Artista", + "AddNewItem": "Afegeix un nou element", + "AlbumCount": "Recompte d'àlbums" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 72f1170a9..e2fceb7b2 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -452,7 +452,7 @@ "SslCertPathHelpText": "Pfad zur PFX Datei", "SslCertPathHelpTextWarning": "Erfordert einen Neustart", "ArtistFolderFormat": "Autor Orderformat", - "UiLanguageHelpText": "Sprache für die gesamte Oberfläche", + "UiLanguageHelpText": "Sprache, die {appName} für die Benutzeroberfläche verwenden wird.", "UiLanguageHelpTextWarning": "Seite muss neugeladen werden", "UnableToLoadNamingSettings": "Umbenennungeinstellungen konnten nicht geladen werden", "Updates": "Updates", @@ -785,7 +785,7 @@ "ImportFailed": "Import fehlgeschlagen", "EndedOnly": "Nur beendete", "MassAlbumsCutoffUnmetWarning": "Bist du dir sicher, dass du nach allen '{0}' Alben suchen willst deren Schwelle nicht erreicht worden ist?", - "SearchForAllMissingAlbumsConfirmationCount": "Bist du dir sicher, dass du nach allen '{0}' fehlenden Alben suchen willst?", + "SearchForAllMissingAlbumsConfirmationCount": "Bist du sicher, dass du nach allen {totalRecords} fehlenden Alben suchen möchtest?", "MissingTracks": "Fehlende Tracks", "MonitorNewItems": "Neues Album überwachen", "MonitoringOptionsHelpText": "Welche Alben sollen überwacht werden nachdem der Künstler hinzugefügt wurde (einmalige Anpassung)", @@ -817,7 +817,7 @@ "CopyToClipboard": "In die Zwischenablage kopieren", "CouldntFindAnyResultsForTerm": "Keine Ergebnisse für '{0}' gefunden", "CustomFormat": "Eigenes Format", - "CustomFormatRequiredHelpText": "Diese {0} Bedingungen müsen zutreffen damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.", + "CustomFormatRequiredHelpText": "Diese {0}-Bedingung muss übereinstimmen, damit das benutzerdefinierte Format angewendet wird. Andernfalls reicht eine einzelne {0}-Übereinstimmung aus.", "CustomFormatSettings": "Einstellungen für eigene Formate", "DeleteCustomFormat": "Eigenes Format löschen", "DeleteCustomFormatMessageText": "Bist du sicher, dass du das benutzerdefinierte Format '{name}' wirklich löschen willst?", @@ -844,7 +844,7 @@ "SpecificMonitoringOptionHelpText": "Autoren überwachen aber nur Bücher überwachen, welche explizit in der Liste miteinbezogen wurden", "CustomFormats": "Eigene Formate", "Customformat": "Eigenes Format", - "CutoffFormatScoreHelpText": "Sobald dieser Wert für das benutzerdefinierte Format erreicht wird, werden keine neuen Releases mehr abgerufen", + "CutoffFormatScoreHelpText": "Sobald dieser benutzerdefinierte Formatwert erreicht ist, wird {appName} keine Albumveröffentlichungen mehr abrufen.", "IncludeCustomFormatWhenRenamingHelpText": "In {Custom Formats} umbennenungs Format", "HiddenClickToShow": "Versteckt, zum Anzeigen anklicken", "RemotePathMappingCheckBadDockerPath": "Docker erkannt; Downloader {0} speichert Downloads in {1}, aber dies ist kein valider {2} Pfad. Überprüfe die Remote-Pfadzuordnungen und die Downloader Einstellungen.", @@ -870,13 +870,13 @@ "ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}", "ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}", "RecycleBinUnableToWriteHealthCheck": "Es kann nicht in den konfigurierten Papierkorb-Ordner geschrieben werden: {0}. Stellen Sie sicher, dass dieser Pfad existiert und von dem Benutzer, der {appName} ausführt, beschreibbar ist.", - "RemotePathMappingCheckDownloadPermissions": "{appName} kann den Download sehen, aber nicht verarbeiten {0}. Möglicherweise ein Rechteproblem.", + "RemotePathMappingCheckDownloadPermissions": "{appName} kann die heruntergeladene Musik {0} sehen, aber nicht darauf zugreifen. Wahrscheinlich ein Berechtigungsfehler.", "RemotePathMappingCheckFileRemoved": "Datei {0} wurde während des Verarbeitens entfernt.", "RemotePathMappingCheckFilesBadDockerPath": "Docker erkannt; Downloader {0} meldet Dateien in {1}, aber dies ist kein valider {2} Pfad. Überprüfe deine Remote-Pfadzuordnungen und die Downloader Einstellungen.", "RemotePathMappingCheckFilesWrongOSPath": "Downloader {0} meldet Dateien in {1}, aber dies ist kein valider {2} Pfad. Überprüfe deine Remote-Pfadzuordnungen und die Downloader Einstellungen.", "RemotePathMappingCheckFolderPermissions": "{appName} kann das Downloadverzeichnis sehen, aber nicht verarbeiten {0}. Möglicherwiese ein Rechteproblem.", "RemotePathMappingCheckGenericPermissions": "Downloader {0} speichert Downloads in {1}, aber {appName} kann dieses Verzeichnis nicht sehen. Möglicherweise müssen die Verzeichnisrechte angepasst werden.", - "RemotePathMappingCheckImportFailed": "{appName} konnte den Film nicht importieren. Prüfe die Logs für mehr Informtationen.", + "RemotePathMappingCheckImportFailed": "{appName} konnte die Musik nicht importieren. Überprüfe die Logs für weitere Details.", "RemotePathMappingCheckFilesGenericPermissions": "Downloader {0} meldet Dateien in {1}, aber {appName} kann dieses Verzeichnis nicht sehen.Möglicherweise müssen die Verzeichnisreche angepasst werden.", "RemotePathMappingCheckFilesLocalWrongOSPath": "Downloader {0} meldet Dateien in {1}, aber dies ist kein valider {2} Pfad. Überprüfe die Downloader Einstellungen.", "RemotePathMappingCheckLocalWrongOSPath": "Downloader {0} speichert Downloads in {1}, aber dies ist kein valider {2} Pfad. Überprüfe die Downloader Einstellungen.", @@ -910,7 +910,7 @@ "DeleteRemotePathMapping": "Entfernte Pfadzuordnung löschen", "DeleteRemotePathMappingMessageText": "Bist du sicher, dass du das diese entfernte Pfadzuordnung löschen willst?", "ListRefreshInterval": "Listen Aktualisierungsintervall", - "ListWillRefreshEveryInterp": "Liste wird alle [0] aktualisiert", + "ListWillRefreshEveryInterp": "Die Liste wird aktualisiert alle {0}", "ApplyChanges": "Änderungen anwenden", "AutomaticAdd": "Automatisch hinzufügen", "DeleteSelectedDownloadClients": "Lösche ausgewählte(n) Download Client(s)", @@ -1024,7 +1024,7 @@ "IndexerDownloadClientHealthCheckMessage": "Indexer mit ungültigen Downloader: {0}.", "Dash": "Bindestrich", "Lowercase": "Kleinbuchstaben", - "GrabReleaseUnknownArtistOrAlbumMessageText": "Das Release konnte keinem Film zugeordnet werden. Ein automatischer Import wird nicht möglich sein. Trotzdem '{0}' erfassen?", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} konnte nicht bestimmen, zu welchem Künstler und Album diese Veröffentlichung gehört. Möglicherweise kann {appName} diese Veröffentlichung nicht automatisch importieren. Möchtest du „{title}“ herunterladen?", "NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}", "ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.", "ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.", @@ -1060,7 +1060,7 @@ "RemoveSelectedItems": "Markierte Einträge löschen", "Total": "Gesamt", "AutoAdd": "Automatisch hinzufügen", - "BlocklistReleaseHelpText": "Dieses Release nicht automatisch erneut erfassen", + "BlocklistReleaseHelpText": "Verhindert, dass {appName} diese Dateien erneut automatisch herunterlädt.", "CloneCondition": "Bedingung klonen", "CountIndexersSelected": "{selectedCount} Künstler ausgewählt", "MonitorNewAlbums": "Neues Album", @@ -1084,9 +1084,9 @@ "Table": "Tabelle", "RemoveCompletedDownloads": "Entferne abgeschlossene Downloads", "SomeResultsAreHiddenByTheAppliedFilter": "Einige Ergebnisse werden durch den angewendeten Filter ausgeblendet", - "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Bist du dir sicher, dass du nach allen '{0}' fehlenden Alben suchen willst?", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Sind Sie sicher, dass Sie nach allen {totalRecords} Cutoff Unmet Alben suchen wollen?", "MonitoredStatus": "Überwacht/Status", - "DownloadClientSortingCheckMessage": "Im Download-Client {downloadClientName} ist die Sortierung {sortingMode} für die Kategorie von {appName} aktiviert. Sie sollten die Sortierung in Ihrem Download-Client deaktivieren, um Importprobleme zu vermeiden.", + "DownloadClientSortingCheckMessage": "Der Download-Client {0} hat die {1}-Sortierung für die Kategorie von {appName} aktiviert. Du solltest die Sortierung in deinem Download-Client deaktivieren, um Importprobleme zu vermeiden.", "ImportListsSettingsSummary": "Importiere von einer anderen {appName}-Instanz oder Trakt-Listen und verwalte Listen-Ausschlüsse", "MetadataSettingsArtistSummary": "Metadaten-Dateien erstellen, wenn Bücher importiert oder Autoren aktualisiert werden", "QualitySettingsSummary": "Qualitätsgrößen und Namensgebung", @@ -1114,7 +1114,7 @@ "Large": "Groß", "RenameFiles": "Dateien umbenennen", "Small": "Klein", - "CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt", + "CountDownloadClientsSelected": "{selectedCount} Download-Client(s) ausgewählt", "Loading": "Lade", "RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?", "ErrorLoadingContent": "Es ist ein Fehler beim Laden dieses Inhalts aufgetreten", @@ -1143,7 +1143,7 @@ "DeleteArtistFolderHelpText": "Löschen Sie den Serienordner und seinen Inhalt", "DeleteAutoTagHelpText": "Sind Sie sicher, dass Sie das automatische Tag „{name}“ löschen möchten?", "DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Der Download-Client {downloadClientName} ist so eingestellt, dass abgeschlossene Downloads entfernt werden. Dies kann dazu führen, dass Downloads von Ihrem Client entfernt werden, bevor {appName} sie importieren kann.", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Der Download-Client {0} ist so eingestellt, dass abgeschlossene Downloads entfernt werden. Dies kann dazu führen, dass Downloads aus deinem Client entfernt werden, bevor {1} sie importieren kann.", "IncludeHealthWarnings": "Gesundheitswarnungen einbeziehen", "Required": "Erforderlich", "ResetTitlesHelpText": "Definitionstitel und -werte zurücksetzen", @@ -1291,5 +1291,63 @@ "DownloadClientSettingsPostImportCategoryHelpText": "Kategorie für {appName}, die nach dem Importieren des Downloads festgelegt wird. {appName} wird Torrents in dieser Kategorie nicht entfernen, auch wenn das Seeding beendet ist. Leer lassen, um dieselbe Kategorie beizubehalten.", "DownloadClientSettingsRecentPriority": "Neueste Priorität", "PostImportCategory": "Post-Import-Kategorie", - "NotificationsSettingsWebhookHeaders": "Header" + "NotificationsSettingsWebhookHeaders": "Header", + "CountAlbums": "{albumCount} Alben", + "DefaultDelayProfileArtist": "Dies ist das Standardprofil. Es gilt für alle Künstler, die kein explizites Profil haben.", + "DelayProfileArtistTagsHelpText": "Gilt für Künstler mit mindestens einem übereinstimmenden Tag", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Priorität bei der Beschaffung von Alben, die in den letzten 14 Tagen veröffentlicht wurden", + "EmbedCoverArtHelpText": "Lidarr-Albumcover in Audiodateien einbetten, wenn Tags geschrieben werden", + "FilterAlbumPlaceholder": "Album filtern", + "ICalTagsArtistHelpText": "Der Feed enthält nur Künstler mit mindestens einem übereinstimmenden Tag", + "SkipRedownloadHelpText": "Verhindert, dass {appName} versucht, alternative Veröffentlichungen für die entfernten Elemente herunterzuladen", + "BannerOptions": "Banner Einstellungen", + "Proceed": "Fortfahren", + "DeleteArtistFolder": "Künstlerordner löschen", + "ReplaceExistingFiles": "Vorhandene Dateien ersetzen", + "ReleaseProfileTagArtistHelpText": "Veröffentlichungsprofile gelten für Künstler mit mindestens einem übereinstimmenden Tag. Leer lassen, um sie auf alle Künstler anzuwenden", + "SelectTracks": "Titel auswählen", + "SetAppTags": "{appName}-Tags festlegen", + "ShouldMonitorExisting": "Vorhandene Alben überwachen", + "TrackCount": "Anzahl der Titel", + "TrackFileDeletedTooltip": "Titeldatei gelöscht", + "TrackImported": "Titel importiert", + "SelectAlbum": "Album auswählen", + "Retag": "Erneut taggen", + "TrackFileTagsUpdatedTooltip": "Titeldatei-Tags aktualisiert", + "MonitorAlbum": "Album überwachen", + "GroupInformation": "Gruppeninformationen", + "Retagged": "Erneut getaggt", + "NoMediumInformation": "Keine Medieninformationen verfügbar.", + "NotificationsEmbySettingsSendNotificationsHelpText": "Lasse MediaBrowser Benachrichtigungen an konfigurierte Anbieter senden", + "OnAlbumDelete": "Beim Löschen eines Albums", + "OnArtistDelete": "Beim Löschen eines Künstlers", + "SelectAlbumRelease": "Albumveröffentlichung auswählen", + "SelectArtist": "Künstler auswählen", + "TrackFiles": "Titeldateien", + "TrackProgress": "Titel-Fortschritt", + "TracksLoadError": "Titel konnten nicht geladen werden", + "MonitorNoNewAlbums": "Keine neuen Alben", + "MatchedToAlbums": "Mit Alben abgeglichen", + "MatchedToArtist": "Mit Künstler abgeglichen", + "NoAlbums": "Keine Alben", + "NoTracksInThisMedium": "Keine Titel in diesem Medium", + "NotificationsTagsArtistHelpText": "Nur Benachrichtigungen für Künstler mit mindestens einem übereinstimmenden Tag senden", + "OnArtistAdd": "Beim Hinzufügen eines Künstlers", + "RetagSelectedArtists": "Ausgewählte Künstler erneut taggen", + "ShowNextAlbumHelpText": "Nächstes Album unter dem Poster anzeigen", + "TrackFileMissingTooltip": "Titeldatei fehlt", + "TrackFilesLoadError": "Titeldateien konnten nicht geladen werden", + "OneAlbum": "1 Album", + "TrackFileRenamedTooltip": "Titeldatei umbenannt", + "InteractiveSearchModalHeaderTitle": "Interaktive Suche – {title}", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Priorität bei der Beschaffung von Alben, die vor mehr als 14 Tagen veröffentlicht wurden", + "DownloadedImporting": "Heruntergeladen – Import wird durchgeführt", + "DownloadedWaitingToImport": "Heruntergeladen – Warte auf Import", + "EditSelectedArtists": "Ausgewählte Künstler bearbeiten", + "EmbedCoverArtInAudioFiles": "Cover-Art in Audiodateien einbetten", + "FilterArtistPlaceholder": "Künstler filtern", + "Inactive": "Inaktiv", + "AlbumInfo": "Album Informationen", + "Banners": "Banner", + "DeleteArtistFolders": "Künstlerordner löschen" } From 8fd79d729147ff99ff7b9699059c0c6636218936 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 1 Feb 2025 22:28:31 +0200 Subject: [PATCH 030/146] New: Prefer newer Usenet releases (cherry picked from commit 6a439f03273b376feda713ef04a6912fc3af9d0a) --- src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs index 7fe5ec1fc..5fc656c37 100644 --- a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs +++ b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionComparer.cs @@ -163,7 +163,7 @@ namespace NzbDrone.Core.DecisionEngine return 10; } - return 1; + return Math.Round(Math.Log10(age)) * -1; }); } From 3c4b438d2797417471be19b9d652717c88370c22 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 31 Jan 2025 17:04:55 +0200 Subject: [PATCH 031/146] Fixed: Health warning for downloading inside root folders (cherry picked from commit 1e9fd02e9d2bf57247adcac5728e2a0d2b084b86) Fixes #5384 --- .../DownloadClientRootFolderCheckFixture.cs | 15 ++++++++++++++- .../Checks/DownloadClientRootFolderCheck.cs | 12 ++++++++++-- src/NzbDrone.Core/Localization/Core/ar.json | 2 +- src/NzbDrone.Core/Localization/Core/bg.json | 2 +- src/NzbDrone.Core/Localization/Core/ca.json | 2 +- src/NzbDrone.Core/Localization/Core/cs.json | 2 +- src/NzbDrone.Core/Localization/Core/da.json | 2 +- src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/el.json | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 2 +- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/fi.json | 2 +- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/he.json | 2 +- src/NzbDrone.Core/Localization/Core/hi.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 2 +- src/NzbDrone.Core/Localization/Core/is.json | 2 +- src/NzbDrone.Core/Localization/Core/it.json | 2 +- src/NzbDrone.Core/Localization/Core/ja.json | 2 +- src/NzbDrone.Core/Localization/Core/ko.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 2 +- src/NzbDrone.Core/Localization/Core/pl.json | 2 +- src/NzbDrone.Core/Localization/Core/pt.json | 2 +- src/NzbDrone.Core/Localization/Core/pt_BR.json | 2 +- src/NzbDrone.Core/Localization/Core/ro.json | 2 +- src/NzbDrone.Core/Localization/Core/ru.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 2 +- src/NzbDrone.Core/Localization/Core/th.json | 2 +- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- src/NzbDrone.Core/Localization/Core/uk.json | 2 +- src/NzbDrone.Core/Localization/Core/vi.json | 2 +- src/NzbDrone.Core/Localization/Core/zh_CN.json | 2 +- 32 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/DownloadClientRootFolderCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/DownloadClientRootFolderCheckFixture.cs index f3e826fd6..7da5fac02 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/DownloadClientRootFolderCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/DownloadClientRootFolderCheckFixture.cs @@ -76,6 +76,19 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks Subject.Check().ShouldBeWarning(wikiFragment: "downloads-in-root-folder"); } + [Test] + public void should_return_warning_if_downloading_inside_root_folder() + { + var rootFolderPath = "c:\\Test".AsOsAgnostic(); + var downloadRootPath = "c:\\Test\\Downloads".AsOsAgnostic(); + + GivenRootFolder(rootFolderPath); + + _clientStatus.OutputRootFolders = new List { new (downloadRootPath) }; + + Subject.Check().ShouldBeWarning(); + } + [Test] public void should_return_ok_if_not_downloading_to_root_folder() { @@ -87,7 +100,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks } [Test] - [TestCaseSource("DownloadClientExceptions")] + [TestCaseSource(nameof(DownloadClientExceptions))] public void should_return_ok_if_client_throws_downloadclientexception(Exception ex) { _downloadClient.Setup(s => s.GetStatus()) diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs index d001c03bf..d4d44eb7f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net.Http; using NLog; @@ -48,11 +49,18 @@ namespace NzbDrone.Core.HealthCheck.Checks try { var status = client.GetStatus(); - var folders = status.OutputRootFolders.Where(folder => rootFolders.Any(r => r.Path.PathEquals(folder.FullPath))); + var folders = rootFolders.Where(r => status.OutputRootFolders.Any(folder => r.Path.PathEquals(folder.FullPath) || r.Path.IsParentPath(folder.FullPath))); foreach (var folder in folders) { - return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("DownloadClientCheckDownloadingToRoot"), client.Definition.Name, folder.FullPath), "#downloads-in-root-folder"); + return new HealthCheck(GetType(), + HealthCheckResult.Warning, + _localizationService.GetLocalizedString("DownloadClientRootFolderHealthCheckMessage", new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "rootFolderPath", folder.Path } + }), + "#downloads-in-root-folder"); } } catch (DownloadClientException ex) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 5ad2cc4ea..276ff036c 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -595,7 +595,7 @@ "ReplaceWithDash": "استبدل بـ داش", "AppDataLocationHealthCheckMessage": "لن يكون التحديث ممكنًا لمنع حذف AppData عند التحديث", "ColonReplacement": "استبدال القولون", - "DownloadClientCheckDownloadingToRoot": "يقوم برنامج التنزيل {0} بوضع التنزيلات في المجلد الجذر {1}. يجب ألا تقوم بالتنزيل إلى مجلد جذر.", + "DownloadClientRootFolderHealthCheckMessage": "يقوم برنامج التنزيل {downloadClientName} بوضع التنزيلات في المجلد الجذر {rootFolderPath}. يجب ألا تقوم بالتنزيل إلى مجلد جذر.", "Disabled": "معاق", "DownloadClientCheckNoneAvailableMessage": "لا يوجد عميل تنزيل متاح", "DownloadClientCheckUnableToCommunicateMessage": "تعذر الاتصال بـ {0}.", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 36db88c56..b2316ac09 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -590,7 +590,7 @@ "AppDataLocationHealthCheckMessage": "Актуализирането няма да е възможно, за да се предотврати изтриването на AppData при актуализация", "ColonReplacement": "Подмяна на дебелото черво", "Disabled": "хора с увреждания", - "DownloadClientCheckDownloadingToRoot": "Клиентът за изтегляне {0} поставя изтеглянията в основната папка {1}. Не трябва да изтегляте в основна папка.", + "DownloadClientRootFolderHealthCheckMessage": "Клиентът за изтегляне {downloadClientName} поставя изтеглянията в основната папка {rootFolderPath}. Не трябва да изтегляте в основна папка.", "DownloadClientCheckNoneAvailableMessage": "Няма наличен клиент за изтегляне", "DownloadClientStatusCheckAllClientMessage": "Всички клиенти за изтегляне са недостъпни поради неуспехи", "ImportListStatusCheckAllClientMessage": "Всички списъци са недостъпни поради неуспехи", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 504f4d43c..9c7098bb2 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -637,7 +637,7 @@ "AppDataLocationHealthCheckMessage": "No es podrà actualitzar per a evitar que s'eliminin AppData a l'actualització", "ColonReplacement": "Substitució de dos punts", "Disabled": "Desactivat", - "DownloadClientCheckDownloadingToRoot": "El client de baixada {0} col·loca les baixades a la carpeta arrel {1}. No s'hauria de baixar a una carpeta arrel.", + "DownloadClientRootFolderHealthCheckMessage": "El client de baixada {downloadClientName} col·loca les baixades a la carpeta arrel {rootFolderPath}. No s'hauria de baixar a una carpeta arrel.", "DownloadClientCheckNoneAvailableMessage": "No hi ha cap client de baixada disponible", "DownloadClientCheckUnableToCommunicateMessage": "No es pot comunicar amb {0}.", "ProxyCheckBadRequestMessage": "No s'ha pogut provar el servidor intermediari. Codi d'estat: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index ff6c2c16f..c184cd978 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -590,7 +590,7 @@ "AppDataLocationHealthCheckMessage": "Aktualizace nebude možná, aby se zabránilo odstranění AppData při aktualizaci", "ColonReplacement": "Nahrazení dvojtečky", "Disabled": "Zakázáno", - "DownloadClientCheckDownloadingToRoot": "Stahovací klient {0} umístí stažené soubory do kořenové složky {1}. Neměli byste stahovat do kořenové složky.", + "DownloadClientRootFolderHealthCheckMessage": "Stahovací klient {downloadClientName} umístí stažené soubory do kořenové složky {rootFolderPath}. Neměli byste stahovat do kořenové složky.", "DownloadClientCheckNoneAvailableMessage": "Není k dispozici žádný klient pro stahování", "DownloadClientCheckUnableToCommunicateMessage": "S uživatelem {0} nelze komunikovat.", "DownloadClientStatusCheckSingleClientMessage": "Stahování klientů není k dispozici z důvodu selhání: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index ada9bc159..ebe0fb7be 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -597,7 +597,7 @@ "AppDataLocationHealthCheckMessage": "Opdatering vil ikke være muligt for at undgå at slette AppData under opdatering", "ColonReplacement": "Udskiftning af kolon", "Disabled": "deaktiveret", - "DownloadClientCheckDownloadingToRoot": "Download klient {0} placerer downloads i rodmappen {1}. Du skal ikke downloade til en rodmappe.", + "DownloadClientRootFolderHealthCheckMessage": "Download klient {downloadClientName} placerer downloads i rodmappen {rootFolderPath}. Du skal ikke downloade til en rodmappe.", "DownloadClientCheckNoneAvailableMessage": "Ingen download klient tilgængelig", "DownloadClientCheckUnableToCommunicateMessage": "Ude af stand til at kommunikere med {0}.", "DownloadClientStatusCheckAllClientMessage": "Alle download klienter er utilgængelige på grund af fejl", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index e2fceb7b2..17b53fad5 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -852,7 +852,7 @@ "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", "ColonReplacement": "Doppelpunkt-Ersatz", "Disabled": "Deaktiviert", - "DownloadClientCheckDownloadingToRoot": "Download-Client {0} legt Downloads im Stammordner {1} ab. Sie sollten nicht in einen Stammordner herunterladen.", + "DownloadClientRootFolderHealthCheckMessage": "Download-Client {downloadClientName} legt Downloads im Stammordner {rootFolderPath} ab. Sie sollten nicht in einen Stammordner herunterladen.", "DownloadClientCheckNoneAvailableMessage": "Kein Download Client verfügbar", "DownloadClientCheckUnableToCommunicateMessage": "Kommunikation mit {0} nicht möglich.", "DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index d1bed1f99..47363001b 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -873,7 +873,7 @@ "AppDataLocationHealthCheckMessage": "Η ενημέρωση δεν θα είναι δυνατή για να αποτραπεί η διαγραφή των δεδομένων εφαρμογής κατά την ενημέρωση", "ColonReplacement": "Αντικατάσταση παχέος εντέρου", "Disabled": "άτομα με ειδικές ανάγκες", - "DownloadClientCheckDownloadingToRoot": "Λήψη προγράμματος-πελάτη {0} τοποθετεί λήψεις στον ριζικό φάκελο {1}. Δεν πρέπει να κάνετε λήψη σε έναν ριζικό φάκελο.", + "DownloadClientRootFolderHealthCheckMessage": "Λήψη προγράμματος-πελάτη {downloadClientName} τοποθετεί λήψεις στον ριζικό φάκελο {rootFolderPath}. Δεν πρέπει να κάνετε λήψη σε έναν ριζικό φάκελο.", "DownloadClientCheckUnableToCommunicateMessage": "Αδύνατο να επικοινωνήσει με {0}.", "DownloadClientStatusCheckAllClientMessage": "Όλα τα προγράμματα λήψης είναι μη διαθέσιμα λόγων αποτυχιών", "ImportListStatusCheckAllClientMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 35b35839e..2c67fc1ed 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -376,7 +376,6 @@ "DoneEditingGroups": "Done Editing Groups", "DownloadClient": "Download Client", "DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location", - "DownloadClientCheckDownloadingToRoot": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.", "DownloadClientCheckNoneAvailableMessage": "No download client is available", "DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {0}.", "DownloadClientDelugeSettingsDirectory": "Download Directory", @@ -387,6 +386,7 @@ "DownloadClientQbittorrentSettingsContentLayout": "Content Layout", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)", "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {0} is set to remove completed downloads. This can result in downloads being removed from your client before {1} can import them.", + "DownloadClientRootFolderHealthCheckMessage": "Download client {downloadClientName} places downloads in the root folder {rootFolderPath}. You should not download to a root folder.", "DownloadClientSettings": "Download Client Settings", "DownloadClientSettingsOlderPriority": "Older Priority", "DownloadClientSettingsOlderPriorityAlbumHelpText": "Priority to use when grabbing albums released over 14 days ago", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index f062a3f92..9db5c4a91 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -622,7 +622,7 @@ "EnableRssHelpText": "Se utilizará cuando {appName} busque periódicamente publicaciones a través de la sincronización por RSS", "HiddenClickToShow": "Oculto, pulsa para mostrar", "Disabled": "Deshabilitado", - "DownloadClientCheckDownloadingToRoot": "El cliente de descargas {0} coloca las descargas en la carpeta raíz {1}. No debe descargar a una carpeta raíz.", + "DownloadClientRootFolderHealthCheckMessage": "El cliente de descargas {downloadClientName} coloca las descargas en la carpeta raíz {rootFolderPath}. No debe descargar a una carpeta raíz.", "DownloadClientStatusCheckAllClientMessage": "Los clientes de descargas no están disponibles debido a errores", "DownloadClientStatusCheckSingleClientMessage": "Clientes de descargas no disponibles debido a errores: {0}", "ImportListStatusCheckAllClientMessage": "Las listas no están disponibles debido a errores", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index e8936b8c1..88537f93e 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -894,7 +894,7 @@ "DeleteCustomFormat": "Poista mukautettu muoto", "DeleteCustomFormatMessageText": "Haluatko varmasti poistaa mukautetun muodon \"{name}\"?", "Disabled": "Ei käytössä", - "DownloadClientCheckDownloadingToRoot": "Latauspalvelu {0} tallentaa lataukset juurikansioon \"{1}\", mutta niitä ei tulisi tallentaa sinne.", + "DownloadClientRootFolderHealthCheckMessage": "Latauspalvelu {downloadClientName} tallentaa lataukset juurikansioon \"{rootFolderPath}\", mutta niitä ei tulisi tallentaa sinne.", "DownloadClientStatusCheckAllClientMessage": "Latauspalveluita ei ole ongelmien vuoksi käytettävissä", "GroupInformation": "Ryhmän tiedot", "MinimumCustomFormatScore": "Mukautetun muodon vähimmäispisteytys", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index c1445b2b8..a3b29285c 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -697,7 +697,7 @@ "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour", "ColonReplacement": "Remplacement pour le « deux-points »", "Disabled": "Désactivé", - "DownloadClientCheckDownloadingToRoot": "Le client de téléchargement {0} place les téléchargements dans le dossier racine {1}. Vous ne devez pas télécharger dans un dossier racine.", + "DownloadClientRootFolderHealthCheckMessage": "Le client de téléchargement {downloadClientName} place les téléchargements dans le dossier racine {rootFolderPath}. Vous ne devez pas télécharger dans un dossier racine.", "DownloadClientCheckNoneAvailableMessage": "Aucun client de téléchargement n'est disponible", "DownloadClientCheckUnableToCommunicateMessage": "Impossible de communiquer avec {0}.", "DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 5a5885200..04a74c103 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -614,7 +614,7 @@ "IndexerSearchCheckNoInteractiveMessage": "אין אינדקסים זמינים כאשר חיפוש אינטראקטיבי מופעל, {appName} לא תספק תוצאות חיפוש אינטראקטיביות", "RemotePathMappingCheckFolderPermissions": "ראדארר יכול לראות אבל לא לגשת לסרטים שירדו {0}. ככל הנראה בעיית הרשאות.", "AppDataLocationHealthCheckMessage": "לא ניתן יהיה לעדכן את מחיקת AppData בעדכון", - "DownloadClientCheckDownloadingToRoot": "הורד לקוח {0} ממקם הורדות בתיקיית הבסיס {1}. אתה לא צריך להוריד לתיקיית שורש.", + "DownloadClientRootFolderHealthCheckMessage": "הורד לקוח {downloadClientName} ממקם הורדות בתיקיית הבסיס {rootFolderPath}. אתה לא צריך להוריד לתיקיית שורש.", "DownloadClientCheckNoneAvailableMessage": "אין לקוח להורדה זמין", "DownloadClientCheckUnableToCommunicateMessage": "לא ניתן לתקשר עם {0}.", "DownloadClientStatusCheckAllClientMessage": "כל לקוחות ההורדה אינם זמינים עקב כשלים", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index bf15aee60..67f74f90f 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -596,7 +596,7 @@ "AppDataLocationHealthCheckMessage": "अद्यतन पर अद्यतन AppData को रोकने के लिए अद्यतन करना संभव नहीं होगा", "ColonReplacement": "कोलन रिप्लेसमेंट", "Disabled": "विकलांग", - "DownloadClientCheckDownloadingToRoot": "डाउनलोड क्लाइंट {0} रूट फ़ोल्डर में डाउनलोड करता है {1}। आपको रूट फ़ोल्डर में डाउनलोड नहीं करना चाहिए।", + "DownloadClientRootFolderHealthCheckMessage": "डाउनलोड क्लाइंट {downloadClientName} रूट फ़ोल्डर में डाउनलोड करता है {rootFolderPath}। आपको रूट फ़ोल्डर में डाउनलोड नहीं करना चाहिए।", "DownloadClientCheckNoneAvailableMessage": "कोई डाउनलोड क्लाइंट उपलब्ध नहीं है", "DownloadClientCheckUnableToCommunicateMessage": "{0} के साथ संवाद करने में असमर्थ।", "DownloadClientStatusCheckSingleClientMessage": "विफलताओं के कारण अनुपलब्ध ग्राहक डाउनलोड करें: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 58c4efa7f..b7c150824 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -880,7 +880,7 @@ "AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül", "ColonReplacement": "Kettőspont Helyettesítés", "Disabled": "Tiltva", - "DownloadClientCheckDownloadingToRoot": "A Letöltőkliens {0} a letöltéseket a gyökérmappába helyezi {1}. Nem szabad letölteni egy gyökérmappába.", + "DownloadClientRootFolderHealthCheckMessage": "A Letöltőkliens {downloadClientName} a letöltéseket a gyökérmappába helyezi {rootFolderPath}. Nem szabad letölteni egy gyökérmappába.", "DownloadClientCheckNoneAvailableMessage": "Nem található letöltési kliens", "DownloadClientCheckUnableToCommunicateMessage": "Nem lehet kommunikálni a következővel: {0}.", "DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index c6e686ea2..09291ef88 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -604,7 +604,7 @@ "UpdateCheckUINotWritableMessage": "Ekki er hægt að setja uppfærslu vegna þess að notendamöppan '{0}' er ekki skrifuð af notandanum '{1}'.", "AppDataLocationHealthCheckMessage": "Uppfærsla verður ekki möguleg til að koma í veg fyrir að AppData sé eytt við uppfærslu", "ColonReplacement": "Skipt um ristil", - "DownloadClientCheckDownloadingToRoot": "Sæktu viðskiptavinur {0} setur niðurhal í rótarmöppuna {1}. Þú ættir ekki að hlaða niður í rótarmöppu.", + "DownloadClientRootFolderHealthCheckMessage": "Sæktu viðskiptavinur {downloadClientName} setur niðurhal í rótarmöppuna {rootFolderPath}. Þú ættir ekki að hlaða niður í rótarmöppu.", "DownloadClientCheckNoneAvailableMessage": "Enginn niðurhalsþjónn er í boði", "DownloadClientCheckUnableToCommunicateMessage": "Ekki er hægt að eiga samskipti við {0}.", "DownloadClientStatusCheckAllClientMessage": "Allir viðskiptavinir sem hlaða niður eru ekki tiltækir vegna bilana", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index e7758d439..97eae932a 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -701,7 +701,7 @@ "AppDataLocationHealthCheckMessage": "L'aggiornamento non sarà possibile per evitare la cancellazione di AppData durante l'aggiornamento", "ColonReplacement": "Sostituzione Due Punti", "Disabled": "Disabilitato", - "DownloadClientCheckDownloadingToRoot": "Il client di download {0} colloca i download nella cartella radice {1}. Non dovresti scaricare in una cartella radice.", + "DownloadClientRootFolderHealthCheckMessage": "Il client di download {downloadClientName} colloca i download nella cartella radice {rootFolderPath}. Non dovresti scaricare in una cartella radice.", "DownloadClientCheckNoneAvailableMessage": "Non è disponibile nessun client di download", "DownloadClientCheckUnableToCommunicateMessage": "Impossibile comunicare con {0}.", "DownloadClientStatusCheckAllClientMessage": "Nessun client di download è disponibile a causa di errori", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 345ca116e..fe2555e2f 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -586,7 +586,7 @@ "MaintenanceRelease": "メンテナンスリリース:バグ修正およびその他の改善。詳細については、Githubのコミット履歴を参照してください", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "ムービーフォルダ「{0}」とそのすべてのコンテンツが削除されます。", "AppDataLocationHealthCheckMessage": "更新時にAppDataが削除されないように更新することはできません", - "DownloadClientCheckDownloadingToRoot": "ダウンロードクライアント{0}は、ダウンロードをルートフォルダ{1}に配置します。ルートフォルダにダウンロードしないでください。", + "DownloadClientRootFolderHealthCheckMessage": "ダウンロードクライアント{downloadClientName}は、ダウンロードをルートフォルダ{rootFolderPath}に配置します。ルートフォルダにダウンロードしないでください。", "DownloadClientCheckNoneAvailableMessage": "ダウンロードクライアントは利用できません", "HiddenClickToShow": "非表示、クリックして表示", "ImportListStatusCheckAllClientMessage": "障害のため、すべてのリストを利用できません", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index bed47dad8..1ce9c02f0 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -586,7 +586,7 @@ "MaintenanceRelease": "유지 관리 출시 : 버그 수정 및 기타 개선. 자세한 내용은 Github 커밋 내역을 참조하십시오.", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "동영상 폴더 '{0}' 및 모든 콘텐츠가 삭제됩니다.", "Disabled": "비활성화됨", - "DownloadClientCheckDownloadingToRoot": "다운로드 클라이언트 {0} 은(는) 루트 폴더 {1}에 다운로드를 저장합니다. 루트 폴더에 다운로드해서는 안됩니다.", + "DownloadClientRootFolderHealthCheckMessage": "다운로드 클라이언트 {downloadClientName} 은(는) 루트 폴더 {rootFolderPath}에 다운로드를 저장합니다. 루트 폴더에 다운로드해서는 안됩니다.", "DownloadClientCheckNoneAvailableMessage": "사용 가능한 다운로드 클라이언트가 없습니다.", "DownloadClientStatusCheckSingleClientMessage": "실패로 인해 다운 불러올 수 없는 클라이언트 : {0}", "HiddenClickToShow": "숨김, 클릭하여 표시", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 24f137e4d..77559467d 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -629,7 +629,7 @@ "ProxyCheckResolveIpMessage": "Achterhalen van het IP-adres voor de geconfigureerde proxy host {0} is mislukt", "RemotePathMappingCheckBadDockerPath": "U gebruikt docker; downloadclient {0} plaatst downloads in {1} maar dit is geen geldig {2}-pad. Controleer uw externe padtoewijzingen en download clientinstellingen.", "ShownClickToHide": "Getoond, klik om te verbergen", - "DownloadClientCheckDownloadingToRoot": "Downloadclient {0} plaatst downloads in de hoofdmap {1}. U mag niet naar een hoofdmap downloaden.", + "DownloadClientRootFolderHealthCheckMessage": "Downloadclient {downloadClientName} plaatst downloads in de hoofdmap {rootFolderPath}. U mag niet naar een hoofdmap downloaden.", "DownloadClientCheckUnableToCommunicateMessage": "Niet in staat om te communiceren met {0}.", "DownloadClientStatusCheckSingleClientMessage": "Downloaders onbeschikbaar wegens fouten: {0}", "IndexerRssHealthCheckNoIndexers": "Geen indexeerders beschikbaar met \"RSS Synchronisatie\" ingeschakeld, {appName} zal niet automatisch nieuwe uitgaves ophalen", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 67fcc1a37..fe56245e9 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -627,7 +627,7 @@ "UpdateCheckUINotWritableMessage": "Nie można zainstalować aktualizacji, ponieważ użytkownik „{1}” nie ma prawa zapisu w folderze interfejsu użytkownika „{0}”.", "AppDataLocationHealthCheckMessage": "Aktualizacja nie będzie możliwa w celu uniknięcia usunięcia danych aplikacji", "Disabled": "Wyłączone", - "DownloadClientCheckDownloadingToRoot": "Klient pobierania {0} umieszcza pliki do pobrania w folderze głównym {1}. Nie należy pobierać do folderu głównego.", + "DownloadClientRootFolderHealthCheckMessage": "Klient pobierania {downloadClientName} umieszcza pliki do pobrania w folderze głównym {rootFolderPath}. Nie należy pobierać do folderu głównego.", "DownloadClientCheckNoneAvailableMessage": "Żaden klient pobierania nie jest dostępny", "DownloadClientCheckUnableToCommunicateMessage": "Nie można skomunikować się z {0}.", "DownloadClientStatusCheckAllClientMessage": "Wszyscy klienci pobierania są niedostępni z powodu błędów", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index becbfd941..1e8cc00ec 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -699,7 +699,7 @@ "AppDataLocationHealthCheckMessage": "Não foi possível actualizar para prevenir apagar a AppData durante a actualização", "ColonReplacement": "Substituição de dois-pontos", "Disabled": "Desativado", - "DownloadClientCheckDownloadingToRoot": "O cliente {0} coloca as transferências na pasta raiz {1}. Não transfira para a pasta raiz.", + "DownloadClientRootFolderHealthCheckMessage": "O cliente {downloadClientName} coloca as transferências na pasta raiz {rootFolderPath}. Não transfira para a pasta raiz.", "DownloadClientCheckNoneAvailableMessage": "Nenhum cliente de transferências disponível", "DownloadClientCheckUnableToCommunicateMessage": "Não é possível ligar-se a {0}.", "DownloadClientStatusCheckSingleClientMessage": "Clientes de transferências indisponíveis devido a falhas: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 36ecd41ae..f621f6eb4 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -880,7 +880,7 @@ "DashOrSpaceDashDependingOnName": "Traço ou Espaço e Traço, dependendo do nome", "DeleteFormat": "Excluir Formato", "Disabled": "Desabilitado", - "DownloadClientCheckDownloadingToRoot": "O cliente de download {0} coloca os downloads na pasta raiz {1}. Você não deve baixar para uma pasta raiz.", + "DownloadClientRootFolderHealthCheckMessage": "O cliente de download {downloadClientName} coloca os downloads na pasta raiz {rootFolderPath}. Você não deve baixar para uma pasta raiz.", "DownloadClientCheckNoneAvailableMessage": "Nenhum cliente de download está disponível", "DownloadClientCheckUnableToCommunicateMessage": "Não é possível se comunicar com {0}.", "DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index c090a3fdf..5b67e821c 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -567,7 +567,7 @@ "CustomFormats": "Formate personalizate", "DeleteFormatMessageText": "Sigur doriți să ștergeți eticheta format {0}?", "Disabled": "Dezactivat", - "DownloadClientCheckDownloadingToRoot": "Clientul de descărcare {0} plasează descărcările în folderul rădăcină {1}. Nu trebuie să descărcați într-un folder rădăcină.", + "DownloadClientRootFolderHealthCheckMessage": "Clientul de descărcare {downloadClientName} plasează descărcările în folderul rădăcină {rootFolderPath}. Nu trebuie să descărcați într-un folder rădăcină.", "DownloadClientCheckNoneAvailableMessage": "Niciun client de descărcare disponibil", "DownloadPropersAndRepacksHelpTextWarning": "Utilizați formate personalizate pentru upgrade-uri automate la Propers / Repacks", "HiddenClickToShow": "Ascuns, faceți clic pentru afișare", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index a687c92ca..6e79d1957 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -641,7 +641,7 @@ "CopyToClipboard": "Копировать в буфер обмена", "CouldntFindAnyResultsForTerm": "Не найдено результатов для '{0}'", "Disabled": "Выключено", - "DownloadClientCheckDownloadingToRoot": "Клиент загрузки {0} помещает загрузки в корневую папку {1}. Вы не должны загружать в корневую папку.", + "DownloadClientRootFolderHealthCheckMessage": "Клиент загрузки {downloadClientName} помещает загрузки в корневую папку {rootFolderPath}. Вы не должны загружать в корневую папку.", "DownloadClientCheckNoneAvailableMessage": "Ни один загрузчик не доступен", "DownloadClientCheckUnableToCommunicateMessage": "Невозможно связаться с {0}.", "DownloadClientStatusCheckAllClientMessage": "Все клиенты для скачивания недоступны из-за ошибок", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index eab45967f..5d0e56896 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -751,7 +751,7 @@ "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "Författar-mappen {0} och allt dess innehåll kommer bli raderat.", "DeleteFormatMessageText": "Är du säker på att du vill ta bort formattaggen {0}?", "Disabled": "Inaktiverad", - "DownloadClientCheckDownloadingToRoot": "Ladda ner klient {0} placerar nedladdningar i rotmappen {1}. Du bör inte ladda ner till en rotmapp.", + "DownloadClientRootFolderHealthCheckMessage": "Ladda ner klient {downloadClientName} placerar nedladdningar i rotmappen {rootFolderPath}. Du bör inte ladda ner till en rotmapp.", "DownloadClientCheckNoneAvailableMessage": "Ingen nedladdningsklient tillgänglig", "DownloadClientCheckUnableToCommunicateMessage": "Kommunikation med {0} ej möjlig.", "DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index ce352f458..cf37ebcb5 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -589,7 +589,7 @@ "DeleteCustomFormat": "ลบรูปแบบที่กำหนดเอง", "DeleteCustomFormatMessageText": "แน่ใจไหมว่าต้องการลบตัวสร้างดัชนี \"{0}\"", "Disabled": "ปิดการใช้งาน", - "DownloadClientCheckDownloadingToRoot": "ดาวน์โหลดไคลเอนต์ {0} จะทำการดาวน์โหลดในโฟลเดอร์รูท {1} คุณไม่ควรดาวน์โหลดไปยังโฟลเดอร์รูท", + "DownloadClientRootFolderHealthCheckMessage": "ดาวน์โหลดไคลเอนต์ {downloadClientName} จะทำการดาวน์โหลดในโฟลเดอร์รูท {rootFolderPath} คุณไม่ควรดาวน์โหลดไปยังโฟลเดอร์รูท", "DownloadClientCheckNoneAvailableMessage": "ไม่มีไคลเอนต์ดาวน์โหลด", "DownloadClientCheckUnableToCommunicateMessage": "ไม่สามารถสื่อสารกับ {0}", "ExportCustomFormat": "ส่งออกรูปแบบที่กำหนดเอง", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index c9c1b31f0..70ba2caab 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -586,7 +586,7 @@ "MaintenanceRelease": "Bakım Sürümü: hata düzeltmeleri ve diğer iyileştirmeler. Daha fazla ayrıntı için Github İşlem Geçmişine bakın", "Conditions": "Koşullar", "Disabled": "Devre dışı", - "DownloadClientCheckDownloadingToRoot": "İndirme istemcisi {0}, indirmeleri kök klasöre yerleştirir {1}. Bir kök klasöre indirmemelisiniz.", + "DownloadClientRootFolderHealthCheckMessage": "İndirme istemcisi {downloadClientName}, indirmeleri kök klasöre yerleştirir {rootFolderPath}. Bir kök klasöre indirmemelisiniz.", "DownloadClientCheckNoneAvailableMessage": "İndirme istemcisi yok", "DownloadClientCheckUnableToCommunicateMessage": "{0} ile iletişim kurulamıyor.", "ReplaceWithSpaceDashSpace": "Space Dash Space ile değiştirin", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 55677cd4b..6cd0ed1f2 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -823,7 +823,7 @@ "UiSettingsSummary": "Параметри календаря, дати та кольору", "AllExpandedCollapseAll": "Закрити все", "CustomFormat": "Користувацький формат", - "DownloadClientCheckDownloadingToRoot": "Клієнт завантаження {0} розміщує завантаження в кореневій папці {1}. Ви не повинні завантажувати в кореневу папку.", + "DownloadClientRootFolderHealthCheckMessage": "Клієнт завантаження {downloadClientName} розміщує завантаження в кореневій папці {rootFolderPath}. Ви не повинні завантажувати в кореневу папку.", "FailedLoadingSearchResults": "Не вдалося завантажити результати пошуку, спробуйте ще.", "ExportCustomFormat": "Додати свій формат", "FailedToLoadQueue": "Не вдалося завантажити чергу", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 25450ad91..ebce4b4bb 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -565,7 +565,7 @@ "DeleteCustomFormatMessageText": "Bạn có chắc chắn muốn xóa trình lập chỉ mục '{0}' không?", "DeleteFormatMessageText": "Bạn có chắc chắn muốn xóa thẻ định dạng {0} không?", "Disabled": "Tàn tật", - "DownloadClientCheckDownloadingToRoot": "Tải xuống ứng dụng khách {0} đặt các bản tải xuống trong thư mục gốc {1}. Bạn không nên tải xuống thư mục gốc.", + "DownloadClientRootFolderHealthCheckMessage": "Tải xuống ứng dụng khách {downloadClientName} đặt các bản tải xuống trong thư mục gốc {rootFolderPath}. Bạn không nên tải xuống thư mục gốc.", "DownloadClientCheckUnableToCommunicateMessage": "Không thể giao tiếp với {0}.", "DownloadClientStatusCheckAllClientMessage": "Tất cả các ứng dụng khách tải xuống không khả dụng do lỗi", "DownloadClientStatusCheckSingleClientMessage": "Ứng dụng khách tải xuống không khả dụng do lỗi: {0}", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index b02ae0ad6..a423a7c51 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -828,7 +828,7 @@ "CloneCustomFormat": "复制自定义格式", "Conditions": "条件", "CouldntFindAnyResultsForTerm": "未找到 '{0}' 的任何结果", - "DownloadClientCheckDownloadingToRoot": "下载客户端{0}将下载内容放在根文件夹{1}中。您不应该下载到根文件夹。", + "DownloadClientRootFolderHealthCheckMessage": "下载客户端{downloadClientName}将下载内容放在根文件夹{rootFolderPath}中。您不应该下载到根文件夹。", "DownloadClientCheckNoneAvailableMessage": "无可用的下载客户端", "DownloadClientCheckUnableToCommunicateMessage": "无法与 {0} 进行通讯。", "DownloadClientStatusCheckAllClientMessage": "下载客户端因故障均不可用", From 45e8ecffa07844f4d064dd59eb32f04d16cbf87f Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 30 Jan 2025 18:50:48 -0800 Subject: [PATCH 032/146] Fixed: Ignore special folders inside Blackhole watch folders (cherry picked from commit e79dd6f8e689617b1fd9f96c639ac300669112c5) --- .../Disk/FileSystemLookupService.cs | 33 +------------ src/NzbDrone.Common/Disk/SpecialFolders.cs | 47 +++++++++++++++++++ .../Blackhole/ScanWatchFolderFixture.cs | 17 +++++++ .../Clients/Blackhole/ScanWatchFolder.cs | 8 +++- 4 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 src/NzbDrone.Common/Disk/SpecialFolders.cs diff --git a/src/NzbDrone.Common/Disk/FileSystemLookupService.cs b/src/NzbDrone.Common/Disk/FileSystemLookupService.cs index 427c4237e..be32f7638 100644 --- a/src/NzbDrone.Common/Disk/FileSystemLookupService.cs +++ b/src/NzbDrone.Common/Disk/FileSystemLookupService.cs @@ -17,37 +17,6 @@ namespace NzbDrone.Common.Disk private readonly IDiskProvider _diskProvider; private readonly IRuntimeInfo _runtimeInfo; - private readonly HashSet _setToRemove = new HashSet - { - // Windows - "boot", - "bootmgr", - "cache", - "msocache", - "recovery", - "$recycle.bin", - "recycler", - "system volume information", - "temporary internet files", - "windows", - - // OS X - ".fseventd", - ".spotlight", - ".trashes", - ".vol", - "cachedmessages", - "caches", - "trash", - - // QNAP - ".@__thumb", - - // Synology - "@eadir", - "#recycle" - }; - public FileSystemLookupService(IDiskProvider diskProvider, IRuntimeInfo runtimeInfo) { _diskProvider = diskProvider; @@ -158,7 +127,7 @@ namespace NzbDrone.Common.Disk }) .ToList(); - directories.RemoveAll(d => _setToRemove.Contains(d.Name.ToLowerInvariant())); + directories.RemoveAll(d => SpecialFolders.IsSpecialFolder(d.Name)); return directories; } diff --git a/src/NzbDrone.Common/Disk/SpecialFolders.cs b/src/NzbDrone.Common/Disk/SpecialFolders.cs new file mode 100644 index 000000000..b1339a7ed --- /dev/null +++ b/src/NzbDrone.Common/Disk/SpecialFolders.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; + +namespace NzbDrone.Common.Disk; + +public static class SpecialFolders +{ + private static readonly HashSet _specialFolders = new HashSet + { + // Windows + "boot", + "bootmgr", + "cache", + "msocache", + "recovery", + "$recycle.bin", + "recycler", + "system volume information", + "temporary internet files", + "windows", + + // OS X + ".fseventd", + ".spotlight", + ".trashes", + ".vol", + "cachedmessages", + "caches", + "trash", + + // QNAP + ".@__thumb", + + // Synology + "@eadir", + "#recycle" + }; + + public static bool IsSpecialFolder(string folder) + { + if (folder == null) + { + return false; + } + + return _specialFolders.Contains(folder.ToLowerInvariant()); + } +} diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs index e1c56ba24..c5ea010c1 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs @@ -99,5 +99,22 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole VerifySingleItem(DownloadItemStatus.Completed); } + + [TestCase("@eaDir")] + [TestCase(".@__thumb")] + public void GetItems_should_not_include_special_subfolders(string folderName) + { + GivenCompletedItem(); + + var targetDir = Path.Combine(_completedDownloadFolder, folderName); + + Mocker.GetMock() + .Setup(c => c.GetDirectories(_completedDownloadFolder)) + .Returns(new[] { targetDir }); + + var items = Subject.GetItems(_completedDownloadFolder, TimeSpan.FromMilliseconds(50)).ToList(); + + items.Count.Should().Be(0); + } } } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs index a6c5f8e12..547bb52e2 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs @@ -52,7 +52,13 @@ namespace NzbDrone.Core.Download.Clients.Blackhole { foreach (var folder in _diskScanService.FilterPaths(watchFolder, _diskProvider.GetDirectories(watchFolder))) { - var title = FileNameBuilder.CleanFileName(Path.GetFileName(folder)); + var folderName = Path.GetFileName(folder); + var title = FileNameBuilder.CleanFileName(folderName); + + if (SpecialFolders.IsSpecialFolder(folderName)) + { + continue; + } var newWatchItem = new WatchFolderItem { From 8e01ba5f21033f601fdfdcbf86ca798a295c0179 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 2 Feb 2025 12:48:53 +0200 Subject: [PATCH 033/146] Bump version to 2.9.6 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 870038455..2ff157690 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: '2.9.5' + majorVersion: '2.9.6' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 5bf2ae9e6fdf91fd30f7db0eeded57e1a27b9a16 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 3 Feb 2025 14:11:43 +0200 Subject: [PATCH 034/146] Bump version to 2.10.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2ff157690..4d34b2684 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: '2.9.6' + majorVersion: '2.10.0' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From e0e17a2ea766598e4c2f7eb70ed297f3cf9f5e86 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 6 Feb 2025 00:36:13 +0200 Subject: [PATCH 035/146] Building docs on ARM Co-authored-by: Mark McDowall (cherry picked from commit 147e732c9ca7a4c289d4f6386f1277650e11f15b) (cherry picked from commit dd900eb7395144b6d299f10fe9475d49d194664e) --- docs.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs.sh b/docs.sh index a84de5fc0..a44dc90ce 100644 --- a/docs.sh +++ b/docs.sh @@ -1,13 +1,18 @@ +#!/bin/bash +set -e + +FRAMEWORK="net6.0" PLATFORM=$1 +ARCHITECTURE="${2:-x64}" if [ "$PLATFORM" = "Windows" ]; then - RUNTIME="win-x64" + RUNTIME="win-$ARCHITECTURE" elif [ "$PLATFORM" = "Linux" ]; then - RUNTIME="linux-x64" + RUNTIME="linux-$ARCHITECTURE" elif [ "$PLATFORM" = "Mac" ]; then - RUNTIME="osx-x64" + RUNTIME="osx-$ARCHITECTURE" else - echo "Platform must be provided as first arguement: Windows, Linux or Mac" + echo "Platform must be provided as first argument: Windows, Linux or Mac" exit 1 fi @@ -35,7 +40,7 @@ dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p dotnet new tool-manifest dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli -dotnet tool run swagger tofile --output ./src/Lidarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/$application" v1 & +dotnet tool run swagger tofile --output ./src/Lidarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 & sleep 45 From bc6417229e9da3d3cab418f92b46eec7a76168c2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 5 Feb 2025 15:33:28 +0000 Subject: [PATCH 036/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Gallyam Biktashev Co-authored-by: Havok Dan Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/bg.json | 13 +++++++- src/NzbDrone.Core/Localization/Core/ca.json | 13 +++++++- src/NzbDrone.Core/Localization/Core/fi.json | 31 ++++++++++--------- .../Localization/Core/pt_BR.json | 4 ++- src/NzbDrone.Core/Localization/Core/ru.json | 4 +-- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index b2316ac09..5a5654ada 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -818,5 +818,16 @@ "BlocklistAndSearch": "Списък за блокиране и търсене", "CustomFormatsSpecificationRegularExpression": "Регулярни изрази", "DownloadClientDelugeSettingsDirectoryHelpText": "Незадължителна локация за изтеглянията, оставете празно, за да използвате мястото по подразбиране на Deluge", - "Absolute": "Абсолютен" + "Absolute": "Абсолютен", + "Episode": "епизод", + "Library": "Библиотека", + "Artist": "изпълнител", + "Theme": "Тема", + "ReleaseProfile": "Профил за издания", + "TBA": "TBA", + "Label": "Етикет", + "Album": "албум", + "AutoAdd": "Автоматично добавяне", + "CatalogNumber": "каталожен номер", + "Discography": "дискография" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 9c7098bb2..48699e2d2 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -973,5 +973,16 @@ "DownloadClientSettingsRecentPriority": "Prioritat del client", "AddNewArtist": "Afegeix Nou Artista", "AddNewItem": "Afegeix un nou element", - "AlbumCount": "Recompte d'àlbums" + "AlbumCount": "Recompte d'àlbums", + "NotificationsSettingsWebhookHeaders": "Capçaleres", + "NotificationsKodiSettingsDisplayTime": "Temps de visualització", + "TestParsing": "Prova anàlisi", + "PasswordConfirmation": "Confirmeu la contrasenya", + "NotificationsKodiSettingsGuiNotification": "Notificació d'interfície gràfica", + "PreviouslyInstalled": "Instal·lat anteriorment", + "ContinuingOnly": "Només en emissió", + "UpdateFiltered": "Actualitza filtrats", + "IndexerSettingsApiUrl": "URL de l'API", + "CountCustomFormatsSelected": "{count} format(s) personalitzat(s) seleccionat(s)", + "Install": "Instal·la" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 88537f93e..c7bf2dd2f 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -16,7 +16,7 @@ "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "Tämän hakupalvelun kanssa ei voida käyttää RSS-syötettä.", "Logging": "Lokikirjaus", "ProxyBypassFilterHelpText": "Erota aliverkkotunnukset pilkuilla ja käytä jokerimerkkinä tähteä ja pistettä (*.). Esimerkki: www.esimerkki.fi,*.esimerkki.fi).", - "UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.", + "UnableToAddANewIndexerPleaseTryAgain": "Virhe lisättäessä hakupalvelua. Yritä uudelleen.", "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Saat lisätietoja yksittäisistä palveluista niiden ohessa olevilla painikkeilla.", "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Saat lisätietoja yksittäisistä latauspalveluista painamalla niiden ohessa olevia lisätietopainikkeita.", "RssSyncIntervalHelpText": "Aikaväli minuutteina. Poista toiminto käytöstä asettamalla arvoksi 0, joka pysäyttää automaattisen julkaisukaappauksen täysin.", @@ -86,7 +86,7 @@ "Columns": "Sarakkeet", "Calendar": "Kalenteri", "CompletedDownloadHandling": "Valmistuneiden latausten käsittely", - "CloneIndexer": "Monista tietolähde", + "CloneIndexer": "Monista palvelu", "CancelPendingTask": "Haluatko varmasti perua odottavan tehtävän?", "CertificateValidation": "Varmenteen vahvistus", "CertificateValidationHelpText": "Määritä HTTPS-varmennevahvistuksen tiukkuus. Älä muta, jos et ymmärrä riskejä.", @@ -201,14 +201,14 @@ "TestAllClients": "Koesta latauspalvelut", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia hakupalveluita. Noudata niiden asettamia sääntöjä.", "TagAudioFilesWithMetadata": "Tallenna metatiedot äänitiedostoihin", - "TestAllIndexers": "Tietolähteiden testaus", + "TestAllIndexers": "Koesta palvelut", "UnableToLoadBackups": "Varmuuskopioinnin lataus epäonnistui", "UnableToLoadDownloadClients": "Latauspalveluiden lataus epäonnistui", "UnableToLoadGeneralSettings": "Yleisasetusten lataus epäonnistui", - "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui", - "UnableToLoadIndexerOptions": "Tietolähdeasetusten lataus epäonnistui", + "UnableToLoadIndexers": "Virhe ladattaessa hakupalveluita.", + "UnableToLoadIndexerOptions": "Virhe ladattaessa hakupalveluasetuksia.", "UnableToLoadImportListExclusions": "Tuontilistapoikkeusten lataus epäonnistui", - "UnableToLoadHistory": "Historian lataus epäonnistui", + "UnableToLoadHistory": "Virhe ladattaessa historiaa.", "UnableToLoadTags": "Tunnisteiden lataus epäonnistui", "UnableToLoadQualityDefinitions": "Laatumääritysten lataus epäonnistui", "UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.", @@ -520,7 +520,7 @@ "AddDelayProfile": "Lisää viiveprofiili", "Added": "Lisäysaika", "AddImportListExclusion": "Lisää tuontilistapoikkeus", - "AddIndexer": "Lisää tietolähde", + "AddIndexer": "Lisää hakupalvelu", "AddMetadataProfile": "Lisää metatietoprofiili", "AddNew": "Lisää uusi", "AddQualityProfile": "Lisää laatuprofiili", @@ -825,7 +825,7 @@ "AddAutoTagError": "Virhe lisättäessä automaattimerkintää. Yritä uudelleen.", "AddCondition": "Lisää ehto", "AddConditionError": "Virhe lisättäessä ehtoa. Yritä uudelleen.", - "AddIndexerImplementation": "Lisätään tietolähdettä – {implementationName}", + "AddIndexerImplementation": "Lisätään hakupalvelua – {implementationName}", "AddDownloadClientImplementation": "Lisätään latauspalvelua – {implementationName}", "AddImportList": "Lisää tuontilista", "AddAutoTag": "Lisää automaattinen tunniste", @@ -873,7 +873,7 @@ "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", "QueueIsEmpty": "Jono on tyhjä", "RecentChanges": "Uusimmat muutokset", - "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituille tietolähteille", + "ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituille hakupalveluille:", "RemotePathMappingCheckBadDockerPath": "Käytät Dockeria ja latauspalvelu {0} tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista etäsijaintien kohdistukset ja latauspalvelun asetukset.", "DeleteSelectedIndexers": "Poista hakupalvelu(t)", "RemotePathMappingCheckFilesWrongOSPath": "Etälatauspalvelu {0} ilmoitti tiedostosijainniksi \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista määritetyt etäsijainnit ja latauspalvelun asetukset.", @@ -906,7 +906,7 @@ "Conditions": "Ehdot", "CountIndexersSelected": "{selectedCount} hakupalvelu(a) on valittu", "DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valittua latauspalvelua?", - "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?", + "DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) hakupalvelu(n/a)?", "EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä", "Negated": "Kielletty", "NegateHelpText": "Jos käytössä, ei mukautettua muotoa sovelleta tämän \"{0}\" -ehdon täsmätessä.", @@ -958,7 +958,7 @@ "EditConditionImplementation": "Muokataan ehtoa – {implementationName}", "EditConnectionImplementation": "Muokataan ilmoituspalvelua – {implementationName}", "EditAutoTag": "Muokkaa automaattimerkintää", - "ManageIndexers": "Hallitse tietolähteitä", + "ManageIndexers": "Palveluiden hallinta", "RenameFiles": "Nimeä tiedostot uudelleen", "Small": "Pieni", "RemoveSelectedItems": "Poista valitut kohteet", @@ -1100,10 +1100,10 @@ "RemoveSelectedItemBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?", "ResetDefinitions": "Palauta määritykset", "NotificationsSettingsUseSslHelpText": "Muodosta yhteys palveluun {serviceName} SSL-protokollan välityksellä.", - "ClickToChangeIndexerFlags": "Muuta tietolähteen lippuja painamalla tästä", + "ClickToChangeIndexerFlags": "Muuta hakupalvelun lippuja painamalla tästä", "CustomFormatsSpecificationFlag": "Lippu", - "SelectIndexerFlags": "Valitse tietolähteen liput", - "SetIndexerFlags": "Aseta tietolähteen liput", + "SelectIndexerFlags": "Valitse hakupalvelun liput", + "SetIndexerFlags": "Aseta hakupalvelun liput", "CustomFilter": "Mukautettu suodatin", "LabelIsRequired": "Nimi on pakollinen", "ImportList": "Tuontilista", @@ -1347,5 +1347,6 @@ "DelayProfileArtistTagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille.", "Disambiguation": "Yksinkertaistaminen", "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä.", - "NotificationsSettingsWebhookHeaders": "Otsakkeet" + "NotificationsSettingsWebhookHeaders": "Otsakkeet", + "TracksLoadError": "Virhe ladattaessa kappaleita." } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index f621f6eb4..bc8215799 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1347,5 +1347,7 @@ "PostImportCategory": "Categoria Pós-Importação", "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridade para usar ao pegar álbuns lançados há mais de 14 dias", "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridade de uso ao adquirir álbuns lançados nos últimos 14 dias", - "NotificationsSettingsWebhookHeaders": "Cabeçalhos" + "NotificationsSettingsWebhookHeaders": "Cabeçalhos", + "TracksLoadError": "Incapaz de carregar faixas", + "NoMediumInformation": "Nenhuma informação da mídia está disponível." } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 6e79d1957..f65225d77 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -292,7 +292,7 @@ "DiskSpace": "Дисковое пространство", "DownloadClient": "Клиент загрузки", "DownloadClients": "Клиенты загрузки", - "DownloadClientSettings": "Настройки клиента загрузки", + "DownloadClientSettings": "Настройки загрузчика", "DownloadFailedCheckDownloadClientForMoreDetails": "Неудачное скачивание: подробности в программе для скачивания", "DownloadFailedInterp": "Неудачное скачивание: {0}", "Downloading": "Скачивается", @@ -641,7 +641,7 @@ "CopyToClipboard": "Копировать в буфер обмена", "CouldntFindAnyResultsForTerm": "Не найдено результатов для '{0}'", "Disabled": "Выключено", - "DownloadClientRootFolderHealthCheckMessage": "Клиент загрузки {downloadClientName} помещает загрузки в корневую папку {rootFolderPath}. Вы не должны загружать в корневую папку.", + "DownloadClientRootFolderHealthCheckMessage": "Загрузчик {downloadClientName} помещает файлы в корневую папку {rootFolderPath}. Вы не должны загружать в корневую папку.", "DownloadClientCheckNoneAvailableMessage": "Ни один загрузчик не доступен", "DownloadClientCheckUnableToCommunicateMessage": "Невозможно связаться с {0}.", "DownloadClientStatusCheckAllClientMessage": "Все клиенты для скачивания недоступны из-за ошибок", From d8222c066c04d5219a21a6e7f9f3571a67e8dcca Mon Sep 17 00:00:00 2001 From: Chaz Harris <16189570+Shadowalker125@users.noreply.github.com> Date: Sat, 15 Feb 2025 03:47:22 -0600 Subject: [PATCH 037/146] Bump devcontainer nodejs version to 20 (#5398) --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6f027453c..d0fa03d5f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,7 +6,7 @@ "features": { "ghcr.io/devcontainers/features/node:1": { "nodeGypDependencies": true, - "version": "16", + "version": "20", "nvmVersion": "latest" } }, From 2b2fd5a175b0d23bba84c5caf2dddcbd7eba7731 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 16 Feb 2025 11:50:48 +0200 Subject: [PATCH 038/146] Fix download links for FileList when passkey contains spaces --- src/NzbDrone.Core/Indexers/FileList/FileListParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs index f29f22354..10ff2f160 100644 --- a/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs @@ -77,7 +77,7 @@ namespace NzbDrone.Core.Indexers.FileList var url = new HttpUri(_settings.BaseUrl) .CombinePath("download.php") .AddQueryParam("id", torrentId) - .AddQueryParam("passkey", _settings.Passkey); + .AddQueryParam("passkey", _settings.Passkey.Trim()); return url.FullUri; } From 664b97249458478f8fe1df6ea115dc3dcd158de3 Mon Sep 17 00:00:00 2001 From: Chaz Harris <16189570+Shadowalker125@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:03:41 -0600 Subject: [PATCH 039/146] Fixed: Custom Lists using only ArtistMusicBrainzId (#5399) When using a JSON list that consists of only MusicBrainzId's the list is being filtered. --- .../ImportLists/FetchAndParseImportListService.cs | 4 ++-- src/NzbDrone.Core/ImportLists/ImportListBase.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs index 382b76727..b029f50bf 100644 --- a/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs +++ b/src/NzbDrone.Core/ImportLists/FetchAndParseImportListService.cs @@ -86,7 +86,7 @@ namespace NzbDrone.Core.ImportLists Task.WaitAll(taskList.ToArray()); - result = result.DistinctBy(r => new { r.Artist, r.Album }).ToList(); + result = result.DistinctBy(r => new { r.Artist, r.Album, r.ArtistMusicBrainzId }).ToList(); _logger.Debug("Found {0} total reports from {1} lists", result.Count, importLists.Count); @@ -135,7 +135,7 @@ namespace NzbDrone.Core.ImportLists Task.WaitAll(taskList.ToArray()); - result = result.DistinctBy(r => new { r.Artist, r.Album }).ToList(); + result = result.DistinctBy(r => new { r.Artist, r.Album, r.ArtistMusicBrainzId }).ToList(); return result; } diff --git a/src/NzbDrone.Core/ImportLists/ImportListBase.cs b/src/NzbDrone.Core/ImportLists/ImportListBase.cs index 044d546c1..ec38f5081 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListBase.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListBase.cs @@ -64,7 +64,7 @@ namespace NzbDrone.Core.ImportLists protected virtual IList CleanupListItems(IEnumerable releases) { - var result = releases.DistinctBy(r => new { r.Artist, r.Album }).ToList(); + var result = releases.DistinctBy(r => new { r.Artist, r.Album, r.ArtistMusicBrainzId }).ToList(); result.ForEach(c => { From be115da1577ea98113e3417fe989db76b0b7824d Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Wed, 19 Feb 2025 04:23:43 +0100 Subject: [PATCH 040/146] Fixed: Fallback to Instance Name for Discord notifications (cherry picked from commit b99e06acc0a3ecae2857d9225b35424c82c67a2b) --- .../Notifications/Discord/Discord.cs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 41c0ae0d7..94714a4f0 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; @@ -14,10 +15,12 @@ namespace NzbDrone.Core.Notifications.Discord public class Discord : NotificationBase { private readonly IDiscordProxy _proxy; + private readonly IConfigFileProvider _configFileProvider; - public Discord(IDiscordProxy proxy) + public Discord(IDiscordProxy proxy, IConfigFileProvider configFileProvider) { _proxy = proxy; + _configFileProvider = configFileProvider; } public override string Name => "Discord"; @@ -33,7 +36,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Url = $"https://musicbrainz.org/artist/{artist.ForeignArtistId}", @@ -138,7 +141,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Url = $"https://musicbrainz.org/artist/{artist.ForeignArtistId}", @@ -296,7 +299,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Title = healthCheck.Source.Name, @@ -319,7 +322,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/Lidarr/Lidarr/develop/Logo/256.png" }, Title = "Health Issue Resolved: " + previousCheck.Source.Name, @@ -342,7 +345,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Title = TRACK_RETAGGED_TITLE, @@ -363,7 +366,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Description = message.Message, @@ -385,7 +388,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Description = message.Message, @@ -407,7 +410,7 @@ namespace NzbDrone.Core.Notifications.Discord { Author = new DiscordAuthor { - Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author, + Name = Settings.Author.IsNullOrWhiteSpace() ? _configFileProvider.InstanceName : Settings.Author, IconUrl = "https://raw.githubusercontent.com/lidarr/Lidarr/develop/Logo/256.png" }, Title = APPLICATION_UPDATE_TITLE, From ad12617694f7ff02ceec2c31bc30b36e1dadf432 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 16 Feb 2025 19:15:27 -0800 Subject: [PATCH 041/146] Cleanse console log messages (cherry picked from commit 609e964794e17343f63e1ecff3fef323e3d284ff) --- .../Instrumentation/CleansingClefLogLayout.cs | 21 +++++++++++++ .../CleansingConsoleLogLayout.cs | 26 ++++++++++++++++ ...neFileTarget.cs => CleansingFileTarget.cs} | 2 +- .../Instrumentation/NzbDroneLogger.cs | 30 +++++++++++-------- .../Instrumentation/ReconfigureLogging.cs | 8 ++--- 5 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs create mode 100644 src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs rename src/NzbDrone.Common/Instrumentation/{NzbDroneFileTarget.cs => CleansingFileTarget.cs} (87%) diff --git a/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs b/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs new file mode 100644 index 000000000..f110b96ac --- /dev/null +++ b/src/NzbDrone.Common/Instrumentation/CleansingClefLogLayout.cs @@ -0,0 +1,21 @@ +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 new file mode 100644 index 000000000..f894a4df5 --- /dev/null +++ b/src/NzbDrone.Common/Instrumentation/CleansingConsoleLogLayout.cs @@ -0,0 +1,26 @@ +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/NzbDroneFileTarget.cs b/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs similarity index 87% rename from src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs rename to src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs index 84658cf74..f74d1fca4 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneFileTarget.cs +++ b/src/NzbDrone.Common/Instrumentation/CleansingFileTarget.cs @@ -4,7 +4,7 @@ using NLog.Targets; namespace NzbDrone.Common.Instrumentation { - public class NzbDroneFileTarget : FileTarget + public class CleansingFileTarget : 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 bfb404e98..c33211019 100644 --- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs +++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs @@ -3,7 +3,6 @@ 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; @@ -13,9 +12,11 @@ namespace NzbDrone.Common.Instrumentation { public static class NzbDroneLogger { - 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 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 static bool _isConfigured; @@ -118,11 +119,7 @@ namespace NzbDrone.Common.Instrumentation ? formatEnumValue : ConsoleLogFormat.Standard; - coloredConsoleTarget.Layout = logFormat switch - { - ConsoleLogFormat.Clef => ClefLogLayout, - _ => ConsoleLogLayout - }; + ConfigureConsoleLayout(coloredConsoleTarget, logFormat); var loggingRule = new LoggingRule("*", level, coloredConsoleTarget); @@ -139,7 +136,7 @@ namespace NzbDrone.Common.Instrumentation private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel) { - var fileTarget = new NzbDroneFileTarget(); + var fileTarget = new CleansingFileTarget(); fileTarget.Name = name; fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName); @@ -152,7 +149,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.MaxArchiveFiles = maxArchiveFiles; fileTarget.EnableFileDelete = true; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; - fileTarget.Layout = FILE_LOG_LAYOUT; + fileTarget.Layout = FileLogLayout; var loggingRule = new LoggingRule("*", minLogLevel, fileTarget); @@ -171,7 +168,7 @@ namespace NzbDrone.Common.Instrumentation fileTarget.ConcurrentWrites = false; fileTarget.ConcurrentWriteAttemptDelay = 50; fileTarget.ConcurrentWriteAttempts = 100; - fileTarget.Layout = FILE_LOG_LAYOUT; + fileTarget.Layout = FileLogLayout; var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget); @@ -216,6 +213,15 @@ 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.Core/Instrumentation/ReconfigureLogging.cs b/src/NzbDrone.Core/Instrumentation/ReconfigureLogging.cs index 1310255fd..d49bb06d7 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()) + foreach (var target in LogManager.Configuration.AllTargets.OfType()) { target.MaxArchiveFiles = _configFileProvider.LogRotate; target.ArchiveAboveSize = _configFileProvider.LogSizeLimit.Megabytes(); @@ -120,11 +120,7 @@ namespace NzbDrone.Core.Instrumentation { var format = _configFileProvider.ConsoleLogFormat; - consoleTarget.Layout = format switch - { - ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout, - _ => NzbDroneLogger.ConsoleLogLayout - }; + NzbDroneLogger.ConfigureConsoleLayout(consoleTarget, format); } } From 36998abba0a45cb709b0bcfbfcc124cb8b7de193 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 19 Feb 2025 15:25:03 +0000 Subject: [PATCH 042/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_Hans/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/fi.json | 12 ++++++------ src/NzbDrone.Core/Localization/Core/zh_Hans.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index c7bf2dd2f..1497c82e6 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -197,7 +197,7 @@ "StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Profiilia käytetään manuaalihakuun.", "Tags": "Tunnisteet", - "TestAll": "Kaikkien testaus", + "TestAll": "Koesta kaikki", "TestAllClients": "Koesta latauspalvelut", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia hakupalveluita. Noudata niiden asettamia sääntöjä.", "TagAudioFilesWithMetadata": "Tallenna metatiedot äänitiedostoihin", @@ -351,7 +351,7 @@ "RestoreBackup": "Palauta varmuuskopio", "RetentionHelpText": "Vain Usenet: määritä rajoittamaton säilytys asettamalla arvoksi 0.", "RetryingDownloadOn": "Yritetään latausta uudelleen {date} klo {time}", - "TestAllLists": "Kaikkien listojen testaus", + "TestAllLists": "Koesta listat", "Time": "Aika", "TotalFileSize": "Kokonaistiedostokoko", "Track": "Valvo", @@ -781,7 +781,7 @@ "HideTracks": "Piilota kappaleet", "LatestAlbum": "Uusin albumi", "LatestAlbumData": "Valvo uusimpia ja tulevia albumeita", - "ManageTracks": "Kappaleiden hallinta", + "ManageTracks": "Hallitse kappaleita", "ManualDownload": "Manuaalinen lataus", "NewAlbums": "Uudet albumit", "NoneMonitoringOptionHelpText": "Älä valvo esittäjiä äläkä albumeita.", @@ -958,7 +958,7 @@ "EditConditionImplementation": "Muokataan ehtoa – {implementationName}", "EditConnectionImplementation": "Muokataan ilmoituspalvelua – {implementationName}", "EditAutoTag": "Muokkaa automaattimerkintää", - "ManageIndexers": "Palveluiden hallinta", + "ManageIndexers": "Hallitse palveluita", "RenameFiles": "Nimeä tiedostot uudelleen", "Small": "Pieni", "RemoveSelectedItems": "Poista valitut kohteet", @@ -1265,7 +1265,7 @@ "AddDelayProfileError": "Virhe lisättäessä viiveporofiilia. Yritä uudelleen.", "ImportListTagsHelpText": "Tunnisteet, joilla tältä tuontilistalta lisätyt kohteet merkitään.", "Min": "Pienin", - "Preferred": "Suosittu", + "Preferred": "Tavoite", "Max": "Suurin", "Today": "Tänään", "MappedNetworkDrivesWindowsService": "Yhdistetyt verkkoasemat eivät ole käytettävissä kun sovellus suoritetaan Windows-palveluna. Saat lisätietoja UKK:sta ({url}).", @@ -1289,7 +1289,7 @@ "InstallMajorVersionUpdateMessageLink": "Saat lisätietoja osoitteesta [{domain}]({url}).", "LogSizeLimit": "Lokin kokorajoitus", "LogSizeLimitHelpText": "Lokitiedoston enimmäiskoko ennen pakkausta. Oletusarvo on 1 Mt.", - "ManageCustomFormats": "Hallitse mukautettuja muotoja", + "ManageCustomFormats": "Hallitse muotoja", "ManageFormats": "Hallitse muotoja", "NoCustomFormatsFound": "Mukautettuja muotoja ei löytynyt", "NotificationsTelegramSettingsIncludeAppNameHelpText": "Ilmoitukset voidaan tarvittaessa erottaa muista sovelluksista lisäämällä niiden eteen \"{appName}\".", diff --git a/src/NzbDrone.Core/Localization/Core/zh_Hans.json b/src/NzbDrone.Core/Localization/Core/zh_Hans.json index 28374badf..032c8c738 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_Hans.json +++ b/src/NzbDrone.Core/Localization/Core/zh_Hans.json @@ -4,5 +4,5 @@ "Always": "总是", "Analytics": "分析", "Username": "用户名", - "Activity": "111" + "Activity": "活动" } From 261f30d268d401a852f8330c46f76392ec6e24e8 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 23 May 2024 06:42:16 -0700 Subject: [PATCH 043/146] New: Genres and Images for Webhooks and Notifiarr (cherry picked from commit fd3dd1ab7dc86cd9e231fa432cc8d2772d5a4bad) Closes #4832 --- .../Notifications/Notifiarr/Notifiarr.cs | 5 +- .../Notifications/Webhook/Webhook.cs | 5 +- .../Notifications/Webhook/WebhookAlbum.cs | 24 +++++---- .../Notifications/Webhook/WebhookArtist.cs | 5 +- .../Notifications/Webhook/WebhookBase.cs | 51 ++++++++++++++----- .../Notifications/Webhook/WebhookImage.cs | 18 +++++++ 6 files changed, 80 insertions(+), 28 deletions(-) create mode 100644 src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs index 3d5300de8..25ea84301 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.Notifications.Webhook; @@ -13,8 +14,8 @@ namespace NzbDrone.Core.Notifications.Notifiarr { private readonly INotifiarrProxy _proxy; - public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService) - : base(configFileProvider, configService) + public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) + : base(configFileProvider, configService, mediaCoverService) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs index 9c0f1855b..0b78dcbec 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.Validation; @@ -12,8 +13,8 @@ namespace NzbDrone.Core.Notifications.Webhook { private readonly IWebhookProxy _proxy; - public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService) - : base(configFileProvider, configService) + public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) + : base(configFileProvider, configService, mediaCoverService) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs index 11a324595..a9070245d 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbum.cs @@ -7,6 +7,17 @@ namespace NzbDrone.Core.Notifications.Webhook { public class WebhookAlbum { + public int Id { get; set; } + public string MBId { get; set; } + public string Title { get; set; } + public string Disambiguation { get; set; } + public string Overview { get; set; } + public string AlbumType { get; set; } + public List SecondaryAlbumTypes { get; set; } + public DateTime? ReleaseDate { get; set; } + public List Genres { get; set; } + public List Images { get; set; } + public WebhookAlbum() { } @@ -20,18 +31,9 @@ namespace NzbDrone.Core.Notifications.Webhook Overview = album.Overview; AlbumType = album.AlbumType; SecondaryAlbumTypes = album.SecondaryTypes.Select(x => x.Name).ToList(); - Genres = album.Genres; ReleaseDate = album.ReleaseDate; + Genres = album.Genres; + Images = album.Images.Select(i => new WebhookImage(i)).ToList(); } - - public int Id { get; set; } - public string MBId { get; set; } - public string Title { get; set; } - public string Disambiguation { get; set; } - public string Overview { get; set; } - public string AlbumType { get; set; } - public List SecondaryAlbumTypes { get; set; } - public List Genres { get; set; } - public DateTime? ReleaseDate { get; set; } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs index 98acf34c0..e758df600 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using NzbDrone.Core.Music; namespace NzbDrone.Core.Notifications.Webhook @@ -13,6 +14,7 @@ namespace NzbDrone.Core.Notifications.Webhook public string Type { get; set; } public string Overview { get; set; } public List Genres { get; set; } + public List Images { get; set; } public WebhookArtist() { @@ -24,10 +26,11 @@ namespace NzbDrone.Core.Notifications.Webhook Name = artist.Name; Disambiguation = artist.Metadata.Value.Disambiguation; Path = artist.Path; + MBId = artist.Metadata.Value.ForeignArtistId; Type = artist.Metadata.Value.Type; Overview = artist.Metadata.Value.Overview; Genres = artist.Metadata.Value.Genres; - MBId = artist.Metadata.Value.ForeignArtistId; + Images = artist.Metadata.Value.Images.Select(i => new WebhookImage(i)).ToList(); } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs index 9c84efb3e..6d1013194 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.ThingiProvider; @@ -12,11 +13,13 @@ namespace NzbDrone.Core.Notifications.Webhook { private readonly IConfigFileProvider _configFileProvider; private readonly IConfigService _configService; + private readonly IMapCoversToLocal _mediaCoverService; - protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService) + protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) { _configFileProvider = configFileProvider; _configService = configService; + _mediaCoverService = mediaCoverService; } public WebhookGrabPayload BuildOnGrabPayload(GrabMessage message) @@ -29,8 +32,8 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.Grab, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(message.Artist), - Albums = remoteAlbum.Albums.Select(x => new WebhookAlbum(x)).ToList(), + Artist = GetArtist(message.Artist), + Albums = remoteAlbum.Albums.Select(GetAlbum).ToList(), Release = new WebhookRelease(quality, remoteAlbum), DownloadClient = message.DownloadClientName, DownloadClientType = message.DownloadClientType, @@ -47,8 +50,8 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.Download, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(message.Artist), - Album = new WebhookAlbum(message.Album), + Artist = GetArtist(message.Artist), + Album = GetAlbum(message.Album), Tracks = trackFiles.SelectMany(x => x.Tracks.Value.Select(y => new WebhookTrack(y))).ToList(), TrackFiles = trackFiles.ConvertAll(x => new WebhookTrackFile(x)), IsUpgrade = message.OldFiles.Any(), @@ -89,7 +92,7 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.ImportFailure, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(message.Artist), + Artist = GetArtist(message.Artist), Tracks = trackFiles.SelectMany(x => x.Tracks.Value.Select(y => new WebhookTrack(y))).ToList(), TrackFiles = trackFiles.ConvertAll(x => new WebhookTrackFile(x)), IsUpgrade = message.OldFiles.Any(), @@ -113,7 +116,7 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.Rename, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(artist), + Artist = GetArtist(artist), RenamedTrackFiles = renamedFiles.ConvertAll(x => new WebhookRenamedTrackFile(x)) }; } @@ -125,7 +128,7 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.Retag, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(message.Artist), + Artist = GetArtist(message.Artist), TrackFile = new WebhookTrackFile(message.TrackFile) }; } @@ -137,7 +140,7 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.ArtistAdd, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(addMessage.Artist), + Artist = GetArtist(addMessage.Artist), }; } @@ -148,7 +151,7 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.ArtistDelete, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(deleteMessage.Artist), + Artist = GetArtist(deleteMessage.Artist), DeletedFiles = deleteMessage.DeletedFiles }; } @@ -160,8 +163,8 @@ namespace NzbDrone.Core.Notifications.Webhook EventType = WebhookEventType.AlbumDelete, InstanceName = _configFileProvider.InstanceName, ApplicationUrl = _configService.ApplicationUrl, - Artist = new WebhookArtist(deleteMessage.Album.Artist), - Album = new WebhookAlbum(deleteMessage.Album), + Artist = GetArtist(deleteMessage.Album.Artist), + Album = GetAlbum(deleteMessage.Album), DeletedFiles = deleteMessage.DeletedFiles }; } @@ -230,5 +233,29 @@ namespace NzbDrone.Core.Notifications.Webhook } }; } + + private WebhookArtist GetArtist(Artist artist) + { + if (artist == null) + { + return null; + } + + _mediaCoverService.ConvertToLocalUrls(artist.Id, MediaCoverEntity.Artist, artist.Metadata.Value.Images); + + return new WebhookArtist(artist); + } + + private WebhookAlbum GetAlbum(Album album) + { + if (album == null) + { + return null; + } + + _mediaCoverService.ConvertToLocalUrls(album.Id, MediaCoverEntity.Album, album.Images); + + return new WebhookAlbum(album); + } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs new file mode 100644 index 000000000..87f511dc1 --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookImage.cs @@ -0,0 +1,18 @@ +using NzbDrone.Core.MediaCover; + +namespace NzbDrone.Core.Notifications.Webhook +{ + public class WebhookImage + { + public MediaCoverTypes CoverType { get; set; } + public string Url { get; set; } + public string RemoteUrl { get; set; } + + public WebhookImage(MediaCover.MediaCover image) + { + CoverType = image.CoverType; + RemoteUrl = image.RemoteUrl; + Url = image.Url; + } + } +} From 860bd04c5986013862ffea0cf10d31d72069208a Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 7 May 2024 17:45:28 -0700 Subject: [PATCH 044/146] New: Add artist tags to Webhook and Notifiarr events (cherry picked from commit cc0a284660f139d5f47b27a2c389973e5e888587) Closes #4805 --- .../CustomScript/CustomScript.cs | 28 ++++++++++++++----- .../Notifications/Notifiarr/Notifiarr.cs | 5 ++-- .../Notifications/Webhook/Webhook.cs | 5 ++-- .../Notifications/Webhook/WebhookArtist.cs | 4 ++- .../Notifications/Webhook/WebhookBase.cs | 25 +++++++++++++++-- src/NzbDrone.Core/Tags/TagRepository.cs | 7 +++++ 6 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 824f6b9fc..9610ef324 100644 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_Release_AlbumCount", remoteAlbum.Albums.Count.ToString()); environmentVariables.Add("Lidarr_Release_AlbumReleaseDates", string.Join(",", remoteAlbum.Albums.Select(e => e.ReleaseDate))); environmentVariables.Add("Lidarr_Release_AlbumTitles", string.Join("|", remoteAlbum.Albums.Select(e => e.Title))); @@ -101,7 +101,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_Album_Id", album.Id.ToString()); environmentVariables.Add("Lidarr_Album_Title", album.Title); environmentVariables.Add("Lidarr_Album_Overview", album.Overview); @@ -139,7 +139,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_TrackFile_Ids", string.Join(",", renamedFiles.Select(e => e.TrackFile.Id))); environmentVariables.Add("Lidarr_TrackFile_Paths", string.Join("|", renamedFiles.Select(e => e.TrackFile.Path))); environmentVariables.Add("Lidarr_TrackFile_PreviousPaths", string.Join("|", renamedFiles.Select(e => e.PreviousPath))); @@ -164,7 +164,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_Album_Id", album.Id.ToString()); environmentVariables.Add("Lidarr_Album_Title", album.Title); environmentVariables.Add("Lidarr_Album_Overview", album.Overview); @@ -201,7 +201,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId.ToString()); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); ExecuteScript(environmentVariables); } @@ -220,7 +220,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId.ToString()); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_Artist_DeletedFiles", deleteMessage.DeletedFiles.ToString()); ExecuteScript(environmentVariables); @@ -241,7 +241,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Artist_MBId", artist.Metadata.Value.ForeignArtistId); environmentVariables.Add("Lidarr_Artist_Type", artist.Metadata.Value.Type); environmentVariables.Add("Lidarr_Artist_Genres", string.Join("|", artist.Metadata.Value.Genres)); - environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", artist.Tags.Select(t => _tagRepository.Get(t).Label))); + environmentVariables.Add("Lidarr_Artist_Tags", string.Join("|", GetTagLabels(artist))); environmentVariables.Add("Lidarr_Album_Id", album.Id.ToString()); environmentVariables.Add("Lidarr_Album_Title", album.Title); environmentVariables.Add("Lidarr_Album_Overview", album.Overview); @@ -342,5 +342,19 @@ namespace NzbDrone.Core.Notifications.CustomScript return processOutput; } + + private List GetTagLabels(Artist artist) + { + if (artist == null) + { + return null; + } + + return _tagRepository.GetTags(artist.Tags) + .Select(s => s.Label) + .Where(l => l.IsNotNullOrWhiteSpace()) + .OrderBy(l => l) + .ToList(); + } } } diff --git a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs index 25ea84301..dccf38f6e 100644 --- a/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs +++ b/src/NzbDrone.Core/Notifications/Notifiarr/Notifiarr.cs @@ -6,6 +6,7 @@ using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.Notifications.Webhook; +using NzbDrone.Core.Tags; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Notifications.Notifiarr @@ -14,8 +15,8 @@ namespace NzbDrone.Core.Notifications.Notifiarr { private readonly INotifiarrProxy _proxy; - public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) - : base(configFileProvider, configService, mediaCoverService) + public Notifiarr(INotifiarrProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService) + : base(configFileProvider, configService, tagRepository, mediaCoverService) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs index 0b78dcbec..489d11d23 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs @@ -5,6 +5,7 @@ using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; +using NzbDrone.Core.Tags; using NzbDrone.Core.Validation; namespace NzbDrone.Core.Notifications.Webhook @@ -13,8 +14,8 @@ namespace NzbDrone.Core.Notifications.Webhook { private readonly IWebhookProxy _proxy; - public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) - : base(configFileProvider, configService, mediaCoverService) + public Webhook(IWebhookProxy proxy, IConfigFileProvider configFileProvider, IConfigService configService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService) + : base(configFileProvider, configService, tagRepository, mediaCoverService) { _proxy = proxy; } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs index e758df600..19ba28319 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookArtist.cs @@ -15,12 +15,13 @@ namespace NzbDrone.Core.Notifications.Webhook public string Overview { get; set; } public List Genres { get; set; } public List Images { get; set; } + public List Tags { get; set; } public WebhookArtist() { } - public WebhookArtist(Artist artist) + public WebhookArtist(Artist artist, List tags) { Id = artist.Id; Name = artist.Name; @@ -31,6 +32,7 @@ namespace NzbDrone.Core.Notifications.Webhook Overview = artist.Metadata.Value.Overview; Genres = artist.Metadata.Value.Genres; Images = artist.Metadata.Value.Images.Select(i => new WebhookImage(i)).ToList(); + Tags = tags; } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs index 6d1013194..2807912f2 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaCover; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; +using NzbDrone.Core.Tags; using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.Notifications.Webhook @@ -13,12 +15,14 @@ namespace NzbDrone.Core.Notifications.Webhook { private readonly IConfigFileProvider _configFileProvider; private readonly IConfigService _configService; + private readonly ITagRepository _tagRepository; private readonly IMapCoversToLocal _mediaCoverService; - protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService, IMapCoversToLocal mediaCoverService) + protected WebhookBase(IConfigFileProvider configFileProvider, IConfigService configService, ITagRepository tagRepository, IMapCoversToLocal mediaCoverService) { _configFileProvider = configFileProvider; _configService = configService; + _tagRepository = tagRepository; _mediaCoverService = mediaCoverService; } @@ -221,7 +225,8 @@ namespace NzbDrone.Core.Notifications.Webhook Id = 1, Name = "Test Name", Path = "C:\\testpath", - MBId = "aaaaa-aaa-aaaa-aaaaaa" + MBId = "aaaaa-aaa-aaaa-aaaaaa", + Tags = new List { "test-tag" } }, Albums = new List { @@ -243,7 +248,7 @@ namespace NzbDrone.Core.Notifications.Webhook _mediaCoverService.ConvertToLocalUrls(artist.Id, MediaCoverEntity.Artist, artist.Metadata.Value.Images); - return new WebhookArtist(artist); + return new WebhookArtist(artist, GetTagLabels(artist)); } private WebhookAlbum GetAlbum(Album album) @@ -257,5 +262,19 @@ namespace NzbDrone.Core.Notifications.Webhook return new WebhookAlbum(album); } + + private List GetTagLabels(Artist artist) + { + if (artist == null) + { + return null; + } + + return _tagRepository.GetTags(artist.Tags) + .Select(s => s.Label) + .Where(l => l.IsNotNullOrWhiteSpace()) + .OrderBy(l => l) + .ToList(); + } } } diff --git a/src/NzbDrone.Core/Tags/TagRepository.cs b/src/NzbDrone.Core/Tags/TagRepository.cs index 4851ad223..5743dd4a6 100644 --- a/src/NzbDrone.Core/Tags/TagRepository.cs +++ b/src/NzbDrone.Core/Tags/TagRepository.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; @@ -9,6 +10,7 @@ namespace NzbDrone.Core.Tags { Tag GetByLabel(string label); Tag FindByLabel(string label); + List GetTags(HashSet tagIds); } public class TagRepository : BasicRepository, ITagRepository @@ -34,5 +36,10 @@ namespace NzbDrone.Core.Tags { return Query(c => c.Label == label).SingleOrDefault(); } + + public List GetTags(HashSet tagIds) + { + return Query(t => tagIds.Contains(t.Id)); + } } } From ec050a7b3c6bd2ac87a915f7220eb3b89db2a169 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 22 Feb 2025 16:36:25 +0200 Subject: [PATCH 045/146] Fixed: Prevent NullRef for webhooks when Artist Metadata is not set Fixes #5368 --- src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs index 2807912f2..bd378ae0f 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs @@ -241,7 +241,7 @@ namespace NzbDrone.Core.Notifications.Webhook private WebhookArtist GetArtist(Artist artist) { - if (artist == null) + if (artist?.Metadata?.Value == null) { return null; } From f177345d010cfe578f7f8eba80575d32e69b9de7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 22 Feb 2025 21:28:33 +0200 Subject: [PATCH 046/146] Fixed: Avoid checking for free space if other specifications fail first --- .../DecisionEngine/Specifications/FreeSpaceSpecification.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/FreeSpaceSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/FreeSpaceSpecification.cs index d83629e08..6f94a5b76 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/FreeSpaceSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/FreeSpaceSpecification.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications _logger = logger; } - public SpecificationPriority Priority => SpecificationPriority.Default; + public SpecificationPriority Priority => SpecificationPriority.Disk; public RejectionType Type => RejectionType.Permanent; public Decision IsSatisfiedBy(RemoteAlbum subject, SearchCriteriaBase searchCriteria) From 23611cb1161c2181d36057b9c6763d87496165c0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 23 Feb 2025 12:16:19 +0200 Subject: [PATCH 047/146] Bump version to 2.10.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4d34b2684..0f6862ed2 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: '2.10.0' + majorVersion: '2.10.1' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From f4dc294ab302051a934f1f1dc53c30844093ec58 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 26 Feb 2025 03:59:22 +0200 Subject: [PATCH 048/146] Fixed: Instance name must contain application name --- .../Configuration/ConfigFileProvider.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 389728f84..60014cc95 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -263,7 +263,21 @@ namespace NzbDrone.Core.Configuration } public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI"; - public string InstanceName => _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName); + + public string InstanceName + { + get + { + var instanceName = _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName); + + if (instanceName.Contains(BuildInfo.AppName, StringComparison.OrdinalIgnoreCase)) + { + return instanceName; + } + + return BuildInfo.AppName; + } + } public bool UpdateAutomatically => _updateOptions.Automatically ?? GetValueBoolean("UpdateAutomatically", OsInfo.IsWindows, false); From 6292f223aca1ff01fdb46270ea3fe918bb966bad Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 17 Sep 2024 23:54:40 +0300 Subject: [PATCH 049/146] Fixed: Attempt to ensure all import results are imported Fixes #2746 Closes #4815 --- .../ImportFixture.cs | 19 ++++++++++----- .../Download/CompletedDownloadService.cs | 23 ++++++++++--------- .../TrackImport/Manual/ManualImportService.cs | 14 +++++------ 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs index 16f6cfd1a..9719b7f1f 100644 --- a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs +++ b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs @@ -183,6 +183,8 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests { GivenArtistMatch(); + var tracks = Builder.CreateListOfSize(3).BuildList(); + _trackedDownload.RemoteAlbum.Albums = new List { CreateAlbum(1, 3) @@ -192,9 +194,9 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { - new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() })), - new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() })), - new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() })), + new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic(), Tracks = new List { tracks[0] } })), + new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic(), Tracks = new List { tracks[1] } })), + new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic(), Tracks = new List { tracks[2] } })), new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() }), "Test Failure") }); @@ -290,6 +292,9 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests [Test] public void should_mark_as_imported_if_all_tracks_were_imported() { + var track1 = new Track { Id = 1 }; + var track2 = new Track { Id = 2 }; + _trackedDownload.RemoteAlbum.Albums = new List { CreateAlbum(1, 2) @@ -301,11 +306,11 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests { new ImportResult( new ImportDecision( - new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() })), + new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic(), Tracks = new List { track1 } })), new ImportResult( new ImportDecision( - new LocalTrack { Path = @"C:\TestPath\Droned.S01E02.mkv".AsOsAgnostic() })) + new LocalTrack { Path = @"C:\TestPath\Droned.S01E02.mkv".AsOsAgnostic(), Tracks = new List { track2 } })) }); Subject.Import(_trackedDownload); @@ -367,11 +372,13 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests { GivenABadlyNamedDownload(); + var track1 = new Track { Id = 1 }; + Mocker.GetMock() .Setup(v => v.ProcessPath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new List { - new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic() })) + new ImportResult(new ImportDecision(new LocalTrack { Path = @"C:\TestPath\Droned.S01E01.mkv".AsOsAgnostic(), Tracks = new List { track1 } })) }); Mocker.GetMock() diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index eca048e78..7fb40d994 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -178,9 +178,11 @@ namespace NzbDrone.Core.Download public bool VerifyImport(TrackedDownload trackedDownload, List importResults) { - var allTracksImported = importResults.All(c => c.Result == ImportResultType.Imported) || - importResults.Count(c => c.Result == ImportResultType.Imported) >= - Math.Max(1, trackedDownload.RemoteAlbum.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount))); + var allTracksImported = + (importResults.Any() && importResults.All(c => c.Result == ImportResultType.Imported)) || + importResults.Where(c => c.Result == ImportResultType.Imported) + .SelectMany(c => c.ImportDecision.Item.Tracks) + .Count() >= Math.Max(1, trackedDownload.RemoteAlbum.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount))); if (allTracksImported) { @@ -191,6 +193,10 @@ namespace NzbDrone.Core.Download return true; } + var historyItems = _historyService.FindByDownloadId(trackedDownload.DownloadItem.DownloadId) + .OrderByDescending(h => h.Date) + .ToList(); + // Double check if all episodes were imported by checking the history if at least one // file was imported. This will allow the decision engine to reject already imported // episode files and still mark the download complete when all files are imported. @@ -199,19 +205,14 @@ namespace NzbDrone.Core.Download // and an episode is removed, but later comes back with a different ID then Sonarr will treat it as incomplete. // Since imports should be relatively fast and these types of data changes are infrequent this should be quite // safe, but commenting for future benefit. - var atLeastOneEpisodeImported = importResults.Any(c => c.Result == ImportResultType.Imported); - - var historyItems = _historyService.FindByDownloadId(trackedDownload.DownloadItem.DownloadId) - .OrderByDescending(h => h.Date) - .ToList(); - + var atLeastOneTrackImported = importResults.Any(c => c.Result == ImportResultType.Imported); var allTracksImportedInHistory = _trackedDownloadAlreadyImported.IsImported(trackedDownload, historyItems); if (allTracksImportedInHistory) { // Log different error messages depending on the circumstances, but treat both as fully imported, because that's the reality. // The second message shouldn't be logged in most cases, but continued reporting would indicate an ongoing issue. - if (atLeastOneEpisodeImported) + if (atLeastOneTrackImported) { _logger.Debug("All albums were imported in history for {0}", trackedDownload.DownloadItem.Title); } @@ -233,7 +234,7 @@ namespace NzbDrone.Core.Download return true; } - _logger.Debug("Not all albums have been imported for {0}", trackedDownload.DownloadItem.Title); + _logger.Debug("Not all albums have been imported for the release '{0}'", trackedDownload.DownloadItem.Title); return false; } diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index 7cf6b7c85..d7d0d2d4e 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -391,28 +391,26 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual { var trackedDownload = groupedTrackedDownload.First().TrackedDownload; var importArtist = groupedTrackedDownload.First().ImportResult.ImportDecision.Item.Artist; - var outputPath = trackedDownload.ImportItem.OutputPath.FullPath; if (_diskProvider.FolderExists(outputPath)) { if (_downloadedTracksImportService.ShouldDeleteFolder( - _diskProvider.GetDirectoryInfo(outputPath), - importArtist) && trackedDownload.DownloadItem.CanMoveFiles) + _diskProvider.GetDirectoryInfo(outputPath), importArtist) && + trackedDownload.DownloadItem.CanMoveFiles) { _diskProvider.DeleteFolder(outputPath, true); } } - var remoteTrackCount = Math.Max(1, - trackedDownload.RemoteAlbum?.Albums.Sum(x => - x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount)) ?? 1); + var remoteTrackCount = Math.Max(1, trackedDownload.RemoteAlbum?.Albums.Sum(x => x.AlbumReleases.Value.Where(y => y.Monitored).Sum(z => z.TrackCount)) ?? 1); - var importResults = groupedTrackedDownload.Select(x => x.ImportResult).ToList(); + var importResults = groupedTrackedDownload.Select(c => c.ImportResult).ToList(); var importedTrackCount = importResults.Where(c => c.Result == ImportResultType.Imported) .SelectMany(c => c.ImportDecision.Item.Tracks) .Count(); - var allTracksImported = importResults.All(c => c.Result == ImportResultType.Imported) || importedTrackCount >= remoteTrackCount; + + var allTracksImported = (importResults.Any() && importResults.All(c => c.Result == ImportResultType.Imported)) || importedTrackCount >= remoteTrackCount; if (allTracksImported) { From e8bb78e5bb44f3f369492124158237cd60ba0027 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 23 Feb 2021 18:39:24 -0800 Subject: [PATCH 050/146] New: Improve messaging if release is in queue because all tracks in release were not imported (cherry picked from commit 2728bf79ca41bc372de515cb09e1034a8c006c2b) --- .../Download/CompletedDownloadService.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 7fb40d994..9ac8e13e9 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -149,14 +149,11 @@ namespace NzbDrone.Core.Download var statusMessages = new List { - new TrackedDownloadStatusMessage("One or more albums expected in this release were not imported or missing", new List()) + new TrackedDownloadStatusMessage("One or more tracks expected in this release were not imported or missing from the release", new List()) }; if (importResults.Any(c => c.Result != ImportResultType.Imported)) { - // Mark as failed to prevent further attempts at processing - trackedDownload.State = TrackedDownloadState.ImportFailed; - statusMessages.AddRange( importResults .Where(v => v.Result != ImportResultType.Imported && v.ImportDecision.Item != null) @@ -165,14 +162,16 @@ namespace NzbDrone.Core.Download new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.Item.Path), v.Errors))); - if (statusMessages.Any()) - { - trackedDownload.Warn(statusMessages.ToArray()); - } - - // Publish event to notify Album was imported incompelte + // Publish event to notify album was imported incomplete _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); - return; + } + + if (statusMessages.Any()) + { + trackedDownload.Warn(statusMessages.ToArray()); + + // Mark as failed to prevent further attempts at processing + trackedDownload.State = TrackedDownloadState.ImportFailed; } } From a1a53dbb5e017bbeb9b636aea302fd31b2df598b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 25 Jun 2024 15:51:20 -0700 Subject: [PATCH 051/146] New: Improve UI status when downloads cannot be imported automatically (cherry picked from commit 6d5ff9c4d6993d16848980aea499a45b1b51d95c) --- .../src/Activity/Queue/QueueStatusCell.js | 36 ++++++++++++------- .../HistoryEventTypeFilterBuilderRowValue.tsx | 2 +- frontend/src/Store/Actions/historyActions.js | 2 +- .../ImportFixture.cs | 2 +- .../Download/CompletedDownloadService.cs | 19 ++++++---- .../TrackedDownloads/TrackedDownload.cs | 1 + src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/el.json | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 12 ++++++- src/NzbDrone.Core/Localization/Core/es.json | 2 +- src/NzbDrone.Core/Localization/Core/fi.json | 2 +- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 2 +- .../Localization/Core/pt_BR.json | 2 +- .../Localization/Core/zh_CN.json | 2 +- 15 files changed, 60 insertions(+), 30 deletions(-) diff --git a/frontend/src/Activity/Queue/QueueStatusCell.js b/frontend/src/Activity/Queue/QueueStatusCell.js index 6d5caf6f9..d4dcdfeee 100644 --- a/frontend/src/Activity/Queue/QueueStatusCell.js +++ b/frontend/src/Activity/Queue/QueueStatusCell.js @@ -57,30 +57,40 @@ function QueueStatusCell(props) { if (status === 'paused') { iconName = icons.PAUSED; - title = 'Paused'; + title = translate('Paused'); } if (status === 'queued') { iconName = icons.QUEUED; - title = 'Queued'; + title = translate('Queued'); } if (status === 'completed') { iconName = icons.DOWNLOADED; - title = 'Downloaded'; + title = translate('Downloaded'); + + if (trackedDownloadState === 'importBlocked') { + title += ` - ${translate('UnableToImportAutomatically')}`; + iconKind = kinds.WARNING; + } + + if (trackedDownloadState === 'importFailed') { + title += ` - ${translate('ImportFailed', { sourceTitle })}`; + iconKind = kinds.WARNING; + } if (trackedDownloadState === 'importPending') { - title += ' - Waiting to Import'; + title += ` - ${translate('WaitingToImport')}`; iconKind = kinds.PURPLE; } if (trackedDownloadState === 'importing') { - title += ' - Importing'; + title += ` - ${translate('Importing')}`; iconKind = kinds.PURPLE; } if (trackedDownloadState === 'failedPending') { - title += ' - Waiting to Process'; + title += ` - ${translate('WaitingToProcess')}`; iconKind = kinds.DANGER; } } @@ -91,36 +101,38 @@ function QueueStatusCell(props) { if (status === 'delay') { iconName = icons.PENDING; - title = 'Pending'; + title = translate('Pending'); } if (status === 'downloadClientUnavailable') { iconName = icons.PENDING; iconKind = kinds.WARNING; - title = 'Pending - Download client is unavailable'; + title = translate('PendingDownloadClientUnavailable'); } if (status === 'failed') { iconName = icons.DOWNLOADING; iconKind = kinds.DANGER; - title = 'Download failed'; + title = translate('DownloadFailed'); } if (status === 'warning') { iconName = icons.DOWNLOADING; iconKind = kinds.WARNING; - title = `Download warning: ${errorMessage || 'check download client for more details'}`; + const warningMessage = + errorMessage || translate('CheckDownloadClientForDetails'); + title = translate('DownloadWarning', { warningMessage }); } if (hasError) { if (status === 'completed') { iconName = icons.DOWNLOAD; iconKind = kinds.DANGER; - title = `Import failed: ${sourceTitle}`; + title = translate('ImportFailed', { sourceTitle }); } else { iconName = icons.DOWNLOADING; iconKind = kinds.DANGER; - title = 'Download failed'; + title = translate('DownloadFailed'); } } diff --git a/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx index 45e6fc756..1b3b369be 100644 --- a/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx +++ b/frontend/src/Components/Filter/Builder/HistoryEventTypeFilterBuilderRowValue.tsx @@ -25,7 +25,7 @@ const EVENT_TYPE_OPTIONS = [ { id: 7, get name() { - return translate('ImportFailed'); + return translate('ImportCompleteFailed'); }, }, { diff --git a/frontend/src/Store/Actions/historyActions.js b/frontend/src/Store/Actions/historyActions.js index 225698229..9d16d29c4 100644 --- a/frontend/src/Store/Actions/historyActions.js +++ b/frontend/src/Store/Actions/historyActions.js @@ -150,7 +150,7 @@ export const defaultState = { }, { key: 'importFailed', - label: () => translate('ImportFailed'), + label: () => translate('ImportCompleteFailed'), filters: [ { key: 'eventType', diff --git a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs index 9719b7f1f..ee0651ea3 100644 --- a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs +++ b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs @@ -395,7 +395,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Never()); - _trackedDownload.State.Should().Be(TrackedDownloadState.ImportFailed); + _trackedDownload.State.Should().Be(TrackedDownloadState.ImportBlocked); } private void AssertImported() diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 9ac8e13e9..b5010b8f8 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -63,8 +63,8 @@ namespace NzbDrone.Core.Download SetImportItem(trackedDownload); - // Only process tracked downloads that are still downloading - if (trackedDownload.State != TrackedDownloadState.Downloading) + // Only process tracked downloads that are still downloading or have been blocked for importing due to an issue with matching + if (trackedDownload.State != TrackedDownloadState.Downloading && trackedDownload.State != TrackedDownloadState.ImportBlocked) { return; } @@ -93,7 +93,9 @@ namespace NzbDrone.Core.Download if (artist == null) { - trackedDownload.Warn("Artist name mismatch, automatic import is not possible."); + trackedDownload.Warn("Artist name mismatch, automatic import is not possible. Check the download troubleshooting entry on the wiki for common causes."); + SetStateToImportBlocked(trackedDownload); + return; } } @@ -113,6 +115,8 @@ namespace NzbDrone.Core.Download if (trackedDownload.RemoteAlbum == null) { trackedDownload.Warn("Unable to parse download, automatic import is not possible."); + SetStateToImportBlocked(trackedDownload); + return; } @@ -169,9 +173,7 @@ namespace NzbDrone.Core.Download if (statusMessages.Any()) { trackedDownload.Warn(statusMessages.ToArray()); - - // Mark as failed to prevent further attempts at processing - trackedDownload.State = TrackedDownloadState.ImportFailed; + SetStateToImportBlocked(trackedDownload); } } @@ -237,6 +239,11 @@ namespace NzbDrone.Core.Download return false; } + private void SetStateToImportBlocked(TrackedDownload trackedDownload) + { + trackedDownload.State = TrackedDownloadState.ImportBlocked; + } + private void SetImportItem(TrackedDownload trackedDownload) { trackedDownload.ImportItem = _provideImportItemService.ProvideImportItem(trackedDownload.DownloadItem, trackedDownload.ImportItem); diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownload.cs b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownload.cs index d4b4cfe20..af1f85abf 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownload.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownload.cs @@ -41,6 +41,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads Downloading, DownloadFailed, DownloadFailedPending, + ImportBlocked, ImportPending, Importing, ImportFailed, diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 17b53fad5..6ce2aa25f 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -782,7 +782,7 @@ "DownloadImported": "Importiere herunterladen", "EditMetadata": "Metadaten bearbeiten", "ForNewImportsOnly": "Nur für neue Imports", - "ImportFailed": "Import fehlgeschlagen", + "ImportCompleteFailed": "Import fehlgeschlagen", "EndedOnly": "Nur beendete", "MassAlbumsCutoffUnmetWarning": "Bist du dir sicher, dass du nach allen '{0}' Alben suchen willst deren Schwelle nicht erreicht worden ist?", "SearchForAllMissingAlbumsConfirmationCount": "Bist du sicher, dass du nach allen {totalRecords} fehlenden Alben suchen möchtest?", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 47363001b..1ba176c58 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -751,7 +751,7 @@ "GoToArtistListing": "Μεταβείτε στη λίστα καλλιτεχνών", "HideAlbums": "Απόκρυψη άλμπουμ", "HideTracks": "Απόκρυψη κομματιών", - "ImportFailed": "Η εισαγωγή απέτυχε", + "ImportCompleteFailed": "Η εισαγωγή απέτυχε", "ImportFailures": "Αστοχίες εισαγωγής", "ImportLists": "Λίστες εισαγωγής", "ImportListSpecificSettings": "Εισαγωγή ειδικών ρυθμίσεων λίστας", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2c67fc1ed..5f9c76b0c 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -197,6 +197,7 @@ "ChangeCategoryMultipleHint": "Changes downloads to the 'Post-Import Category' from Download Client", "ChangeFileDate": "Change File Date", "ChangeHasNotBeenSavedYet": "Change has not been saved yet", + "CheckDownloadClientForDetails": "check download client for more details", "ChmodFolder": "chmod Folder", "ChmodFolderHelpText": "Octal, applied during import/rename to media folders and files (without execute bits)", "ChmodFolderHelpTextWarning": "This only works if the user running {appName} is the owner of the file. It's better to ensure the download client sets the permissions properly.", @@ -406,7 +407,9 @@ "DownloadPropersAndRepacksHelpTextWarning": "Use custom formats for automatic upgrades to Propers/Repacks", "DownloadPropersAndRepacksHelpTexts1": "Whether or not to automatically upgrade to Propers/Repacks", "DownloadPropersAndRepacksHelpTexts2": "Use 'Do not Prefer' to sort by preferred word score over propers/repacks", + "DownloadWarning": "Download warning: {warningMessage}", "DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details", + "Downloaded": "Downloaded", "DownloadedImporting": "'Downloaded - Importing'", "DownloadedUnableToImportCheckLogsForDetails": "'Downloaded - Unable to Import: check logs for details'", "DownloadedWaitingToImport": "'Downloaded - Waiting to Import'", @@ -571,9 +574,10 @@ "IllRestartLater": "I'll restart later", "Implementation": "Implementation", "Import": "Import", + "ImportCompleteFailed": "Import Failed", "ImportExtraFiles": "Import Extra Files", "ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an track file", - "ImportFailed": "Import Failed", + "ImportFailed": "Import Failed: {sourceTitle}", "ImportFailedInterp": "Import failed: {0}", "ImportFailures": "Import failures", "ImportList": "Import List", @@ -891,7 +895,10 @@ "Path": "Path", "PathHelpText": "Root Folder containing your music library", "PathHelpTextWarning": "This must be different to the directory where your download client puts files", + "Paused": "Paused", "Peers": "Peers", + "Pending": "Pending", + "PendingDownloadClientUnavailable": "Pending - Download client is unavailable", "Period": "Period", "Permissions": "Permissions", "Playlist": "Playlist", @@ -1268,6 +1275,7 @@ "UnableToAddANewQualityProfilePleaseTryAgain": "Unable to add a new quality profile, please try again.", "UnableToAddANewRemotePathMappingPleaseTryAgain": "Unable to add a new remote path mapping, please try again.", "UnableToAddANewRootFolderPleaseTryAgain": "Unable to add a new root folder, please try again.", + "UnableToImportAutomatically": "Unable to Import Automatically", "UnableToLoadBackups": "Unable to load backups", "UnableToLoadBlocklist": "Unable to load blocklist", "UnableToLoadCustomFormats": "Unable to load custom formats", @@ -1335,6 +1343,8 @@ "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Branch to use to update {appName}", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch used by external update mechanism", "Version": "Version", + "WaitingToImport": "Waiting to Import", + "WaitingToProcess": "Waiting to Process", "Wanted": "Wanted", "Warn": "Warn", "WatchLibraryForChangesHelpText": "Rescan automatically when files change in a root folder", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 9db5c4a91..2dc642ba6 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1126,7 +1126,7 @@ "DefaultLidarrTags": "Etiquetas predeterminadas de {appName}", "ExpandItemsByDefault": "Expandir elementos predeterminados", "DownloadedWaitingToImport": "'Descargados - Esperando para importar'", - "ImportFailed": "La importación falló", + "ImportCompleteFailed": "La importación falló", "IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "No se puede eliminar un perfil de metadatos que está enlazado a un artista o a una lista de importación", "IsExpandedShowTracks": "Mostrar pistas", "IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "No se puede eliminar un perfil de calidad que está enlazado a un artista o a una lista de importación", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 1497c82e6..4429df780 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -773,7 +773,7 @@ "ExistingAlbumsData": "Valvo albumeita, joille on tiedostoja tai joita ei ole vielä julkaistu.", "ForNewImportsOnly": "Vain uusille tuonneille", "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "Esittäjältä ei valvota albumeita", - "ImportFailed": "Tuonti epäonnistui", + "ImportCompleteFailed": "Tuonti epäonnistui", "ImportFailures": "Tuontivirheet", "ImportLists": "Tuontilistat", "ImportListSettings": "Tuontilistojen yleisasetukset", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index a3b29285c..e824e21dd 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -897,7 +897,7 @@ "DeleteMetadataProfile": "Supprimer le profil de métadonnées", "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "Aucun album surveillé pour cet artiste", "ImportFailures": "Échecs d’importation", - "ImportFailed": "Échec de l'importation", + "ImportCompleteFailed": "Échec de l'importation", "IndexerIdHelpTextWarning": "L'utilisation d'un indexeur spécifique avec les mots préférés peut conduire à la saisie de versions en double", "LastAlbum": "Dernier album", "ListRefreshInterval": "Intervalle d'actualisation de la liste", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index b7c150824..387c736c6 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -790,7 +790,7 @@ "ForNewImportsOnly": "Csak új importokra", "EndedOnly": "Csak a véget értek", "ContinuingOnly": "Csak folytatás", - "ImportFailed": "Az importálás sikertelen", + "ImportCompleteFailed": "Az importálás sikertelen", "MediaCount": "Médiaszám", "MissingTracks": "Hiányzó számok", "MonitorNewItems": "Új albumok monitorozása", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index bc8215799..e0c1db1d5 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -789,7 +789,7 @@ "EditMetadata": "Editar metadados", "EditReleaseProfile": "Editar perfil de lançamento", "ForNewImportsOnly": "Para novas importações somente", - "ImportFailed": "Falha na importação", + "ImportCompleteFailed": "Falha na importação", "MissingTracks": "Faixas Ausentes", "NewAlbums": "Novos Álbuns", "NextAlbum": "Próximo Álbum", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index a423a7c51..7247d2857 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -708,7 +708,7 @@ "Other": "其他", "OutputPath": "输出路径", "QualitiesHelpText": "即使未勾选,列表中靠前的质量优先级更高。同组内的质量优先级相同。仅需勾选需要的质量", - "ImportFailed": "导入失败", + "ImportCompleteFailed": "导入失败", "TrackArtist": "歌曲歌手", "OnAlbumDelete": "当专辑删除时", "OnArtistDelete": "当歌手删除时", From 2997c163460a4c590fbb776e5d3b7da0642475c3 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 26 Jun 2024 08:58:22 -0700 Subject: [PATCH 052/146] Fixed: Reprocessing items that were previously blocked during importing (cherry picked from commit bce848facf8aeaeac6a1d59c92941d00589034a4) --- src/NzbDrone.Core/Download/FailedDownloadService.cs | 4 ++-- .../Download/TrackedDownloads/DownloadMonitoringService.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Download/FailedDownloadService.cs b/src/NzbDrone.Core/Download/FailedDownloadService.cs index 72b33dca8..60c9e8d05 100644 --- a/src/NzbDrone.Core/Download/FailedDownloadService.cs +++ b/src/NzbDrone.Core/Download/FailedDownloadService.cs @@ -73,8 +73,8 @@ namespace NzbDrone.Core.Download public void Check(TrackedDownload trackedDownload) { - // Only process tracked downloads that are still downloading - if (trackedDownload.State != TrackedDownloadState.Downloading) + // Only process tracked downloads that are still downloading or import is blocked (if they fail after attempting to be processed) + if (trackedDownload.State != TrackedDownloadState.Downloading && trackedDownload.State != TrackedDownloadState.ImportBlocked) { return; } diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs index 79ec696b8..4ab3b23da 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs @@ -115,7 +115,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads { var trackedDownload = _trackedDownloadService.TrackDownload((DownloadClientDefinition)downloadClient.Definition, downloadItem); - if (trackedDownload != null && trackedDownload.State == TrackedDownloadState.Downloading) + if (trackedDownload is { State: TrackedDownloadState.Downloading or TrackedDownloadState.ImportBlocked }) { _failedDownloadService.Check(trackedDownload); _completedDownloadService.Check(trackedDownload); From 031f32a52cfd50747abf5b161c030c6e58090478 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 18 Sep 2024 22:43:12 +0300 Subject: [PATCH 053/146] Fixed: Refresh cache for tracked queue on artist/album add or removal Prevents a NullRef in CompletedDownloadService.VerifyImport when publishing DownloadCompletedEvent for an already cached tracked download --- .../TrackedDownloadService.cs | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs index efe1d2fd4..636104398 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs @@ -16,7 +16,7 @@ using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.TrackedDownloads { - public interface ITrackedDownloadService : IHandle + public interface ITrackedDownloadService { TrackedDownload Find(string downloadId); void StopTracking(string downloadId); @@ -26,13 +26,16 @@ namespace NzbDrone.Core.Download.TrackedDownloads void UpdateTrackable(List trackedDownloads); } - public class TrackedDownloadService : ITrackedDownloadService + public class TrackedDownloadService : ITrackedDownloadService, + IHandle, + IHandle, + IHandle, + IHandle { private readonly IParsingService _parsingService; private readonly IHistoryService _historyService; private readonly IEventAggregator _eventAggregator; private readonly IDownloadHistoryService _downloadHistoryService; - private readonly ITrackedDownloadAlreadyImported _trackedDownloadAlreadyImported; private readonly ICustomFormatCalculationService _formatCalculator; private readonly Logger _logger; private readonly ICached _cache; @@ -43,7 +46,6 @@ namespace NzbDrone.Core.Download.TrackedDownloads ICustomFormatCalculationService formatCalculator, IEventAggregator eventAggregator, IDownloadHistoryService downloadHistoryService, - ITrackedDownloadAlreadyImported trackedDownloadAlreadyImported, Logger logger) { _parsingService = parsingService; @@ -51,7 +53,6 @@ namespace NzbDrone.Core.Download.TrackedDownloads _cache = cacheManager.GetCache(GetType()); _formatCalculator = formatCalculator; _eventAggregator = eventAggregator; - _trackedDownloadAlreadyImported = trackedDownloadAlreadyImported; _downloadHistoryService = downloadHistoryService; _logger = logger; } @@ -264,18 +265,6 @@ namespace NzbDrone.Core.Download.TrackedDownloads } } - public void Handle(AlbumDeletedEvent message) - { - var cachedItems = _cache.Values.Where(x => x.RemoteAlbum != null && x.RemoteAlbum.Albums.Any(a => a.Id == message.Album.Id)).ToList(); - - if (cachedItems.Any()) - { - cachedItems.ForEach(UpdateCachedItem); - - _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); - } - } - public void Handle(AlbumInfoRefreshedEvent message) { var needsToUpdate = false; @@ -301,12 +290,45 @@ namespace NzbDrone.Core.Download.TrackedDownloads } } + public void Handle(AlbumDeletedEvent message) + { + var cachedItems = _cache.Values + .Where(t => + t.RemoteAlbum?.Albums != null && + t.RemoteAlbum.Albums.Any(a => a.Id == message.Album.Id || a.ForeignAlbumId == message.Album.ForeignAlbumId)) + .ToList(); + + if (cachedItems.Any()) + { + cachedItems.ForEach(UpdateCachedItem); + + _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); + } + } + + public void Handle(ArtistAddedEvent message) + { + var cachedItems = _cache.Values + .Where(t => + t.RemoteAlbum?.Artist == null || + message.Artist?.ForeignArtistId == t.RemoteAlbum.Artist.ForeignArtistId) + .ToList(); + + if (cachedItems.Any()) + { + cachedItems.ForEach(UpdateCachedItem); + + _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); + } + } + public void Handle(ArtistsDeletedEvent message) { - var cachedItems = _cache.Values.Where(t => - t.RemoteAlbum?.Artist != null && - message.Artists.Select(a => a.Id).Contains(t.RemoteAlbum.Artist.Id)) - .ToList(); + var cachedItems = _cache.Values + .Where(t => + t.RemoteAlbum?.Artist != null && + message.Artists.Any(a => a.Id == t.RemoteAlbum.Artist.Id || a.ForeignArtistId == t.RemoteAlbum.Artist.ForeignArtistId)) + .ToList(); if (cachedItems.Any()) { From 07db508580266da2f2aaaf63dd23b649cb0aca37 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 18 Sep 2024 23:58:18 +0300 Subject: [PATCH 054/146] Fixed: Calculating custom formats for queue --- .../TrackedDownloads/TrackedDownloadService.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs index 636104398..085373b56 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Common.Serializer; using NzbDrone.Core.CustomFormats; +using NzbDrone.Core.Download.Aggregation; using NzbDrone.Core.Download.History; using NzbDrone.Core.History; using NzbDrone.Core.Messaging.Events; @@ -36,6 +37,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads private readonly IHistoryService _historyService; private readonly IEventAggregator _eventAggregator; private readonly IDownloadHistoryService _downloadHistoryService; + private readonly IRemoteAlbumAggregationService _aggregationService; private readonly ICustomFormatCalculationService _formatCalculator; private readonly Logger _logger; private readonly ICached _cache; @@ -46,6 +48,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads ICustomFormatCalculationService formatCalculator, IEventAggregator eventAggregator, IDownloadHistoryService downloadHistoryService, + IRemoteAlbumAggregationService aggregationService, Logger logger) { _parsingService = parsingService; @@ -54,6 +57,7 @@ namespace NzbDrone.Core.Download.TrackedDownloads _formatCalculator = formatCalculator; _eventAggregator = eventAggregator; _downloadHistoryService = downloadHistoryService; + _aggregationService = aggregationService; _logger = logger; } @@ -67,6 +71,8 @@ namespace NzbDrone.Core.Download.TrackedDownloads var parsedAlbumInfo = Parser.Parser.ParseAlbumTitle(trackedDownload.DownloadItem.Title); trackedDownload.RemoteAlbum = parsedAlbumInfo == null ? null : _parsingService.Map(parsedAlbumInfo); + + _aggregationService.Augment(trackedDownload.RemoteAlbum); } public void StopTracking(string downloadId) @@ -191,9 +197,11 @@ namespace NzbDrone.Core.Download.TrackedDownloads } } - // Calculate custom formats if (trackedDownload.RemoteAlbum != null) { + _aggregationService.Augment(trackedDownload.RemoteAlbum); + + // Calculate custom formats trackedDownload.RemoteAlbum.CustomFormats = _formatCalculator.ParseCustomFormat(trackedDownload.RemoteAlbum, downloadItem.TotalSize); } From 8c99280f07498e990a2d786e84428f34ebbc0cb7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 17 Jun 2024 20:39:13 -0700 Subject: [PATCH 055/146] Fixed: Adding albums with unknown items in queue --- .../Download/Aggregation/RemoteAlbumAggregationService.cs | 5 +++++ src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/Aggregation/RemoteAlbumAggregationService.cs b/src/NzbDrone.Core/Download/Aggregation/RemoteAlbumAggregationService.cs index 46352c300..ec73a0285 100644 --- a/src/NzbDrone.Core/Download/Aggregation/RemoteAlbumAggregationService.cs +++ b/src/NzbDrone.Core/Download/Aggregation/RemoteAlbumAggregationService.cs @@ -25,6 +25,11 @@ namespace NzbDrone.Core.Download.Aggregation public RemoteAlbum Augment(RemoteAlbum remoteAlbum) { + if (remoteAlbum == null) + { + return null; + } + foreach (var augmenter in _augmenters) { try diff --git a/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs b/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs index 97221d909..dda2b3f7c 100644 --- a/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs +++ b/src/NzbDrone.Core/Music/Handlers/ArtistScannedHandler.cs @@ -47,7 +47,7 @@ namespace NzbDrone.Core.Music _eventAggregator.PublishEvent(new ArtistAddCompletedEvent(artist)); - if (artist.AddOptions.SearchForMissingAlbums) + if (addOptions.SearchForMissingAlbums) { _commandQueueManager.Push(new MissingAlbumSearchCommand(artist.Id)); } From a2201001c514d07da01c63fcb88e912411a30de4 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 5 Mar 2025 18:03:20 +0000 Subject: [PATCH 056/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: youngjimisme <977671346@qq.com> Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/fi.json | 3 ++- src/NzbDrone.Core/Localization/Core/zh_CN.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 4429df780..370800fd6 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1348,5 +1348,6 @@ "Disambiguation": "Yksinkertaistaminen", "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä.", "NotificationsSettingsWebhookHeaders": "Otsakkeet", - "TracksLoadError": "Virhe ladattaessa kappaleita." + "TracksLoadError": "Virhe ladattaessa kappaleita.", + "NoMediumInformation": "Julkaisumuodon tietoja ei ole saatavilla." } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 7247d2857..6c1f63dbe 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1336,5 +1336,6 @@ "DownloadClientSettingsPostImportCategoryHelpText": "导入下载后要设置的 {appName} 的分类。 即使做种完成,{appName} 也不会删除该分类中的种子。 留空以保留同一分类。", "DownloadClientSettingsRecentPriority": "最近优先", "PostImportCategory": "导入后分类", - "NotificationsSettingsWebhookHeaders": "标头" + "NotificationsSettingsWebhookHeaders": "标头", + "DefaultDelayProfileArtist": "This is the default profile. It applies to all artists that don't have an explicit profile." } From 9fc549b43bc5076fa8e500134440ffd114c8a899 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 2 Mar 2025 06:53:04 +0200 Subject: [PATCH 057/146] Fixed: Replace diacritics in Clean Title naming tokens --- .../OrganizerTests/FileNameBuilderTests/CleanTitleFixture.cs | 3 ++- src/NzbDrone.Core/Organizer/FileNameBuilder.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleFixture.cs index 0a637fc17..e85ab28b2 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleFixture.cs @@ -64,7 +64,7 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests } [TestCase("Florence + the Machine", "Florence + the Machine")] - [TestCase("Beyoncé X10", "Beyoncé X10")] + [TestCase("Beyoncé X10", "Beyonce X10")] [TestCase("Girlfriends' Guide to Divorce", "Girlfriends Guide to Divorce")] [TestCase("Rule #23: Never Lie to the Kids", "Rule #23 Never Lie to the Kids")] [TestCase("Anne Hathaway/Florence + The Machine", "Anne Hathaway Florence + The Machine")] @@ -81,6 +81,7 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests [TestCase("[a] title", "a title")] [TestCase("backslash \\ backlash", "backslash backlash")] [TestCase("I'm the Boss", "Im the Boss")] + [TestCase("Joker: Folie à deux", "Joker Folie a deux")] public void should_get_expected_title_back(string name, string expected) { _artist.Name = name; diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index abfa9399d..a3342f5b3 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -258,7 +258,7 @@ namespace NzbDrone.Core.Organizer title = ScenifyReplaceChars.Replace(title, " "); title = ScenifyRemoveChars.Replace(title, string.Empty); - return title; + return title.RemoveDiacritics(); } public static string TitleThe(string title) From 6e57c14e57280f4544c8185cce4457d7942a6004 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 11 Aug 2024 08:48:22 -0700 Subject: [PATCH 058/146] Fixed: Marking queued item as failed not blocking the correct Torrent Info Hash (cherry picked from commit 4b186e894e4e229a435c077e00c65b67ca178333) Fixes #4977 Closes #4988 --- src/Lidarr.Api.V1/Queue/QueueController.cs | 2 +- .../Blocklisting/BlocklistService.cs | 4 +- .../Download/FailedDownloadService.cs | 50 ++++++++++--------- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/Lidarr.Api.V1/Queue/QueueController.cs b/src/Lidarr.Api.V1/Queue/QueueController.cs index 730b50436..8123f30fe 100644 --- a/src/Lidarr.Api.V1/Queue/QueueController.cs +++ b/src/Lidarr.Api.V1/Queue/QueueController.cs @@ -302,7 +302,7 @@ namespace Lidarr.Api.V1.Queue if (blocklist) { - _failedDownloadService.MarkAsFailed(trackedDownload.DownloadItem.DownloadId, skipRedownload); + _failedDownloadService.MarkAsFailed(trackedDownload, skipRedownload); } if (!removeFromClient && !blocklist && !changeCategory) diff --git a/src/NzbDrone.Core/Blocklisting/BlocklistService.cs b/src/NzbDrone.Core/Blocklisting/BlocklistService.cs index 18c4503f1..147b436a8 100644 --- a/src/NzbDrone.Core/Blocklisting/BlocklistService.cs +++ b/src/NzbDrone.Core/Blocklisting/BlocklistService.cs @@ -185,7 +185,9 @@ namespace NzbDrone.Core.Blocklisting Indexer = message.Data.GetValueOrDefault("indexer"), Protocol = (DownloadProtocol)Convert.ToInt32(message.Data.GetValueOrDefault("protocol")), Message = message.Message, - TorrentInfoHash = message.Data.GetValueOrDefault("torrentInfoHash") + TorrentInfoHash = message.TrackedDownload?.Protocol == DownloadProtocol.Torrent + ? message.TrackedDownload.DownloadItem.DownloadId + : message.Data.GetValueOrDefault("torrentInfoHash", null) }; if (Enum.TryParse(message.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags)) diff --git a/src/NzbDrone.Core/Download/FailedDownloadService.cs b/src/NzbDrone.Core/Download/FailedDownloadService.cs index 60c9e8d05..d3d64f28a 100644 --- a/src/NzbDrone.Core/Download/FailedDownloadService.cs +++ b/src/NzbDrone.Core/Download/FailedDownloadService.cs @@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download public interface IFailedDownloadService { void MarkAsFailed(int historyId, bool skipRedownload = false); - void MarkAsFailed(string downloadId, bool skipRedownload = false); + void MarkAsFailed(TrackedDownload trackedDownload, bool skipRedownload = false); void Check(TrackedDownload trackedDownload); void ProcessFailed(TrackedDownload trackedDownload); } @@ -20,15 +20,12 @@ namespace NzbDrone.Core.Download public class FailedDownloadService : IFailedDownloadService { private readonly IHistoryService _historyService; - private readonly ITrackedDownloadService _trackedDownloadService; private readonly IEventAggregator _eventAggregator; public FailedDownloadService(IHistoryService historyService, - ITrackedDownloadService trackedDownloadService, IEventAggregator eventAggregator) { _historyService = historyService; - _trackedDownloadService = trackedDownloadService; _eventAggregator = eventAggregator; } @@ -37,9 +34,10 @@ namespace NzbDrone.Core.Download var history = _historyService.Get(historyId); var downloadId = history.DownloadId; + if (downloadId.IsNullOrWhiteSpace()) { - PublishDownloadFailedEvent(new List { history }, "Manually marked as failed", skipRedownload: skipRedownload); + PublishDownloadFailedEvent(history, new List { history.AlbumId }, "Manually marked as failed", skipRedownload: skipRedownload); return; } @@ -53,21 +51,19 @@ namespace NzbDrone.Core.Download } // Add any other history items for the download ID then filter out any duplicate history items. - grabbedHistory.AddRange(_historyService.Find(downloadId, EntityHistoryEventType.Grabbed)); + grabbedHistory.AddRange(GetGrabbedHistory(downloadId)); grabbedHistory = grabbedHistory.DistinctBy(h => h.Id).ToList(); - PublishDownloadFailedEvent(grabbedHistory, "Manually marked as failed"); + PublishDownloadFailedEvent(history, GetAlbumIds(grabbedHistory), "Manually marked as failed"); } - public void MarkAsFailed(string downloadId, bool skipRedownload = false) + public void MarkAsFailed(TrackedDownload trackedDownload, bool skipRedownload = false) { - var history = _historyService.Find(downloadId, EntityHistoryEventType.Grabbed); + var history = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId); if (history.Any()) { - var trackedDownload = _trackedDownloadService.Find(downloadId); - - PublishDownloadFailedEvent(history, "Manually marked as failed", trackedDownload, skipRedownload: skipRedownload); + PublishDownloadFailedEvent(history.First(), GetAlbumIds(history), "Manually marked as failed", trackedDownload, skipRedownload: skipRedownload); } } @@ -82,9 +78,7 @@ namespace NzbDrone.Core.Download if (trackedDownload.DownloadItem.IsEncrypted || trackedDownload.DownloadItem.Status == DownloadItemStatus.Failed) { - var grabbedItems = _historyService - .Find(trackedDownload.DownloadItem.DownloadId, EntityHistoryEventType.Grabbed) - .ToList(); + var grabbedItems = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId); if (grabbedItems.Empty()) { @@ -103,9 +97,7 @@ namespace NzbDrone.Core.Download return; } - var grabbedItems = _historyService - .Find(trackedDownload.DownloadItem.DownloadId, EntityHistoryEventType.Grabbed) - .ToList(); + var grabbedItems = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId); if (grabbedItems.Empty()) { @@ -124,18 +116,17 @@ namespace NzbDrone.Core.Download } trackedDownload.State = TrackedDownloadState.DownloadFailed; - PublishDownloadFailedEvent(grabbedItems, failure, trackedDownload); + PublishDownloadFailedEvent(grabbedItems.First(), GetAlbumIds(grabbedItems), failure, trackedDownload); } - private void PublishDownloadFailedEvent(List historyItems, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false) + private void PublishDownloadFailedEvent(EntityHistory historyItem, List albumIds, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false) { - var historyItem = historyItems.Last(); Enum.TryParse(historyItem.Data.GetValueOrDefault(EntityHistory.RELEASE_SOURCE, ReleaseSourceType.Unknown.ToString()), out ReleaseSourceType releaseSource); var downloadFailedEvent = new DownloadFailedEvent { ArtistId = historyItem.ArtistId, - AlbumIds = historyItems.Select(h => h.AlbumId).Distinct().ToList(), + AlbumIds = albumIds, Quality = historyItem.Quality, SourceTitle = historyItem.SourceTitle, DownloadClient = historyItem.Data.GetValueOrDefault(EntityHistory.DOWNLOAD_CLIENT), @@ -144,10 +135,23 @@ namespace NzbDrone.Core.Download Data = historyItem.Data, TrackedDownload = trackedDownload, SkipRedownload = skipRedownload, - ReleaseSource = releaseSource + ReleaseSource = releaseSource, }; _eventAggregator.PublishEvent(downloadFailedEvent); } + + private List GetAlbumIds(List historyItems) + { + return historyItems.Select(h => h.AlbumId).Distinct().ToList(); + } + + private List GetGrabbedHistory(string downloadId) + { + // Sort by date so items are always in the same order + return _historyService.Find(downloadId, EntityHistoryEventType.Grabbed) + .OrderByDescending(h => h.Date) + .ToList(); + } } } From 5a3f8794426834d8007ced2f4ebace4448ccadd7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 6 Mar 2025 17:28:36 +0200 Subject: [PATCH 059/146] Fixed: Sending import failure notifications to webhook/notifiarr --- src/NzbDrone.Core/Notifications/AlbumDownloadMessage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/AlbumDownloadMessage.cs b/src/NzbDrone.Core/Notifications/AlbumDownloadMessage.cs index 4cd26be55..f0bd9a323 100644 --- a/src/NzbDrone.Core/Notifications/AlbumDownloadMessage.cs +++ b/src/NzbDrone.Core/Notifications/AlbumDownloadMessage.cs @@ -11,8 +11,8 @@ namespace NzbDrone.Core.Notifications public Artist Artist { get; set; } public Album Album { get; set; } public AlbumRelease Release { get; set; } - public List TrackFiles { get; set; } - public List OldFiles { get; set; } + public List TrackFiles { get; set; } = new (); + public List OldFiles { get; set; } = new (); public DownloadClientItemClientInfo DownloadClientInfo { get; set; } public string DownloadId { get; set; } From 342c82aa1f523aa1e99afde0ec1e160e846fe773 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 6 Mar 2025 19:15:59 +0200 Subject: [PATCH 060/146] Fixed: Avoid notifications on reprocessing failed items in queue --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index b5010b8f8..6b80ee34e 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -166,8 +166,13 @@ namespace NzbDrone.Core.Download new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.Item.Path), v.Errors))); + // Mark as failed to prevent further attempts at processing + trackedDownload.State = TrackedDownloadState.ImportFailed; + // Publish event to notify album was imported incomplete _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); + + return; } if (statusMessages.Any()) From 29f581086550ce5996fd56d516500cc32c13a9ce Mon Sep 17 00:00:00 2001 From: Servarr Date: Thu, 6 Mar 2025 17:22:36 +0000 Subject: [PATCH 061/146] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index a940258aa..8849354f6 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -12922,6 +12922,7 @@ "downloading", "downloadFailed", "downloadFailedPending", + "importBlocked", "importPending", "importing", "importFailed", From 1e42ae94aa77f2b29dfd85cbc8b2c3914638919f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 6 Mar 2025 19:49:10 +0200 Subject: [PATCH 062/146] Fix Completed Download Service tests --- .../Download/CompletedDownloadServiceTests/ImportFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs index ee0651ea3..9719b7f1f 100644 --- a/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs +++ b/src/NzbDrone.Core.Test/Download/CompletedDownloadServiceTests/ImportFixture.cs @@ -395,7 +395,7 @@ namespace NzbDrone.Core.Test.Download.CompletedDownloadServiceTests Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Never()); - _trackedDownload.State.Should().Be(TrackedDownloadState.ImportBlocked); + _trackedDownload.State.Should().Be(TrackedDownloadState.ImportFailed); } private void AssertImported() From 6c6f92fbed4854e7e902aee1c8f0b34e14e99100 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 7 Mar 2025 23:17:29 +0200 Subject: [PATCH 063/146] Bump SixLabors.ImageSharp to 3.1.7 --- src/NzbDrone.Core/Lidarr.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index 54543b035..42a17da5d 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -27,7 +27,7 @@ - +
From 84b91ba6c1fda2c7ef860ee0e9be9bf5fcb6f76b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 7 Mar 2025 23:18:35 +0200 Subject: [PATCH 064/146] Bump Polly to 8.5.2 --- src/NzbDrone.Core/Lidarr.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index 42a17da5d..a56bfb295 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -7,7 +7,7 @@ - + From 9314eb34abc75668da42f0939fa4d831e8a0bf50 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 8 Mar 2025 15:44:52 +0200 Subject: [PATCH 065/146] Fixed: Displaying warnings for automatic failed imports in queue --- src/NzbDrone.Core/Download/CompletedDownloadService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 6b80ee34e..6d3dd2f96 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -169,6 +169,11 @@ namespace NzbDrone.Core.Download // Mark as failed to prevent further attempts at processing trackedDownload.State = TrackedDownloadState.ImportFailed; + if (statusMessages.Any()) + { + trackedDownload.Warn(statusMessages.ToArray()); + } + // Publish event to notify album was imported incomplete _eventAggregator.PublishEvent(new AlbumImportIncompleteEvent(trackedDownload)); From 6dd87fd3486c17435d028101382d93db15365095 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 9 Mar 2025 11:52:12 +0200 Subject: [PATCH 066/146] Bump version to 2.10.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0f6862ed2..efdb8b4d1 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: '2.10.1' + majorVersion: '2.10.2' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 33049910de8ed733ed915af58ab37a7829434c71 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 16 Mar 2025 10:47:47 +0200 Subject: [PATCH 067/146] Bump version to 2.10.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index efdb8b4d1..3050b9438 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: '2.10.2' + majorVersion: '2.10.3' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From a1c2bfa527111c78aef174dadb381524166ee263 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 16 Mar 2025 09:37:29 +0000 Subject: [PATCH 068/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ar/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/bg/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/cs/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/da/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/de/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/el/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/he/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/is/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ja/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ko/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pl/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/sv/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/th/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/vi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ar.json | 8 ++- src/NzbDrone.Core/Localization/Core/bg.json | 8 ++- src/NzbDrone.Core/Localization/Core/ca.json | 10 ++- src/NzbDrone.Core/Localization/Core/cs.json | 11 ++- src/NzbDrone.Core/Localization/Core/da.json | 10 ++- src/NzbDrone.Core/Localization/Core/de.json | 12 +++- src/NzbDrone.Core/Localization/Core/el.json | 8 ++- src/NzbDrone.Core/Localization/Core/es.json | 12 +++- src/NzbDrone.Core/Localization/Core/fi.json | 12 +++- src/NzbDrone.Core/Localization/Core/fr.json | 12 +++- src/NzbDrone.Core/Localization/Core/he.json | 8 ++- src/NzbDrone.Core/Localization/Core/hi.json | 8 ++- src/NzbDrone.Core/Localization/Core/hr.json | 3 +- src/NzbDrone.Core/Localization/Core/hu.json | 11 ++- src/NzbDrone.Core/Localization/Core/is.json | 8 ++- src/NzbDrone.Core/Localization/Core/it.json | 16 ++++- src/NzbDrone.Core/Localization/Core/ja.json | 8 ++- src/NzbDrone.Core/Localization/Core/ko.json | 70 ++++++++++++++++++- .../Localization/Core/nb_NO.json | 3 +- src/NzbDrone.Core/Localization/Core/nl.json | 10 ++- src/NzbDrone.Core/Localization/Core/pl.json | 8 ++- src/NzbDrone.Core/Localization/Core/pt.json | 9 ++- .../Localization/Core/pt_BR.json | 12 +++- src/NzbDrone.Core/Localization/Core/ro.json | 13 +++- src/NzbDrone.Core/Localization/Core/ru.json | 22 +++++- src/NzbDrone.Core/Localization/Core/sk.json | 3 +- src/NzbDrone.Core/Localization/Core/sv.json | 9 ++- src/NzbDrone.Core/Localization/Core/th.json | 8 ++- src/NzbDrone.Core/Localization/Core/tr.json | 12 +++- src/NzbDrone.Core/Localization/Core/uk.json | 8 ++- src/NzbDrone.Core/Localization/Core/vi.json | 8 ++- .../Localization/Core/zh_CN.json | 12 +++- 32 files changed, 340 insertions(+), 32 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 276ff036c..8e5b877da 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -759,5 +759,11 @@ "Preferred": "يفضل", "Today": "اليوم", "MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات", - "DownloadClientSettingsRecentPriority": "أولوية العميل" + "DownloadClientSettingsRecentPriority": "أولوية العميل", + "CheckDownloadClientForDetails": "تحقق من برنامج التحميل لمزيد من التفاصيل", + "Downloaded": "تم التنزيل", + "Paused": "متوقف مؤقتًا", + "Pending": "قيد الانتظار", + "WaitingToImport": "في انتظار الاستيراد", + "WaitingToProcess": "في انتظار المعالجة" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 5a5654ada..4150d7860 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -829,5 +829,11 @@ "Album": "албум", "AutoAdd": "Автоматично добавяне", "CatalogNumber": "каталожен номер", - "Discography": "дискография" + "Discography": "дискография", + "CheckDownloadClientForDetails": "проверете клиента за изтегляне за повече подробности", + "WaitingToImport": "Изчаква се импортиране", + "WaitingToProcess": "Изчаква се обработка", + "Downloaded": "Изтеглено", + "Paused": "На пауза", + "Pending": "В очакване" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 48699e2d2..f090fc042 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -984,5 +984,13 @@ "UpdateFiltered": "Actualitza filtrats", "IndexerSettingsApiUrl": "URL de l'API", "CountCustomFormatsSelected": "{count} format(s) personalitzat(s) seleccionat(s)", - "Install": "Instal·la" + "Install": "Instal·la", + "CheckDownloadClientForDetails": "Consulteu el client de descàrrega per a obtenir més detalls", + "DownloadWarning": "Avís de baixada: {warningMessage}", + "Downloaded": "S'ha baixat", + "ImportFailed": "La importació ha fallat: {sourceTitle}", + "Paused": "En pausa", + "Pending": "Pendents", + "WaitingToImport": "S’està esperant per a importar", + "WaitingToProcess": "S’està esperant per a processar" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index c184cd978..62778716a 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -917,5 +917,14 @@ "DoNotBlocklistHint": "Odstraň bez přidání do seznamu blokování", "DownloadClientAriaSettingsDirectoryHelpText": "Volitelné umístění pro stahování, pokud chcete použít výchozí umístění Aria2, ponechte prázdné", "DownloadClientQbittorrentSettingsContentLayout": "Rozvržení obsahu", - "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Zda použít rozvržení obsahu nakonfigurované v qBittorrentu, původní rozvržení z torrentu nebo vždy vytvořit podsložku (qBittorrent 4.3.2+)" + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Zda použít rozvržení obsahu nakonfigurované v qBittorrentu, původní rozvržení z torrentu nebo vždy vytvořit podsložku (qBittorrent 4.3.2+)", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Nepovinné - umístění kam přesunout dokončená stahování, pokud ponecháte prázné, použije se výchozí umístění Deluge", + "DownloadClientDelugeSettingsDirectoryHelpText": "Nepovinné - umístění stahovaných souborů, pokud ponecháte prázné, použije se výchozí umístění Deluge", + "WaitingToImport": "Čekání na import", + "WaitingToProcess": "Čekání na zpracování", + "DownloadClientDelugeSettingsDirectoryCompleted": "Adresář kam přesunout po dokončení", + "CheckDownloadClientForDetails": "zkontrolujte klienta pro stahování pro více informací", + "Downloaded": "Staženo", + "Paused": "Pozastaveno", + "Pending": "čekající" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index ebe0fb7be..dec645e3e 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -798,5 +798,13 @@ "Episode": "afsnit", "MetadataProfile": "metadataprofil", "Min": "Min", - "DownloadClientSettingsRecentPriority": "Kundens prioritet" + "DownloadClientSettingsRecentPriority": "Kundens prioritet", + "Pending": "Verserende", + "ImportFailed": "Import mislykkedes: »{sourceTitle}«", + "CheckDownloadClientForDetails": "tjek download klient for flere detaljer", + "DownloadWarning": "Downloadadvarsel: »{warningMessage}«", + "Downloaded": "Downloadet", + "Paused": "Pauset", + "WaitingToImport": "Venter på at importere", + "WaitingToProcess": "Venter på at behandle" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 6ce2aa25f..6970578a9 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -1349,5 +1349,15 @@ "Inactive": "Inaktiv", "AlbumInfo": "Album Informationen", "Banners": "Banner", - "DeleteArtistFolders": "Künstlerordner löschen" + "DeleteArtistFolders": "Künstlerordner löschen", + "ImportFailed": "Import fehlgeschlagen: {sourceTitle}", + "DownloadWarning": "Download Warnung: {warningMessage}", + "Downloaded": "Heruntergeladen", + "Pending": "Ausstehend", + "PendingDownloadClientUnavailable": "Ausstehend - Download-Client nicht verfügbar", + "UnableToImportAutomatically": "Kann nicht automatisch importiert werden", + "CheckDownloadClientForDetails": "Weitere Informationen finden Sie im Download-Client", + "Paused": "Pausiert", + "WaitingToImport": "Warten auf Import", + "WaitingToProcess": "Warten auf Bearbeitung" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 1ba176c58..4e8a92dee 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1121,5 +1121,11 @@ "Min": "Ελάχ", "Today": "Σήμερα", "MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες", - "DownloadClientSettingsRecentPriority": "Προτεραιότητα πελάτη" + "DownloadClientSettingsRecentPriority": "Προτεραιότητα πελάτη", + "Pending": "εκκρεμής", + "WaitingToImport": "Αναμονή για εισαγωγή", + "WaitingToProcess": "Αναμονή για επεξεργασία", + "CheckDownloadClientForDetails": "ελέγξτε το πρόγραμμα-πελάτη λήψης για περισσότερες λεπτομέρειες", + "Downloaded": "Κατεβασμένα", + "Paused": "Σε παύση" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 2dc642ba6..a649ba180 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1349,5 +1349,15 @@ "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioridad a usar cuando se capturen álbumes lanzados hace más de 14 días", "NotificationsSettingsWebhookHeaders": "Cabeceras", "NoMediumInformation": "Ninguna información del medio disponible.", - "TracksLoadError": "No se pudo cargar las pistas" + "TracksLoadError": "No se pudo cargar las pistas", + "CheckDownloadClientForDetails": "Revisar el cliente de descarga para más detalles", + "DownloadWarning": "Alerta de descarga: {warningMessage}", + "Downloaded": "Descargado", + "ImportFailed": "La importación falló: {sourceTitle}", + "Paused": "Pausado", + "Pending": "Pendiente", + "PendingDownloadClientUnavailable": "Pendiente - El cliente de descarga no está disponible", + "UnableToImportAutomatically": "No se pudo importar automáticamente", + "WaitingToImport": "Esperar para importar", + "WaitingToProcess": "Esperar al proceso" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 370800fd6..9eab9f71b 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1349,5 +1349,15 @@ "NotificationsTagsArtistHelpText": "Ilmoita vain vähintään yhdellä täsmäävällä tunnisteella merkityistä esittäjistä.", "NotificationsSettingsWebhookHeaders": "Otsakkeet", "TracksLoadError": "Virhe ladattaessa kappaleita.", - "NoMediumInformation": "Julkaisumuodon tietoja ei ole saatavilla." + "NoMediumInformation": "Julkaisumuodon tietoja ei ole saatavilla.", + "DownloadWarning": "Latausvaroitus: {warningMessage}", + "UnableToImportAutomatically": "Virhe automaattituonnissa.", + "WaitingToImport": "Odottaa tuontia", + "WaitingToProcess": "Odottaa käsittelyä", + "CheckDownloadClientForDetails": "katso lisätietoja latauspalvelusta", + "Downloaded": "Ladattu", + "Paused": "Keskeytetty", + "Pending": "Odottaa", + "PendingDownloadClientUnavailable": "Odottaa – Latauspalvelu ei ole käytettävissä", + "ImportFailed": "Tuonti epäonnistui: {sourceTitle}" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index e824e21dd..7b10d98b2 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1340,5 +1340,15 @@ "DownloadClientSettingsRecentPriority": "Priorité récente", "PostImportCategory": "Catégorie après l'importation", "ManageFormats": "Gérer les formats", - "NotificationsSettingsWebhookHeaders": "En-têtes" + "NotificationsSettingsWebhookHeaders": "En-têtes", + "ImportFailed": "Échec de l'importation : {sourceTitle}", + "CheckDownloadClientForDetails": "Pour plus de détails, consultez le client de téléchargement", + "DownloadWarning": "Avertissement de téléchargement : {warningMessage}", + "Downloaded": "Téléchargé", + "Paused": "En pause", + "Pending": "En attente", + "PendingDownloadClientUnavailable": "En attente – Le client de téléchargement n'est pas disponible", + "UnableToImportAutomatically": "Impossible d'importer automatiquement", + "WaitingToImport": "En attente d'import", + "WaitingToProcess": "En attente de traitement" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 04a74c103..ec324b3bb 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -797,5 +797,11 @@ "Min": "דקה", "Preferred": "מועדף", "MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף", - "DownloadClientSettingsRecentPriority": "עדיפות לקוח" + "DownloadClientSettingsRecentPriority": "עדיפות לקוח", + "Paused": "מושהית", + "CheckDownloadClientForDetails": "בדוק את לקוח ההורדות לפרטים נוספים", + "Downloaded": "הורד", + "Pending": "ממתין ל", + "WaitingToImport": "ממתין לייבוא", + "WaitingToProcess": "מחכה לעיבוד" } diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 67f74f90f..b286c95f9 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -753,5 +753,11 @@ "Preferred": "पसंदीदा", "Today": "आज", "MappedNetworkDrivesWindowsService": "विंडोज सर्विस के रूप में चलने पर मैप्ड नेटवर्क ड्राइव उपलब्ध नहीं हैं। अधिक जानकारी के लिए कृपया FAQ देखें", - "DownloadClientSettingsRecentPriority": "ग्राहक प्राथमिकता" + "DownloadClientSettingsRecentPriority": "ग्राहक प्राथमिकता", + "Downloaded": "डाउनलोड", + "CheckDownloadClientForDetails": "अधिक विवरण के लिए डाउनलोड क्लाइंट की जाँच करें", + "Paused": "रोके गए", + "Pending": "विचाराधीन", + "WaitingToImport": "आयात की प्रतीक्षा में", + "WaitingToProcess": "प्रक्रिया की प्रतीक्षा की जा रही है" } diff --git a/src/NzbDrone.Core/Localization/Core/hr.json b/src/NzbDrone.Core/Localization/Core/hr.json index d2dd93826..0771d0e8e 100644 --- a/src/NzbDrone.Core/Localization/Core/hr.json +++ b/src/NzbDrone.Core/Localization/Core/hr.json @@ -307,5 +307,6 @@ "DeleteSelectedTrackFilesMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?", "AddDelayProfileError": "Neuspješno dodavanje profila odgode, molimo pokušaj ponovno.", "Today": "Danas", - "DownloadClientSettingsRecentPriority": "Prioritet Klijenata" + "DownloadClientSettingsRecentPriority": "Prioritet Klijenata", + "CheckDownloadClientForDetails": "provjerite klienta za preuzimanje za još detalja" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 387c736c6..beb21fdb7 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -1229,5 +1229,14 @@ "Today": "Ma", "DownloadClientSettingsOlderPriority": "Régebbi prioritás", "DownloadClientSettingsRecentPriority": "Legutóbbi prioritás", - "PostImportCategory": "Import utáni kategória" + "PostImportCategory": "Import utáni kategória", + "CheckDownloadClientForDetails": "További részletekért ellenőrizze a letöltési klienst", + "DownloadWarning": "Letöltési figyelmeztetés: {warningMessage}", + "Downloaded": "Letöltve", + "Paused": "Szüneteltetve", + "Pending": "Függőben levő", + "PendingDownloadClientUnavailable": "Függőben – A letöltési kliens nem érhető el", + "ImportFailed": "Sikertelen importálás: {sourceTitle}", + "WaitingToImport": "Várakozás importálásra", + "WaitingToProcess": "Várakozás feldolgozásra" } diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 09291ef88..1718406fe 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -754,5 +754,11 @@ "Preferred": "Æskilegt", "Today": "Í dag", "MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar", - "DownloadClientSettingsRecentPriority": "Forgangur viðskiptavinar" + "DownloadClientSettingsRecentPriority": "Forgangur viðskiptavinar", + "CheckDownloadClientForDetails": "athugaðu niðurhals viðskiptavinur til að fá frekari upplýsingar", + "Downloaded": "Sótt", + "Pending": "Í bið", + "Paused": "Hlé gert", + "WaitingToImport": "Bið eftir að flytja inn", + "WaitingToProcess": "Bið eftir að vinna" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 97eae932a..ea9515178 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -1047,5 +1047,19 @@ "Min": "Min", "Today": "Oggi", "MappedNetworkDrivesWindowsService": "Le unità di rete mappate non sono disponibili eseguendo come servizio di Windows. Vedere le FAQ per maggiori informazioni", - "DownloadClientSettingsRecentPriority": "Priorità Client" + "DownloadClientSettingsRecentPriority": "Priorità Client", + "AutoTaggingRequiredHelpText": "Questa condizione {implementationName} deve corrispondere perché si applichi la regola di auto tagging. Altrimenti è sufficiente una singola corrispondenza {implementationName}.", + "CheckDownloadClientForDetails": "controlla il client di download per maggiori dettagli", + "PendingDownloadClientUnavailable": "In Attesa - Client di Download in attesa", + "WaitingToImport": "In attesa di importazione", + "WaitingToProcess": "In attesa di processo", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "Cerca automaticamente e tenta di scaricare una versione diversa quando il rilascio non riuscito è stato acquisito dalla ricerca interattiva", + "AutoRedownloadFailedFromInteractiveSearch": "Riesecuzione del download non riuscita dalla ricerca interattiva", + "AutoTaggingLoadError": "Impossibile caricare auto tagging", + "DownloadWarning": "Avviso di download: {warningMessage}", + "Downloaded": "Scaricato", + "ImportFailed": "Importazione fallita: {sourceTitle}", + "Paused": "In Pausa", + "Pending": "In Attesa", + "UnableToImportAutomatically": "Impossibile Importare Automaticamente" } diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index fe2555e2f..93383c278 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -754,5 +754,11 @@ "Preferred": "優先", "Today": "今日", "MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください", - "DownloadClientSettingsRecentPriority": "クライアントの優先順位" + "DownloadClientSettingsRecentPriority": "クライアントの優先順位", + "Downloaded": "ダウンロード済み", + "Paused": "一時停止", + "Pending": "保留中", + "WaitingToProcess": "処理を待っています", + "CheckDownloadClientForDetails": "詳細については、ダウンロードクライアントを確認してください", + "WaitingToImport": "インポートを待機中" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 1ce9c02f0..c4b133c80 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -899,5 +899,73 @@ "ChangeCategory": "카테고리 변경", "ClearBlocklist": "차단 목록 지우기", "DashOrSpaceDashDependingOnName": "이름에 따라 대시 또는 띄어쓰고 대시", - "Donate": "기부하기" + "Donate": "기부하기", + "IndexerDownloadClientHelpText": "이 인덱서에서 가져온 것을 가져오는 데 사용되는 다운로드 클라이언트를 지정하세요", + "NoDownloadClientsFound": "다운로드 클라이언트를 찾을 수 없음", + "QueueFilterHasNoItems": "선택된 대기열 필터에 항목이 없습니다", + "Total": "합계", + "IndexerSettingsSeedTimeHelpText": "토렌드가 중지되기 전에 시드되어야 하는 시간, 비어 있을 경우 다운로드 클라이언트의 기본값을 사용합니다", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "다른 애플리케이션의 알림을 구분하기 위해 메시지 제목 앞에 {appName}를 접두사로 사용 (선택 사항)", + "Episode": "에피소드", + "FormatRuntimeHours": "{hours}시간", + "FormatRuntimeMinutes": "{minutes}분", + "FormatShortTimeSpanHours": "{hours}시간", + "FormatShortTimeSpanMinutes": "{minutes}분", + "HealthMessagesInfoBox": "행 끝에 있는 위키 링크(책 아이콘)를 클릭하거나 [로그]({link})를 확인하면 이러한 상태 점검 메시지의 원인에 대한 상세 정보를 찾을 수 있습니다. 이러한 메시지를 해석하는 데 어려움이 있는 경우 아래 링크에서 지원팀에 문의할 수 있습니다.", + "MassSearchCancelWarning": "{appName}을 재시작하거나 모든 인덱서를 비활성화하지 않고는 이 작업을 취소할 수 없음", + "Negated": "부정", + "NotificationsSettingsUpdateMapPathsFrom": "다음 위치부터 경로 매핑하기", + "ErrorLoadingContent": "이 콘텐트를 로드하는 중 오류가 발생했습니다", + "IndexerSettingsSeedRatioHelpText": "토런트가 멈추기 전에 도달해야 하는 비율, 비어 있으면 다운로드 클라이언트의 기본값을 사용합니다. 비율은 최소 1.0이어야 하며 인덱서 규칙을 따라야 합니다.", + "DownloadClientSettingsPostImportCategoryHelpText": "다운로드를 가져온 후 {appName}에 대한 카테고리를 설정합니다. {appName}는 시딩이 완료되었더라도 해당 카테고리의 토렌드를 제거하지 않습니다. 같은 카테고리를 유지하려면 비워두세요.", + "DownloadWarning": "다운로드 경고: {0}", + "Downloaded": "다운로드됨", + "ParseModalUnableToParse": "제공된 제목을 구문 분석할 수 없음 재시도하세요.", + "Pending": "대기중", + "PendingDownloadClientUnavailable": "보류 중 - 다운로드 클라이언트를 사용할 수 없음", + "Preferred": "선호", + "PreferredSize": "선호하는 크기", + "UnableToImportAutomatically": "자동으로 가져올 수 없습니다", + "WaitingToProcess": "처리 대기 중", + "AllExpandedCollapseAll": "모두 접기", + "AllExpandedExpandAll": "모두 펼치기", + "ParseModalErrorParsing": "구문분석 중 오류가 발생했습니다. 재시도하세요.", + "ParseModalHelpText": "위의 입력란에 릴리스 제목을 입력하세요", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatShortTimeSpanSeconds": "{seconds}초", + "FormatTimeSpanDays": "{days}d {time}", + "IgnoreDownloadHint": "{appName}가 이 다운로드를 더 이상 처리하지 못하도록 합니다", + "IgnoreDownloadsHint": "{appName}가 이러한 다운로드를 더 이상 처리하지 않도록 중지합니다", + "IndexerSettingsSeedRatio": "종자 비율", + "PostImportCategory": "수입 후 카테고리", + "RegularExpressionsTutorialLink": "정규 표현식에 대한 상세 내용은 [여기]({url})에서 확인할 수 있습니다.", + "InstallMajorVersionUpdateMessageLink": "상세 내용은 [{domain}]({url})을 확인하세요.", + "NoCustomFormatsFound": "사용자 정의 형식을 찾을 수 없음", + "ParseModalHelpTextDetails": "{appName}은 제목을 구문 분석하고 해당 제목에 대한 세부 사항를 표시하려고 시도합니다.", + "SceneNumberHasntBeenVerifiedYet": "아직 장면 번호가 확인되지 않았습니다", + "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} 경로는 {serviceName}이 라이브러리 경로 위치를 {appName}와 다르게 볼 때 시리즈 경로를 수정하는 데 사용됨 (라이브러리 업데이트 필요)", + "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName} 경로는 {serviceName}이 라이브러리 경로 위치를 {appName}와 다르게 볼 때 시리즈 경로를 수정하는 데 사용됨 (라이브러리 업데이트 필요)", + "NotificationsSettingsUpdateMapPathsTo": "다음 위치까지 경로 매핑하기", + "Other": "기타", + "Absolute": "절대", + "EnabledHelpText": "출시 프로필을 활성화하려면 체크하세요", + "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "에피소드에는 절대 에피소드 번호가 없음", + "MonitoredStatus": "모니터링 설정/상태", + "Monitoring": "모니터링 중", + "ExpandOtherByDefaultHelpText": "기타", + "Posters": "포스터", + "PreferProtocol": "{preferredProtocol} 선호", + "WithFiles": "파일과 함께", + "CheckDownloadClientForDetails": "상세 내용은 다운로드 클라이언트를 확인하세요", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent의 구성된 콘텐츠 레이아웃을 사용할지, 토런트의 원래 레이아웃을 사용할지, 항상 하위 폴더를 생성할지(qBittorrent 4.3.2+)", + "EnableRssHelpText": "{appName}가 RSS 동기화를 통해 주기적으로 릴리스를 찾을 때 사용됩니다", + "FormatDateTime": "{formattedDate} {formattedTime}", + "IncludeCustomFormatWhenRenaming": "이름을 바꿀 때 사용자 정의 형식 포함", + "InvalidUILanguage": "UI가 잘못된 언어로 설정되어 있습니다, 수정하고 설정을 저장하세요", + "IsShowingMonitoredMonitorSelected": "선택된 모니터", + "NoEventsFound": "이벤트가 없음", + "Paused": "일시중지", + "RootFolderPathHelpText": "루트 폴더 목록 항목이 다음에 추가됩니다:", + "WaitingToImport": "가져오기 대기 중", + "AddNewArtistRootFolderHelpText": "'{folder}' 하위 폴더가 자동으로 생성됩니다" } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index eb62c4211..e694f772b 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -285,5 +285,6 @@ "AddImportListImplementation": "Legg til importliste - {implementationName}", "IgnoredPlaceHolder": "Legg til ny begrensning", "AddImportList": "Ny Importliste", - "AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget" + "AddNewArtistRootFolderHelpText": "Undermappa \"{folder}\" vil bli automatisk laget", + "CheckDownloadClientForDetails": "sjekk nedlastningsklienten for mer informasjon" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 77559467d..8c24bdac1 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -907,5 +907,13 @@ "AddArtistWithName": "{artistName} toevoegen", "AddNewArtist": "Voeg nieuwe artiest toe", "AddNewAlbum": "Voeg nieuw album toe", - "AddNewAlbumSearchForNewAlbum": "Start zoektoch voor een nieuw album" + "AddNewAlbumSearchForNewAlbum": "Start zoektoch voor een nieuw album", + "DownloadWarning": "Download waarschuwing: {warningMessage}", + "Downloaded": "Gedownload", + "Pending": "In afwachting", + "WaitingToProcess": "Wachten tot Verwerking", + "CheckDownloadClientForDetails": "controleer downloader voor meer details", + "ImportFailed": "Importeren mislukt: {sourceTitle}", + "Paused": "Gepauzeerd", + "WaitingToImport": "Wachten tot Importeren" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index fe56245e9..05c8108d0 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -853,5 +853,11 @@ "Preferred": "Preferowane", "Today": "Dzisiaj", "MappedNetworkDrivesWindowsService": "Zmapowane dyski sieciowe nie są dostępne, gdy działają jako usługa systemu Windows. Więcej informacji można znaleźć w FAQ", - "DownloadClientSettingsRecentPriority": "Priorytet klienta" + "DownloadClientSettingsRecentPriority": "Priorytet klienta", + "CheckDownloadClientForDetails": "sprawdź klienta pobierania, aby uzyskać więcej informacji", + "Downloaded": "Pobrano", + "Paused": "Wstrzymano", + "Pending": "W oczekiwaniu", + "WaitingToImport": "Czekam na import", + "WaitingToProcess": "Czekam na przetworzenie" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 1e8cc00ec..762f82806 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -1024,5 +1024,12 @@ "Preferred": "Preferido", "Today": "Hoje", "MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Veja as Perguntas mais frequentes para obter mais informações", - "DownloadClientSettingsRecentPriority": "Prioridade do cliente" + "DownloadClientSettingsRecentPriority": "Prioridade do cliente", + "Downloaded": "Transferido", + "Paused": "Em pausa", + "WaitingToProcess": "Aguardando para processar", + "CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes", + "DownloadWarning": "Alerta de transferência: {warningMessage}", + "Pending": "Pendente", + "WaitingToImport": "Aguardando para importar" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index e0c1db1d5..b3da09969 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1349,5 +1349,15 @@ "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioridade de uso ao adquirir álbuns lançados nos últimos 14 dias", "NotificationsSettingsWebhookHeaders": "Cabeçalhos", "TracksLoadError": "Incapaz de carregar faixas", - "NoMediumInformation": "Nenhuma informação da mídia está disponível." + "NoMediumInformation": "Nenhuma informação da mídia está disponível.", + "ImportFailed": "Falha na importação: {sourceTitle}", + "Pending": "Pendente", + "PendingDownloadClientUnavailable": "Pendente - O cliente de download não está disponível", + "WaitingToImport": "Aguardando para Importar", + "WaitingToProcess": "Aguardando para Processar", + "CheckDownloadClientForDetails": "verifique o cliente de download para saber mais", + "DownloadWarning": "Aviso de download: {warningMessage}", + "Downloaded": "Baixado", + "Paused": "Pausado", + "UnableToImportAutomatically": "Não foi possível importar automaticamente" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 5b67e821c..892838e1f 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -800,5 +800,16 @@ "Today": "Astăzi", "MappedNetworkDrivesWindowsService": "Unitățile de rețea mapate nu sunt disponibile atunci când rulează ca serviciu Windows. Vă rugăm să consultați [FAQ]({url}) pentru mai multe informații", "DownloadClientSettingsRecentPriority": "Prioritate recente", - "DownloadClientSettingsOlderPriority": "Prioritate mai vechi" + "DownloadClientSettingsOlderPriority": "Prioritate mai vechi", + "Paused": "Întrerupt", + "Pending": "În așteptare", + "PendingDownloadClientUnavailable": "În așteptare - Clientul de descărcare nu este disponibil", + "WaitingToImport": "Se așteaptă importul", + "WaitingToProcess": "Se așteaptă procesarea", + "AddAutoTag": "Adăugați Tagare Automata", + "AddCondition": "Adăugați Condiție", + "Any": "Oricare", + "CheckDownloadClientForDetails": "Verificați clientul de descărcare pentru mai multe detalii", + "Downloaded": "Descărcat", + "AddImportList": "Adăugați Lista de Import" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index f65225d77..ae809669b 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -1088,5 +1088,25 @@ "DownloadClientSettingsOlderPriority": "Более старый приоритет", "DownloadClientSettingsPostImportCategoryHelpText": "Категория для приложения {appName}, которую необходимо установить после импорта загрузки. {appName} не удалит торренты в этой категории, даже если раздача завершена. Оставьте пустым, чтобы сохранить ту же категорию.", "DownloadClientSettingsRecentPriority": "Недавний приоритет", - "PostImportCategory": "Категория после импорта" + "PostImportCategory": "Категория после импорта", + "Downloaded": "Скачано", + "LastSearched": "Искали недавно", + "UnableToImportAutomatically": "Невозможно импортировать автоматически", + "WaitingToImport": "Ожидание импорта", + "WaitingToProcess": "Ожидает обработки", + "NotificationsSettingsWebhookHeaders": "Заголовки", + "DeleteSelected": "Удалить выбранные", + "EditSelectedCustomFormats": "Изменить выбранные пользовательские форматы", + "CheckDownloadClientForDetails": "проверьте клиент загрузки для более подробной информации", + "DownloadWarning": "Предупреждения по скачиванию: {warningMessage}", + "ImportFailed": "Не удалось импортировать: {sourceTitle}", + "InteractiveSearchModalHeaderTitle": "Интерактивный поиск - {title}", + "ManageCustomFormats": "Управлять пользовательскими форматами", + "NoCustomFormatsFound": "Нет пользовательских форматов", + "NoCutoffUnmetItems": "Нет элементов не достигших максимального качества", + "Paused": "Приостановлено", + "Pending": "В ожидании", + "PendingDownloadClientUnavailable": "Ожидание – Клиент для загрузки недоступен", + "SkipFreeSpaceCheckHelpText": "Используете, когда {appName} не может верно определить свободное место в вашей корневой папке", + "ManageFormats": "Управлять форматами" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index 56f223b2a..8d875dc66 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -295,5 +295,6 @@ "Clone": "Zatvoriť", "Reason": "Séria", "AddDelayProfileError": "Nie je možné pridať novú podmienku, skúste to znova.", - "DownloadClientSettingsRecentPriority": "Priorita klienta" + "DownloadClientSettingsRecentPriority": "Priorita klienta", + "CheckDownloadClientForDetails": "ďalšie podrobnosti nájdete v klientovi na sťahovanie" } diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 5d0e56896..40a55143c 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -926,5 +926,12 @@ "Preferred": "Föredraget", "Today": "Idag", "MappedNetworkDrivesWindowsService": "Mappade nätverksenheter är inte tillgängliga när de körs som en Windows-tjänst. Se FAQ för mer information", - "DownloadClientSettingsRecentPriority": "Klient prioritet" + "DownloadClientSettingsRecentPriority": "Klient prioritet", + "DownloadWarning": "Hämtningsmeddelande: {warningMessage}", + "Downloaded": "Nerladdad", + "Paused": "Pausad", + "Pending": "I väntan på", + "WaitingToImport": "Väntar på att importera", + "WaitingToProcess": "Väntar på att bearbeta", + "CheckDownloadClientForDetails": "Kontrollera nedladdningsklienten för mer detaljer" } diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index cf37ebcb5..57304302d 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -751,5 +751,11 @@ "Preferred": "ที่ต้องการ", "Today": "วันนี้", "MappedNetworkDrivesWindowsService": "ไดรฟ์เครือข่ายที่แมปไม่พร้อมใช้งานเมื่อเรียกใช้เป็นบริการ Windows โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม", - "DownloadClientSettingsRecentPriority": "ลำดับความสำคัญของลูกค้า" + "DownloadClientSettingsRecentPriority": "ลำดับความสำคัญของลูกค้า", + "CheckDownloadClientForDetails": "ตรวจสอบไคลเอนต์ดาวน์โหลดสำหรับรายละเอียดเพิ่มเติม", + "Pending": "รอดำเนินการ", + "WaitingToImport": "กำลังรอการนำเข้า", + "WaitingToProcess": "กำลังรอดำเนินการ", + "Downloaded": "ดาวน์โหลดแล้ว", + "Paused": "หยุดชั่วคราว" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 70ba2caab..4c9ee6a6b 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -1083,5 +1083,15 @@ "DownloadClientSettingsRecentPriority": "Yeni Önceliği", "PostImportCategory": "İçe Aktarma Sonrası Kategorisi", "DownloadClientSettingsOlderPriority": "Eski Önceliği", - "NotificationsSettingsWebhookHeaders": "Başlıklar" + "NotificationsSettingsWebhookHeaders": "Başlıklar", + "DownloadWarning": "İndirme Uyası: {warningMessage}", + "Downloaded": "İndirildi", + "Paused": "Duraklatıldı", + "Pending": "Bekliyor", + "PendingDownloadClientUnavailable": "Beklemede - İndirme istemcisi kullanılamıyor", + "UnableToImportAutomatically": "Otomatikman İçe Aktarılamıyor", + "CheckDownloadClientForDetails": "daha fazla ayrıntı için indirme istemcisini kontrol edin", + "WaitingToImport": "İçe Aktarma Bekleniyor", + "WaitingToProcess": "İşlenmek için Bekleniyor", + "ImportFailed": "İçe aktarma başarısız oldu: {sourceTitle}" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 6cd0ed1f2..7b1d2a391 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -917,5 +917,11 @@ "Preferred": "Бажано", "Max": "Максимальний", "MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ", - "DownloadClientSettingsRecentPriority": "Пріоритет клієнта" + "DownloadClientSettingsRecentPriority": "Пріоритет клієнта", + "Downloaded": "Завантажено", + "Paused": "Призупинено", + "Pending": "В очікуванні", + "WaitingToImport": "Очікування імпорту", + "WaitingToProcess": "Очікування обробки", + "CheckDownloadClientForDetails": "перевірте клієнт завантаження, щоб дізнатися більше" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index ebce4b4bb..f57741ed6 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -788,5 +788,11 @@ "Preferred": "Ưu tiên", "Today": "Hôm nay", "MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin", - "DownloadClientSettingsRecentPriority": "Ưu tiên khách hàng" + "DownloadClientSettingsRecentPriority": "Ưu tiên khách hàng", + "Pending": "Đang chờ xử lý", + "WaitingToImport": "Đang chờ nhập", + "CheckDownloadClientForDetails": "kiểm tra ứng dụng khách tải xuống để biết thêm chi tiết", + "Downloaded": "Đã tải xuống", + "Paused": "Tạm dừng", + "WaitingToProcess": "Đang chờ xử lý" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 6c1f63dbe..09dbca921 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1337,5 +1337,15 @@ "DownloadClientSettingsRecentPriority": "最近优先", "PostImportCategory": "导入后分类", "NotificationsSettingsWebhookHeaders": "标头", - "DefaultDelayProfileArtist": "This is the default profile. It applies to all artists that don't have an explicit profile." + "DefaultDelayProfileArtist": "This is the default profile. It applies to all artists that don't have an explicit profile.", + "CheckDownloadClientForDetails": "查看下载客户端了解更多详细信息", + "DownloadWarning": "下载警告:{warningMessage}", + "UnableToImportAutomatically": "无法自动导入", + "ImportFailed": "导入失败:{sourceTitle}", + "Downloaded": "已下载", + "Paused": "暂停", + "Pending": "挂起", + "PendingDownloadClientUnavailable": "挂起 - 下载客户端不可用", + "WaitingToImport": "等待导入", + "WaitingToProcess": "等待处理" } From 81895f803387492da728a15fbfffdbb9d3b5025b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 29 Jan 2025 18:46:19 -0800 Subject: [PATCH 069/146] Fixed: Drop downs flickering in some cases (cherry picked from commit 3b024443c5447b7638a69a99809bf44b2419261f) Closes #5386 --- .../src/Components/Form/EnhancedSelectInput.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/frontend/src/Components/Form/EnhancedSelectInput.js b/frontend/src/Components/Form/EnhancedSelectInput.js index cc4215025..8327b9385 100644 --- a/frontend/src/Components/Form/EnhancedSelectInput.js +++ b/frontend/src/Components/Form/EnhancedSelectInput.js @@ -20,6 +20,8 @@ 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; } @@ -137,18 +139,9 @@ class EnhancedSelectInput extends Component { // Listeners onComputeMaxHeight = (data) => { - const { - top, - bottom - } = data.offsets.reference; - const windowHeight = window.innerHeight; - if ((/^botton/).test(data.placement)) { - data.styles.maxHeight = windowHeight - bottom; - } else { - data.styles.maxHeight = top; - } + data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE; return data; }; @@ -457,6 +450,10 @@ class EnhancedSelectInput extends Component { order: 851, enabled: true, fn: this.onComputeMaxHeight + }, + preventOverflow: { + enabled: true, + boundariesElement: 'viewport' } }} > From 5cf9624e559f87245232cb676067a11bd64fd3bb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 23 Mar 2025 13:02:07 +0200 Subject: [PATCH 070/146] Bump version to 2.11.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3050b9438..b87e0a2ed 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: '2.10.3' + majorVersion: '2.11.0' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From f8d4b3a59b32814fe32155999ed3ae0d5fc8756c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 23 Mar 2025 13:07:35 +0200 Subject: [PATCH 071/146] Bump NLog, Npgsql, System.Memory and System.ValueTuple --- src/Lidarr.Api.V1/Lidarr.Api.V1.csproj | 2 +- src/Lidarr.Http/Lidarr.Http.csproj | 2 +- src/NzbDrone.Common/Lidarr.Common.csproj | 6 +++--- src/NzbDrone.Core/Lidarr.Core.csproj | 8 ++++---- src/NzbDrone.Mono/Lidarr.Mono.csproj | 2 +- src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj | 2 +- src/NzbDrone.Update/Lidarr.Update.csproj | 2 +- src/NzbDrone.Windows/Lidarr.Windows.csproj | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj b/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj index b501c694b..187fa86ff 100644 --- a/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj +++ b/src/Lidarr.Api.V1/Lidarr.Api.V1.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Lidarr.Http/Lidarr.Http.csproj b/src/Lidarr.Http/Lidarr.Http.csproj index 5164642dc..103ca71ea 100644 --- a/src/Lidarr.Http/Lidarr.Http.csproj +++ b/src/Lidarr.Http/Lidarr.Http.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/NzbDrone.Common/Lidarr.Common.csproj b/src/NzbDrone.Common/Lidarr.Common.csproj index 383149c37..6e16836fc 100644 --- a/src/NzbDrone.Common/Lidarr.Common.csproj +++ b/src/NzbDrone.Common/Lidarr.Common.csproj @@ -9,14 +9,14 @@ - + - + - + diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index a56bfb295..9c5d16036 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -9,7 +9,7 @@ - + @@ -20,12 +20,12 @@ - - + + - + diff --git a/src/NzbDrone.Mono/Lidarr.Mono.csproj b/src/NzbDrone.Mono/Lidarr.Mono.csproj index 73a45be81..386105c02 100644 --- a/src/NzbDrone.Mono/Lidarr.Mono.csproj +++ b/src/NzbDrone.Mono/Lidarr.Mono.csproj @@ -4,7 +4,7 @@ true - + diff --git a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj index 704b7b0df..77109c6a9 100644 --- a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Update/Lidarr.Update.csproj b/src/NzbDrone.Update/Lidarr.Update.csproj index d2d84022e..c23403b1a 100644 --- a/src/NzbDrone.Update/Lidarr.Update.csproj +++ b/src/NzbDrone.Update/Lidarr.Update.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NzbDrone.Windows/Lidarr.Windows.csproj b/src/NzbDrone.Windows/Lidarr.Windows.csproj index 7f41c9233..4914272c2 100644 --- a/src/NzbDrone.Windows/Lidarr.Windows.csproj +++ b/src/NzbDrone.Windows/Lidarr.Windows.csproj @@ -4,7 +4,7 @@ true - + From 18f13fe7f8cfec6aeab1385cd223fd67eae5bf8f Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 23 Mar 2025 20:06:49 -0700 Subject: [PATCH 072/146] Fixed: Allow tables to scroll on tablets in portrait mode (cherry picked from commit 5fb632eb46cf77ea4f61d407f6429d9c32dba766) --- frontend/src/Components/Modal/Modal.css | 7 ------- frontend/src/Components/Table/Cells/TableRowCell.css | 2 +- .../src/Components/Table/Cells/VirtualTableRowCell.css | 2 +- frontend/src/Components/Table/Table.css | 2 +- frontend/src/Components/Table/TableHeaderCell.css | 2 +- frontend/src/Components/Table/TablePager.css | 2 +- frontend/src/Components/Table/VirtualTableHeaderCell.css | 2 +- 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/frontend/src/Components/Modal/Modal.css b/frontend/src/Components/Modal/Modal.css index f7a229501..c41e9a2d1 100644 --- a/frontend/src/Components/Modal/Modal.css +++ b/frontend/src/Components/Modal/Modal.css @@ -83,13 +83,6 @@ } @media only screen and (max-width: $breakpointMedium) { - .modal.small, - .modal.medium { - width: 90%; - } -} - -@media only screen and (max-width: $breakpointSmall) { .modalContainer { position: fixed; } diff --git a/frontend/src/Components/Table/Cells/TableRowCell.css b/frontend/src/Components/Table/Cells/TableRowCell.css index 47ce0d22e..7e3353c25 100644 --- a/frontend/src/Components/Table/Cells/TableRowCell.css +++ b/frontend/src/Components/Table/Cells/TableRowCell.css @@ -4,7 +4,7 @@ line-height: 1.52857143; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .cell { white-space: nowrap; } diff --git a/frontend/src/Components/Table/Cells/VirtualTableRowCell.css b/frontend/src/Components/Table/Cells/VirtualTableRowCell.css index 2501b7c84..f7f3b9306 100644 --- a/frontend/src/Components/Table/Cells/VirtualTableRowCell.css +++ b/frontend/src/Components/Table/Cells/VirtualTableRowCell.css @@ -7,7 +7,7 @@ white-space: nowrap; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .cell { white-space: nowrap; } diff --git a/frontend/src/Components/Table/Table.css b/frontend/src/Components/Table/Table.css index bdfdec641..d0507be6b 100644 --- a/frontend/src/Components/Table/Table.css +++ b/frontend/src/Components/Table/Table.css @@ -10,7 +10,7 @@ border-collapse: collapse; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .tableContainer { min-width: 100%; width: fit-content; diff --git a/frontend/src/Components/Table/TableHeaderCell.css b/frontend/src/Components/Table/TableHeaderCell.css index c2c4f58c8..eded9c95b 100644 --- a/frontend/src/Components/Table/TableHeaderCell.css +++ b/frontend/src/Components/Table/TableHeaderCell.css @@ -9,7 +9,7 @@ margin-left: 10px; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .headerCell { white-space: nowrap; } diff --git a/frontend/src/Components/Table/TablePager.css b/frontend/src/Components/Table/TablePager.css index d73a0d0c0..6d184196e 100644 --- a/frontend/src/Components/Table/TablePager.css +++ b/frontend/src/Components/Table/TablePager.css @@ -60,7 +60,7 @@ height: 25px; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .pager { flex-wrap: wrap; } diff --git a/frontend/src/Components/Table/VirtualTableHeaderCell.css b/frontend/src/Components/Table/VirtualTableHeaderCell.css index c2c4f58c8..eded9c95b 100644 --- a/frontend/src/Components/Table/VirtualTableHeaderCell.css +++ b/frontend/src/Components/Table/VirtualTableHeaderCell.css @@ -9,7 +9,7 @@ margin-left: 10px; } -@media only screen and (max-width: $breakpointSmall) { +@media only screen and (max-width: $breakpointMedium) { .headerCell { white-space: nowrap; } From 950c51bc5928d4b8a72b86d45249eac5be654bd1 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 20 Mar 2025 13:10:06 +0200 Subject: [PATCH 073/146] Fixed: Priority validation for indexers and download clients (cherry picked from commit f0e320f3aa501f120721503b8256f464a31be783) --- src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs | 2 ++ src/Lidarr.Api.V1/Indexers/IndexerController.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs b/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs index bd4c993bf..bc54aa7e0 100644 --- a/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs +++ b/src/Lidarr.Api.V1/DownloadClient/DownloadClientController.cs @@ -1,3 +1,4 @@ +using FluentValidation; using Lidarr.Http; using NzbDrone.Core.Download; @@ -12,6 +13,7 @@ namespace Lidarr.Api.V1.DownloadClient public DownloadClientController(IDownloadClientFactory downloadClientFactory) : base(downloadClientFactory, "downloadclient", ResourceMapper, BulkResourceMapper) { + SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); } } } diff --git a/src/Lidarr.Api.V1/Indexers/IndexerController.cs b/src/Lidarr.Api.V1/Indexers/IndexerController.cs index 2ebcd3f29..2187e2b28 100644 --- a/src/Lidarr.Api.V1/Indexers/IndexerController.cs +++ b/src/Lidarr.Api.V1/Indexers/IndexerController.cs @@ -1,3 +1,4 @@ +using FluentValidation; using Lidarr.Http; using NzbDrone.Core.Indexers; using NzbDrone.Core.Validation; @@ -13,6 +14,7 @@ namespace Lidarr.Api.V1.Indexers public IndexerController(IndexerFactory indexerFactory, DownloadClientExistsValidator downloadClientExistsValidator) : base(indexerFactory, "indexer", ResourceMapper, BulkResourceMapper) { + SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); } } From 4bea38ab9c57d1dc111ce7ed6e73fcdea6669d8f Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 11 Mar 2025 08:41:48 -0700 Subject: [PATCH 074/146] Improve logging when login fails due to CryptographicException (cherry picked from commit 1449941471cbb8885e9298317b9a30f2576d7941) --- .../AuthenticationController.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/Lidarr.Http/Authentication/AuthenticationController.cs b/src/Lidarr.Http/Authentication/AuthenticationController.cs index 2fc588dd2..f7281cf5c 100644 --- a/src/Lidarr.Http/Authentication/AuthenticationController.cs +++ b/src/Lidarr.Http/Authentication/AuthenticationController.cs @@ -1,9 +1,14 @@ 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; @@ -16,11 +21,15 @@ namespace Lidarr.Http.Authentication { private readonly IAuthenticationService _authService; private readonly IConfigFileProvider _configFileProvider; + private readonly IAppFolderInfo _appFolderInfo; + private readonly Logger _logger; - public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider) + public AuthenticationController(IAuthenticationService authService, IConfigFileProvider configFileProvider, IAppFolderInfo appFolderInfo, Logger logger) { _authService = authService; _configFileProvider = configFileProvider; + _appFolderInfo = appFolderInfo; + _logger = logger; } [HttpPost("login")] @@ -45,7 +54,23 @@ namespace Lidarr.Http.Authentication IsPersistent = resource.RememberMe == "on" }; - await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); + 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 Lidarr", Path.Combine(_appFolderInfo.AppDataFolder, "asp")); + } + else + { + _logger.Error(e, "Failed to authenticate user. {0}", e.Message); + } + + return Unauthorized(); + } if (returnUrl.IsNullOrWhiteSpace() || !Url.IsLocalUrl(returnUrl)) { From a86bd8e862ebe265efdc44fb7383834edc775e07 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 11 Mar 2025 18:09:19 +0200 Subject: [PATCH 075/146] Fixed: Inherit indexer, size and release group for marked as failed history (cherry picked from commit e08c9d5501e65aabce3456b2dd7571867508d88f) --- src/NzbDrone.Core/History/EntityHistory.cs | 3 +++ src/NzbDrone.Core/History/EntityHistoryService.cs | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/History/EntityHistory.cs b/src/NzbDrone.Core/History/EntityHistory.cs index ffc7e8e7c..496213275 100644 --- a/src/NzbDrone.Core/History/EntityHistory.cs +++ b/src/NzbDrone.Core/History/EntityHistory.cs @@ -10,6 +10,9 @@ namespace NzbDrone.Core.History { public const string DOWNLOAD_CLIENT = "downloadClient"; public const string RELEASE_SOURCE = "releaseSource"; + public const string RELEASE_GROUP = "releaseGroup"; + public const string SIZE = "size"; + public const string INDEXER = "indexer"; public EntityHistory() { diff --git a/src/NzbDrone.Core/History/EntityHistoryService.cs b/src/NzbDrone.Core/History/EntityHistoryService.cs index d94d0cf9e..d88358ddb 100644 --- a/src/NzbDrone.Core/History/EntityHistoryService.cs +++ b/src/NzbDrone.Core/History/EntityHistoryService.cs @@ -267,7 +267,9 @@ namespace NzbDrone.Core.History history.Data.Add("DownloadClient", message.DownloadClient); history.Data.Add("Message", message.Message); - history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString()); + history.Data.Add("ReleaseGroup", message.TrackedDownload?.RemoteAlbum?.ParsedAlbumInfo?.ReleaseGroup ?? message.Data.GetValueOrDefault(EntityHistory.RELEASE_GROUP)); + history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString() ?? message.Data.GetValueOrDefault(EntityHistory.SIZE)); + history.Data.Add("Indexer", message.TrackedDownload?.RemoteAlbum?.Release?.Indexer ?? message.Data.GetValueOrDefault(EntityHistory.INDEXER)); _historyRepository.Insert(history); } @@ -417,6 +419,7 @@ namespace NzbDrone.Core.History history.Data.Add("Message", message.Message); history.Data.Add("ReleaseGroup", message.TrackedDownload?.RemoteAlbum?.ParsedAlbumInfo?.ReleaseGroup); history.Data.Add("Size", message.TrackedDownload?.DownloadItem.TotalSize.ToString()); + history.Data.Add("Indexer", message.TrackedDownload?.RemoteAlbum?.Release?.Indexer); historyToAdd.Add(history); } From d381463b608e3c09d8cbc77f90dd4224a18feefc Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 11 Mar 2025 18:13:39 +0200 Subject: [PATCH 076/146] New: Display indexer in download failed details (cherry picked from commit a324052debf63a8db73a2f3c79201864892bb62c) --- .../src/Activity/History/Details/HistoryDetails.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/Activity/History/Details/HistoryDetails.js b/frontend/src/Activity/History/Details/HistoryDetails.js index b90a64f47..84aa3e0f2 100644 --- a/frontend/src/Activity/History/Details/HistoryDetails.js +++ b/frontend/src/Activity/History/Details/HistoryDetails.js @@ -172,7 +172,8 @@ function HistoryDetails(props) { if (eventType === 'downloadFailed') { const { - message + message, + indexer } = data; return ( @@ -192,6 +193,14 @@ function HistoryDetails(props) { null } + { + indexer ? ( + + ) : null} + { message ? Date: Sun, 23 Mar 2025 18:16:18 +0200 Subject: [PATCH 077/146] Cleanup unused sorting fields for bulk manage providers (cherry picked from commit 6115236d3853f70a18b73aef15ebe4e18ab48e40) --- .../Manage/ManageCustomFormatsModalContent.tsx | 6 ++---- .../Manage/ManageDownloadClientsModalContent.tsx | 6 ++---- .../Indexers/Indexers/Manage/ManageIndexersModalContent.tsx | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/frontend/src/Settings/CustomFormats/CustomFormats/Manage/ManageCustomFormatsModalContent.tsx b/frontend/src/Settings/CustomFormats/CustomFormats/Manage/ManageCustomFormatsModalContent.tsx index cb2fa3cca..aabaf67c1 100644 --- a/frontend/src/Settings/CustomFormats/CustomFormats/Manage/ManageCustomFormatsModalContent.tsx +++ b/frontend/src/Settings/CustomFormats/CustomFormats/Manage/ManageCustomFormatsModalContent.tsx @@ -10,11 +10,11 @@ import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; +import Column from 'Components/Table/Column'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import useSelectState from 'Helpers/Hooks/useSelectState'; import { kinds } from 'Helpers/Props'; -import SortDirection from 'Helpers/Props/SortDirection'; import { bulkDeleteCustomFormats, bulkEditCustomFormats, @@ -34,7 +34,7 @@ type OnSelectedChangeCallback = React.ComponentProps< typeof ManageCustomFormatsModalRow >['onSelectedChange']; -const COLUMNS = [ +const COLUMNS: Column[] = [ { name: 'name', label: () => translate('Name'), @@ -56,8 +56,6 @@ const COLUMNS = [ interface ManageCustomFormatsModalContentProps { onModalClose(): void; - sortKey?: string; - sortDirection?: SortDirection; } function ManageCustomFormatsModalContent( diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx index 734f5efab..b2c1208cb 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/ManageDownloadClientsModalContent.tsx @@ -10,11 +10,11 @@ import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; +import Column from 'Components/Table/Column'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import useSelectState from 'Helpers/Hooks/useSelectState'; import { kinds } from 'Helpers/Props'; -import SortDirection from 'Helpers/Props/SortDirection'; import { bulkDeleteDownloadClients, bulkEditDownloadClients, @@ -35,7 +35,7 @@ type OnSelectedChangeCallback = React.ComponentProps< typeof ManageDownloadClientsModalRow >['onSelectedChange']; -const COLUMNS = [ +const COLUMNS: Column[] = [ { name: 'name', label: () => translate('Name'), @@ -82,8 +82,6 @@ const COLUMNS = [ interface ManageDownloadClientsModalContentProps { onModalClose(): void; - sortKey?: string; - sortDirection?: SortDirection; } function ManageDownloadClientsModalContent( diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx index dbb394959..997d1b566 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx +++ b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx @@ -10,11 +10,11 @@ import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; +import Column from 'Components/Table/Column'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import useSelectState from 'Helpers/Hooks/useSelectState'; import { kinds } from 'Helpers/Props'; -import SortDirection from 'Helpers/Props/SortDirection'; import { bulkDeleteIndexers, bulkEditIndexers, @@ -35,7 +35,7 @@ type OnSelectedChangeCallback = React.ComponentProps< typeof ManageIndexersModalRow >['onSelectedChange']; -const COLUMNS = [ +const COLUMNS: Column[] = [ { name: 'name', label: () => translate('Name'), @@ -82,8 +82,6 @@ const COLUMNS = [ interface ManageIndexersModalContentProps { onModalClose(): void; - sortKey?: string; - sortDirection?: SortDirection; } function ManageIndexersModalContent(props: ManageIndexersModalContentProps) { From c28a97cafdcb2d068cdca185ed9ceeb40027bddd Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 24 Mar 2025 19:14:58 -0700 Subject: [PATCH 078/146] Fixed: Deleting artist folder fails when files/folders aren't instantly removed (cherry picked from commit c84699ed5d5a2f59f236c26a8999d25a1102ec02) --- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 22 ++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index dfdb6b54c..01aaaaded 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.IO.Abstractions; using System.Linq; +using System.Threading; using NLog; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.EnvironmentInfo; @@ -306,9 +307,26 @@ namespace NzbDrone.Common.Disk { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - var files = GetFiles(path, recursive); + var files = GetFiles(path, recursive).ToList(); - files.ToList().ForEach(RemoveReadOnly); + files.ForEach(RemoveReadOnly); + + var attempts = 0; + + while (attempts < 3 && files.Any()) + { + EmptyFolder(path); + + if (GetFiles(path, recursive).Any()) + { + // Wait for IO operations to complete after emptying the folder since they aren't always + // instantly removed and it can lead to false positives that files are still present. + Thread.Sleep(3000); + } + + attempts++; + files = GetFiles(path, recursive).ToList(); + } _fileSystem.Directory.Delete(path, recursive); } From 1b9b57ae9bb835d5648cf13a15ee98abc5cea528 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 25 Mar 2025 21:13:13 +0200 Subject: [PATCH 079/146] Bump browserslist-db --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a08388e6b..baba74fa1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2323,9 +2323,9 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: - version "1.0.30001668" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz#98e214455329f54bf7a4d70b49c9794f0fbedbed" - integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw== + version "1.0.30001707" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz" + integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw== chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" From 5bdc119b980f6c13a609f35a6c337a0d4e70d09c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 27 Mar 2025 19:47:03 +0200 Subject: [PATCH 080/146] Fixed: Include Track for history/since Fixes #5421 --- src/NzbDrone.Core/History/EntityHistoryRepository.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/History/EntityHistoryRepository.cs b/src/NzbDrone.Core/History/EntityHistoryRepository.cs index 4b66c88b7..5c659724d 100644 --- a/src/NzbDrone.Core/History/EntityHistoryRepository.cs +++ b/src/NzbDrone.Core/History/EntityHistoryRepository.cs @@ -104,6 +104,7 @@ namespace NzbDrone.Core.History var builder = Builder() .Join((h, a) => h.ArtistId == a.Id) .Join((h, a) => h.AlbumId == a.Id) + .LeftJoin((h, t) => h.TrackId == t.Id) .Where(x => x.Date >= date); if (eventType.HasValue) @@ -111,10 +112,11 @@ namespace NzbDrone.Core.History builder.Where(h => h.EventType == eventType); } - return _database.QueryJoined(builder, (history, artist, album) => + return _database.QueryJoined(builder, (history, artist, album, track) => { history.Artist = artist; history.Album = album; + history.Track = track; return history; }).OrderBy(h => h.Date).ToList(); } From 8027ab5d2e15b128fd56227858e810f37c62c73e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 28 Mar 2025 09:57:57 +0200 Subject: [PATCH 081/146] Include invalid path in exception message when failing to normalize --- src/NzbDrone.Common/PathEqualityComparer.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Common/PathEqualityComparer.cs b/src/NzbDrone.Common/PathEqualityComparer.cs index bd6fa430d..e8322864a 100644 --- a/src/NzbDrone.Common/PathEqualityComparer.cs +++ b/src/NzbDrone.Common/PathEqualityComparer.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; @@ -6,7 +7,7 @@ namespace NzbDrone.Common { public class PathEqualityComparer : IEqualityComparer { - public static readonly PathEqualityComparer Instance = new PathEqualityComparer(); + public static readonly PathEqualityComparer Instance = new (); private PathEqualityComparer() { @@ -19,12 +20,19 @@ namespace NzbDrone.Common public int GetHashCode(string obj) { - if (OsInfo.IsWindows) + try { - return obj.CleanFilePath().Normalize().ToLower().GetHashCode(); - } + if (OsInfo.IsWindows) + { + return obj.CleanFilePath().Normalize().ToLower().GetHashCode(); + } - return obj.CleanFilePath().Normalize().GetHashCode(); + return obj.CleanFilePath().Normalize().GetHashCode(); + } + catch (ArgumentException ex) + { + throw new ArgumentException($"Invalid path: {obj}", ex); + } } } } From 13f6b1a086ba95e355a9bcc37799bdcec8e5f87f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 30 Mar 2025 10:17:14 +0300 Subject: [PATCH 082/146] Bump version to 2.11.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b87e0a2ed..9076b6da6 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: '2.11.0' + majorVersion: '2.11.1' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 6150a57596794c42b25cf50e72d1cc5c0f3ea33d Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 30 Mar 2025 07:17:20 +0000 Subject: [PATCH 083/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Maxime Surrel Co-authored-by: Moxitech Co-authored-by: Weblate Co-authored-by: Xing Wang Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/fr.json | 4 +++- src/NzbDrone.Core/Localization/Core/ru.json | 7 +++++-- src/NzbDrone.Core/Localization/Core/zh_CN.json | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 7b10d98b2..ab01fa5e8 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1350,5 +1350,7 @@ "PendingDownloadClientUnavailable": "En attente – Le client de téléchargement n'est pas disponible", "UnableToImportAutomatically": "Impossible d'importer automatiquement", "WaitingToImport": "En attente d'import", - "WaitingToProcess": "En attente de traitement" + "WaitingToProcess": "En attente de traitement", + "DefaultDelayProfileArtist": "Il s'agit du profil par défaut. Il s'applique à tous les artistes qui n'ont pas de profil explicite.", + "DelayProfileArtistTagsHelpText": "S'applique aux artistes avec au moins une balise correspondante" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index ae809669b..7b1bed1fc 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -834,7 +834,7 @@ "Absolute": "Абсолютный", "RecycleBinUnableToWriteHealthCheck": "Не удается выполнить запись в настроенную папку корзины: {path}. Убедитесь, что этот путь существует и доступен для записи пользователем, запускающим {appName}", "AddListExclusionHelpText": "Запретить добавление серий в {appName} по спискам", - "AddNewArtistRootFolderHelpText": "Подпапка \"{0}\" будет создана автоматически", + "AddNewArtistRootFolderHelpText": "Подпапка \"{folder}\" будет создана автоматически", "AuthenticationRequiredHelpText": "Отредактируйте, для каких запросов требуется авторизация. Не изменяйте, если не понимаете риски.", "DeleteArtistFolderCountConfirmation": "Вы уверены, что хотите удалить {count} выбранных индексатора?", "RenameFiles": "Переименовать файлы", @@ -1108,5 +1108,8 @@ "Pending": "В ожидании", "PendingDownloadClientUnavailable": "Ожидание – Клиент для загрузки недоступен", "SkipFreeSpaceCheckHelpText": "Используете, когда {appName} не может верно определить свободное место в вашей корневой папке", - "ManageFormats": "Управлять форматами" + "ManageFormats": "Управлять форматами", + "AddArtistWithName": "Добавить {artistName}", + "AddNewAlbum": "Добавить новый альбом", + "AddMetadataProfile": "Добавить мета-данные профиля" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 09dbca921..93e286e22 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1337,7 +1337,7 @@ "DownloadClientSettingsRecentPriority": "最近优先", "PostImportCategory": "导入后分类", "NotificationsSettingsWebhookHeaders": "标头", - "DefaultDelayProfileArtist": "This is the default profile. It applies to all artists that don't have an explicit profile.", + "DefaultDelayProfileArtist": "这是默认的配置。此配置用于所有的没有配置的艺术家", "CheckDownloadClientForDetails": "查看下载客户端了解更多详细信息", "DownloadWarning": "下载警告:{warningMessage}", "UnableToImportAutomatically": "无法自动导入", @@ -1347,5 +1347,7 @@ "Pending": "挂起", "PendingDownloadClientUnavailable": "挂起 - 下载客户端不可用", "WaitingToImport": "等待导入", - "WaitingToProcess": "等待处理" + "WaitingToProcess": "等待处理", + "DelayProfileArtistTagsHelpText": "应用到至少有一个标签匹配的艺术家", + "AlbumInfo": "专辑 信息" } From 4677a1115a42c2e6c637e591002c9c83619b75cf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 2 Apr 2025 00:11:01 +0300 Subject: [PATCH 084/146] Bump linux agent to ubuntu-22.04 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9076b6da6..c754fddfd 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,7 +19,7 @@ variables: nodeVersion: '20.X' innoVersion: '6.2.0' windowsImage: 'windows-2022' - linuxImage: 'ubuntu-20.04' + linuxImage: 'ubuntu-22.04' macImage: 'macOS-13' trigger: From c83332e58cfd50c95fbb2c26c946628f28f3b4da Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 24 Mar 2025 20:14:55 -0700 Subject: [PATCH 085/146] New: Prevent Remote Path Mapping local folder being set to System folder or '/' (cherry picked from commit 0f904e091702a2ac53771ee3aeb5aafe62688035) --- .../RemotePathMappingController.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs b/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs index f0679e27b..33edddff3 100644 --- a/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs +++ b/src/Lidarr.Api.V1/RemotePathMappings/RemotePathMappingController.cs @@ -28,10 +28,13 @@ namespace Lidarr.Api.V1.RemotePathMappings .NotEmpty(); SharedValidator.RuleFor(c => c.LocalPath) - .Cascade(CascadeMode.Stop) - .IsValidPath() - .SetValidator(mappedNetworkDriveValidator) - .SetValidator(pathExistsValidator); + .Cascade(CascadeMode.Stop) + .IsValidPath() + .SetValidator(mappedNetworkDriveValidator) + .SetValidator(pathExistsValidator) + .SetValidator(new SystemFolderValidator()) + .NotEqual("/") + .WithMessage("Cannot be set to '/'"); } public override RemotePathMappingResource GetResourceById(int id) @@ -41,7 +44,7 @@ namespace Lidarr.Api.V1.RemotePathMappings [RestPostById] [Consumes("application/json")] - public ActionResult CreateMapping(RemotePathMappingResource resource) + public ActionResult CreateMapping([FromBody] RemotePathMappingResource resource) { var model = resource.ToModel(); @@ -62,7 +65,7 @@ namespace Lidarr.Api.V1.RemotePathMappings } [RestPutById] - public ActionResult UpdateMapping(RemotePathMappingResource resource) + public ActionResult UpdateMapping([FromBody] RemotePathMappingResource resource) { var mapping = resource.ToModel(); From 89b9352fef7ea6a5f70c9010bddef800301efa19 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 24 Mar 2025 20:07:15 -0700 Subject: [PATCH 086/146] Fixed: Set output encoding to UTF-8 when running external processes (cherry picked from commit f8e57b09856278a6d0c65f18704e96a33459687d) --- src/NzbDrone.Common/Processes/ProcessProvider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs index 3c86a06b1..bee099319 100644 --- a/src/NzbDrone.Common/Processes/ProcessProvider.cs +++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs @@ -6,6 +6,7 @@ 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; @@ -117,7 +118,9 @@ namespace NzbDrone.Common.Processes UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, - RedirectStandardInput = true + RedirectStandardInput = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8 }; if (environmentVariables != null) From 9ba71ae6b1fec6698d7b6476768952b131b66637 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 31 Mar 2025 19:26:14 -0700 Subject: [PATCH 087/146] Update WikiUrl type in API docs (cherry picked from commit 9bd619ccfe074abe396bbf043a36a5be18a7ba4b) --- src/Lidarr.Api.V1/Health/HealthResource.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Lidarr.Api.V1/Health/HealthResource.cs b/src/Lidarr.Api.V1/Health/HealthResource.cs index 9de525009..b059198db 100644 --- a/src/Lidarr.Api.V1/Health/HealthResource.cs +++ b/src/Lidarr.Api.V1/Health/HealthResource.cs @@ -1,7 +1,6 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Lidarr.Http.REST; -using NzbDrone.Common.Http; using NzbDrone.Core.HealthCheck; namespace Lidarr.Api.V1.Health @@ -11,7 +10,7 @@ namespace Lidarr.Api.V1.Health public string Source { get; set; } public HealthCheckResult Type { get; set; } public string Message { get; set; } - public HttpUri WikiUrl { get; set; } + public string WikiUrl { get; set; } } public static class HealthResourceMapper @@ -29,7 +28,7 @@ namespace Lidarr.Api.V1.Health Source = model.Source.Name, Type = model.Type, Message = model.Message, - WikiUrl = model.WikiUrl + WikiUrl = model.WikiUrl.FullUri }; } From 1045684935bb22085d3a06f7c3a23ee253d4f849 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 8 Apr 2025 15:28:37 +0300 Subject: [PATCH 088/146] Bump Selenium.WebDriver.ChromeDriver --- src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj index ada550253..8204721f3 100644 --- a/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Lidarr.Automation.Test.csproj @@ -4,7 +4,7 @@ - + From e4a36ca388e38d670bf865e5c3c59eb0d1bd57ac Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 7 Apr 2025 15:55:38 +0300 Subject: [PATCH 089/146] Log delete statements only once --- src/NzbDrone.Core/Datastore/BasicRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Datastore/BasicRepository.cs b/src/NzbDrone.Core/Datastore/BasicRepository.cs index 75cc9510b..d39858f2f 100644 --- a/src/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/src/NzbDrone.Core/Datastore/BasicRepository.cs @@ -252,7 +252,7 @@ namespace NzbDrone.Core.Datastore protected void Delete(SqlBuilder builder) { - var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery(); + var sql = builder.AddDeleteTemplate(typeof(TModel)); using (var conn = _database.OpenConnection()) { From 556f0ea54bb31227cc82253aad219f35e8a65e96 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 7 Apr 2025 15:54:06 +0300 Subject: [PATCH 090/146] Fixed: Disallow tags creation with empty label --- src/Lidarr.Api.V1/Tags/TagController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Lidarr.Api.V1/Tags/TagController.cs b/src/Lidarr.Api.V1/Tags/TagController.cs index a0e76335e..14f1aef64 100644 --- a/src/Lidarr.Api.V1/Tags/TagController.cs +++ b/src/Lidarr.Api.V1/Tags/TagController.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using FluentValidation; using Lidarr.Http; using Lidarr.Http.REST; using Lidarr.Http.REST.Attributes; @@ -23,6 +24,8 @@ namespace Lidarr.Api.V1.Tags : base(signalRBroadcaster) { _tagService = tagService; + + SharedValidator.RuleFor(c => c.Label).NotEmpty(); } public override TagResource GetResourceById(int id) From d21ad2ad68b9e24c5b50270cdbcd06f8f8bdbf01 Mon Sep 17 00:00:00 2001 From: Servarr Date: Tue, 8 Apr 2025 12:38:22 +0000 Subject: [PATCH 091/146] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 45 ++-------------------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index 8849354f6..4c0462717 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -9808,7 +9808,8 @@ "nullable": true }, "wikiUrl": { - "$ref": "#/components/schemas/HttpUri" + "type": "string", + "nullable": true } }, "additionalProperties": false @@ -10062,48 +10063,6 @@ }, "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 - }, "ImportListBulkResource": { "type": "object", "properties": { From d9562c701e069650130ab8e307269cdc411f3986 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 8 Apr 2025 12:32:18 +0000 Subject: [PATCH 092/146] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Hugoren Martinako Co-authored-by: Ste Co-authored-by: Weblate Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ca/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ca.json | 279 ++++++++++++++++++-- src/NzbDrone.Core/Localization/Core/fr.json | 13 +- src/NzbDrone.Core/Localization/Core/uk.json | 24 +- 3 files changed, 290 insertions(+), 26 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index f090fc042..97ac789ac 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -15,7 +15,7 @@ "BindAddress": "Adreça d'enllaç", "DeleteQualityProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat '{name}'?", "DeleteReleaseProfile": "Suprimeix el perfil de llançament", - "DeleteReleaseProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?", + "DeleteReleaseProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de llançament?", "DownloadClients": "Descàrrega Clients", "EnableColorImpairedMode": "Activa el mode amb alteracions del color", "EnableHelpText": "Activa la creació de fitxers de metadades per a aquest tipus de metadades", @@ -82,7 +82,7 @@ "TorrentDelayHelpText": "Retard en minuts per a esperar abans de capturar un torrent", "Torrents": "Torrents", "UnableToLoadGeneralSettings": "No es pot carregar la configuració general", - "UnableToLoadHistory": "No es pot carregar l'historial", + "UnableToLoadHistory": "No es pot carregar l'historial.", "UnableToLoadImportListExclusions": "No es poden carregar les exclusions de la llista", "UnableToLoadIndexerOptions": "No es poden carregar les opcions de l'indexador", "RemoveCompleted": "S'ha eliminat", @@ -134,7 +134,7 @@ "MoreInfo": "Més informació", "NoBackupsAreAvailable": "No hi ha còpies de seguretat disponibles", "NETCore": ".NET", - "NoHistory": "Sense història", + "NoHistory": "Sense historial.", "NoLeaveIt": "No, deixa-ho", "NotificationTriggers": "Activadors de notificacions", "NoUpdatesAreAvailable": "No hi ha actualitzacions disponibles", @@ -243,7 +243,7 @@ "ChownGroupHelpText": "Nom del grup o gid. Utilitzeu gid per a sistemes de fitxers remots.", "ChownGroupHelpTextWarning": "Això només funciona si l'usuari que executa {appName} és el propietari del fitxer. És millor assegurar-se que el client de descàrrega utilitza el mateix grup que {appName}.", "ConnectSettings": "Configuració de connexió", - "CopyUsingHardlinksHelpText": "Utilitzeu els enllaços durs quan intenteu copiar fitxers de torrents que encara s'estan sembrant", + "CopyUsingHardlinksHelpText": "Els enllaços durs permeten que {appName} importi torrents de sembra a la carpeta de l'artista sense prendre espai extra al disc o copiar tot el contingut del fitxer. Els enllaços durs només funcionaran si l'origen i la destinació estan en el mateix volum", "CopyUsingHardlinksHelpTextWarning": "De tant en tant, els bloquejos de fitxers poden impedir reanomenar els fitxers que s'estan sembrant. Podeu desactivar temporalment la compartició i utilitzar la funció de reanomenar de {appName} com a solució.", "CreateEmptyArtistFolders": "Creeu carpetes buides per a les pel·lícules", "CreateEmptyArtistFoldersHelpText": "Creeu carpetes de pel·lícules que falten durant l'exploració del disc", @@ -252,7 +252,7 @@ "CutoffUnmet": "Tall no assolit", "Dates": "Dates", "DatabaseMigration": "Migració de BD", - "DelayingDownloadUntil": "S'està retardant la baixada fins a les {0} a les {1}", + "DelayingDownloadUntil": "S'està retardant la baixada fins a les {date} a les {time}", "DelayProfile": "Perfil de retard", "DelayProfiles": "Perfils de retard", "Delete": "Suprimeix", @@ -311,7 +311,7 @@ "IllRestartLater": "Reinicia més tard", "ImportExtraFiles": "Importa fitxers addicionals", "ImportExtraFilesHelpText": "Importeu fitxers addicionals coincidents (subtítols, nfo, etc.) després d'importar un fitxer de pel·lícula", - "ImportFailedInterp": "ImportFailedInterp", + "ImportFailedInterp": "Importació fallida: {0}", "Importing": "S'està important", "IncludeUnmonitored": "Inclou no monitorat", "Indexer": "Indexador", @@ -323,7 +323,7 @@ "LogFiles": "Fitxers de registre", "LogLevel": "Nivell de registre", "MaximumSize": "Mida màxima", - "MaximumSizeHelpText": "Mida màxima per a una versió que es pot capturar en MB. Establiu a zero per establir-lo en il·limitat", + "MaximumSizeHelpText": "Mida màxima per a una versió que es pot capturar en MB. Establiu a zero per establir-lo en il·limitat.", "Mechanism": "Mecanisme", "MediaInfo": "Informació de mitjans", "MediaManagementSettings": "Configuració de gestió de mitjans", @@ -462,7 +462,7 @@ "Progress": "Progrés", "SizeLimit": "Límit de mida", "Backup": "Còpia de seguretat", - "IndexerTagHelpText": "Utilitzeu aquest indexador només per a pel·lícules amb almenys una etiqueta coincident. Deixeu-ho en blanc per utilitzar-ho amb totes les pel·lícules.", + "IndexerTagHelpText": "Només utilitza aquest indexador per a pel·lícules que coincideixin amb almenys una etiqueta. Deixar en blanc per a utilitzar-ho amb totes les pel·lícules.", "Info": "Informació", "InstanceName": "Nom de la instància", "InteractiveImport": "Importació interactiva", @@ -593,7 +593,7 @@ "CouldntFindAnyResultsForTerm": "No s'ha pogut trobar cap resultat per a '{0}'", "DeleteCustomFormat": "Suprimeix el format personalitzat", "DeleteCustomFormatMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?", - "DeleteFormatMessageText": "Esteu segur que voleu suprimir l'etiqueta de format {0} ?", + "DeleteFormatMessageText": "Esteu segur que voleu suprimir l'etiqueta de format '{name}'?", "DownloadPropersAndRepacksHelpTextWarning": "Utilitzeu formats personalitzats per a actualitzacions automàtiques a Propers/Repacks", "DownloadedUnableToImportCheckLogsForDetails": "Baixat: no es pot importar: comproveu els registres per obtenir-ne més detalls", "ExportCustomFormat": "Exporta el format personalitzat", @@ -601,7 +601,7 @@ "FailedLoadingSearchResults": "No s'han pogut carregar els resultats de la cerca, torneu-ho a provar.", "Formats": "Formats", "IncludeCustomFormatWhenRenamingHelpText": "Inclou en {Custom Formats} el format de canvi de nom", - "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "És fàcil afegir una pel·lícula nova, només cal que comenceu a escriure el nom de la pel·lícula que voleu afegir", + "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "És fàcil afegir una pel·lícula nova, només cal que comenceu a escriure el nom de la pel·lícula que voleu afegir.", "MinFormatScoreHelpText": "La puntuació mínima de format personalitzada per a la baixada", "Monitor": "Monitora", "NegateHelpText": "Si està marcat, el format personalitzat no s'aplicarà si la condició {0} coincideix.", @@ -614,7 +614,7 @@ "UnableToLoadInteractiveSearch": "No es poden carregar els resultats d'aquesta cerca de pel·lícules. Torna-ho a provar més tard", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "La carpeta de pel·lícules '{0}' i tot el seu contingut es suprimiran.", "CustomFormat": "Format personalitzat", - "CustomFormatRequiredHelpText": "La condició {0} ha de coincidir perquè s'apliqui el format personalitzat. En cas contrari, n'hi ha prou amb una única coincidència de {1}.", + "CustomFormatRequiredHelpText": "La condició {0} ha de coincidir perquè s'apliqui el format personalitzat. En cas contrari, n'hi ha prou amb una única coincidència de {0}.", "CustomFormatSettings": "Configuració de formats personalitzats", "CustomFormats": "Formats personalitzats", "Customformat": "Formats personalitzats", @@ -643,13 +643,13 @@ "ProxyCheckBadRequestMessage": "No s'ha pogut provar el servidor intermediari. Codi d'estat: {0}", "ProxyCheckResolveIpMessage": "No s'ha pogut resoldre l'adreça IP de l'amfitrió intermediari configurat {0}", "RemotePathMappingCheckBadDockerPath": "Esteu utilitzant docker; el client de baixada {0} col·loca les baixades a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i la configuració del client de baixada.", - "RemotePathMappingCheckDownloadPermissions": "{appName} pot veure però no accedir a la pel·lícula baixada {0}. Error de permisos probable.", + "RemotePathMappingCheckDownloadPermissions": "{appName} pot veure però no accedir a la música descarregada {0}. Probablement s'ha produït un error en els permisos.", "RemotePathMappingCheckDockerFolderMissing": "Esteu utilitzant docker; el client de baixada {0} col·loca les baixades a {1}, però sembla que aquest directori no existeix dins del contenidor. Reviseu els mapes de camins remots i la configuració dels volums del contenidor.", "RemotePathMappingCheckFilesBadDockerPath": "Esteu utilitzant docker; el client de baixada{0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i la configuració del client de baixada.", "RemotePathMappingCheckFilesLocalWrongOSPath": "El client de baixada local {0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu la configuració del vostre client de baixada.", "RemotePathMappingCheckFilesWrongOSPath": "El client de baixada remota {0} ha informat de fitxers a {1}, però el camí {2} no és vàlid. Reviseu els mapes de camins remots i baixeu la configuració del client.", "RemotePathMappingCheckGenericPermissions": "El client de baixada {0} col·loca les baixades a {1} però {appName} no pot veure aquest directori. És possible que hàgiu d'ajustar els permisos de la carpeta.", - "RemotePathMappingCheckImportFailed": "{appName} no ha pogut importar una pel·lícula. Comproveu els vostres registres per a obtenir més informació.", + "RemotePathMappingCheckImportFailed": "{appName} no ha pogut importar música. Comproveu els vostres registres per obtenir-ne més detalls.", "RemotePathMappingCheckLocalWrongOSPath": "El client de baixada local {0} col·loca les baixades a {1}, però el camí {2} no és vàlid. Reviseu la configuració del vostre client de baixada.", "RemotePathMappingCheckRemoteDownloadClient": "El client de baixada remota {0} ha informat de fitxers a {1}, però sembla que aquest directori no existeix. És probable que falti el mapa de camins remots.", "RootFolderCheckMultipleMessage": "Falten diverses carpetes arrel: {0}", @@ -677,8 +677,8 @@ "BlocklistReleases": "Llista de llançaments bloquejats", "BlocklistReleaseHelpText": "Impedeix que {appName} torni a capturar aquesta versió automàticament", "FailedToLoadQueue": "No s'ha pogut carregar la cua", - "DeleteConditionMessageText": "Esteu segur que voleu suprimir la notificació '{0}'?", - "DeleteSelectedDownloadClients": "Suprimeix el client de descàrrega", + "DeleteConditionMessageText": "Esteu segur que voleu suprimir la condició '{name}'?", + "DeleteSelectedDownloadClients": "Suprimeix els clients seleccionats de baixada", "DeleteSelectedIndexers": "Suprimeix l'indexador(s)", "DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?", "DownloadClientSortingCheckMessage": "El client de baixada {0} té l'ordenació {1} activada per a la categoria de {appName}. Hauríeu de desactivar l'ordenació al vostre client de descàrrega per evitar problemes d'importació.", @@ -721,7 +721,7 @@ "ImportListRootFolderMissingRootHealthCheckMessage": "Falta la carpeta arrel per a les llistes d'importació: {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Falten diverses carpetes arrel per a les llistes d'importació: {0}", "Enabled": "Habilitat", - "AddNewArtistRootFolderHelpText": "La subcarpeta '{0}' es crearà automàticament", + "AddNewArtistRootFolderHelpText": "La subcarpeta '{folder}' es crearà automàticament", "Priority": "Prioritat", "DeleteSpecification": "Esborra especificació", "BypassIfHighestQualityHelpText": "Evita el retard quan la versió té la qualitat activada més alta al perfil de qualitat amb el protocol preferit", @@ -826,15 +826,15 @@ "Unlimited": "Il·limitat", "Artist": "artista", "BypassIfAboveCustomFormatScore": "Ometre si està per sobre de la puntuació de format personalitzada", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {downloadClientName} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {0} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.", "EditConnectionImplementation": "Afegeix una connexió - {implementationName}", "Episode": "Episodi", "AddImportListExclusionAlbumHelpText": "Eviteu que els àlbums s'afegeixin a {appName} per llistes", "ImportLists": "llista d'importació", - "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració", + "ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {0} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració", "BypassIfAboveCustomFormatScoreHelpText": "Habiliteu l'omissió quan la versió tingui una puntuació superior a la puntuació mínima per al format personalitzat", "Artists": "artista", - "CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)", + "CountDownloadClientsSelected": "{selectedCount} client(s) de baixada seleccionat(s)", "EditReleaseProfile": "Afegeix un perfil de llançament", "ReleaseProfiles": "Perfils de llançament", "ExtraFileExtensionsHelpTextsExamples": "Exemples: '.sub, .nfo' o 'sub,nfo'", @@ -859,7 +859,7 @@ "AutoRedownloadFailedFromInteractiveSearch": "Tornar a baixar baixades fallades des de la cerca interactiva", "AutoRedownloadFailed": "Tornar a baixar les baixades fallades", "StatusEndedContinuing": "Continua", - "DeleteTrackFileMessageText": "Esteu segur que voleu suprimir '{path}'?", + "DeleteTrackFileMessageText": "Esteu segur que voleu suprimir {0}?", "NoCutoffUnmetItems": "No hi ha elements de tall no assolits", "Release": " Llançament", "DeleteEmptyFoldersHelpText": "Suprimeix les carpetes de sèries buides durant l'exploració del disc i quan s'esborren els fitxers de sèries", @@ -914,7 +914,7 @@ "DownloadClientDelugeSettingsDirectoryCompleted": "Directori al qual es mou quan s'hagi completat", "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge", "DownloadClientDelugeSettingsDirectoryHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge", - "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} no ha pogut determinar per a quina pel·lícula era aquest llançament. És possible que {appName} no pugui importar automàticament aquesta versió. Voleu capturar \"{0}\"?", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} no ha pogut determinar per a quina pel·lícula era aquest llançament. És possible que {appName} no pugui importar automàticament aquesta versió. Voleu capturar '{title}'?", "IndexerFlags": "Indicadors de l'indexador", "MonitorNoAlbums": "Cap", "Rejections": "Rebutjats", @@ -992,5 +992,240 @@ "Paused": "En pausa", "Pending": "Pendents", "WaitingToImport": "S’està esperant per a importar", - "WaitingToProcess": "S’està esperant per a processar" + "WaitingToProcess": "S’està esperant per a processar", + "DefaultMonitorOptionHelpText": "Quins àlbums s'han de controlar en afegir inicialment per als artistes detectats en aquesta carpeta", + "DownloadedImporting": "'Descarregat - Important'", + "ExpandItemsByDefault": "Expandeix els elements per defecte", + "HideAlbums": "Oculta els àlbums", + "PathHelpText": "Carpeta arrel que conté la vostra biblioteca de música", + "AllAlbums": "Tots els àlbums", + "AllowFingerprintingHelpText": "Utilitza l'empremta digital per millorar la precisió de la coincidència de la pista", + "DefaultTagsHelpText": "Etiquetes {appName} per defecte per als artistes detectats en aquesta carpeta", + "ShowNextAlbumHelpText": "Mostra el següent àlbum sota el cartell", + "TheAlbumsFilesWillBeDeleted": "Els fitxers de l'àlbum s'eliminaran.", + "TrackCount": "Comptador de pistes", + "TrackDownloaded": "Pista descarregada", + "TrackFiles": "Fitxers de pista", + "ArtistNameHelpText": "El nom de l'artista/àlbum a excloure (pot ser qualsevol cosa significativa)", + "ContinuingNoAdditionalAlbumsAreExpected": "No s'espera cap àlbum addicional", + "ContinuingMoreAlbumsAreExpected": "S'espera més àlbums", + "AddedArtistSettings": "Configuració d'artista afegida", + "AlbumDetails": "Detalls de l'àlbum", + "AlbumHasNotAired": "L'àlbum no s'ha emès", + "AlbumInfo": "Informació de l'àlbum", + "AlbumIsDownloading": "L'àlbum s'està baixant", + "AlbumIsNotMonitored": "L'àlbum no està monitoritzat", + "AlbumRelease": "Publicació de l'àlbum", + "AlbumReleaseDate": "Data de publicació de l'àlbum", + "AlbumStatus": "Estat de l'àlbum", + "AlbumStudio": "Estudi d'àlbum", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} pistes baixades", + "AlbumStudioTruncated": "Només es mostren els últims 20 àlbums, ves als detalls per veure tots els àlbums", + "AlbumType": "Tipus d'àlbum", + "AllAlbumsData": "Controla tots els àlbums excepte els especials", + "AllArtistAlbums": "Tots els àlbums d'artista", + "AllMonitoringOptionHelpText": "Monitora els artistes i tots els àlbums de cada artista inclosos a la llista d'importació", + "AllowFingerprintingHelpTextWarning": "Això requereix que {appName} llegeixi parts del fitxer que alentiran els escanejos i poden causar una activitat de disc o xarxa alta.", + "AnchorTooltip": "Aquest fitxer ja és a la vostra biblioteca per a una versió que esteu important", + "AnyReleaseOkHelpText": "{appName} canviarà automàticament a la versió que coincideixi amb les pistes baixades", + "ArtistClickToChangeAlbum": "Feu clic per canviar l'àlbum", + "ArtistEditor": "Editor d'artistes", + "ArtistFolderFormat": "Format de carpeta d'artista", + "ArtistIsMonitored": "L'artista està monitoritzat", + "ArtistMonitoring": "Seguiment de l'artista", + "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total: {totalTrackCount}, Baixada: {downloadingCount})", + "ArtistType": "Tipus d'artista", + "ArtistsEditRootFolderHelpText": "Moure artistes a la mateixa carpeta arrel es pot utilitzar per a canviar el nom de les carpetes d'artista perquè coincideixin amb el nom o el format de nom actualitzat", + "AutomaticallySwitchRelease": "Commuta automàticament la versió", + "BackupIntervalHelpText": "Interval per a fer una còpia de seguretat de la base de dades {appName} i de la configuració", + "BannerOptions": "Opcions del bàner", + "ContinuingAllTracksDownloaded": "Continuant (totes les pistes baixades)", + "DashOrSpaceDashDependingOnName": "Traç o guió d'espai depenent del nom", + "DelayProfileArtistTagsHelpText": "Aplica als artistes amb almenys una etiqueta coincident", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Prioritat a utilitzar en capturar àlbums publicats en els últims 14 dies", + "IsShowingMonitoredMonitorSelected": "Monitor seleccionat", + "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} admet múltiples llistes per importar àlbums i artistes a la base de dades.", + "MediumFormat": "Format mitjà", + "MetadataSettingsArtistSummary": "Crea fitxers de metadades quan s'importin pistes o s'actualitzi l'artista", + "MissingTracks": "Manquen pistes", + "MonitorAlbum": "Àlbum del monitor", + "MonitorArtists": "Monitora els artistes", + "MonitorExistingAlbums": "Àlbums existents", + "MonitorFirstAlbum": "Primer àlbum", + "NoTracksInThisMedium": "No hi ha pistes en aquest suport", + "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName} camí, utilitzat per modificar els camins de sèrie quan {serviceName} veu la ubicació del camí de la biblioteca diferent de {appName} (requereix 'Biblioteca d'actualització')", + "OneAlbum": "1 àlbum", + "Retag": "Reetiqueta", + "SearchForAllCutoffUnmetAlbums": "Cerca tots els àlbums de Cutoff Unmet", + "SecondaryAlbumTypes": "Tipus d'àlbum secundari", + "SetAppTags": "Estableix {appName} etiquetes", + "ShouldMonitorExisting": "Monitora els àlbums existents", + "ShouldMonitorExistingHelpText": "Monitora automàticament els àlbums d'aquesta llista que ja estan a {appName}", + "ShouldMonitorHelpText": "Monitora els artistes i àlbums afegits d'aquesta llista", + "ShowLastAlbum": "Mostra l'últim àlbum", + "TagAudioFilesWithMetadata": "Etiqueta els fitxers d'àudio amb metadades", + "TrackFileMissingTooltip": "Falta el fitxer de la pista", + "TrackNaming": "Nom de la pista", + "TrackProgress": "Progrés de la pista", + "TrackStatus": "Estat de la pista", + "SpecificMonitoringOptionHelpText": "Monitora els artistes, però només supervisa els àlbums inclosos explícitament a la llista", + "OnAlbumDelete": "En suprimir l'àlbum", + "TrackFileDeletedTooltip": "S'ha suprimit el fitxer de pista", + "TrackFileTagsUpdatedTooltip": "S'han actualitzat les etiquetes dels fitxers de seguiment", + "MonitoringOptionsHelpText": "Quins àlbums s'han de controlar després d'afegir l'artista (ajust d'un sol cop)", + "Proceed": "Procedeix", + "SelectArtist": "Selecciona l'artista", + "AllowArtistChangeClickToChangeArtist": "Feu clic per canviar l'artista", + "FutureAlbums": "Àlbums futurs", + "ArtistName": "Nom de l'artista", + "MonitorNoNewAlbums": "Sense àlbums nous", + "IsExpandedShowTracks": "Mostra les pistes", + "MonitorMissingAlbums": "Manquen àlbums", + "ShowAlbumCount": "Mostra el comptador d'àlbums", + "AreYouSure": "N'estàs segur?", + "Banners": "Bàners", + "NoneMonitoringOptionHelpText": "No monitoris artistes ni àlbums", + "DownloadedWaitingToImport": "'Descarregat - Esperant a importar'", + "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "L'episodi no té un número d'episodi absolut", + "NoMediumInformation": "No hi ha informació de suport disponible.", + "MissingTracksArtistNotMonitored": "Manquen pistes (l'artista no està monitoritzat)", + "NotDiscography": "No discografia", + "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} camí, utilitzat per modificar els camins de sèrie quan {serviceName} veu la ubicació del camí de la biblioteca diferent de {appName} (requereix 'Biblioteca d'actualització')", + "NotificationsTagsArtistHelpText": "Envia només notificacions per a artistes amb almenys una etiqueta coincident", + "Playlist": "Reproducció", + "PrimaryAlbumTypes": "Tipus d'àlbum principal", + "PrimaryTypes": "Tipus primaris", + "TrackArtist": "Artista de la pista", + "TrackImported": "S'ha importat la pista", + "DownloadImported": "Baixada importada", + "ForeignId": "Id estranger", + "Inactive": "Inactiu", + "EditArtist": "Edita l'artista", + "ReleasesHelpText": "Canvia el llançament d'aquest àlbum", + "ShouldSearch": "Cerca elements nous", + "GoToArtistListing": "Ves a la llista d'artistes", + "SelectAlbum": "Selecciona l'àlbum", + "SceneNumberHasntBeenVerifiedYet": "El número d'escena encara no s'ha verificat", + "SelectTracks": "Selecciona les pistes", + "ArtistIsUnmonitored": "L'artista no està monitoritzat", + "DefaultQualityProfileIdHelpText": "Perfil de qualitat predeterminat per als artistes detectats en aquesta carpeta", + "ExistingAlbums": "Àlbums existents", + "GroupInformation": "Informació del grup", + "MatchedToAlbums": "Coincideix amb els àlbums", + "MusicbrainzId": "Id del Musicbrainz", + "ThereWasAnErrorLoadingThisItem": "S'ha produït un error en carregar aquest element", + "SearchBoxPlaceHolder": "p. ex. Trencant Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25", + "ShowNextAlbum": "Mostra l'àlbum següent", + "MediaCount": "Comptador de mitjans", + "MissingAlbums": "Manquen àlbums", + "MissingTracksArtistMonitored": "Pistes que falten (controlat per l'artista)", + "MonitorFutureAlbums": "Àlbums futurs", + "MusicBrainzAlbumID": "ID de l'àlbum del MusicBrainz", + "NextAlbum": "Àlbum següent", + "AlbumTitle": "Títol de l'àlbum", + "AllExpandedExpandAll": "Expandeix-ho tot", + "MonitorNewAlbums": "Àlbums nous", + "LatestAlbum": "Últim àlbum", + "RemoveSelectedItemBlocklistMessageText": "Esteu segur que voleu eliminar els elements seleccionats de la llista de bloqueigs?", + "RenameTracks": "Canvia el nom de les pistes", + "ThereWasAnErrorLoadingThisPage": "S'ha produït un error en carregar aquesta pàgina", + "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} pistes baixades", + "TrackFileRenamedTooltip": "S'ha canviat el nom del fitxer de pista", + "WriteMetadataToAudioFiles": "Escriu les metadades als fitxers d'àudio", + "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "No hi ha àlbums supervisats per a aquest artista", + "SearchAlbum": "Cerca un àlbum", + "ForNewImportsOnly": "Només per a importacions noves", + "CollapseMultipleAlbums": "Redueix diversos àlbums", + "CollapseMultipleAlbumsHelpText": "Redueix diversos àlbums que es publiquen el mateix dia", + "CombineWithExistingFiles": "Combina amb els fitxers existents", + "CountAlbums": "{albumCount} àlbums", + "Deceased": "Defunció", + "DefaultDelayProfileArtist": "Aquest és el perfil per defecte. S'aplica a tots els artistes que no tenen un perfil explícit.", + "DefaultLidarrTags": "Etiquetes {appName} per defecte", + "DefaultMetadataProfileIdHelpText": "Perfil predeterminat de metadades per als artistes detectats en aquesta carpeta", + "DeleteArtist": "Suprimeix l'artista seleccionat", + "DeleteArtistFolder": "Suprimeix la carpeta d'artista", + "DeleteArtistFolderCountWithFilesConfirmation": "Esteu segur que voleu suprimir {count} artistes seleccionats i tots els continguts?", + "DeleteFilesHelpText": "Suprimeix els fitxers de la pista i la carpeta de l'artista", + "DeleteSelectedArtists": "Suprimeix els artistes seleccionats", + "DeleteTrackFile": "Suprimeix el fitxer de pista", + "EditSelectedArtists": "Edita els artistes seleccionats", + "EmbedCoverArtHelpText": "Incrusta l'art de l'àlbum Lidarr en fitxers d'àudio en escriure etiquetes", + "EmbedCoverArtInAudioFiles": "Incrusta la caràtula en fitxers d'àudio", + "EnableAutomaticAddHelpText": "Afegeix un artista/àlbum a {appName} quan es realitzen les sincronitzacions a través de la interfície d'usuari o per {appName}", + "EnabledHelpText": "Marqueu-ho per a habilitar el perfil de la versió", + "EndedAllTracksDownloaded": "Finalitzat (totes les pistes baixades)", + "ExistingAlbumsData": "Monitora els àlbums que tenen fitxers o encara no s'han publicat", + "ExpandBroadcastByDefaultHelpText": "Transmissió", + "ExpandEPByDefaultHelpText": "Eps", + "ExpandSingleByDefaultHelpText": "Individuals", + "FilterAlbumPlaceholder": "Filtra l'àlbum", + "FilterArtistPlaceholder": "Filtra l'artista", + "FirstAlbum": "Primer àlbum", + "FirstAlbumData": "Controla els primers àlbums. Tots els altres àlbums seran ignorats", + "ForeignIdHelpText": "L'ID del Musicbrainz de l'artista/àlbum a excloure", + "FutureAlbumsData": "Monitora els àlbums que encara no s'han publicat", + "HideTracks": "Oculta les pistes", + "ICalTagsArtistHelpText": "Feed només contindrà artistes amb almenys una etiqueta coincident", + "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Si no afegiu una exclusió de la llista d'importació i l'artista té un perfil de metadades diferent de 'None'.", + "ImportCompleteFailed": "Ha fallat la importació", + "ImportListTagsHelpText": "Etiquetes que s'afegiran a la importació des d'aquesta llista", + "IndexerIdHelpText": "Especifiqueu a quin indexador s'aplica el perfil", + "IsExpandedHideAlbums": "Oculta els àlbums", + "IsExpandedHideTracks": "Oculta les pistes", + "IsExpandedShowAlbums": "Mostra els àlbums", + "IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "No es pot suprimir un perfil de metadades que està adjuntat a un artista o a una llista d'importació", + "IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "No es pot suprimir un perfil de qualitat que estigui adjuntat a un artista o a una llista d'importació", + "IsShowingMonitoredUnmonitorSelected": "Unmonitor seleccionat", + "LastAlbum": "Últim àlbum", + "LatestAlbumData": "Monitoritza els últims àlbums i futurs àlbums", + "ManageTracks": "Gestiona les pistes", + "MatchedToArtist": "Coincideix amb l'artista", + "MassAlbumsCutoffUnmetWarning": "Esteu segur que voleu cercar tots els ‘{0}’ àlbums sense límits satisfets?", + "MissingAlbumsData": "Monitora els àlbums que no tenen fitxers o que encara no s'han publicat", + "MonitorAlbumExistingOnlyWarning": "Aquest és un ajust ajustat de la configuració monitoritzada per a cada àlbum. Utilitzeu l'opció Artist/Edit per controlar què passa amb els àlbums nous", + "MonitorAllAlbums": "Tots els àlbums", + "MonitorArtist": "Monitora l’artista", + "MonitorLastestAlbum": "Últim àlbum", + "MonitorNewItems": "Monitora els àlbums nous", + "MonitorNewItemsHelpText": "Quins àlbums nous s'han de controlar", + "MonitoredHelpText": "Baixa els àlbums monitoritzats d'aquest artista", + "MultiDiscTrackFormat": "Format de pista multidisc", + "MusicBrainzArtistID": "ID de l'artista del MusicBrainz", + "NoneData": "No es controlarà cap àlbum", + "OnArtistAdd": "En afegir l'artista", + "Retagged": "Reetiquetat", + "RecycleBinUnableToWriteHealthCheck": "No s'ha pogut escriure a la carpeta de contenidors de reciclatge configurada: {0}. Assegureu-vos que aquest camí existeix i que l'usuari que executa {appName} pot escriure", + "RefreshArtist": "Actualitza l'artista", + "ReleaseProfileTagArtistHelpText": "Els perfils de llançament s'aplicaran als artistes amb almenys una etiqueta coincident. Deixa en blanc per aplicar a tots els artistes", + "ReplaceExistingFiles": "Substitueix els fitxers existents", + "RetagSelectedArtists": "Reetiqueta els artistes seleccionats", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Esteu segur que voleu cercar tots els {totalRecords} àlbums tallats Unmet?", + "SearchForAllMissingAlbums": "Cerca tots els àlbums que falten", + "SearchForAllMissingAlbumsConfirmationCount": "Esteu segur que voleu cercar tots els {totalRecords} àlbums que manquen?", + "SearchForMonitoredAlbums": "Cerca àlbums monitoritzats", + "SecondaryTypes": "Tipus secundaris", + "SelectAlbumRelease": "Selecciona la publicació de l'àlbum", + "SelectedCountArtistsSelectedInterp": "{selectedCount} Artistes seleccionats", + "ShowTitleHelpText": "Mostra el nom de l'artista sota el cartell", + "SkipRedownloadHelpText": "Evita que {appName} intenti baixar versions alternatives per als elements eliminats", + "SpecificAlbum": "Àlbum específic", + "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} pistes totals. {1} pistes amb fitxers.", + "TrackFilesCountMessage": "No hi ha fitxers de pista", + "TrackFilesLoadError": "No s'han pogut carregar els fitxers de pista", + "TrackMissingFromDisk": "Falta la pista del disc", + "TracksLoadError": "No s'han pogut carregar les pistes", + "WriteAudioTagsHelpTextWarning": "En seleccionar ‘Tots els fitxers’ s'alteraran els fitxers existents quan s'importin.", + "DeleteArtistFolders": "Suprimeix les carpetes d'artista", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Prioritat a utilitzar en capturar àlbums publicats fa més de 14 dies", + "EditMetadata": "Edita les metadades", + "NewAlbums": "Àlbums nous", + "NoAlbums": "Sense àlbums", + "NoMissingItems": "No falten elements", + "OnArtistDelete": "En suprimir l'artista", + "OnTrackRetag": "En reetiquetar la pista", + "RootFolderPathHelpText": "Els elements de la llista de carpetes arrel s'afegiran a", + "ScrubAudioTagsHelpText": "Elimina les etiquetes existents dels fitxers, deixant només les afegides per {appName}.", + "ScrubExistingTags": "Neteja les etiquetes existents", + "Disambiguation": "Desambiguació" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index ab01fa5e8..6dbaaf986 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -690,7 +690,7 @@ "ResetDefinitions": "Réinitialiser les définitions", "ResetTitles": "Réinitialiser les titres", "HiddenClickToShow": "Masqué, cliquez pour afficher", - "RemotePathMappingCheckDownloadPermissions": "{appName} peut voir mais ne peut accéder au film téléchargé {0}. Il s'agit probablement d'une erreur de permissions.", + "RemotePathMappingCheckDownloadPermissions": "{appName} peut voir mais ne peut accéder au musique téléchargé {0}. Il s'agit probablement d'une erreur de permissions.", "RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker ; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.", "ShownClickToHide": "Affiché, cliquez pour masquer", "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", @@ -729,7 +729,7 @@ "RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.", "RemotePathMappingCheckFolderPermissions": "{appName} peut voir mais pas accéder au répertoire de téléchargement {0}. Erreur d'autorisations probable.", "RemotePathMappingCheckGenericPermissions": "Le client de téléchargement {0} met les téléchargements dans {1} mais {appName} ne peut voir ce répertoire. Il est possible que vous ayez besoin d'ajuster les permissions de ce dossier.", - "RemotePathMappingCheckImportFailed": "{appName} a échoué en important un Film. Vérifier vos logs pour plus de détails.", + "RemotePathMappingCheckImportFailed": "{appName} a échoué en important une musique. Vérifier vos logs pour plus de détails.", "RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.", "RemotePathMappingCheckLocalWrongOSPath": "Le client de téléchargement {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.", "RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.", @@ -1352,5 +1352,12 @@ "WaitingToImport": "En attente d'import", "WaitingToProcess": "En attente de traitement", "DefaultDelayProfileArtist": "Il s'agit du profil par défaut. Il s'applique à tous les artistes qui n'ont pas de profil explicite.", - "DelayProfileArtistTagsHelpText": "S'applique aux artistes avec au moins une balise correspondante" + "DelayProfileArtistTagsHelpText": "S'applique aux artistes avec au moins une balise correspondante", + "ICalTagsArtistHelpText": "Le flux ne contiendra que des artistes ayant au moins un tag correspondant", + "NoMediumInformation": "Aucune information sur le support n'est disponible.", + "DownloadClientSettingsOlderPriorityAlbumHelpText": "Priorité à utiliser lors de la récupération des albums sortis il y a plus de 14 jours", + "DownloadClientSettingsRecentPriorityAlbumHelpText": "Priorité à utiliser lors de la récupération des albums sortis au cours des 14 derniers jours", + "NotificationsTagsArtistHelpText": "Envoyer des notifications uniquement pour les artistes ayant au moins un tag correspondant", + "ReleaseProfileTagArtistHelpText": "Les profils de sortie s'appliqueront aux artistes ayant au moins un tag correspondant. Laisser vide pour appliquer à tous les artistes", + "TracksLoadError": "Impossible de charger les pistes" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 7b1d2a391..cfd4334cb 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -923,5 +923,27 @@ "Pending": "В очікуванні", "WaitingToImport": "Очікування імпорту", "WaitingToProcess": "Очікування обробки", - "CheckDownloadClientForDetails": "перевірте клієнт завантаження, щоб дізнатися більше" + "CheckDownloadClientForDetails": "перевірте клієнт завантаження, щоб дізнатися більше", + "DashOrSpaceDashDependingOnName": "Тире або пробіл залежно від імені", + "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Епізод не має абсолютного номера епізоду", + "ExpandOtherByDefaultHelpText": "Інше", + "ImportListTagsHelpText": "Теги, які будуть додані при імпорті з цього списку", + "IndexerIdHelpText": "Вкажіть, до якого індексатору застосовується профіль", + "IsShowingMonitoredUnmonitorSelected": "Не відстежувати вибрані", + "RemoveSelectedItemBlocklistMessageText": "Ви впевнені, що хочете видалити вибрані елементи з чорного списку?", + "RootFolderPathHelpText": "Елементи списку кореневих тек будуть додані в", + "ThereWasAnErrorLoadingThisItem": "Сталася помилка при завантаженні цього елемента", + "ThereWasAnErrorLoadingThisPage": "Сталася помилка під час завантаження цієї сторінки", + "AllExpandedExpandAll": "Розгорнути все", + "NoMissingItems": "Немає відсутніх елементів", + "TBA": "Будь ласка, перевірте пізніше", + "IsShowingMonitoredMonitorSelected": "Відстеження вибрано", + "SceneNumberHasntBeenVerifiedYet": "Номер сцени ще не перевірено", + "EnabledHelpText": "Установіть прапорець, щоб увімкнути профіль релізу", + "Loading": "Завантаження", + "NoCutoffUnmetItems": "Не має елементів що не досягли порогу", + "NotificationsEmbySettingsUpdateLibraryHelpText": "Оновити бібліотеку при імпорті, перейменуванні або видаленні", + "NotificationsSettingsUpdateMapPathsFromHelpText": "Шлях {appName}, який використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (необхідно 'Оновити бібліотеку')", + "NotificationsSettingsUpdateMapPathsToHelpText": "Шлях {serviceName}, що використовується для зміни шляхів до серіалів, коли {serviceName} бачить шлях до бібліотеки інакше, ніж {appName} (потрібно 'Оновити бібліотеку')", + "Select...": "Вибрати..." } From fbfd24e226ebe1c1aaca2f4d1a3d907784203e10 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 13 Apr 2025 10:08:22 +0300 Subject: [PATCH 093/146] Bump version to 2.11.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c754fddfd..aebacf592 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: '2.11.1' + majorVersion: '2.11.2' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From d8850af0193846df6de6ec38d67bfabffe58e86b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 17 Apr 2025 12:32:11 +0300 Subject: [PATCH 094/146] Increase input sizes in edit artist modal Closes #5294 --- .../src/Artist/Edit/EditArtistModalContent.js | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/frontend/src/Artist/Edit/EditArtistModalContent.js b/frontend/src/Artist/Edit/EditArtistModalContent.js index 82a390d84..bca6e3ea6 100644 --- a/frontend/src/Artist/Edit/EditArtistModalContent.js +++ b/frontend/src/Artist/Edit/EditArtistModalContent.js @@ -15,7 +15,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import Popover from 'Components/Tooltip/Popover'; -import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props'; +import { icons, inputTypes, kinds, sizes, tooltipPositions } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import styles from './EditArtistModalContent.css'; @@ -93,7 +93,7 @@ class EditArtistModalContent extends Component {
- + {translate('Monitored')} @@ -107,9 +107,10 @@ class EditArtistModalContent extends Component { /> - + {translate('MonitorNewItems')} + - + {translate('QualityProfile')} @@ -146,10 +147,10 @@ class EditArtistModalContent extends Component { { - showMetadataProfile && - + showMetadataProfile ? + - Metadata Profile + {translate('MetadataProfile')} - + : + null } - + {translate('Path')} @@ -189,7 +191,7 @@ class EditArtistModalContent extends Component { /> - + {translate('Tags')} @@ -209,7 +211,7 @@ class EditArtistModalContent extends Component { kind={kinds.DANGER} onPress={onDeleteArtistPress} > - Delete + {translate('Delete')}