From 2f80957f11fd5ab735c030c574e228a7bd320847 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 4 Feb 2024 12:54:53 +0200 Subject: [PATCH 001/491] Bump version to 2.1.7 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index c0469d10a..579799208 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.1.6' + majorVersion: '2.1.7' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 0121095b3e4761f4f91eed7bf94932d71ce7a874 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Tue, 10 Oct 2023 15:58:03 +0200 Subject: [PATCH 002/491] New: Add additional CleanNameThe/CleanTitleThe naming tokens (cherry picked from commit 81aaf00a4cd2b3a2f8ddf67226c13bb51ea39dda) Add some translations and fix the validation for track naming Closes #4197 --- .../MediaManagement/Naming/NamingModal.js | 76 +++++++++----- .../CleanTitleTheFixture.cs | 98 +++++++++++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 8 ++ .../Organizer/FileNameBuilder.cs | 16 ++- 4 files changed, 172 insertions(+), 26 deletions(-) create mode 100644 src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleTheFixture.cs diff --git a/frontend/src/Settings/MediaManagement/Naming/NamingModal.js b/frontend/src/Settings/MediaManagement/Naming/NamingModal.js index 35244e64e..dec15893f 100644 --- a/frontend/src/Settings/MediaManagement/Naming/NamingModal.js +++ b/frontend/src/Settings/MediaManagement/Naming/NamingModal.js @@ -15,16 +15,51 @@ import NamingOption from './NamingOption'; import styles from './NamingModal.css'; const separatorOptions = [ - { key: ' ', value: 'Space ( )' }, - { key: '.', value: 'Period (.)' }, - { key: '_', value: 'Underscore (_)' }, - { key: '-', value: 'Dash (-)' } + { + key: ' ', + get value() { + return `${translate('Space')} ( )`; + } + }, + { + key: '.', + get value() { + return `${translate('Period')} (.)`; + } + }, + { + key: '_', + get value() { + return `${translate('Underscore')} (_)`; + } + }, + { + key: '-', + get value() { + return `${translate('Dash')} (-)`; + } + } ]; const caseOptions = [ - { key: 'title', value: 'Default Case' }, - { key: 'lower', value: 'Lowercase' }, - { key: 'upper', value: 'Uppercase' } + { + key: 'title', + get value() { + return translate('DefaultCase'); + } + }, + { + key: 'lower', + get value() { + return translate('Lowercase'); + } + }, + { + key: 'upper', + get value() { + return translate('Uppercase'); + } + } ]; const fileNameTokens = [ @@ -40,33 +75,23 @@ const fileNameTokens = [ const artistTokens = [ { token: '{Artist Name}', example: 'Artist Name' }, - - { token: '{Artist NameThe}', example: 'Artist Name, The' }, - - { token: '{Artist NameFirstCharacter}', example: 'A' }, - { token: '{Artist CleanName}', example: 'Artist Name' }, - + { token: '{Artist NameThe}', example: 'Artist Name, The' }, + { token: '{Artist CleanNameThe}', example: 'Artist Name, The' }, + { token: '{Artist NameFirstCharacter}', example: 'A' }, { token: '{Artist Disambiguation}', example: 'Disambiguation' }, - { token: '{Artist Genre}', example: 'Pop' }, - { token: '{Artist MbId}', example: 'db92a151-1ac2-438b-bc43-b82e149ddd50' } ]; const albumTokens = [ { token: '{Album Title}', example: 'Album Title' }, - - { token: '{Album TitleThe}', example: 'Album Title, The' }, - { token: '{Album CleanTitle}', example: 'Album Title' }, - + { token: '{Album TitleThe}', example: 'Album Title, The' }, + { token: '{Album CleanTitleThe}', example: 'Album Title, The' }, { token: '{Album Type}', example: 'Album Type' }, - { token: '{Album Disambiguation}', example: 'Disambiguation' }, - { token: '{Album Genre}', example: 'Rock' }, - { token: '{Album MbId}', example: '082c6aff-a7cc-36e0-a960-35a578ecd937' } ]; @@ -96,8 +121,9 @@ const trackTitleTokens = [ const trackArtistTokens = [ { token: '{Track ArtistName}', example: 'Artist Name' }, - { token: '{Track ArtistNameThe}', example: 'Artist Name, The' }, { token: '{Track ArtistCleanName}', example: 'Artist Name' }, + { token: '{Track ArtistNameThe}', example: 'Artist Name, The' }, + { token: '{Track ArtistCleanNameThe}', example: 'Artist Name, The' }, { token: '{Track ArtistMbId}', example: 'db92a151-1ac2-438b-bc43-b82e149ddd50' } ]; @@ -213,7 +239,7 @@ class NamingModal extends Component { > - File Name Tokens + {translate('FileNameTokens')} @@ -552,7 +578,7 @@ class NamingModal extends Component { onSelectionChange={this.onInputSelectionChange} /> diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleTheFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleTheFixture.cs new file mode 100644 index 000000000..3cbfd9928 --- /dev/null +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CleanTitleTheFixture.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using System.Linq; +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.CustomFormats; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Music; +using NzbDrone.Core.Organizer; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests +{ + [TestFixture] + public class CleanTitleTheFixture : CoreTest + { + private Artist _artist; + private Album _album; + private AlbumRelease _release; + private Track _track; + private TrackFile _trackFile; + private NamingConfig _namingConfig; + + [SetUp] + public void Setup() + { + _artist = Builder + .CreateNew() + .With(s => s.Name = "Avenged Sevenfold") + .Build(); + + _album = Builder + .CreateNew() + .With(s => s.Title = "Hail to the King") + .Build(); + + _release = Builder + .CreateNew() + .With(s => s.Media = new List { new Medium { Number = 1 } }) + .Build(); + + _track = Builder.CreateNew() + .With(e => e.Title = "Doing Time") + .With(e => e.AbsoluteTrackNumber = 3) + .With(e => e.AlbumRelease = _release) + .Build(); + + _trackFile = new TrackFile { Quality = new QualityModel(Quality.MP3_256), ReleaseGroup = "LidarrTest" }; + + _namingConfig = NamingConfig.Default; + _namingConfig.RenameTracks = true; + + Mocker.GetMock() + .Setup(c => c.GetConfig()).Returns(_namingConfig); + + Mocker.GetMock() + .Setup(v => v.Get(Moq.It.IsAny())) + .Returns(v => Quality.DefaultQualityDefinitions.First(c => c.Quality == v)); + + Mocker.GetMock() + .Setup(v => v.All()) + .Returns(new List()); + } + + [TestCase("The Mist", "Mist, The")] + [TestCase("A Place to Call Home", "Place to Call Home, A")] + [TestCase("An Adventure in Space and Time", "Adventure in Space and Time, An")] + [TestCase("The Flash (2010)", "Flash, The 2010")] + [TestCase("A League Of Their Own (AU)", "League Of Their Own, A AU")] + [TestCase("The Fixer (ZH) (2015)", "Fixer, The ZH 2015")] + [TestCase("The Sixth Sense 2 (Thai)", "Sixth Sense 2, The Thai")] + [TestCase("The Amazing Race (Latin America)", "Amazing Race, The Latin America")] + [TestCase("The Rat Pack (A&E)", "Rat Pack, The AandE")] + [TestCase("The Climax: I (Almost) Got Away With It (2016)", "Climax I Almost Got Away With It, The 2016")] + public void should_get_expected_title_back(string title, string expected) + { + _artist.Name = title; + _namingConfig.StandardTrackFormat = "{Artist CleanNameThe}"; + + Subject.BuildTrackFileName(new List { _track }, _artist, _album, _trackFile) + .Should().Be(expected); + } + + [TestCase("A")] + [TestCase("Anne")] + [TestCase("Theodore")] + [TestCase("3%")] + public void should_not_change_title(string title) + { + _artist.Name = title; + _namingConfig.StandardTrackFormat = "{Artist CleanNameThe}"; + + Subject.BuildTrackFileName(new List { _track }, _artist, _album, _trackFile) + .Should().Be(title); + } + } +} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 15e3aa631..c08cf304d 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -256,6 +256,7 @@ "CutoffFormatScoreHelpText": "Once this custom format score is reached {appName} will no longer grab album releases", "CutoffHelpText": "Once this quality is reached {appName} will no longer download albums", "CutoffUnmet": "Cutoff Unmet", + "Dash": "Dash", "DashOrSpaceDashDependingOnName": "Dash or Space Dash depending on name", "Database": "Database", "DatabaseMigration": "Database Migration", @@ -263,6 +264,7 @@ "DateAdded": "Date Added", "Dates": "Dates", "Deceased": "Deceased", + "DefaultCase": "Default Case", "DefaultDelayProfileHelpText": "This is the default profile. It applies to all artist that don't have an explicit profile.", "DefaultLidarrTags": "Default {appName} Tags", "DefaultMetadataProfileIdHelpText": "Default Metadata Profile for artists detected in this folder", @@ -449,6 +451,7 @@ "FailedToLoadQueue": "Failed to load Queue", "FileDateHelpText": "Change file date on import/rescan", "FileManagement": "File Management", + "FileNameTokens": "File Name Tokens", "FileNames": "File Names", "Filename": "Filename", "Files": "Files", @@ -614,6 +617,7 @@ "Logout": "Logout", "Logs": "Logs", "LongDateFormat": "Long Date Format", + "Lowercase": "Lowercase", "MIA": "MIA", "MaintenanceRelease": "Maintenance Release: bug fixes and other improvements. See Github Commit History for more details", "ManageClients": "Manage Clients", @@ -764,6 +768,7 @@ "PathHelpText": "Root Folder containing your music library", "PathHelpTextWarning": "This must be different to the directory where your download client puts files", "Peers": "Peers", + "Period": "Period", "Permissions": "Permissions", "Playlist": "Playlist", "Port": "Port", @@ -1028,6 +1033,7 @@ "Source": "Source", "SourcePath": "Source Path", "SourceTitle": "Source Title", + "Space": "Space", "SpecificAlbum": "Specific Album", "SpecificMonitoringOptionHelpText": "Monitor artists but only monitor albums explicitly included in the list", "SslCertPasswordHelpText": "Password for pfx file", @@ -1147,6 +1153,7 @@ "UnableToLoadTags": "Unable to load Tags", "UnableToLoadTheCalendar": "Unable to load the calendar", "UnableToLoadUISettings": "Unable to load UI settings", + "Underscore": "Underscore", "Ungroup": "Ungroup", "Unlimited": "Unlimited", "UnmappedFiles": "Unmapped Files", @@ -1169,6 +1176,7 @@ "UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Updating is disabled inside a docker container. Update the container image instead.", "UpgradeAllowedHelpText": "If disabled qualities will not be upgraded", "UpgradesAllowed": "Upgrades Allowed", + "Uppercase": "Uppercase", "Uptime": "Uptime", "UrlBaseHelpText": "For reverse proxy support, default is empty", "UrlBaseHelpTextWarning": "Requires restart to take effect", diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index cf6007da5..c8cb22a64 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -54,7 +54,7 @@ namespace NzbDrone.Core.Organizer public static readonly Regex AlbumTitleRegex = new Regex(@"(?\{(?:Album)(?[- ._])(Clean)?Title(The)?(?::(?[0-9-]+))?\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public static readonly Regex TrackTitleRegex = new Regex(@"(?\{(?:Track)(?[- ._])(Clean)?Title(The)?(?::(?[0-9-]+))?\})", + public static readonly Regex TrackTitleRegex = new Regex(@"(?\{(?:Track)(?[- ._])(Clean)?Title(?::(?[0-9-]+))?\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex FileNameCleanupRegex = new Regex(@"([- ._])(\1)+", RegexOptions.Compiled); @@ -266,6 +266,17 @@ namespace NzbDrone.Core.Organizer return TitlePrefixRegex.Replace(title, "$2, $1$3"); } + public static string CleanTitleThe(string title) + { + if (TitlePrefixRegex.IsMatch(title)) + { + var splitResult = TitlePrefixRegex.Split(title); + return $"{CleanTitle(splitResult[2]).Trim()}, {splitResult[1]}{CleanTitle(splitResult[3])}"; + } + + return CleanTitle(title); + } + public static string TitleFirstCharacter(string title) { if (char.IsLetterOrDigit(title[0])) @@ -300,6 +311,7 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Artist Name}"] = m => Truncate(artist.Name, m.CustomFormat); tokenHandlers["{Artist CleanName}"] = m => Truncate(CleanTitle(artist.Name), m.CustomFormat); tokenHandlers["{Artist NameThe}"] = m => Truncate(TitleThe(artist.Name), m.CustomFormat); + tokenHandlers["{Artist CleanNameThe}"] = m => Truncate(CleanTitleThe(artist.Name), m.CustomFormat); tokenHandlers["{Artist Genre}"] = m => artist.Metadata.Value.Genres?.FirstOrDefault() ?? string.Empty; tokenHandlers["{Artist NameFirstCharacter}"] = m => TitleFirstCharacter(TitleThe(artist.Name)); tokenHandlers["{Artist MbId}"] = m => artist.ForeignArtistId ?? string.Empty; @@ -315,6 +327,7 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Album Title}"] = m => Truncate(album.Title, m.CustomFormat); tokenHandlers["{Album CleanTitle}"] = m => Truncate(CleanTitle(album.Title), m.CustomFormat); tokenHandlers["{Album TitleThe}"] = m => Truncate(TitleThe(album.Title), m.CustomFormat); + tokenHandlers["{Album CleanTitleThe}"] = m => Truncate(CleanTitleThe(album.Title), m.CustomFormat); tokenHandlers["{Album Type}"] = m => album.AlbumType; tokenHandlers["{Album Genre}"] = m => album.Genres.FirstOrDefault() ?? string.Empty; tokenHandlers["{Album MbId}"] = m => album.ForeignAlbumId ?? string.Empty; @@ -346,6 +359,7 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{Track ArtistName}"] = m => Truncate(firstArtist.Name, m.CustomFormat); tokenHandlers["{Track ArtistCleanName}"] = m => Truncate(CleanTitle(firstArtist.Name), m.CustomFormat); tokenHandlers["{Track ArtistNameThe}"] = m => Truncate(TitleThe(firstArtist.Name), m.CustomFormat); + tokenHandlers["{Track ArtistCleanNameThe}"] = m => Truncate(CleanTitleThe(firstArtist.Name), m.CustomFormat); tokenHandlers["{Track ArtistMbId}"] = m => firstArtist.ForeignArtistId ?? string.Empty; } } From 2a8c67badcb10d2d74480167a9d7f5e8fee1a635 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 25 Jan 2024 20:51:55 -0600 Subject: [PATCH 003/491] New: Preserve replaygain tags --- .../MediaFiles/AudioTagServiceFixture.cs | 34 ++++++++++++++++++- .../MediaFiles/AudioTagService.cs | 16 +++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs index 1b155c1df..cfc6259c4 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs @@ -326,7 +326,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture [Test] public void should_ignore_non_parsable_id3v23_date() { - GivenFileCopy("nin.mp2"); + GivenFileCopy("nin.mp3"); using (var file = TagLib.File.Create(_copiedFile)) { @@ -440,5 +440,37 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Once()); } + + [TestCase("nin.mp3")] + public void should_ignore_replaygain_tags_during_scrub(string filename) + { + Mocker.GetMock() + .Setup(x => x.ScrubAudioTags) + .Returns(true); + + GivenFileCopy(filename); + + using (var preFile = TagLib.File.Create(_copiedFile)) + { + preFile.Tag.ReplayGainAlbumPeak = 1; + preFile.Tag.ReplayGainAlbumGain = 500; + preFile.Tag.ReplayGainTrackPeak = 2; + preFile.Tag.ReplayGainTrackGain = 250; + preFile.Save(); + } + + var file = GivenPopulatedTrackfile(0); + + file.Path = _copiedFile; + Subject.WriteTags(file, false, true); + + using (var postFile = TagLib.File.Create(_copiedFile)) + { + postFile.Tag.ReplayGainAlbumGain.Should().Be(500); + postFile.Tag.ReplayGainAlbumPeak.Should().Be(1); + postFile.Tag.ReplayGainTrackGain.Should().Be(250); + postFile.Tag.ReplayGainTrackPeak.Should().Be(2); + } + } } } diff --git a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs index abb727111..6c0bdc4f3 100644 --- a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs +++ b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs @@ -151,8 +151,24 @@ namespace NzbDrone.Core.MediaFiles try { file = TagLib.File.Create(path); + + var replayGainAlbumGain = file.Tag.ReplayGainAlbumGain; + var replayGainAlbumPeak = file.Tag.ReplayGainAlbumPeak; + var replayGainTrackGain = file.Tag.ReplayGainTrackGain; + var replayGainTrackPeak = file.Tag.ReplayGainTrackPeak; + file.RemoveTags(TagLib.TagTypes.AllTags); file.Save(); + file.Dispose(); + + file = TagLib.File.Create(path); + + file.Tag.ReplayGainAlbumGain = replayGainAlbumGain; + file.Tag.ReplayGainAlbumPeak = replayGainAlbumPeak; + file.Tag.ReplayGainTrackGain = replayGainTrackGain; + file.Tag.ReplayGainTrackPeak = replayGainTrackPeak; + + file.Save(); } catch (CorruptFileException ex) { From 6e43d8a4fea12b094486e79b7b90cde1943f43ff Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 4 Feb 2024 12:50:55 -0600 Subject: [PATCH 004/491] New: Ability to import aiff files Closes #4102 --- src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs b/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs index 8d749a98a..b87fcc619 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileExtensions.cs @@ -24,7 +24,10 @@ namespace NzbDrone.Core.MediaFiles { ".wav", Quality.WAV }, { ".wv", Quality.WAVPACK }, { ".flac", Quality.FLAC }, - { ".ape", Quality.APE } + { ".ape", Quality.APE }, + { ".aif", Quality.Unknown }, + { ".aiff", Quality.Unknown }, + { ".aifc", Quality.Unknown } }; } From aecf5bba49fb736293c79ca310ec5b6582dcc928 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 4 Feb 2024 13:09:11 -0600 Subject: [PATCH 005/491] Fixed: Correctly map artist logos to clearlogo type Closes #2627 --- src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 53644c089..444bbc204 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -624,7 +624,8 @@ namespace NzbDrone.Core.MetadataSource.SkyHook case "disc": return MediaCoverTypes.Disc; case "logo": - return MediaCoverTypes.Logo; + case "clearlogo": + return MediaCoverTypes.Clearlogo; default: return MediaCoverTypes.Unknown; } From 3702fa773c28441ad570889f14084a1bb88a6cc0 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 4 Feb 2024 14:01:30 -0600 Subject: [PATCH 006/491] New: Filter by Monitor New Items Closes #3707 --- frontend/src/Artist/Artist.ts | 1 + .../src/Artist/Index/Table/ArtistIndexRow.css | 1 + .../Index/Table/ArtistIndexRow.css.d.ts | 1 + .../src/Artist/Index/Table/ArtistIndexRow.tsx | 10 ++++++++++ .../Index/Table/ArtistIndexTableHeader.css | 1 + .../Table/ArtistIndexTableHeader.css.d.ts | 1 + .../Filter/Builder/FilterBuilderRow.js | 4 ++++ .../MonitorNewItemsFilterBuilderRowValue.js | 19 +++++++++++++++++++ .../Helpers/Props/filterBuilderValueTypes.js | 1 + .../src/Store/Actions/artistIndexActions.js | 12 ++++++++++++ 10 files changed, 51 insertions(+) create mode 100644 frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js diff --git a/frontend/src/Artist/Artist.ts b/frontend/src/Artist/Artist.ts index 61266a8d4..d89e32f34 100644 --- a/frontend/src/Artist/Artist.ts +++ b/frontend/src/Artist/Artist.ts @@ -36,6 +36,7 @@ interface Artist extends ModelBase { nextAlbum?: Album; qualityProfileId: number; metadataProfileId: number; + monitorNewItems: string; ratings: Ratings; rootFolderPath: string; sortName: string; diff --git a/frontend/src/Artist/Index/Table/ArtistIndexRow.css b/frontend/src/Artist/Index/Table/ArtistIndexRow.css index b75ad6afd..35d03c263 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexRow.css +++ b/frontend/src/Artist/Index/Table/ArtistIndexRow.css @@ -67,6 +67,7 @@ flex: 1 0 125px; } +.monitorNewItems, .nextAlbum, .lastAlbum, .added, diff --git a/frontend/src/Artist/Index/Table/ArtistIndexRow.css.d.ts b/frontend/src/Artist/Index/Table/ArtistIndexRow.css.d.ts index fd8d84e17..4855aec75 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexRow.css.d.ts +++ b/frontend/src/Artist/Index/Table/ArtistIndexRow.css.d.ts @@ -14,6 +14,7 @@ interface CssExports { 'lastAlbum': string; 'link': string; 'metadataProfileId': string; + 'monitorNewItems': string; 'nextAlbum': string; 'overlayTitle': string; 'path': string; diff --git a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx index e87545093..bff0eb24f 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx +++ b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx @@ -24,6 +24,7 @@ import TagListConnector from 'Components/TagListConnector'; import { icons } from 'Helpers/Props'; import { executeCommand } from 'Store/Actions/commandActions'; import formatBytes from 'Utilities/Number/formatBytes'; +import titleCase from 'Utilities/String/titleCase'; import translate from 'Utilities/String/translate'; import AlbumsCell from './AlbumsCell'; import hasGrowableColumns from './hasGrowableColumns'; @@ -56,6 +57,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { monitored, status, path, + monitorNewItems, nextAlbum, lastAlbum, added, @@ -238,6 +240,14 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { ); } + if (name === 'monitorNewItems') { + return ( + + {titleCase(monitorNewItems)} + + ); + } + if (name === 'nextAlbum') { if (nextAlbum) { return ( diff --git a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css index 6da0be920..7ea4e94aa 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css +++ b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css @@ -31,6 +31,7 @@ flex: 1 0 125px; } +.monitorNewItems, .nextAlbum, .lastAlbum, .added, diff --git a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css.d.ts b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css.d.ts index 4d9dcd20b..467b401bb 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css.d.ts +++ b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.css.d.ts @@ -11,6 +11,7 @@ interface CssExports { 'lastAlbum': string; 'latestAlbum': string; 'metadataProfileId': string; + 'monitorNewItems': string; 'nextAlbum': string; 'path': string; 'qualityProfileId': string; diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js index f613d20bc..8be71aaff 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderRow.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderRow.js @@ -11,6 +11,7 @@ import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector'; import HistoryEventTypeFilterBuilderRowValue from './HistoryEventTypeFilterBuilderRowValue'; import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector'; import MetadataProfileFilterBuilderRowValueConnector from './MetadataProfileFilterBuilderRowValueConnector'; +import MonitorNewItemsFilterBuilderRowValue from './MonitorNewItemsFilterBuilderRowValue'; import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue'; import QualityFilterBuilderRowValueConnector from './QualityFilterBuilderRowValueConnector'; import QualityProfileFilterBuilderRowValueConnector from './QualityProfileFilterBuilderRowValueConnector'; @@ -68,6 +69,9 @@ function getRowValueConnector(selectedFilterBuilderProp) { case filterBuilderValueTypes.METADATA_PROFILE: return MetadataProfileFilterBuilderRowValueConnector; + case filterBuilderValueTypes.MONITOR_NEW_ITEMS: + return MonitorNewItemsFilterBuilderRowValue; + case filterBuilderValueTypes.PROTOCOL: return ProtocolFilterBuilderRowValue; diff --git a/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js b/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js new file mode 100644 index 000000000..3b178da06 --- /dev/null +++ b/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js @@ -0,0 +1,19 @@ +import React from 'react'; +import FilterBuilderRowValue from './FilterBuilderRowValue'; + +const options = [ + { id: 'all', name: 'All Albums' }, + { id: 'new', name: 'New' }, + { id: 'none', name: 'None' } +]; + +function MonitorNewItemsFilterBuilderRowValue(props) { + return ( + + ); +} + +export default MonitorNewItemsFilterBuilderRowValue; diff --git a/frontend/src/Helpers/Props/filterBuilderValueTypes.js b/frontend/src/Helpers/Props/filterBuilderValueTypes.js index b19d16c8a..005ea0b7a 100644 --- a/frontend/src/Helpers/Props/filterBuilderValueTypes.js +++ b/frontend/src/Helpers/Props/filterBuilderValueTypes.js @@ -5,6 +5,7 @@ export const DEFAULT = 'default'; export const HISTORY_EVENT_TYPE = 'historyEventType'; export const INDEXER = 'indexer'; export const METADATA_PROFILE = 'metadataProfile'; +export const MONITOR_NEW_ITEMS = 'monitorNewItems'; export const PROTOCOL = 'protocol'; export const QUALITY = 'quality'; export const QUALITY_PROFILE = 'qualityProfile'; diff --git a/frontend/src/Store/Actions/artistIndexActions.js b/frontend/src/Store/Actions/artistIndexActions.js index 756a6ee25..72cb20142 100644 --- a/frontend/src/Store/Actions/artistIndexActions.js +++ b/frontend/src/Store/Actions/artistIndexActions.js @@ -94,6 +94,12 @@ export const defaultState = { isSortable: true, isVisible: false }, + { + name: 'monitorNewItems', + label: () => translate('MonitorNewItems'), + isSortable: true, + isVisible: false + }, { name: 'nextAlbum', label: () => translate('NextAlbum'), @@ -267,6 +273,12 @@ export const defaultState = { type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.METADATA_PROFILE }, + { + name: 'monitorNewItems', + label: () => translate('MonitorNewItems'), + type: filterBuilderTypes.EXACT, + valueType: filterBuilderValueTypes.MONITOR_NEW_ITEMS + }, { name: 'nextAlbum', label: () => translate('NextAlbum'), From d38c44d25e5cdbf51027e0cd3a2bfb5c56ccc71f Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 4 Feb 2024 14:26:15 -0600 Subject: [PATCH 007/491] New: Option to disable cover art embed in files (#4547) * New: Option to disable cover art embed in files Fixes #2488 * Update src/NzbDrone.Core/MediaFiles/AudioTagService.cs Co-authored-by: Bogdan --- .../MetadataProvider/MetadataProvider.js | 17 ++++++++++++ .../Config/MetadataProviderConfigResource.cs | 2 ++ .../MediaFiles/AudioTagServiceFixture.cs | 4 +++ .../Configuration/ConfigService.cs | 7 +++++ .../Configuration/IConfigService.cs | 1 + src/NzbDrone.Core/Localization/Core/en.json | 2 ++ .../MediaFiles/AudioTagService.cs | 26 +++++++++++-------- 7 files changed, 48 insertions(+), 11 deletions(-) diff --git a/frontend/src/Settings/Metadata/MetadataProvider/MetadataProvider.js b/frontend/src/Settings/Metadata/MetadataProvider/MetadataProvider.js index e0bbe3ec6..10448892c 100644 --- a/frontend/src/Settings/Metadata/MetadataProvider/MetadataProvider.js +++ b/frontend/src/Settings/Metadata/MetadataProvider/MetadataProvider.js @@ -61,6 +61,23 @@ function MetadataProvider(props) { /> + { + settings.writeAudioTags.value !== 'no' && + + + {translate('EmbedCoverArtInAudioFiles')} + + + + + } + {translate('ScrubExistingTags')} diff --git a/src/Lidarr.Api.V1/Config/MetadataProviderConfigResource.cs b/src/Lidarr.Api.V1/Config/MetadataProviderConfigResource.cs index 8d29a2356..af2c930fd 100644 --- a/src/Lidarr.Api.V1/Config/MetadataProviderConfigResource.cs +++ b/src/Lidarr.Api.V1/Config/MetadataProviderConfigResource.cs @@ -8,6 +8,7 @@ namespace Lidarr.Api.V1.Config public string MetadataSource { get; set; } public WriteAudioTagsType WriteAudioTags { get; set; } public bool ScrubAudioTags { get; set; } + public bool EmbedCoverArt { get; set; } } public static class MetadataProviderConfigResourceMapper @@ -19,6 +20,7 @@ namespace Lidarr.Api.V1.Config MetadataSource = model.MetadataSource, WriteAudioTags = model.WriteAudioTags, ScrubAudioTags = model.ScrubAudioTags, + EmbedCoverArt = model.EmbedCoverArt, }; } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs index cfc6259c4..6a0520803 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs @@ -65,6 +65,10 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture .Setup(x => x.WriteAudioTags) .Returns(WriteAudioTagsType.Sync); + Mocker.GetMock() + .Setup(x => x.EmbedCoverArt) + .Returns(true); + var imageFile = Path.Combine(_testdir, "nin.png"); var imageSize = _diskProvider.GetFileSize(imageFile); diff --git a/src/NzbDrone.Core/Configuration/ConfigService.cs b/src/NzbDrone.Core/Configuration/ConfigService.cs index 84a2bfe6d..6aa7c5448 100644 --- a/src/NzbDrone.Core/Configuration/ConfigService.cs +++ b/src/NzbDrone.Core/Configuration/ConfigService.cs @@ -283,6 +283,13 @@ namespace NzbDrone.Core.Configuration set { SetValue("ScrubAudioTags", value); } } + public bool EmbedCoverArt + { + get { return GetValueBoolean("EmbedCoverArt", true); } + + set { SetValue("EmbedCoverArt", value); } + } + public int FirstDayOfWeek { get { return GetValueInt("FirstDayOfWeek", (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek); } diff --git a/src/NzbDrone.Core/Configuration/IConfigService.cs b/src/NzbDrone.Core/Configuration/IConfigService.cs index 4009ffb6d..1665334d4 100644 --- a/src/NzbDrone.Core/Configuration/IConfigService.cs +++ b/src/NzbDrone.Core/Configuration/IConfigService.cs @@ -76,6 +76,7 @@ namespace NzbDrone.Core.Configuration string MetadataSource { get; set; } WriteAudioTagsType WriteAudioTags { get; set; } bool ScrubAudioTags { get; set; } + bool EmbedCoverArt { get; set; } // Forms Auth string RijndaelPassphrase { get; } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index c08cf304d..9139ebb18 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -402,6 +402,8 @@ "EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedImportLists": "Edit Selected Import Lists", "EditSelectedIndexers": "Edit Selected Indexers", + "EmbedCoverArtInAudioFiles": "Embed Cover Art In Audio Files", + "EmbedCoverArtHelpText": "Embed Lidarr album art into audio files when writing tags", "Enable": "Enable", "EnableAutomaticAdd": "Enable Automatic Add", "EnableAutomaticAddHelpText": "Add artist/albums to {appName} when syncs are performed via the UI or by {appName}", diff --git a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs index 6c0bdc4f3..0263372dc 100644 --- a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs +++ b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs @@ -80,21 +80,25 @@ namespace NzbDrone.Core.MediaFiles var albumartist = album.Artist.Value; var artist = track.ArtistMetadata.Value; - var cover = album.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover); string imageFile = null; long imageSize = 0; - if (cover != null) + + if (_configService.EmbedCoverArt) { - imageFile = _mediaCoverService.GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, null); - _logger.Trace($"Embedding: {imageFile}"); - var fileInfo = _diskProvider.GetFileInfo(imageFile); - if (fileInfo.Exists) + var cover = album.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover); + if (cover != null) { - imageSize = fileInfo.Length; - } - else - { - imageFile = null; + imageFile = _mediaCoverService.GetCoverPath(album.Id, MediaCoverEntity.Album, cover.CoverType, cover.Extension, null); + _logger.Trace("Embedding: {0}", imageFile); + var fileInfo = _diskProvider.GetFileInfo(imageFile); + if (fileInfo.Exists) + { + imageSize = fileInfo.Length; + } + else + { + imageFile = null; + } } } From 09e9162aa6860fa788ac014dc468e035e1b38e0f Mon Sep 17 00:00:00 2001 From: Servarr Date: Sun, 4 Feb 2024 20:38:54 +0000 Subject: [PATCH 008/491] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index be7e0bd6f..05700cd97 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -10795,6 +10795,9 @@ }, "scrubAudioTags": { "type": "boolean" + }, + "embedCoverArt": { + "type": "boolean" } }, "additionalProperties": false From 49883d0e30e65dbd0ac28547864ca685e6f9ce34 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 5 Feb 2024 14:15:10 +0200 Subject: [PATCH 009/491] Add some translations for artist table index --- .../src/Artist/Index/Table/ArtistIndexRow.tsx | 18 +++------- .../MonitorNewItemsFilterBuilderRowValue.js | 19 ----------- .../MonitorNewItemsFilterBuilderRowValue.tsx | 33 +++++++++++++++++++ .../src/Utilities/String/firstCharToUpper.js | 9 +++++ 4 files changed, 47 insertions(+), 32 deletions(-) delete mode 100644 frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js create mode 100644 frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.tsx create mode 100644 frontend/src/Utilities/String/firstCharToUpper.js diff --git a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx index bff0eb24f..376fdb359 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx +++ b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx @@ -24,7 +24,7 @@ import TagListConnector from 'Components/TagListConnector'; import { icons } from 'Helpers/Props'; import { executeCommand } from 'Store/Actions/commandActions'; import formatBytes from 'Utilities/Number/formatBytes'; -import titleCase from 'Utilities/String/titleCase'; +import firstCharToUpper from 'Utilities/String/firstCharToUpper'; import translate from 'Utilities/String/translate'; import AlbumsCell from './AlbumsCell'; import hasGrowableColumns from './hasGrowableColumns'; @@ -224,14 +224,6 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { ); } - if (name === 'qualityProfileId') { - return ( - - {qualityProfile.name} - - ); - } - if (name === 'metadataProfileId') { return ( @@ -243,7 +235,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { if (name === 'monitorNewItems') { return ( - {titleCase(monitorNewItems)} + {translate(firstCharToUpper(monitorNewItems))} ); } @@ -262,7 +254,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { } return ( - None + {translate('None')} ); } @@ -281,7 +273,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { } return ( - None + {translate('None')} ); } @@ -338,7 +330,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { if (name === 'path') { return ( - {path} + {path} ); } diff --git a/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js b/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js deleted file mode 100644 index 3b178da06..000000000 --- a/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import FilterBuilderRowValue from './FilterBuilderRowValue'; - -const options = [ - { id: 'all', name: 'All Albums' }, - { id: 'new', name: 'New' }, - { id: 'none', name: 'None' } -]; - -function MonitorNewItemsFilterBuilderRowValue(props) { - return ( - - ); -} - -export default MonitorNewItemsFilterBuilderRowValue; diff --git a/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.tsx new file mode 100644 index 000000000..812d8c5b1 --- /dev/null +++ b/frontend/src/Components/Filter/Builder/MonitorNewItemsFilterBuilderRowValue.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import FilterBuilderRowValueProps from 'Components/Filter/Builder/FilterBuilderRowValueProps'; +import translate from 'Utilities/String/translate'; +import FilterBuilderRowValue from './FilterBuilderRowValue'; + +const options = [ + { + id: 'all', + get name() { + return translate('AllAlbums'); + }, + }, + { + id: 'new', + get name() { + return translate('New'); + }, + }, + { + id: 'none', + get name() { + return translate('None'); + }, + }, +]; + +function MonitorNewItemsFilterBuilderRowValue( + props: FilterBuilderRowValueProps +) { + return ; +} + +export default MonitorNewItemsFilterBuilderRowValue; diff --git a/frontend/src/Utilities/String/firstCharToUpper.js b/frontend/src/Utilities/String/firstCharToUpper.js new file mode 100644 index 000000000..1ce64831c --- /dev/null +++ b/frontend/src/Utilities/String/firstCharToUpper.js @@ -0,0 +1,9 @@ +function firstCharToUpper(input) { + if (!input) { + return ''; + } + + return [].map.call(input, (char, i) => (i ? char : char.toUpperCase())).join(''); +} + +export default firstCharToUpper; From 0bcbf9df81afe4ca349eed0a68d04a4a75908347 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 2 Jan 2021 10:30:11 -0800 Subject: [PATCH 010/491] Fixed: Don't convert artist/album selection filter to lower case in state (cherry picked from commit ca52eb76ca2e286479f1803f399d5f5b563cfb41) Closes #1857 --- .../src/InteractiveImport/Album/SelectAlbumModalContent.js | 5 +++-- .../src/InteractiveImport/Artist/SelectArtistModalContent.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js b/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js index 91c284636..5f2cc9696 100644 --- a/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js +++ b/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js @@ -55,7 +55,7 @@ class SelectAlbumModalContent extends Component { // Listeners onFilterChange = ({ value }) => { - this.setState({ filter: value.toLowerCase() }); + this.setState({ filter: value }); }; // @@ -71,6 +71,7 @@ class SelectAlbumModalContent extends Component { } = this.props; const filter = this.state.filter; + const filterLower = filter.toLowerCase(); return ( @@ -107,7 +108,7 @@ class SelectAlbumModalContent extends Component { { items.map((item) => { - return item.title.toLowerCase().includes(filter) ? + return item.title.toLowerCase().includes(filterLower) ? ( { - this.setState({ filter: value.toLowerCase() }); + this.setState({ filter: value }); }; // @@ -43,6 +43,7 @@ class SelectArtistModalContent extends Component { } = this.props; const filter = this.state.filter; + const filterLower = filter.toLowerCase(); return ( @@ -69,7 +70,7 @@ class SelectArtistModalContent extends Component { > { items.map((item) => { - return item.artistName.toLowerCase().includes(filter) ? + return item.artistName.toLowerCase().includes(filterLower) ? ( Date: Thu, 6 Dec 2018 20:58:59 -0800 Subject: [PATCH 011/491] New: Store last search time for AlbumSearch (cherry picked from commit 9af57c6786eedd9beda4e1c6b8cdca20d165b622) --- .../Migration/077_album_last_searched_time.cs | 14 ++++++++++++++ .../IndexerSearch/ReleaseSearchService.cs | 10 ++++++++++ src/NzbDrone.Core/Music/Model/Album.cs | 1 + src/NzbDrone.Core/Music/Services/AlbumService.cs | 6 ++++++ 4 files changed, 31 insertions(+) create mode 100644 src/NzbDrone.Core/Datastore/Migration/077_album_last_searched_time.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/077_album_last_searched_time.cs b/src/NzbDrone.Core/Datastore/Migration/077_album_last_searched_time.cs new file mode 100644 index 000000000..7100103d8 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/077_album_last_searched_time.cs @@ -0,0 +1,14 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(077)] + public class album_last_searched_time : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("Albums").AddColumn("LastSearchTime").AsDateTimeOffset().Nullable(); + } + } +} diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index cc6fad685..89b71f62e 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -139,6 +139,16 @@ namespace NzbDrone.Core.IndexerSearch _logger.Debug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count); + // Update the last search time for all albums if at least 1 indexer was searched. + if (indexers.Any()) + { + var lastSearchTime = DateTime.UtcNow; + _logger.Debug("Setting last search time to: {0}", lastSearchTime); + + criteriaBase.Albums.ForEach(a => a.LastSearchTime = lastSearchTime); + _albumService.UpdateLastSearchTime(criteriaBase.Albums); + } + return _makeDownloadDecision.GetSearchDecision(reports, criteriaBase).ToList(); } diff --git a/src/NzbDrone.Core/Music/Model/Album.cs b/src/NzbDrone.Core/Music/Model/Album.cs index 582ffe241..6ac9c13b0 100644 --- a/src/NzbDrone.Core/Music/Model/Album.cs +++ b/src/NzbDrone.Core/Music/Model/Album.cs @@ -38,6 +38,7 @@ namespace NzbDrone.Core.Music public string AlbumType { get; set; } public List SecondaryTypes { get; set; } public Ratings Ratings { get; set; } + public DateTime? LastSearchTime { get; set; } // These are Lidarr generated/config public string CleanTitle { get; set; } diff --git a/src/NzbDrone.Core/Music/Services/AlbumService.cs b/src/NzbDrone.Core/Music/Services/AlbumService.cs index 1f1d421fb..91f3fd37c 100644 --- a/src/NzbDrone.Core/Music/Services/AlbumService.cs +++ b/src/NzbDrone.Core/Music/Services/AlbumService.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Core.Music Album UpdateAlbum(Album album); void SetAlbumMonitored(int albumId, bool monitored); void SetMonitored(IEnumerable ids, bool monitored); + void UpdateLastSearchTime(List albums); PagingSpec AlbumsWithoutFiles(PagingSpec pagingSpec); List AlbumsBetweenDates(DateTime start, DateTime end, bool includeUnmonitored); List ArtistAlbumsBetweenDates(Artist artist, DateTime start, DateTime end, bool includeUnmonitored); @@ -301,6 +302,11 @@ namespace NzbDrone.Core.Music } } + public void UpdateLastSearchTime(List albums) + { + _albumRepository.SetFields(albums, a => a.LastSearchTime); + } + public void Handle(ArtistsDeletedEvent message) { // TODO Do this in one call instead of one for each artist? From 2fc966af0c526a3e75a0bf523225b98dcfc21a42 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 5 Feb 2024 19:55:41 +0200 Subject: [PATCH 012/491] New: Missing/Cutoff Unmet searches will search for albums that haven't been searched recently first Closes #3250 Simplify filter expression for cutoff unmet album search --- .../IndexerSearch/AlbumSearchService.cs | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs b/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs index 1b2dbc649..ef75dba40 100644 --- a/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs @@ -1,7 +1,5 @@ -using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; using System.Threading.Tasks; using NLog; using NzbDrone.Common.Instrumentation.Extensions; @@ -40,21 +38,31 @@ namespace NzbDrone.Core.IndexerSearch _logger = logger; } - private async Task SearchForMissingAlbums(List albums, bool userInvokedSearch) + private async Task SearchForBulkAlbums(List albums, bool userInvokedSearch) { _logger.ProgressInfo("Performing missing search for {0} albums", albums.Count); var downloadedCount = 0; - foreach (var album in albums) + foreach (var album in albums.OrderBy(a => a.LastSearchTime ?? DateTime.MinValue)) { List decisions; - decisions = await _releaseSearchService.AlbumSearch(album.Id, false, userInvokedSearch, false); + + try + { + decisions = await _releaseSearchService.AlbumSearch(album.Id, false, userInvokedSearch, false); + } + catch (Exception ex) + { + _logger.Error(ex, "Unable to search for album: [{0}]", album); + continue; + } + var processed = await _processDownloadDecisions.ProcessDecisions(decisions); downloadedCount += processed.Grabbed.Count; } - _logger.ProgressInfo("Completed missing search for {0} albums. {1} reports downloaded.", albums.Count, downloadedCount); + _logger.ProgressInfo("Completed search for {0} albums. {1} reports downloaded.", albums.Count, downloadedCount); } public void Execute(AlbumSearchCommand message) @@ -106,17 +114,11 @@ namespace NzbDrone.Core.IndexerSearch var queue = _queueService.GetQueue().Where(q => q.Album != null).Select(q => q.Album.Id); var missing = albums.Where(e => !queue.Contains(e.Id)).ToList(); - SearchForMissingAlbums(missing, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); + SearchForBulkAlbums(missing, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); } public void Execute(CutoffUnmetAlbumSearchCommand message) { - Expression> filterExpression; - - filterExpression = v => - v.Monitored == true && - v.Artist.Value.Monitored == true; - var pagingSpec = new PagingSpec { Page = 1, @@ -125,14 +127,13 @@ namespace NzbDrone.Core.IndexerSearch SortKey = "Id" }; - pagingSpec.FilterExpressions.Add(filterExpression); + pagingSpec.FilterExpressions.Add(v => v.Monitored == true && v.Artist.Value.Monitored == true); var albums = _albumCutoffService.AlbumsWhereCutoffUnmet(pagingSpec).Records.ToList(); - var queue = _queueService.GetQueue().Where(q => q.Album != null).Select(q => q.Album.Id); - var missing = albums.Where(e => !queue.Contains(e.Id)).ToList(); + var cutoffUnmet = albums.Where(e => !queue.Contains(e.Id)).ToList(); - SearchForMissingAlbums(missing, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); + SearchForBulkAlbums(cutoffUnmet, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); } } } From abefdca0fcdbc7e2f2c7fa8a3c2958737d31e4a4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 5 Feb 2024 20:42:25 +0200 Subject: [PATCH 013/491] Fix Missing/CutoffUnmet search all warnings --- frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js | 4 ++-- frontend/src/Wanted/Missing/Missing.js | 4 ++-- src/NzbDrone.Core/Localization/Core/de.json | 2 +- src/NzbDrone.Core/Localization/Core/el.json | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 7 ++++--- src/NzbDrone.Core/Localization/Core/fi.json | 2 +- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 2 +- src/NzbDrone.Core/Localization/Core/pt_BR.json | 2 +- src/NzbDrone.Core/Localization/Core/zh_CN.json | 2 +- 10 files changed, 15 insertions(+), 14 deletions(-) diff --git a/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js b/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js index 7e3b971ad..e13d6b539 100644 --- a/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js +++ b/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js @@ -244,10 +244,10 @@ class CutoffUnmet extends Component { message={
- {translate('MassAlbumsCutoffUnmetWarning', [totalRecords])} + {translate('SearchForAllCutoffUnmetAlbumsConfirmationCount', { totalRecords })}
- {translate('ThisCannotBeCancelled')} + {translate('MassSearchCancelWarning')}
} diff --git a/frontend/src/Wanted/Missing/Missing.js b/frontend/src/Wanted/Missing/Missing.js index c29d66cf5..65b0a0e1c 100644 --- a/frontend/src/Wanted/Missing/Missing.js +++ b/frontend/src/Wanted/Missing/Missing.js @@ -261,10 +261,10 @@ class Missing extends Component { message={
- {translate('MassAlbumsSearchWarning', [totalRecords])} + {translate('SearchForAllMissingAlbumsConfirmationCount', { totalRecords })}
- {translate('ThisCannotBeCancelled')} + {translate('MassSearchCancelWarning')}
} diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index fc845cc02..167e4e4e9 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -790,7 +790,7 @@ "ImportFailed": "Import fehlgeschlagen", "EndedOnly": "Nur abgeschlossene", "MassAlbumsCutoffUnmetWarning": "Bist du dir sicher, dass du nach allen '{0}' Alben suchen willst deren Schwelle nicht erreicht worden ist?", - "MassAlbumsSearchWarning": "Bist du dir sicher, dass du nach allen '{0}' fehlenden Alben suchen willst?", + "SearchForAllMissingAlbumsConfirmationCount": "Bist du dir sicher, dass du nach allen '{0}' fehlenden Alben suchen willst?", "MissingTracks": "Fehlende Tracks", "MonitorNewItems": "Neues Album überwachen", "MonitoringOptionsHelpText": "Welche Alben sollen überwacht werden nachdem der Künstler hinzugefügt wurde (einmalige Anpassung)", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 6dc3a0749..f1f9c628c 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -730,7 +730,7 @@ "IsInUseCantDeleteAQualityProfileThatIsAttachedToAnArtistOrImportList": "Δεν είναι δυνατή η διαγραφή ενός προφίλ ποιότητας που είναι συνδεδεμένο με έναν καλλιτέχνη ή λίστα εισαγωγής", "LatestAlbumData": "Παρακολουθήστε τα τελευταία άλμπουμ και τα μελλοντικά άλμπουμ", "MassAlbumsCutoffUnmetWarning": "Είστε βέβαιοι ότι θέλετε να αναζητήσετε όλα τα άλμπουμ \"{0}\" Cutoff Unmet;", - "MassAlbumsSearchWarning": "Είστε βέβαιοι ότι θέλετε να αναζητήσετε όλα τα άλμπουμ \"{0}\" που λείπουν;", + "SearchForAllMissingAlbumsConfirmationCount": "Είστε βέβαιοι ότι θέλετε να αναζητήσετε όλα τα άλμπουμ \"{0}\" που λείπουν;", "MetadataProfiles": "Προφίλ μεταδεδομένων", "MinimumCustomFormatScoreHelpText": "Απαιτείται ελάχιστη βαθμολογία προσαρμοσμένης μορφής για την παράκαμψη της καθυστέρησης για το προτιμώμενο πρωτόκολλο", "MonitorAlbumExistingOnlyWarning": "Αυτή είναι μια εφάπαξ προσαρμογή της ρύθμισης παρακολούθησης για κάθε άλμπουμ. Χρησιμοποιήστε την επιλογή στην περιοχή Καλλιτέχνης/Επεξεργασία για να ελέγξετε τι συμβαίνει στα άλμπουμ που προστέθηκαν πρόσφατα", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 9139ebb18..99843ffd9 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -402,8 +402,8 @@ "EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedImportLists": "Edit Selected Import Lists", "EditSelectedIndexers": "Edit Selected Indexers", - "EmbedCoverArtInAudioFiles": "Embed Cover Art In Audio Files", "EmbedCoverArtHelpText": "Embed Lidarr album art into audio files when writing tags", + "EmbedCoverArtInAudioFiles": "Embed Cover Art In Audio Files", "Enable": "Enable", "EnableAutomaticAdd": "Enable Automatic Add", "EnableAutomaticAddHelpText": "Add artist/albums to {appName} when syncs are performed via the UI or by {appName}", @@ -634,7 +634,7 @@ "MarkAsFailed": "Mark as Failed", "MarkAsFailedMessageText": "Are you sure you want to mark '{0}' as failed?", "MassAlbumsCutoffUnmetWarning": "Are you sure you want to search for all '{0}' Cutoff Unmet albums?", - "MassAlbumsSearchWarning": "Are you sure you want to search for all '{0}' missing albums?", + "MassSearchCancelWarning": "This cannot be cancelled once started without restarting {appName} or disabling all of your indexers.", "MaximumLimits": "Maximum Limits", "MaximumSize": "Maximum Size", "MaximumSizeHelpText": "Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited.", @@ -964,7 +964,9 @@ "SearchAll": "Search All", "SearchBoxPlaceHolder": "eg. Breaking Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a39717f1d25", "SearchForAllCutoffUnmetAlbums": "Search for all Cutoff Unmet albums", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Are you sure you want to search for all {totalRecords} Cutoff Unmet albums?", "SearchForAllMissingAlbums": "Search for all missing albums", + "SearchForAllMissingAlbumsConfirmationCount": "Are you sure you want to search for all {totalRecords} missing albums?", "SearchForMissing": "Search for Missing", "SearchForMonitoredAlbums": "Search for monitored albums", "SearchMonitored": "Search Monitored", @@ -1078,7 +1080,6 @@ "ThemeHelpText": "Change Application UI Theme, 'Auto' Theme will use your OS Theme to set Light or Dark mode. Inspired by Theme.Park", "ThereWasAnErrorLoadingThisItem": "There was an error loading this item", "ThereWasAnErrorLoadingThisPage": "There was an error loading this page", - "ThisCannotBeCancelled": "This cannot be cancelled once started without disabling all of your indexers.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "This will apply to all indexers, please follow the rules set forth by them", "Time": "Time", "TimeFormat": "Time Format", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index fca7e1756..b29a9afbf 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -802,7 +802,7 @@ "SelectAlbum": "Valitse albumi", "SelectAlbumRelease": "Valitse albumin julkaisu", "FutureAlbumsData": "Seuraa albumeita, joita ei ole vielä julkaistu.", - "MassAlbumsSearchWarning": "Haluatko varmasti etsiä '{0}' puuttuvaa albumia?", + "SearchForAllMissingAlbumsConfirmationCount": "Haluatko varmasti etsiä '{0}' puuttuvaa albumia?", "EditArtist": "Muokkaa esittäjää", "DeleteSelected": "Poista valitut", "ClickToChangeReleaseGroup": "Vaihda julkaisuryhmää painamalla tästä", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index d3ee2a429..7d900ecfd 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -991,7 +991,7 @@ "SearchForMonitoredAlbums": "Rechercher des albums surveillés", "ImportListSpecificSettings": "Paramètres spécifiques à la liste d'importation", "MissingTracks": "Pistes manquantes", - "MassAlbumsSearchWarning": "Êtes-vous sûr de vouloir rechercher tous les albums manquants « {0} » ?", + "SearchForAllMissingAlbumsConfirmationCount": "Êtes-vous sûr de vouloir rechercher tous les albums manquants « {0} » ?", "MonitoredHelpText": "Téléchargez les albums surveillés de cet artiste", "ContinuingMoreAlbumsAreExpected": "D'autres albums sont attendus", "MusicBrainzRecordingID": "Identifiant d'enregistrement MusicBrainz", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 045670774..0c45811dd 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -645,7 +645,7 @@ "OnUpgrade": "Minőségjavítás alatt", "OnApplicationUpdate": "Alkalmazásfrissítésről", "OnImportFailure": "Importálási hiba esetén", - "MassAlbumsSearchWarning": "Biztos benne, hogy megkeresi az összes \"{0}\" hiányzó albumot?", + "SearchForAllMissingAlbumsConfirmationCount": "Biztos benne, hogy megkeresi az összes \"{0}\" hiányzó albumot?", "MassAlbumsCutoffUnmetWarning": "Biztosan megkeresi az összes „{0}” Küszöbhatár alatti albumot?", "ThisCannotBeCancelled": "Ezt folyamatot az összes indexelő letiltása nélkül nem lehet visszavonni, ha egyszer elindult.", "AddedArtistSettings": "Szerzői beállítások hozzáadva", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 3650f980b..dcd5f50cd 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -645,7 +645,7 @@ "OnImportFailure": "Ao Falhar na Importação", "OnHealthIssue": "Ao Problema de Saúde", "ExpandBroadcastByDefaultHelpText": "Transmissão", - "MassAlbumsSearchWarning": "Tem certeza de que deseja pesquisar todos os '{0}' álbuns ausentes?", + "SearchForAllMissingAlbumsConfirmationCount": "Tem certeza de que deseja pesquisar todos os '{0}' álbuns ausentes?", "MassAlbumsCutoffUnmetWarning": "Tem certeza de que deseja pesquisar todos os álbuns '{0}' que não atingiram o corte?", "ThisCannotBeCancelled": "Isso não pode ser cancelado uma vez iniciado sem desabilitar todos os seus indexadores.", "ImportListSpecificSettings": "Importar configurações específicas da lista", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 399f7bacc..5754042ae 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -748,7 +748,7 @@ "CombineWithExistingFiles": "和现有文件合并", "Episode": "集", "TrackNaming": "歌曲命名", - "MassAlbumsSearchWarning": "你确定要搜索所有 '{0}' 个缺失专辑么?", + "SearchForAllMissingAlbumsConfirmationCount": "你确定要搜索所有 '{0}' 个缺失专辑么?", "MediumFormat": "媒体格式", "MissingAlbums": "缺失专辑", "MissingTracksArtistMonitored": "缺失歌曲(歌手已监控)", From 2f0d02b3bc2996d428a1f9e61a35a3f528143cf9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 7 Dec 2022 20:26:46 -0800 Subject: [PATCH 014/491] Allow Discography to be grabbed automatically if all albums will be released within 24 hours (cherry picked from commit 87795708b5caf63e63570cb62c6043a781ee89ae) Closes #3181 --- .../DiscographySpecificationFixture.cs | 8 ++++++++ .../Specifications/DiscographySpecification.cs | 2 +- src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/DiscographySpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/DiscographySpecificationFixture.cs index f6a87b092..d5ef99ed8 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/DiscographySpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/DiscographySpecificationFixture.cs @@ -57,6 +57,14 @@ namespace NzbDrone.Core.Test.DecisionEngineTests Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } + [Test] + public void should_return_true_if_all_albums_will_have_released_in_the_next_24_hours() + { + _remoteAlbum.Albums.Last().ReleaseDate = DateTime.UtcNow.AddHours(23); + + Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); + } + [Test] public void should_return_false_if_one_album_has_not_released() { diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/DiscographySpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/DiscographySpecification.cs index 98ff0d304..bff31f1b2 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/DiscographySpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/DiscographySpecification.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { _logger.Debug("Checking if all albums in discography release have released. {0}", subject.Release.Title); - if (subject.Albums.Any(e => !e.ReleaseDate.HasValue || e.ReleaseDate.Value.After(DateTime.UtcNow))) + if (subject.Albums.Any(e => !e.ReleaseDate.HasValue || e.ReleaseDate.Value.After(DateTime.UtcNow.AddHours(24)))) { _logger.Debug("Discography release {0} rejected. All albums haven't released yet.", subject.Release.Title); return Decision.Reject("Discography release rejected. All albums haven't released yet."); diff --git a/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs b/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs index ef75dba40..356b5c65e 100644 --- a/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/AlbumSearchService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; From 0bdd5f3278eb29be813d494fa855917a862e1a98 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 12 Apr 2022 17:46:10 -0700 Subject: [PATCH 015/491] Fixed: A potential issue when extra files for multiple artists have the same relative path (cherry picked from commit a6a68b4cae7688506c45ff6cf10989fe6596c274) Closes #2760 --- src/NzbDrone.Core/Extras/Files/ExtraFileRepository.cs | 6 +++--- src/NzbDrone.Core/Extras/Files/ExtraFileService.cs | 6 +++--- src/NzbDrone.Core/Extras/Others/OtherExtraFileRenamer.cs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Extras/Files/ExtraFileRepository.cs b/src/NzbDrone.Core/Extras/Files/ExtraFileRepository.cs index 5d88a9a36..a056ca106 100644 --- a/src/NzbDrone.Core/Extras/Files/ExtraFileRepository.cs +++ b/src/NzbDrone.Core/Extras/Files/ExtraFileRepository.cs @@ -14,7 +14,7 @@ namespace NzbDrone.Core.Extras.Files List GetFilesByArtist(int artistId); List GetFilesByAlbum(int artistId, int albumId); List GetFilesByTrackFile(int trackFileId); - TExtraFile FindByPath(string path); + TExtraFile FindByPath(int artistId, string path); } public class ExtraFileRepository : BasicRepository, IExtraFileRepository @@ -55,9 +55,9 @@ namespace NzbDrone.Core.Extras.Files return Query(c => c.TrackFileId == trackFileId); } - public TExtraFile FindByPath(string path) + public TExtraFile FindByPath(int artistId, string path) { - return Query(c => c.RelativePath == path).SingleOrDefault(); + return Query(c => c.ArtistId == artistId && c.RelativePath == path).SingleOrDefault(); } } } diff --git a/src/NzbDrone.Core/Extras/Files/ExtraFileService.cs b/src/NzbDrone.Core/Extras/Files/ExtraFileService.cs index a1c113a39..3f02432e0 100644 --- a/src/NzbDrone.Core/Extras/Files/ExtraFileService.cs +++ b/src/NzbDrone.Core/Extras/Files/ExtraFileService.cs @@ -18,7 +18,7 @@ namespace NzbDrone.Core.Extras.Files { List GetFilesByArtist(int artistId); List GetFilesByTrackFile(int trackFileId); - TExtraFile FindByPath(string path); + TExtraFile FindByPath(int artistId, string path); void Upsert(TExtraFile extraFile); void Upsert(List extraFiles); void Delete(int id); @@ -59,9 +59,9 @@ namespace NzbDrone.Core.Extras.Files return _repository.GetFilesByTrackFile(trackFileId); } - public TExtraFile FindByPath(string path) + public TExtraFile FindByPath(int artistId, string path) { - return _repository.FindByPath(path); + return _repository.FindByPath(artistId, path); } public void Upsert(TExtraFile extraFile) diff --git a/src/NzbDrone.Core/Extras/Others/OtherExtraFileRenamer.cs b/src/NzbDrone.Core/Extras/Others/OtherExtraFileRenamer.cs index b5f321e61..542684e18 100644 --- a/src/NzbDrone.Core/Extras/Others/OtherExtraFileRenamer.cs +++ b/src/NzbDrone.Core/Extras/Others/OtherExtraFileRenamer.cs @@ -41,8 +41,8 @@ namespace NzbDrone.Core.Extras.Others } var relativePath = artist.Path.GetRelativePath(path); + var otherExtraFile = _otherExtraFileService.FindByPath(artist.Id, relativePath); - var otherExtraFile = _otherExtraFileService.FindByPath(relativePath); if (otherExtraFile != null) { var newPath = path + "-orig"; @@ -66,8 +66,8 @@ namespace NzbDrone.Core.Extras.Others } var relativePath = artist.Path.GetRelativePath(path); + var otherExtraFile = _otherExtraFileService.FindByPath(artist.Id, relativePath); - var otherExtraFile = _otherExtraFileService.FindByPath(relativePath); if (otherExtraFile != null) { var subfolder = Path.GetDirectoryName(relativePath); From a9b16d298f86d2c2ca0e44aeb2d9d51b66d6404f Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 12 Feb 2023 22:33:45 -0800 Subject: [PATCH 016/491] Improve CF calculation for files without scene name Fixed: Use original filename instead of complete path when calculating CF for existing file without scene name (cherry picked from commit 997aabbc3cfc3c9c5c220786d1d08cfceec5e2f2) Closes #3359 --- .../CustomFormats/CustomFormatCalculationService.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs index 253bdcfdc..6f8421c13 100644 --- a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs +++ b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs @@ -58,7 +58,7 @@ namespace NzbDrone.Core.CustomFormats { var parsed = Parser.Parser.ParseAlbumTitle(blocklist.SourceTitle); - var episodeInfo = new ParsedAlbumInfo + var albumInfo = new ParsedAlbumInfo { ArtistName = artist.Name, ReleaseTitle = parsed?.ReleaseTitle ?? blocklist.SourceTitle, @@ -68,7 +68,7 @@ namespace NzbDrone.Core.CustomFormats var input = new CustomFormatInput { - AlbumInfo = episodeInfo, + AlbumInfo = albumInfo, Artist = artist, Size = blocklist.Size ?? 0 }; @@ -160,7 +160,7 @@ namespace NzbDrone.Core.CustomFormats else if (trackFile.OriginalFilePath.IsNotNullOrWhiteSpace()) { _logger.Trace("Using original file path for release title: {0}", Path.GetFileName(trackFile.OriginalFilePath)); - releaseTitle = trackFile.OriginalFilePath; + releaseTitle = Path.GetFileName(trackFile.OriginalFilePath); } else if (trackFile.Path.IsNotNullOrWhiteSpace()) { @@ -168,7 +168,7 @@ namespace NzbDrone.Core.CustomFormats releaseTitle = Path.GetFileName(trackFile.Path); } - var episodeInfo = new ParsedAlbumInfo + var albumInfo = new ParsedAlbumInfo { ArtistName = artist.Name, ReleaseTitle = releaseTitle, @@ -178,7 +178,7 @@ namespace NzbDrone.Core.CustomFormats var input = new CustomFormatInput { - AlbumInfo = episodeInfo, + AlbumInfo = albumInfo, Artist = artist, Size = trackFile.Size, Filename = Path.GetFileName(trackFile.Path) From d8066ec17278e8dc78f6d8b408ae987a1241ddeb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 5 Feb 2024 22:26:54 +0200 Subject: [PATCH 017/491] New: Size column for albums Closes #3292 --- frontend/src/Album/Details/AlbumDetailsMedium.js | 2 +- frontend/src/Artist/Details/AlbumRow.css | 1 + frontend/src/Artist/Details/AlbumRow.css.d.ts | 1 + frontend/src/Artist/Details/AlbumRow.js | 15 ++++++++++++++- .../src/Artist/Details/ArtistDetailsSeason.js | 2 +- frontend/src/Store/Actions/albumActions.js | 11 +++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 1 + 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/frontend/src/Album/Details/AlbumDetailsMedium.js b/frontend/src/Album/Details/AlbumDetailsMedium.js index fb665cb88..09c489b2d 100644 --- a/frontend/src/Album/Details/AlbumDetailsMedium.js +++ b/frontend/src/Album/Details/AlbumDetailsMedium.js @@ -175,7 +175,7 @@ class AlbumDetailsMedium extends Component { :
- No tracks in this medium + {translate('NoTracksInThisMedium')}
}
diff --git a/frontend/src/Artist/Details/AlbumRow.css b/frontend/src/Artist/Details/AlbumRow.css index 836fec7ac..383d97746 100644 --- a/frontend/src/Artist/Details/AlbumRow.css +++ b/frontend/src/Artist/Details/AlbumRow.css @@ -10,6 +10,7 @@ width: 42px; } +.size, .status { composes: cell from '~Components/Table/Cells/TableRowCell.css'; diff --git a/frontend/src/Artist/Details/AlbumRow.css.d.ts b/frontend/src/Artist/Details/AlbumRow.css.d.ts index d63f87253..90377b53b 100644 --- a/frontend/src/Artist/Details/AlbumRow.css.d.ts +++ b/frontend/src/Artist/Details/AlbumRow.css.d.ts @@ -2,6 +2,7 @@ // Please do not change this file! interface CssExports { 'monitored': string; + 'size': string; 'status': string; 'title': string; } diff --git a/frontend/src/Artist/Details/AlbumRow.js b/frontend/src/Artist/Details/AlbumRow.js index 52cd07975..3219c7161 100644 --- a/frontend/src/Artist/Details/AlbumRow.js +++ b/frontend/src/Artist/Details/AlbumRow.js @@ -10,6 +10,7 @@ import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; import { kinds, sizes } from 'Helpers/Props'; import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; +import formatBytes from 'Utilities/Number/formatBytes'; import translate from 'Utilities/String/translate'; import styles from './AlbumRow.css'; @@ -87,7 +88,8 @@ class AlbumRow extends Component { const { trackCount = 0, trackFileCount = 0, - totalTrackCount = 0 + totalTrackCount = 0, + sizeOnDisk = 0 } = statistics; return ( @@ -196,6 +198,17 @@ class AlbumRow extends Component { ); } + if (name === 'size') { + return ( + + {!!sizeOnDisk && formatBytes(sizeOnDisk)} + + ); + } + if (name === 'status') { return ( translate('Size'), + isSortable: true, + isVisible: false + }, { name: 'rating', label: () => translate('Rating'), diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 99843ffd9..a05bb0b65 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -725,6 +725,7 @@ "NoMissingItems": "No missing items", "NoResultsFound": "No results found", "NoTagsHaveBeenAddedYet": "No tags have been added yet", + "NoTracksInThisMedium": "No tracks in this medium", "NoUpdatesAreAvailable": "No updates are available", "None": "None", "NoneData": "No albums will be monitored", From 6ae99acea7be10533515a3ad4c16c0864997019a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 5 Feb 2024 22:36:53 +0200 Subject: [PATCH 018/491] Fix tests for storing last search time for albums --- src/NzbDrone.Core/Music/Model/Album.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Music/Model/Album.cs b/src/NzbDrone.Core/Music/Model/Album.cs index 6ac9c13b0..0e50525ea 100644 --- a/src/NzbDrone.Core/Music/Model/Album.cs +++ b/src/NzbDrone.Core/Music/Model/Album.cs @@ -96,6 +96,7 @@ namespace NzbDrone.Core.Music Monitored = other.Monitored; AnyReleaseOk = other.AnyReleaseOk; LastInfoSync = other.LastInfoSync; + LastSearchTime = other.LastSearchTime; Added = other.Added; AddOptions = other.AddOptions; } From c3c50498bdca6a08ea40d5446e0e466204038f45 Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 5 Feb 2024 19:54:47 -0600 Subject: [PATCH 019/491] Debian Install Script Closes #4382 Closes #4383 Closes #4401 Closes #4407 Closes #4423 Closes #4474 Co-Authored-By: Stevie Robinson --- distribution/debian/install.sh | 182 +++++++++++++++++++++++++++++ distribution/debian/lidarr.service | 20 ++++ 2 files changed, 202 insertions(+) create mode 100644 distribution/debian/install.sh create mode 100644 distribution/debian/lidarr.service diff --git a/distribution/debian/install.sh b/distribution/debian/install.sh new file mode 100644 index 000000000..6eff79eaa --- /dev/null +++ b/distribution/debian/install.sh @@ -0,0 +1,182 @@ +#!/bin/bash +### Description: Lidarr .NET Debian install +### Originally written for Radarr by: DoctorArr - doctorarr@the-rowlands.co.uk on 2021-10-01 v1.0 +### Updates for servarr suite made by Bakerboy448, DoctorArr, brightghost, aeramor and VP-EN +### Version v1.0.0 2023-12-29 - StevieTV - adapted from servarr script for Lidarr installs +### Version V1.0.1 2024-01-02 - StevieTV - remove UTF8-BOM +### Version V1.0.2 2024-01-03 - markus101 - Get user input from /dev/tty +### Version V1.0.3 2024-01-06 - StevieTV - exit script when it is ran from install directory + +### Boilerplate Warning +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +scriptversion="1.0.3" +scriptdate="2024-01-06" + +set -euo pipefail + +echo "Running Lidarr Install Script - Version [$scriptversion] as of [$scriptdate]" + +# Am I root?, need root! + +if [ "$EUID" -ne 0 ]; then + echo "Please run as root." + exit +fi + +app="lidarr" +app_port="8686" +app_prereq="curl sqlite3 wget" +app_umask="0002" +branch="main" + +# Constants +### Update these variables as required for your specific instance +installdir="/opt" # {Update me if needed} Install Location +bindir="${installdir}/${app^}" # Full Path to Install Location +datadir="/var/lib/$app/" # {Update me if needed} AppData directory to use +app_bin=${app^} # Binary Name of the app + +# This script should not be ran from installdir, otherwise later in the script the extracted files will be removed before they can be moved to installdir. +if [ "$installdir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ] || [ "$bindir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ]; then + echo "You should not run this script from the intended install directory. The script will exit. Please re-run it from another directory" + exit +fi + +# Prompt User +read -r -p "What user should ${app^} run as? (Default: $app): " app_uid < /dev/tty +app_uid=$(echo "$app_uid" | tr -d ' ') +app_uid=${app_uid:-$app} +# Prompt Group +read -r -p "What group should ${app^} run as? (Default: media): " app_guid < /dev/tty +app_guid=$(echo "$app_guid" | tr -d ' ') +app_guid=${app_guid:-media} + +echo "This will install [${app^}] to [$bindir] and use [$datadir] for the AppData Directory" +echo "${app^} will run as the user [$app_uid] and group [$app_guid]. By continuing, you've confirmed that that user and group will have READ and WRITE access to your Media Library and Download Client Completed Download directories" +read -n 1 -r -s -p $'Press enter to continue or ctrl+c to exit...\n' < /dev/tty + +# Create User / Group as needed +if [ "$app_guid" != "$app_uid" ]; then + if ! getent group "$app_guid" >/dev/null; then + groupadd "$app_guid" + fi +fi +if ! getent passwd "$app_uid" >/dev/null; then + adduser --system --no-create-home --ingroup "$app_guid" "$app_uid" + echo "Created and added User [$app_uid] to Group [$app_guid]" +fi +if ! getent group "$app_guid" | grep -qw "$app_uid"; then + echo "User [$app_uid] did not exist in Group [$app_guid]" + usermod -a -G "$app_guid" "$app_uid" + echo "Added User [$app_uid] to Group [$app_guid]" +fi + +# Stop the App if running +if service --status-all | grep -Fq "$app"; then + systemctl stop "$app" + systemctl disable "$app".service + echo "Stopped existing $app" +fi + +# Create Appdata Directory + +# AppData +mkdir -p "$datadir" +chown -R "$app_uid":"$app_guid" "$datadir" +chmod 775 "$datadir" +echo "Directories created" +# Download and install the App + +# prerequisite packages +echo "" +echo "Installing pre-requisite Packages" +# shellcheck disable=SC2086 +apt update && apt install -y $app_prereq +echo "" +ARCH=$(dpkg --print-architecture) +# get arch +dlbase="https://lidarr.servarr.com/v1/update/$branch/updatefile?os=linux&runtime=netcore" +case "$ARCH" in +"amd64") DLURL="${dlbase}&arch=x64" ;; +"armhf") DLURL="${dlbase}&arch=arm" ;; +"arm64") DLURL="${dlbase}&arch=arm64" ;; +*) + echo "Arch not supported" + exit 1 + ;; +esac +echo "" +echo "Removing previous tarballs" +# -f to Force so we fail if it doesnt exist +rm -f "${app^}".*.tar.gz +echo "" +echo "Downloading..." +wget --content-disposition "$DLURL" +tar -xvzf "${app^}".*.tar.gz +echo "" +echo "Installation files downloaded and extracted" + +# remove existing installs +echo "Removing existing installation" +rm -rf "$bindir" +echo "Installing..." +mv "${app^}" $installdir +chown "$app_uid":"$app_guid" -R "$bindir" +chmod 775 "$bindir" +rm -rf "${app^}.*.tar.gz" +# Ensure we check for an update in case user installs older version or different branch +touch "$datadir"/update_required +chown "$app_uid":"$app_guid" "$datadir"/update_required +echo "App Installed" +# Configure Autostart + +# Remove any previous app .service +echo "Removing old service file" +rm -rf /etc/systemd/system/"$app".service + +# Create app .service with correct user startup +echo "Creating service file" +cat </dev/null +[Unit] +Description=${app^} Daemon +After=syslog.target network.target +[Service] +User=$app_uid +Group=$app_guid +UMask=$app_umask +Type=simple +ExecStart=$bindir/$app_bin -nobrowser -data=$datadir +TimeoutStopSec=20 +KillMode=process +Restart=on-failure +[Install] +WantedBy=multi-user.target +EOF + +# Start the App +echo "Service file created. Attempting to start the app" +systemctl -q daemon-reload +systemctl enable --now -q "$app" + +# Finish Update/Installation +host=$(hostname -I) +ip_local=$(grep -oP '^\S*' <<<"$host") +echo "" +echo "Install complete" +sleep 10 +STATUS="$(systemctl is-active "$app")" +if [ "${STATUS}" = "active" ]; then + echo "Browse to http://$ip_local:$app_port for the ${app^} GUI" +else + echo "${app^} failed to start" +fi + +# Exit +exit 0 diff --git a/distribution/debian/lidarr.service b/distribution/debian/lidarr.service new file mode 100644 index 000000000..8ec5b5b1d --- /dev/null +++ b/distribution/debian/lidarr.service @@ -0,0 +1,20 @@ +# This file is owned by the lidarr package, DO NOT MODIFY MANUALLY +# Instead use 'dpkg-reconfigure -plow lidarr' to modify User/Group/UMask/-data +# Or use systemd built-in override functionality using 'systemctl edit lidarr' +[Unit] +Description=Lidarr Daemon +After=network.target + +[Service] +User=lidarr +Group=lidarr +UMask=002 + +Type=simple +ExecStart=/opt/Lidarr/Lidarr -nobrowser -data=/var/lib/lidarr +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target From 6471353bcd9b4effaa07ead7f976582a3174ba0a Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 5 Feb 2024 18:43:49 +0000 Subject: [PATCH 020/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Havok Dan Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ar.json | 1 - src/NzbDrone.Core/Localization/Core/bg.json | 1 - src/NzbDrone.Core/Localization/Core/ca.json | 1 - src/NzbDrone.Core/Localization/Core/cs.json | 1 - src/NzbDrone.Core/Localization/Core/da.json | 1 - src/NzbDrone.Core/Localization/Core/de.json | 1 - src/NzbDrone.Core/Localization/Core/el.json | 1 - src/NzbDrone.Core/Localization/Core/es.json | 1 - src/NzbDrone.Core/Localization/Core/fi.json | 1 - src/NzbDrone.Core/Localization/Core/fr.json | 1 - src/NzbDrone.Core/Localization/Core/he.json | 1 - src/NzbDrone.Core/Localization/Core/hi.json | 1 - src/NzbDrone.Core/Localization/Core/hu.json | 1 - src/NzbDrone.Core/Localization/Core/is.json | 1 - src/NzbDrone.Core/Localization/Core/it.json | 1 - src/NzbDrone.Core/Localization/Core/ja.json | 1 - src/NzbDrone.Core/Localization/Core/ko.json | 1 - src/NzbDrone.Core/Localization/Core/nl.json | 1 - src/NzbDrone.Core/Localization/Core/pl.json | 1 - src/NzbDrone.Core/Localization/Core/pt.json | 1 - .../Localization/Core/pt_BR.json | 19 +++++++++++++++++-- src/NzbDrone.Core/Localization/Core/ro.json | 1 - src/NzbDrone.Core/Localization/Core/ru.json | 1 - src/NzbDrone.Core/Localization/Core/sv.json | 1 - src/NzbDrone.Core/Localization/Core/th.json | 1 - src/NzbDrone.Core/Localization/Core/tr.json | 1 - src/NzbDrone.Core/Localization/Core/uk.json | 1 - src/NzbDrone.Core/Localization/Core/vi.json | 1 - .../Localization/Core/zh_CN.json | 1 - 29 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index a3dc917eb..d90772abe 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -119,7 +119,6 @@ "TestAllIndexers": "اختبار كافة المفهرسات", "TestAllLists": "اختبر كل القوائم", "SendAnonymousUsageData": "إرسال بيانات الاستخدام المجهولة", - "ThisCannotBeCancelled": "لا يمكن إلغاء هذا بمجرد البدء دون إعادة تشغيل Whisparr.", "TorrentDelayHelpText": "تأخير في دقائق للانتظار قبل الاستيلاء على سيل", "ShowSearch": "إظهار البحث", "Size": " بحجم", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index cb33ced79..fb06b5a4f 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -443,7 +443,6 @@ "Unmonitored": "Без наблюдение", "UpdateAll": "Актуализирай всички", "OnGrab": "На Граб", - "ThisCannotBeCancelled": "Това не може да бъде отменено след стартиране без рестартиране на Whisparr.", "Component": "Съставна част", "OnRename": "При преименуване", "Tracks": "Проследяване", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 38faa5110..eb5490051 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -79,7 +79,6 @@ "TagIsNotUsedAndCanBeDeleted": "L'etiqueta no està en ús i es pot suprimir", "Tags": "Etiquetes", "Tasks": "Tasques", - "ThisCannotBeCancelled": "No es pot cancel·lar un cop iniciat sense desactivar tots els vostres indexadors.", "TorrentDelay": "Retard del torrent", "TorrentDelayHelpText": "Retard en minuts per a esperar abans de capturar un torrent", "Torrents": "Torrents", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 5a59b0c3a..818c01b20 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -448,7 +448,6 @@ "OnRename": "Při přejmenování", "OnUpgrade": "Při upgradu", "OnHealthIssue": "K otázce zdraví", - "ThisCannotBeCancelled": "Toto nelze zrušit po spuštění bez restartování Whisparru.", "OnGrab": "Chyť", "NETCore": ".NET Core", "Activity": "Aktivita", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index b3accb4ca..49ef667a0 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -450,7 +450,6 @@ "OnHealthIssue": "Om sundhedsspørgsmål", "OnRename": "Om omdøb", "OnUpgrade": "Ved opgradering", - "ThisCannotBeCancelled": "Dette kan ikke annulleres en gang startet uden genstart af Whisparr.", "Activity": "Aktivitet", "Add": "Tilføj", "AddDelayProfile": "Tilføj forsinkelsesprofil", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 167e4e4e9..05ecb6a3b 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -643,7 +643,6 @@ "MusicbrainzId": "MusicBrainz Id", "AlbumStudio": "Albumstudio", "OnHealthIssue": "Bei Zustandsproblem", - "ThisCannotBeCancelled": "Nach dem Start kann dies nicht mehr abgebrochen werden ohne alle Indexer zu deaktivieren.", "AddedArtistSettings": "Autor Einstellungen hinzugefügt", "ImportListSpecificSettings": "Listenspezifische Einstellungen importieren", "Activity": "Aktivität", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index f1f9c628c..de2335904 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -447,7 +447,6 @@ "Settings": "Ρυθμίσεις", "OnRename": "Μετονομασία", "OnUpgrade": "Κατά την αναβάθμιση", - "ThisCannotBeCancelled": "Αυτό δεν μπορεί να ακυρωθεί μόλις ξεκινήσει η απενεργοποίηση όλων των ευρετηριωτών σας.", "OnHealthIssue": "Σχετικά με το θέμα της υγείας", "OnGrab": "Στο Grab", "Tracks": "Ιχνος", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 89a7a9a9f..e10f1cb1a 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -455,7 +455,6 @@ "AllowFingerprinting": "Permitir impresión digital", "OnRename": "En Renombrado", "Season": "Temporada", - "ThisCannotBeCancelled": "Esto no puede ser cancelado una vez iniciado sin deshabilitar todos sus indexadores.", "OnGrab": "Al Capturar", "OnHealthIssue": "En Problema de Salud", "MetadataProfile": "perfil de metadatos", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index b29a9afbf..ca11acdbe 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -510,7 +510,6 @@ "OnUpgrade": "Päivitettäessä", "RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevan taulukon lataustyökalukohtaisiin asetuksiin.", "SearchForAllMissingAlbums": "Etsi kaikkia puuttuvia albumeita", - "ThisCannotBeCancelled": "Tämän peruminen on aloituksen jälkeen mahdollista vain poistamalla kaikki tietolähteet käytöstä.", "OnGrab": "Kun julkaisu kaapataan", "OnHealthIssue": "Vakausongelmat", "OnRename": "Uudelleennimeäminen", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 7d900ecfd..30b41ac2f 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -487,7 +487,6 @@ "Duration": "Durée", "RemoveFailed": "Échec de la suppression", "RemoveDownloadsAlert": "Les paramètres de suppression ont été déplacés vers les paramètres individuels du client de téléchargement dans le tableau ci-dessus.", - "ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.", "OnGrab": "À saisir", "OnHealthIssue": "Sur la question de la santé", "OnRename": "Au renommage", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 28d0aa6b0..f5c071ab2 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -449,7 +449,6 @@ "OnHealthIssue": "בנושא הבריאות", "OnRename": "על שינוי שם", "OnUpgrade": "בשדרוג", - "ThisCannotBeCancelled": "לא ניתן לבטל פעולה זו לאחר שהתחילה מבלי להפעיל מחדש את Whisparr.", "OnGrab": "על לתפוס", "NETCore": ".NET Core", "Duration": "אורך", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 498694199..0ed7783e0 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -445,7 +445,6 @@ "Source": "स्रोत", "SourcePath": "स्रोत पथ", "Ungroup": "असमूहीकृत", - "ThisCannotBeCancelled": "यह एक बार रद्द नहीं किया जा सकता है जब तक कि रेडर को फिर से शुरू किए बिना।", "OnGrab": "हड़पने पर", "OnHealthIssue": "स्वास्थ्य के मुद्दे पर", "OnRename": "नाम बदलने पर", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 0c45811dd..c7893fbe3 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -647,7 +647,6 @@ "OnImportFailure": "Importálási hiba esetén", "SearchForAllMissingAlbumsConfirmationCount": "Biztos benne, hogy megkeresi az összes \"{0}\" hiányzó albumot?", "MassAlbumsCutoffUnmetWarning": "Biztosan megkeresi az összes „{0}” Küszöbhatár alatti albumot?", - "ThisCannotBeCancelled": "Ezt folyamatot az összes indexelő letiltása nélkül nem lehet visszavonni, ha egyszer elindult.", "AddedArtistSettings": "Szerzői beállítások hozzáadva", "ImportListSpecificSettings": "Listaspecifikus beállítások importálása", "MonitorAlbumExistingOnlyWarning": "Ez az egyes könyvek felügyelt beállításának egyszeri módosítása. A Szerző/Szerkesztés alatti lehetőség segítségével szabályozhatja, hogy mi történjen az újonnan hozzáadott könyvekkel", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index f60d86c24..3b843bfc5 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -444,7 +444,6 @@ "Scheduled": "Tímaáætlun", "Ungroup": "Aftengja hópinn", "Uptime": "Spenntur", - "ThisCannotBeCancelled": "Ekki er hægt að hætta við þetta þegar byrjað er án þess að endurræsa Whisparr.", "OnGrab": "Á grípa", "OnHealthIssue": "Um heilbrigðismál", "OnRename": "Um Endurnefna", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 72f08314b..9dc1d51df 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -474,7 +474,6 @@ "BackupIntervalHelpText": "Intervallo per eseguire il backup del DB {appName} e delle impostazioni", "RemoveCompleted": "Rimuovi completati", "RemoveFailed": "Rimozione fallita", - "ThisCannotBeCancelled": "Questo non può essere annullato una volta avviato senza disabilitare tutti i tuoi indexers.", "RemoveDownloadsAlert": "Le impostazioni per la rimozione sono stati spostati nelle impostazioni individuali dei Client di Download nella tabella sopra.", "OnApplicationUpdate": "All'aggiornamento dell'applicazione", "OnGrab": "Quando viene prelevato", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 31e7153bf..7399d12f7 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -444,7 +444,6 @@ "Year": "年", "YesCancel": "はい、キャンセル", "AlreadyInYourLibrary": "すでにライブラリにあります", - "ThisCannotBeCancelled": "Whisparrを再起動せずに一度開始すると、これをキャンセルすることはできません。", "OnGrab": "グラブで", "OnHealthIssue": "健康問題について", "OnRename": "名前の変更について", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 94f415f11..7eb27eeee 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -446,7 +446,6 @@ "UrlBaseHelpText": "역방향 프록시 지원의 경우 기본값은 비어 있습니다.", "OnRename": "이름 변경시", "ShowUnknownArtistItems": "알 수없는 영화 항목 표시", - "ThisCannotBeCancelled": "Whisparr를 다시 시작하지 않고 시작한 후에는 취소 할 수 없습니다.", "Time": "시간", "HostHelpText": "원격 다운로드 클라이언트에 지정한 것과 동일한 호스트", "ReleaseStatuses": "출시 상태", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 4137b55fb..2a5f66095 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -457,7 +457,6 @@ "OnHealthIssue": "Bij Gezondheidsprobleem", "OnRename": "Bij Hernoemen", "OnUpgrade": "Bij Opwaarderen", - "ThisCannotBeCancelled": "Eenmaal gestart kan dit niet worden geannuleerd zonder al je indexeerders uit te schakelen.", "Tracks": "Spoor", "OnGrab": "Bij Ophalen", "AddedArtistSettings": "Auteur instellingen toegevoegd", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 3dd2247ff..36557fed9 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -446,7 +446,6 @@ "Source": "Źródło", "OnRename": "Zmiana nazwy", "OnUpgrade": "Przy aktualizacji", - "ThisCannotBeCancelled": "Nie można tego anulować po uruchomieniu bez ponownego uruchamiania Whisparr.", "NETCore": ".NET Core", "OnGrab": "Na Grab", "OnHealthIssue": "W kwestii zdrowia", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 139b116fd..4c4b43848 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -360,7 +360,6 @@ "TestAllClients": "Testar todos os clientes", "TestAllIndexers": "Testar todos os indexadores", "TestAllLists": "Testar todas as listas", - "ThisCannotBeCancelled": "Isso não pode ser cancelado uma vez iniciado sem desabilitar todos os seus indexadores.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Isto se aplicará a todos os indexadores, siga as regras estabelecidas por eles", "Time": "Hora", "TimeFormat": "Formato de hora", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index dcd5f50cd..c8b061000 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -647,7 +647,6 @@ "ExpandBroadcastByDefaultHelpText": "Transmissão", "SearchForAllMissingAlbumsConfirmationCount": "Tem certeza de que deseja pesquisar todos os '{0}' álbuns ausentes?", "MassAlbumsCutoffUnmetWarning": "Tem certeza de que deseja pesquisar todos os álbuns '{0}' que não atingiram o corte?", - "ThisCannotBeCancelled": "Isso não pode ser cancelado uma vez iniciado sem desabilitar todos os seus indexadores.", "ImportListSpecificSettings": "Importar configurações específicas da lista", "AddedArtistSettings": "Adicionado configurações de artista", "MonitorAlbumExistingOnlyWarning": "Este é um ajuste único da configuração monitoramento para cada álbum. Use a opção em Artista/Editar para controlar o que acontece com os álbuns recém-adicionados", @@ -1188,5 +1187,21 @@ "RemoveQueueItemRemovalMethodHelpTextWarning": "'Remover do cliente de download' removerá o download e os arquivos do cliente de download.", "ArtistIndexFooterDownloading": "Baixando", "IncludeHealthWarnings": "Incluir Advertências de Saúde", - "OnArtistAdd": "Ao Adicionar Artista" + "OnArtistAdd": "Ao Adicionar Artista", + "Donate": "Doar", + "Menu": "Menu", + "AutomaticSearch": "Pesquisa Automática", + "KeyboardShortcuts": "Atalhos do Teclado", + "Links": "Links", + "Logout": "Sair", + "Dash": "Traço", + "DefaultCase": "Padrão Maiúscula ou Minúscula", + "FileNameTokens": "Tokens de nome de arquivo", + "Period": "Ponto", + "Space": "Espaço", + "Uppercase": "Maiuscula", + "EmbedCoverArtInAudioFiles": "Incorporar capa em arquivos de áudio", + "EmbedCoverArtHelpText": "Incorpore a arte do álbum Lidarr em arquivos de áudio ao escrever etiquetas", + "Lowercase": "Minúscula", + "Underscore": "Sublinhar" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 5ecb63984..2a56b66d7 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -104,7 +104,6 @@ "TestAllClients": "Testați toți clienții", "TestAllIndexers": "Testați toți indexatorii", "TestAllLists": "Testați toate listele", - "ThisCannotBeCancelled": "Acest lucru nu poate fi anulat odată pornit fără a reporni Whisparr.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Acest lucru se va aplica tuturor indexatorilor, vă rugăm să urmați regulile stabilite de aceștia", "TorrentDelay": "Întârziere Torrent", "Torrents": "Torente", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index ab2df30d3..38ce32ecf 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -151,7 +151,6 @@ "Tags": "Тэги", "Tasks": "Задачи", "TestAll": "Тестировать все", - "ThisCannotBeCancelled": "Нельзя отменить после запуска без перезапуска Whisparr.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Это будет применяться ко всем индексаторам, пожалуйста, следуйте установленным ими правилам", "TimeFormat": "Формат времени", "TorrentDelay": "Задержка торрента", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index baf53e108..93281825e 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -598,7 +598,6 @@ "Tags": "Taggar", "TestAll": "Testa samtliga", "TestAllClients": "Testa samtliga klienter", - "ThisCannotBeCancelled": "Detta kan inte avbrytas en gång startat utan att Whisparr startas om.", "Tracks": "Spår", "OnHealthIssue": "På hälsofrågan", "OnImportFailure": "När Import Misslyckas", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index cce64cf26..3456d48f7 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -139,7 +139,6 @@ "TestAll": "ทดสอบทั้งหมด", "TestAllClients": "ทดสอบลูกค้าทั้งหมด", "TestAllIndexers": "ทดสอบดัชนีทั้งหมด", - "ThisCannotBeCancelled": "ไม่สามารถยกเลิกได้เมื่อเริ่มต้นโดยไม่ต้องรีสตาร์ท Whisparr", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "สิ่งนี้จะนำไปใช้กับผู้จัดทำดัชนีทั้งหมดโปรดปฏิบัติตามกฎที่กำหนดโดยพวกเขา", "Time": "เวลา", "TimeFormat": "รูปแบบเวลา", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index b40df6976..2c625299e 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -444,7 +444,6 @@ "Dates": "Tarih", "Name": "İsim", "RemoveFilter": "Filtreyi kaldır", - "ThisCannotBeCancelled": "Bu, Whisparr yeniden başlatılmadan başlatıldıktan sonra iptal edilemez.", "OnGrab": "Yakalandığında", "OnHealthIssue": "Sağlık Sorunu Hakkında", "OnRename": "Yeniden Adlandırıldığında", diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 0c288c1c5..4c655c05e 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -202,7 +202,6 @@ "TestAllClients": "Перевірте всіх клієнтів", "TestAllIndexers": "Перевірити всі індексатори", "TestAllLists": "Перевірити всі списки", - "ThisCannotBeCancelled": "Це не можна скасувати після запуску без вимкнення всіх ваших індексаторів.", "Title": "Назва", "Torrents": "Торренти", "TotalFileSize": "Загальний розмір файлу", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 37ae8d995..5f4524c2d 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -168,7 +168,6 @@ "TestAllClients": "Kiểm tra tất cả khách hàng", "TestAllIndexers": "Kiểm tra tất cả các chỉ mục", "TestAllLists": "Kiểm tra tất cả danh sách", - "ThisCannotBeCancelled": "Điều này không thể bị hủy sau khi bắt đầu mà không khởi động lại Whisparr.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Điều này sẽ áp dụng cho tất cả người lập chỉ mục, vui lòng tuân theo các quy tắc do họ đặt ra", "Time": "Thời gian", "TorrentDelayHelpText": "Trì hoãn trong vài phút để đợi trước khi lấy một torrent", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 5754042ae..5a0e0092c 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -208,7 +208,6 @@ "Year": "年", "BackupIntervalHelpText": "备份 {appName} 数据库和设置的时间间隔", "CalendarWeekColumnHeaderHelpText": "当使用周视图时显示上面的每一列", - "ThisCannotBeCancelled": "在不禁用所有索引器的情况下,一旦启动就无法取消。", "APIKey": "API Key", "AutomaticallySwitchRelease": "自动切换发行版本", "ApiKeyHelpTextWarning": "需重启以生效", From 8e5942d5c5ca5833739cb3b3d25d37a032ec9f1f Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 5 Feb 2024 21:18:50 -0600 Subject: [PATCH 021/491] Parse Exception Release Groups Closes #4541 Closes #4327 Closes #4250 Closes #3221 Closes #2658 Co-Authored-By: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Co-Authored-By: Mark McDowall --- .../ParserTests/ReleaseGroupParserFixture.cs | 39 +++++++++++++++++++ src/NzbDrone.Core/Parser/Parser.cs | 21 ++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs index deadf024c..cd5c5ff56 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs @@ -15,6 +15,8 @@ namespace NzbDrone.Core.Test.ParserTests [TestCase("Olafur.Arnalds-Remember-WEB-2018-ENTiTLED-postbot", "ENTiTLED")] [TestCase("Olafur.Arnalds-Remember-WEB-2018-ENTiTLED-xpost", "ENTiTLED")] [TestCase("[TR24][OF] Good Charlotte - Generation Rx - 2018", null)] + [TestCase("The.Good.Series.S05E03.Series.of.Intelligence.1080p.10bit.AMZN.WEB-DL.DDP5.1.HEVC-Vyndros", "Vyndros")] + [TestCase("Artist.Title-Album.Title.1080p.DSNP.WEB-DL.DDP2.0.H.264-VARYG", "VARYG")] // [TestCase("", "")] public void should_parse_release_group(string title, string expected) @@ -22,6 +24,43 @@ namespace NzbDrone.Core.Test.ParserTests Parser.Parser.ParseReleaseGroup(title).Should().Be(expected); } + [TestCase("Show.Name.2009.S01.1080p.BluRay.DTS5.1.x264-D-Z0N3", "D-Z0N3")] + [TestCase("Show.Name.S01E01.1080p.WEB-DL.H264.Fight-BB.mkv", "Fight-BB")] + [TestCase("Show Name (2021) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 5.1 Tigole) [QxR]", "Tigole")] + [TestCase("Show Name (2021) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 2.0 afm72) [QxR]", "afm72")] + [TestCase("Show Name (2021) Season 1 S01 (1080p DSNP WEB-DL x265 HEVC 10bit EAC3 5.1 Silence) [QxR]", "Silence")] + [TestCase("Show Name (2021) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 2.0 Panda) [QxR]", "Panda")] + [TestCase("Show Name (2020) Season 1 S01 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 2.0 Ghost) [QxR]", "Ghost")] + [TestCase("Show Name (2020) Season 1 S01 (1080p WEB-DL x265 HEVC 10bit AC3 5.1 MONOLITH) [QxR]", "MONOLITH")] + [TestCase("The Show S08E09 The Series.1080p.AMZN.WEB-DL.x265.10bit.EAC3.6.0-Qman[UTR]", "UTR")] + [TestCase("The Show S03E07 Fire and Series[1080p x265 10bit S87 Joy]", "Joy")] + [TestCase("The Show (2016) - S02E01 - Soul Series #1 (1080p NF WEBRip x265 ImE)", "ImE")] + [TestCase("The Show (2020) - S02E03 - Fighting His Series(1080p ATVP WEB-DL x265 t3nzin)", "t3nzin")] + [TestCase("[Anime Time] A Show [BD][Dual Audio][1080p][HEVC 10bit x265][AAC][Eng Sub] [Batch] Title)", "Anime Time")] + [TestCase("[Project Angel] Anime Series [DVD 480p] [10-bit x265 HEVC | Opus]", "Project Angel")] + [TestCase("[Hakata Ramen] Show Title - Season 2 - Revival of The Commandments", "Hakata Ramen")] + [TestCase("Show Name (2022) S01 (2160p DSNP WEB-DL H265 DV HDR DDP Atmos 5.1 English - HONE)", "HONE")] + [TestCase("Show Title (2021) S01 (2160p ATVP WEB-DL Hybrid H265 DV HDR10+ DDP Atmos 5.1 English - HONE)", "HONE")] + [TestCase("Series.Title.S01E09.1080p.DSNP.WEB-DL.DDP2.0.H.264-VARYG (Blue Lock, Multi-Subs)", "VARYG")] + [TestCase("Series.Title (2014) S09E10 (1080p AMZN WEB-DL x265 HEVC 10bit DDP 5.1 Vyndros)", "Vyndros")] + [TestCase("Series Title S02E03 Title 4k to 1080p DSNP WEBrip x265 DDP 5 1 Releaser[SEV]", "SEV")] + [TestCase("Series Title Season 01 S01 1080p AMZN UHD WebRip x265 DDP 5.1 Atmos Releaser-SEV", "SEV")] + [TestCase("Series Title - S01.E06 - Title 1080p AMZN WebRip x265 DDP 5.1 Atmos Releaser [SEV]", "SEV")] + [TestCase("Grey's Anatomy (2005) - S01E01 - A Hard Day's Night (1080p DSNP WEB-DL x265 Garshasp).mkv", "Garshasp")] + [TestCase("Marvel's Agent Carter (2015) - S02E04 - Smoke & Mirrors (1080p BluRay x265 Kappa).mkv", "Kappa")] + [TestCase("Snowpiercer (2020) - S02E03 - A Great Odyssey (1080p BluRay x265 Kappa).mkv", "Kappa")] + [TestCase("Enaaya (2019) - S01E01 - Episode 1 (1080p WEB-DL x265 Natty).mkv", "Natty")] + [TestCase("SpongeBob SquarePants (1999) - S03E01-E02 - Mermaid Man and Barnacle Boy IV & Doing Time (1080p AMZN WEB-DL x265 RCVR).mkv", "RCVR")] + [TestCase("Invincible (2021) - S01E02 - Here Goes Nothing (1080p WEB-DL x265 SAMPA).mkv", "SAMPA")] + [TestCase("The Bad Batch (2021) - S01E01 - Aftermath (1080p DSNP WEB-DL x265 YOGI).mkv", "YOGI")] + [TestCase("Line of Duty (2012) - S01E01 - Episode 1 (1080p BluRay x265 r00t).mkv", "r00t")] + [TestCase("Rich & Shameless - S01E01 - Girls Gone Wild Exposed (720p x265 EDGE2020).mkv", "EDGE2020")] + [TestCase("Show Name (2016) Season 1 S01 (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 5 1 RZeroX) QxR", "RZeroX")] + public void should_parse_exception_release_group(string title, string expected) + { + Parser.Parser.ParseReleaseGroup(title).Should().Be(expected); + } + [Test] [Ignore("Track name parsing needs to be worked on")] public void should_not_include_extension_in_release_group() diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index b0da746f2..9a19a64b1 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -202,6 +202,13 @@ namespace NzbDrone.Core.Parser private static readonly Regex AnimeReleaseGroupRegex = new Regex(@"^(?:\[(?(?!\s).+?(?(?:D\-Z0N3|Fight-BB|VARYG|E\.N\.D)\b)", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + // groups whose releases end with RlsGroup) or RlsGroup] + private static readonly Regex ExceptionReleaseGroupRegex = new Regex(@"(?(Silence|afm72|Panda|Ghost|MONOLITH|Tigole|Joy|ImE|UTR|t3nzin|Anime Time|Project Angel|Hakata Ramen|HONE|Vyndros|SEV|Garshasp|Kappa|Natty|RCVR|SAMPA|YOGI|r00t|EDGE2020|RZeroX)(?=\]|\)))", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex WordDelimiterRegex = new Regex(@"(\s|\.|,|_|-|=|\|)+", RegexOptions.Compiled); private static readonly Regex PunctuationRegex = new Regex(@"[^\w\s]", RegexOptions.Compiled); private static readonly Regex CommonWordRegex = new Regex(@"\b(a|an|the|and|or|of)\b\s?", RegexOptions.IgnoreCase | RegexOptions.Compiled); @@ -552,6 +559,20 @@ namespace NzbDrone.Core.Parser title = CleanReleaseGroupRegex.Replace(title); + var exceptionReleaseGroupRegex = ExceptionReleaseGroupRegex.Matches(title); + + if (exceptionReleaseGroupRegex.Count != 0) + { + return exceptionReleaseGroupRegex.OfType().Last().Groups["releasegroup"].Value; + } + + var exceptionExactMatch = ExceptionReleaseGroupRegexExact.Matches(title); + + if (exceptionExactMatch.Count != 0) + { + return exceptionExactMatch.OfType().Last().Groups["releasegroup"].Value; + } + var matches = ReleaseGroupRegex.Matches(title); if (matches.Count != 0) From efe0a3d283e93cb1d14c5408b940b9a7e84081b0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 4 Apr 2023 09:21:34 -0700 Subject: [PATCH 022/491] Typings cleanup and improvements Appease linter (cherry picked from commit b2c43fb2a67965d68d3d35b72302b0cddb5aca23) (cherry picked from commit 3b5e83670b844cf7c20bf7d744d9fbc96fde6902) Closes #3516 Closes #3510 Closes #2778 --- frontend/src/Artist/Index/ArtistIndex.tsx | 31 +++-- .../Artist/Index/ArtistIndexFilterModal.tsx | 11 +- .../Index/Banners/ArtistIndexBanner.tsx | 2 +- .../Index/Banners/ArtistIndexBanners.tsx | 23 ++-- .../ArtistIndexBannerOptionsModalContent.tsx | 2 +- .../Index/Menus/ArtistIndexFilterMenu.tsx | 21 ++-- .../Index/Menus/ArtistIndexSortMenu.tsx | 49 ++++---- .../Index/Menus/ArtistIndexViewMenu.tsx | 15 ++- .../Overview/ArtistIndexOverviewInfo.tsx | 110 +++++++++++------- .../Overview/ArtistIndexOverviewInfoRow.tsx | 5 +- .../Index/Overview/ArtistIndexOverviews.tsx | 18 +-- ...ArtistIndexOverviewOptionsModalContent.tsx | 2 +- .../Index/Posters/ArtistIndexPoster.tsx | 2 +- .../Index/Posters/ArtistIndexPosters.tsx | 23 ++-- .../ArtistIndexPosterOptionsModalContent.tsx | 2 +- .../Index/Select/AlbumStudio/AlbumDetails.tsx | 2 +- .../Select/AlbumStudio/AlbumStudioAlbum.tsx | 2 +- .../ChangeMonitoringModalContent.tsx | 2 +- .../Index/Select/ArtistIndexPosterSelect.tsx | 7 +- .../Select/ArtistIndexSelectAllButton.tsx | 2 +- .../Index/Select/ArtistIndexSelectFooter.tsx | 12 +- .../Select/ArtistIndexSelectModeButton.tsx | 2 +- .../AudioTags/RetagArtistModalContent.tsx | 12 +- .../Delete/DeleteArtistModalContent.tsx | 11 +- .../Select/Edit/EditArtistModalContent.tsx | 4 +- .../Index/Select/Tags/TagsModalContent.tsx | 7 +- .../src/Artist/Index/Table/ArtistIndexRow.tsx | 9 +- .../Artist/Index/Table/ArtistIndexTable.tsx | 23 ++-- .../Index/Table/ArtistIndexTableHeader.tsx | 9 +- .../Index/Table/ArtistIndexTableOptions.tsx | 3 +- .../Index/createArtistIndexItemSelector.ts | 21 ++-- frontend/src/Commands/Command.ts | 37 ++++++ .../src/Components/Page/PageContentBody.tsx | 13 +-- frontend/src/Components/Scroller/Scroller.tsx | 20 +++- frontend/src/Components/Table/VirtualTable.js | 19 ++- .../src/Components/withScrollPosition.tsx | 28 +++-- frontend/src/Store/scrollPositions.js | 5 - frontend/src/Store/scrollPositions.ts | 5 + frontend/src/Store/thunks.js | 27 ----- frontend/src/Store/thunks.ts | 39 +++++++ .../src/Utilities/Table/getSelectedIds.js | 15 --- .../src/Utilities/Table/getSelectedIds.ts | 18 +++ frontend/src/typings/callbacks.ts | 6 + frontend/src/typings/inputs.ts | 4 + frontend/tsconfig.json | 8 ++ src/NzbDrone.Core/Localization/Core/en.json | 1 + 46 files changed, 420 insertions(+), 269 deletions(-) create mode 100644 frontend/src/Commands/Command.ts delete mode 100644 frontend/src/Store/scrollPositions.js create mode 100644 frontend/src/Store/scrollPositions.ts delete mode 100644 frontend/src/Store/thunks.js create mode 100644 frontend/src/Store/thunks.ts delete mode 100644 frontend/src/Utilities/Table/getSelectedIds.js create mode 100644 frontend/src/Utilities/Table/getSelectedIds.ts create mode 100644 frontend/src/typings/callbacks.ts create mode 100644 frontend/src/typings/inputs.ts diff --git a/frontend/src/Artist/Index/ArtistIndex.tsx b/frontend/src/Artist/Index/ArtistIndex.tsx index 3143ff725..2fcc0fadf 100644 --- a/frontend/src/Artist/Index/ArtistIndex.tsx +++ b/frontend/src/Artist/Index/ArtistIndex.tsx @@ -7,6 +7,8 @@ import React, { } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { SelectProvider } from 'App/SelectContext'; +import ArtistAppState, { ArtistIndexAppState } from 'App/State/ArtistAppState'; +import ClientSideCollectionAppState from 'App/State/ClientSideCollectionAppState'; import NoArtist from 'Artist/NoArtist'; import { RSS_SYNC } from 'Commands/commandNames'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; @@ -89,16 +91,19 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { sortKey, sortDirection, view, - } = useSelector(createArtistClientSideCollectionItemsSelector('artistIndex')); + }: ArtistAppState & ArtistIndexAppState & ClientSideCollectionAppState = + useSelector(createArtistClientSideCollectionItemsSelector('artistIndex')); const isRssSyncExecuting = useSelector( createCommandExecutingSelector(RSS_SYNC) ); const { isSmallScreen } = useSelector(createDimensionsSelector()); const dispatch = useDispatch(); - const scrollerRef = useRef(); + const scrollerRef = useRef(null); const [isOptionsModalOpen, setIsOptionsModalOpen] = useState(false); - const [jumpToCharacter, setJumpToCharacter] = useState(null); + const [jumpToCharacter, setJumpToCharacter] = useState( + undefined + ); const [isSelectMode, setIsSelectMode] = useState(false); useEffect(() => { @@ -118,14 +123,14 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { }, [isSelectMode, setIsSelectMode]); const onTableOptionChange = useCallback( - (payload) => { + (payload: unknown) => { dispatch(setArtistTableOption(payload)); }, [dispatch] ); const onViewSelect = useCallback( - (value) => { + (value: string) => { dispatch(setArtistView({ view: value })); if (scrollerRef.current) { @@ -136,14 +141,14 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { ); const onSortSelect = useCallback( - (value) => { + (value: string) => { dispatch(setArtistSort({ sortKey: value })); }, [dispatch] ); const onFilterSelect = useCallback( - (value) => { + (value: string) => { dispatch(setArtistFilter({ selectedFilterKey: value })); }, [dispatch] @@ -158,15 +163,15 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { }, [setIsOptionsModalOpen]); const onJumpBarItemPress = useCallback( - (character) => { + (character: string) => { setJumpToCharacter(character); }, [setJumpToCharacter] ); const onScroll = useCallback( - ({ scrollTop }) => { - setJumpToCharacter(null); + ({ scrollTop }: { scrollTop: number }) => { + setJumpToCharacter(undefined); scrollPositions.artistIndex = scrollTop; }, [setJumpToCharacter] @@ -180,10 +185,10 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { }; } - const characters = items.reduce((acc, item) => { + const characters = items.reduce((acc: Record, item) => { let char = item.sortName.charAt(0); - if (!isNaN(char)) { + if (!isNaN(Number(char))) { char = '#'; } @@ -300,6 +305,8 @@ const ArtistIndex = withScrollPosition((props: ArtistIndexProps) => { { + (payload: unknown) => { dispatch(setArtistFilter(payload)); }, [dispatch] @@ -39,6 +45,7 @@ export default function ArtistIndexFilterModal(props) { return ( ) : null} - {showQualityProfile ? ( + {showQualityProfile && !!qualityProfile?.name ? (
{qualityProfile.name}
diff --git a/frontend/src/Artist/Index/Banners/ArtistIndexBanners.tsx b/frontend/src/Artist/Index/Banners/ArtistIndexBanners.tsx index 50c0f3f9a..3582da097 100644 --- a/frontend/src/Artist/Index/Banners/ArtistIndexBanners.tsx +++ b/frontend/src/Artist/Index/Banners/ArtistIndexBanners.tsx @@ -1,8 +1,9 @@ import { throttle } from 'lodash'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import React, { RefObject, useEffect, useMemo, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import { FixedSizeGrid as Grid, GridChildComponentProps } from 'react-window'; import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; import Artist from 'Artist/Artist'; import ArtistIndexBanner from 'Artist/Index/Banners/ArtistIndexBanner'; import useMeasure from 'Helpers/Hooks/useMeasure'; @@ -21,7 +22,7 @@ const columnPaddingSmallScreen = parseInt( const progressBarHeight = parseInt(dimensions.progressBarSmallHeight); const detailedProgressBarHeight = parseInt(dimensions.progressBarMediumHeight); -const ADDITIONAL_COLUMN_COUNT = { +const ADDITIONAL_COLUMN_COUNT: Record = { small: 3, medium: 2, large: 1, @@ -41,17 +42,17 @@ interface CellItemData { interface ArtistIndexBannersProps { items: Artist[]; - sortKey?: string; + sortKey: string; sortDirection?: SortDirection; jumpToCharacter?: string; scrollTop?: number; - scrollerRef: React.MutableRefObject; + scrollerRef: RefObject; isSelectMode: boolean; isSmallScreen: boolean; } const artistIndexSelector = createSelector( - (state) => state.artistIndex.bannerOptions, + (state: AppState) => state.artistIndex.bannerOptions, (bannerOptions) => { return { bannerOptions, @@ -108,7 +109,7 @@ export default function ArtistIndexBanners(props: ArtistIndexBannersProps) { } = props; const { bannerOptions } = useSelector(artistIndexSelector); - const ref: React.MutableRefObject = useRef(); + const ref = useRef(null); const [measureRef, bounds] = useMeasure(); const [size, setSize] = useState({ width: 0, height: 0 }); @@ -222,8 +223,8 @@ export default function ArtistIndexBanners(props: ArtistIndexBannersProps) { }, [isSmallScreen, scrollerRef, bounds]); useEffect(() => { - const currentScrollListener = isSmallScreen ? window : scrollerRef.current; - const currentScrollerRef = scrollerRef.current; + const currentScrollerRef = scrollerRef.current as HTMLElement; + const currentScrollListener = isSmallScreen ? window : currentScrollerRef; const handleScroll = throttle(() => { const { offsetTop = 0 } = currentScrollerRef; @@ -232,7 +233,7 @@ export default function ArtistIndexBanners(props: ArtistIndexBannersProps) { ? getWindowScrollTopPosition() : currentScrollerRef.scrollTop) - offsetTop; - ref.current.scrollTo({ scrollLeft: 0, scrollTop }); + ref.current?.scrollTo({ scrollLeft: 0, scrollTop }); }, 10); currentScrollListener.addEventListener('scroll', handleScroll); @@ -255,8 +256,8 @@ export default function ArtistIndexBanners(props: ArtistIndexBannersProps) { const scrollTop = rowIndex * rowHeight + padding; - ref.current.scrollTo({ scrollLeft: 0, scrollTop }); - scrollerRef.current.scrollTo(0, scrollTop); + ref.current?.scrollTo({ scrollLeft: 0, scrollTop }); + scrollerRef.current?.scrollTo(0, scrollTop); } } }, [ diff --git a/frontend/src/Artist/Index/Banners/Options/ArtistIndexBannerOptionsModalContent.tsx b/frontend/src/Artist/Index/Banners/Options/ArtistIndexBannerOptionsModalContent.tsx index f75311bca..f889ea450 100644 --- a/frontend/src/Artist/Index/Banners/Options/ArtistIndexBannerOptionsModalContent.tsx +++ b/frontend/src/Artist/Index/Banners/Options/ArtistIndexBannerOptionsModalContent.tsx @@ -59,7 +59,7 @@ function ArtistIndexBannerOptionsModalContent( const dispatch = useDispatch(); const onBannerOptionChange = useCallback( - ({ name, value }) => { + ({ name, value }: { name: string; value: unknown }) => { dispatch(setArtistBannerOption({ [name]: value })); }, [dispatch] diff --git a/frontend/src/Artist/Index/Menus/ArtistIndexFilterMenu.tsx b/frontend/src/Artist/Index/Menus/ArtistIndexFilterMenu.tsx index 19be069e5..91ebbef2d 100644 --- a/frontend/src/Artist/Index/Menus/ArtistIndexFilterMenu.tsx +++ b/frontend/src/Artist/Index/Menus/ArtistIndexFilterMenu.tsx @@ -1,10 +1,18 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import { CustomFilter } from 'App/State/AppState'; import ArtistIndexFilterModal from 'Artist/Index/ArtistIndexFilterModal'; import FilterMenu from 'Components/Menu/FilterMenu'; import { align } from 'Helpers/Props'; -function ArtistIndexFilterMenu(props) { +interface ArtistIndexFilterMenuProps { + selectedFilterKey: string | number; + filters: object[]; + customFilters: CustomFilter[]; + isDisabled: boolean; + onFilterSelect(filterName: string): unknown; +} + +function ArtistIndexFilterMenu(props: ArtistIndexFilterMenuProps) { const { selectedFilterKey, filters, @@ -26,15 +34,6 @@ function ArtistIndexFilterMenu(props) { ); } -ArtistIndexFilterMenu.propTypes = { - selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) - .isRequired, - filters: PropTypes.arrayOf(PropTypes.object).isRequired, - customFilters: PropTypes.arrayOf(PropTypes.object).isRequired, - isDisabled: PropTypes.bool.isRequired, - onFilterSelect: PropTypes.func.isRequired, -}; - ArtistIndexFilterMenu.defaultProps = { showCustomFilters: false, }; diff --git a/frontend/src/Artist/Index/Menus/ArtistIndexSortMenu.tsx b/frontend/src/Artist/Index/Menus/ArtistIndexSortMenu.tsx index 3d4b8ded0..9bae4dabf 100644 --- a/frontend/src/Artist/Index/Menus/ArtistIndexSortMenu.tsx +++ b/frontend/src/Artist/Index/Menus/ArtistIndexSortMenu.tsx @@ -1,11 +1,19 @@ -import PropTypes from 'prop-types'; import React from 'react'; import MenuContent from 'Components/Menu/MenuContent'; import SortMenu from 'Components/Menu/SortMenu'; import SortMenuItem from 'Components/Menu/SortMenuItem'; -import { align, sortDirections } from 'Helpers/Props'; +import { align } from 'Helpers/Props'; +import SortDirection from 'Helpers/Props/SortDirection'; +import translate from 'Utilities/String/translate'; -function ArtistIndexSortMenu(props) { +interface SeriesIndexSortMenuProps { + sortKey?: string; + sortDirection?: SortDirection; + isDisabled: boolean; + onSortSelect(sortKey: string): unknown; +} + +function ArtistIndexSortMenu(props: SeriesIndexSortMenuProps) { const { sortKey, sortDirection, isDisabled, onSortSelect } = props; return ( @@ -17,7 +25,7 @@ function ArtistIndexSortMenu(props) { sortDirection={sortDirection} onPress={onSortSelect} > - Monitored/Status + {translate('MonitoredStatus')} - Name + {translate('Name')} - Type + {translate('Type')} - Quality Profile + {translate('QualityProfile')} - Metadata Profile + {translate('MetadataProfile')} - Next Album + {translate('NextAlbum')} - Last Album + {translate('Last Album')} - Added + {translate('Added')} - Albums + {translate('Albums')} - Tracks + {translate('Tracks')} - Track Count + {translate('TrackCount')} - Path + {translate('Path')} - Size on Disk + {translate('SizeOnDisk')} - Tags + {translate('Tags')} ); } -ArtistIndexSortMenu.propTypes = { - sortKey: PropTypes.string, - sortDirection: PropTypes.oneOf(sortDirections.all), - isDisabled: PropTypes.bool.isRequired, - onSortSelect: PropTypes.func.isRequired, -}; - export default ArtistIndexSortMenu; diff --git a/frontend/src/Artist/Index/Menus/ArtistIndexViewMenu.tsx b/frontend/src/Artist/Index/Menus/ArtistIndexViewMenu.tsx index f4be32db3..bb88d9149 100644 --- a/frontend/src/Artist/Index/Menus/ArtistIndexViewMenu.tsx +++ b/frontend/src/Artist/Index/Menus/ArtistIndexViewMenu.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import MenuContent from 'Components/Menu/MenuContent'; import ViewMenu from 'Components/Menu/ViewMenu'; @@ -6,7 +5,13 @@ import ViewMenuItem from 'Components/Menu/ViewMenuItem'; import { align } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; -function ArtistIndexViewMenu(props) { +interface ArtistIndexViewMenuProps { + view: string; + isDisabled: boolean; + onViewSelect(value: string): unknown; +} + +function ArtistIndexViewMenu(props: ArtistIndexViewMenuProps) { const { view, isDisabled, onViewSelect } = props; return ( @@ -36,10 +41,4 @@ function ArtistIndexViewMenu(props) { ); } -ArtistIndexViewMenu.propTypes = { - view: PropTypes.string.isRequired, - isDisabled: PropTypes.bool.isRequired, - onViewSelect: PropTypes.func.isRequired, -}; - export default ArtistIndexViewMenu; diff --git a/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfo.tsx b/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfo.tsx index 33c4ad2a9..fd3263893 100644 --- a/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfo.tsx +++ b/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfo.tsx @@ -1,15 +1,51 @@ +import { IconDefinition } from '@fortawesome/free-regular-svg-icons'; import React, { useMemo } from 'react'; import { useSelector } from 'react-redux'; import Album from 'Album/Album'; import { icons } from 'Helpers/Props'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import dimensions from 'Styles/Variables/dimensions'; +import QualityProfile from 'typings/QualityProfile'; +import { UiSettings } from 'typings/UiSettings'; import formatDateTime from 'Utilities/Date/formatDateTime'; import getRelativeDate from 'Utilities/Date/getRelativeDate'; import formatBytes from 'Utilities/Number/formatBytes'; +import translate from 'Utilities/String/translate'; import ArtistIndexOverviewInfoRow from './ArtistIndexOverviewInfoRow'; import styles from './ArtistIndexOverviewInfo.css'; +interface RowProps { + name: string; + showProp: string; + valueProp: string; +} + +interface RowInfoProps { + title: string; + iconName: IconDefinition; + label: string; +} + +interface ArtistIndexOverviewInfoProps { + height: number; + showMonitored: boolean; + showQualityProfile: boolean; + showLastAlbum: boolean; + showAdded: boolean; + showAlbumCount: boolean; + showPath: boolean; + showSizeOnDisk: boolean; + monitored: boolean; + nextAlbum?: Album; + qualityProfile?: QualityProfile; + lastAlbum?: Album; + added?: string; + albumCount: number; + path: string; + sizeOnDisk?: number; + sortKey: string; +} + const infoRowHeight = parseInt(dimensions.artistIndexOverviewInfoRowHeight); const rows = [ @@ -50,11 +86,17 @@ const rows = [ }, ]; -function getInfoRowProps(row, props, uiSettings) { +function getInfoRowProps( + row: RowProps, + props: ArtistIndexOverviewInfoProps, + uiSettings: UiSettings +): RowInfoProps | null { const { name } = row; if (name === 'monitored') { - const monitoredText = props.monitored ? 'Monitored' : 'Unmonitored'; + const monitoredText = props.monitored + ? translate('Monitored') + : translate('Unmonitored'); return { title: monitoredText, @@ -63,9 +105,9 @@ function getInfoRowProps(row, props, uiSettings) { }; } - if (name === 'qualityProfileId') { + if (name === 'qualityProfileId' && !!props.qualityProfile?.name) { return { - title: 'Quality Profile', + title: translate('QualityProfile'), iconName: icons.PROFILE, label: props.qualityProfile.name, }; @@ -78,15 +120,16 @@ function getInfoRowProps(row, props, uiSettings) { return { title: `Last Album: ${lastAlbum.title}`, iconName: icons.CALENDAR, - label: getRelativeDate( - lastAlbum.releaseDate, - shortDateFormat, - showRelativeDates, - { - timeFormat, - timeForToday: true, - } - ), + label: + getRelativeDate( + lastAlbum.releaseDate, + shortDateFormat, + showRelativeDates, + { + timeFormat, + timeForToday: true, + } + ) ?? '', }; } @@ -98,10 +141,11 @@ function getInfoRowProps(row, props, uiSettings) { return { title: `Added: ${formatDateTime(added, longDateFormat, timeFormat)}`, iconName: icons.ADD, - label: getRelativeDate(added, shortDateFormat, showRelativeDates, { - timeFormat, - timeForToday: true, - }), + label: + getRelativeDate(added, shortDateFormat, showRelativeDates, { + timeFormat, + timeForToday: true, + }) ?? '', }; } @@ -116,7 +160,7 @@ function getInfoRowProps(row, props, uiSettings) { } return { - title: 'Album Count', + title: translate('AlbumCount'), iconName: icons.CIRCLE, label: albums, }; @@ -124,7 +168,7 @@ function getInfoRowProps(row, props, uiSettings) { if (name === 'path') { return { - title: 'Path', + title: translate('Path'), iconName: icons.FOLDER, label: props.path, }; @@ -132,31 +176,13 @@ function getInfoRowProps(row, props, uiSettings) { if (name === 'sizeOnDisk') { return { - title: 'Size on Disk', + title: translate('SizeOnDisk'), iconName: icons.DRIVE, label: formatBytes(props.sizeOnDisk), }; } -} -interface ArtistIndexOverviewInfoProps { - height: number; - showMonitored: boolean; - showQualityProfile: boolean; - showLastAlbum: boolean; - showAdded: boolean; - showAlbumCount: boolean; - showPath: boolean; - showSizeOnDisk: boolean; - monitored: boolean; - nextAlbum?: Album; - qualityProfile: object; - lastAlbum?: Album; - added?: string; - albumCount: number; - path: string; - sizeOnDisk?: number; - sortKey: string; + return null; } function ArtistIndexOverviewInfo(props: ArtistIndexOverviewInfoProps) { @@ -175,6 +201,8 @@ function ArtistIndexOverviewInfo(props: ArtistIndexOverviewInfoProps) { const { name, showProp, valueProp } = row; const isVisible = + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore ts(7053) props[valueProp] != null && (props[showProp] || props.sortKey === name); return { @@ -219,6 +247,10 @@ function ArtistIndexOverviewInfo(props: ArtistIndexOverviewInfoProps) { const infoRowProps = getInfoRowProps(row, props, uiSettings); + if (infoRowProps == null) { + return null; + } + return ; })}
diff --git a/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfoRow.tsx b/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfoRow.tsx index 931d7053c..5d9b4a069 100644 --- a/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfoRow.tsx +++ b/frontend/src/Artist/Index/Overview/ArtistIndexOverviewInfoRow.tsx @@ -1,11 +1,12 @@ +import { IconDefinition } from '@fortawesome/free-regular-svg-icons'; import React from 'react'; import Icon from 'Components/Icon'; import styles from './ArtistIndexOverviewInfoRow.css'; interface ArtistIndexOverviewInfoRowProps { title?: string; - iconName: object; - label: string; + iconName?: IconDefinition; + label: string | null; } function ArtistIndexOverviewInfoRow(props: ArtistIndexOverviewInfoRowProps) { diff --git a/frontend/src/Artist/Index/Overview/ArtistIndexOverviews.tsx b/frontend/src/Artist/Index/Overview/ArtistIndexOverviews.tsx index 3f1197ef4..11285c1b3 100644 --- a/frontend/src/Artist/Index/Overview/ArtistIndexOverviews.tsx +++ b/frontend/src/Artist/Index/Overview/ArtistIndexOverviews.tsx @@ -1,5 +1,5 @@ import { throttle } from 'lodash'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import React, { RefObject, useEffect, useMemo, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import { FixedSizeList as List, ListChildComponentProps } from 'react-window'; import Artist from 'Artist/Artist'; @@ -33,11 +33,11 @@ interface RowItemData { interface ArtistIndexOverviewsProps { items: Artist[]; - sortKey?: string; + sortKey: string; sortDirection?: string; jumpToCharacter?: string; scrollTop?: number; - scrollerRef: React.MutableRefObject; + scrollerRef: RefObject; isSelectMode: boolean; isSmallScreen: boolean; } @@ -79,7 +79,7 @@ function ArtistIndexOverviews(props: ArtistIndexOverviewsProps) { const { size: posterSize, detailedProgressBar } = useSelector( selectOverviewOptions ); - const listRef: React.MutableRefObject = useRef(); + const listRef = useRef(null); const [measureRef, bounds] = useMeasure(); const [size, setSize] = useState({ width: 0, height: 0 }); @@ -136,8 +136,8 @@ function ArtistIndexOverviews(props: ArtistIndexOverviewsProps) { }, [isSmallScreen, scrollerRef, bounds]); useEffect(() => { - const currentScrollListener = isSmallScreen ? window : scrollerRef.current; - const currentScrollerRef = scrollerRef.current; + const currentScrollerRef = scrollerRef.current as HTMLElement; + const currentScrollListener = isSmallScreen ? window : currentScrollerRef; const handleScroll = throttle(() => { const { offsetTop = 0 } = currentScrollerRef; @@ -146,7 +146,7 @@ function ArtistIndexOverviews(props: ArtistIndexOverviewsProps) { ? getWindowScrollTopPosition() : currentScrollerRef.scrollTop) - offsetTop; - listRef.current.scrollTo(scrollTop); + listRef.current?.scrollTo(scrollTop); }, 10); currentScrollListener.addEventListener('scroll', handleScroll); @@ -175,8 +175,8 @@ function ArtistIndexOverviews(props: ArtistIndexOverviewsProps) { scrollTop += offset; } - listRef.current.scrollTo(scrollTop); - scrollerRef.current.scrollTo(0, scrollTop); + listRef.current?.scrollTo(scrollTop); + scrollerRef.current?.scrollTo(0, scrollTop); } } }, [jumpToCharacter, rowHeight, items, scrollerRef, listRef]); diff --git a/frontend/src/Artist/Index/Overview/Options/ArtistIndexOverviewOptionsModalContent.tsx b/frontend/src/Artist/Index/Overview/Options/ArtistIndexOverviewOptionsModalContent.tsx index e19692e41..4ab9391e3 100644 --- a/frontend/src/Artist/Index/Overview/Options/ArtistIndexOverviewOptionsModalContent.tsx +++ b/frontend/src/Artist/Index/Overview/Options/ArtistIndexOverviewOptionsModalContent.tsx @@ -60,7 +60,7 @@ function ArtistIndexOverviewOptionsModalContent( const dispatch = useDispatch(); const onOverviewOptionChange = useCallback( - ({ name, value }) => { + ({ name, value }: { name: string; value: unknown }) => { dispatch(setArtistOverviewOption({ [name]: value })); }, [dispatch] diff --git a/frontend/src/Artist/Index/Posters/ArtistIndexPoster.tsx b/frontend/src/Artist/Index/Posters/ArtistIndexPoster.tsx index 156368d9b..67c37c00d 100644 --- a/frontend/src/Artist/Index/Posters/ArtistIndexPoster.tsx +++ b/frontend/src/Artist/Index/Posters/ArtistIndexPoster.tsx @@ -206,7 +206,7 @@ function ArtistIndexPoster(props: ArtistIndexPosterProps) { ) : null} - {showQualityProfile ? ( + {showQualityProfile && !!qualityProfile?.name ? (
{qualityProfile.name}
diff --git a/frontend/src/Artist/Index/Posters/ArtistIndexPosters.tsx b/frontend/src/Artist/Index/Posters/ArtistIndexPosters.tsx index 9e5c3e885..c478ac1ae 100644 --- a/frontend/src/Artist/Index/Posters/ArtistIndexPosters.tsx +++ b/frontend/src/Artist/Index/Posters/ArtistIndexPosters.tsx @@ -1,8 +1,9 @@ import { throttle } from 'lodash'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import React, { RefObject, useEffect, useMemo, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; import { FixedSizeGrid as Grid, GridChildComponentProps } from 'react-window'; import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; import Artist from 'Artist/Artist'; import ArtistIndexPoster from 'Artist/Index/Posters/ArtistIndexPoster'; import useMeasure from 'Helpers/Hooks/useMeasure'; @@ -21,7 +22,7 @@ const columnPaddingSmallScreen = parseInt( const progressBarHeight = parseInt(dimensions.progressBarSmallHeight); const detailedProgressBarHeight = parseInt(dimensions.progressBarMediumHeight); -const ADDITIONAL_COLUMN_COUNT = { +const ADDITIONAL_COLUMN_COUNT: Record = { small: 3, medium: 2, large: 1, @@ -41,17 +42,17 @@ interface CellItemData { interface ArtistIndexPostersProps { items: Artist[]; - sortKey?: string; + sortKey: string; sortDirection?: SortDirection; jumpToCharacter?: string; scrollTop?: number; - scrollerRef: React.MutableRefObject; + scrollerRef: RefObject; isSelectMode: boolean; isSmallScreen: boolean; } const artistIndexSelector = createSelector( - (state) => state.artistIndex.posterOptions, + (state: AppState) => state.artistIndex.posterOptions, (posterOptions) => { return { posterOptions, @@ -108,7 +109,7 @@ export default function ArtistIndexPosters(props: ArtistIndexPostersProps) { } = props; const { posterOptions } = useSelector(artistIndexSelector); - const ref: React.MutableRefObject = useRef(); + const ref = useRef(null); const [measureRef, bounds] = useMeasure(); const [size, setSize] = useState({ width: 0, height: 0 }); @@ -231,8 +232,8 @@ export default function ArtistIndexPosters(props: ArtistIndexPostersProps) { }, [isSmallScreen, size, scrollerRef, bounds]); useEffect(() => { - const currentScrollListener = isSmallScreen ? window : scrollerRef.current; - const currentScrollerRef = scrollerRef.current; + const currentScrollerRef = scrollerRef.current as HTMLElement; + const currentScrollListener = isSmallScreen ? window : currentScrollerRef; const handleScroll = throttle(() => { const { offsetTop = 0 } = currentScrollerRef; @@ -241,7 +242,7 @@ export default function ArtistIndexPosters(props: ArtistIndexPostersProps) { ? getWindowScrollTopPosition() : currentScrollerRef.scrollTop) - offsetTop; - ref.current.scrollTo({ scrollLeft: 0, scrollTop }); + ref.current?.scrollTo({ scrollLeft: 0, scrollTop }); }, 10); currentScrollListener.addEventListener('scroll', handleScroll); @@ -264,8 +265,8 @@ export default function ArtistIndexPosters(props: ArtistIndexPostersProps) { const scrollTop = rowIndex * rowHeight + padding; - ref.current.scrollTo({ scrollLeft: 0, scrollTop }); - scrollerRef.current.scrollTo(0, scrollTop); + ref.current?.scrollTo({ scrollLeft: 0, scrollTop }); + scrollerRef.current?.scrollTo(0, scrollTop); } } }, [ diff --git a/frontend/src/Artist/Index/Posters/Options/ArtistIndexPosterOptionsModalContent.tsx b/frontend/src/Artist/Index/Posters/Options/ArtistIndexPosterOptionsModalContent.tsx index e1e60801c..2560d855a 100644 --- a/frontend/src/Artist/Index/Posters/Options/ArtistIndexPosterOptionsModalContent.tsx +++ b/frontend/src/Artist/Index/Posters/Options/ArtistIndexPosterOptionsModalContent.tsx @@ -59,7 +59,7 @@ function ArtistIndexPosterOptionsModalContent( const dispatch = useDispatch(); const onPosterOptionChange = useCallback( - ({ name, value }) => { + ({ name, value }: { name: string; value: unknown }) => { dispatch(setArtistPosterOption({ [name]: value })); }, [dispatch] diff --git a/frontend/src/Artist/Index/Select/AlbumStudio/AlbumDetails.tsx b/frontend/src/Artist/Index/Select/AlbumStudio/AlbumDetails.tsx index bd6a01e10..02c5f9ee9 100644 --- a/frontend/src/Artist/Index/Select/AlbumStudio/AlbumDetails.tsx +++ b/frontend/src/Artist/Index/Select/AlbumStudio/AlbumDetails.tsx @@ -57,7 +57,7 @@ function AlbumDetails(props: AlbumDetailsProps) { albumType, monitored, statistics, - isSaving, + isSaving = false, } = album; return ( diff --git a/frontend/src/Artist/Index/Select/AlbumStudio/AlbumStudioAlbum.tsx b/frontend/src/Artist/Index/Select/AlbumStudio/AlbumStudioAlbum.tsx index ec4ef9074..3e7e0578f 100644 --- a/frontend/src/Artist/Index/Select/AlbumStudio/AlbumStudioAlbum.tsx +++ b/frontend/src/Artist/Index/Select/AlbumStudio/AlbumStudioAlbum.tsx @@ -11,7 +11,7 @@ interface AlbumStudioAlbumProps { artistId: number; albumId: number; title: string; - disambiguation: string; + disambiguation?: string; albumType: string; monitored: boolean; statistics: Statistics; diff --git a/frontend/src/Artist/Index/Select/AlbumStudio/ChangeMonitoringModalContent.tsx b/frontend/src/Artist/Index/Select/AlbumStudio/ChangeMonitoringModalContent.tsx index c21c9a8af..b3c2abbbe 100644 --- a/frontend/src/Artist/Index/Select/AlbumStudio/ChangeMonitoringModalContent.tsx +++ b/frontend/src/Artist/Index/Select/AlbumStudio/ChangeMonitoringModalContent.tsx @@ -33,7 +33,7 @@ function ChangeMonitoringModalContent( const [monitor, setMonitor] = useState(NO_CHANGE); const onInputChange = useCallback( - ({ value }) => { + ({ value }: { value: string }) => { setMonitor(value); }, [setMonitor] diff --git a/frontend/src/Artist/Index/Select/ArtistIndexPosterSelect.tsx b/frontend/src/Artist/Index/Select/ArtistIndexPosterSelect.tsx index cc072f41a..86b41e8ba 100644 --- a/frontend/src/Artist/Index/Select/ArtistIndexPosterSelect.tsx +++ b/frontend/src/Artist/Index/Select/ArtistIndexPosterSelect.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { SyntheticEvent, useCallback } from 'react'; import { useSelect } from 'App/SelectContext'; import Icon from 'Components/Icon'; import Link from 'Components/Link/Link'; @@ -15,8 +15,9 @@ function ArtistIndexPosterSelect(props: ArtistIndexPosterSelectProps) { const isSelected = selectState.selectedState[artistId]; const onSelectPress = useCallback( - (event) => { - const shiftKey = event.nativeEvent.shiftKey; + (event: SyntheticEvent) => { + const nativeEvent = event.nativeEvent as PointerEvent; + const shiftKey = nativeEvent.shiftKey; selectDispatch({ type: 'toggleSelected', diff --git a/frontend/src/Artist/Index/Select/ArtistIndexSelectAllButton.tsx b/frontend/src/Artist/Index/Select/ArtistIndexSelectAllButton.tsx index 7229dbdc0..2b3e9c01c 100644 --- a/frontend/src/Artist/Index/Select/ArtistIndexSelectAllButton.tsx +++ b/frontend/src/Artist/Index/Select/ArtistIndexSelectAllButton.tsx @@ -6,7 +6,7 @@ import { icons } from 'Helpers/Props'; interface ArtistIndexSelectAllButtonProps { label: string; isSelectMode: boolean; - overflowComponent: React.FunctionComponent; + overflowComponent: React.FunctionComponent; } function ArtistIndexSelectAllButton(props: ArtistIndexSelectAllButtonProps) { diff --git a/frontend/src/Artist/Index/Select/ArtistIndexSelectFooter.tsx b/frontend/src/Artist/Index/Select/ArtistIndexSelectFooter.tsx index ffa017a78..f0569d607 100644 --- a/frontend/src/Artist/Index/Select/ArtistIndexSelectFooter.tsx +++ b/frontend/src/Artist/Index/Select/ArtistIndexSelectFooter.tsx @@ -24,6 +24,14 @@ import OrganizeArtistModal from './Organize/OrganizeArtistModal'; import TagsModal from './Tags/TagsModal'; import styles from './ArtistIndexSelectFooter.css'; +interface SavePayload { + monitored?: boolean; + qualityProfileId?: number; + metadataProfileId?: number; + rootFolderPath?: string; + moveFiles?: boolean; +} + const artistEditorSelector = createSelector( (state: AppState) => state.artist, (artist) => { @@ -79,7 +87,7 @@ function ArtistIndexSelectFooter() { }, [setIsEditModalOpen]); const onSavePress = useCallback( - (payload) => { + (payload: SavePayload) => { setIsSavingArtist(true); setIsEditModalOpen(false); @@ -118,7 +126,7 @@ function ArtistIndexSelectFooter() { }, [setIsTagsModalOpen]); const onApplyTagsPress = useCallback( - (tags, applyTags) => { + (tags: number[], applyTags: string) => { setIsSavingTags(true); setIsTagsModalOpen(false); diff --git a/frontend/src/Artist/Index/Select/ArtistIndexSelectModeButton.tsx b/frontend/src/Artist/Index/Select/ArtistIndexSelectModeButton.tsx index 45fe78536..8679bba99 100644 --- a/frontend/src/Artist/Index/Select/ArtistIndexSelectModeButton.tsx +++ b/frontend/src/Artist/Index/Select/ArtistIndexSelectModeButton.tsx @@ -7,7 +7,7 @@ interface ArtistIndexSelectModeButtonProps { label: string; iconName: IconDefinition; isSelectMode: boolean; - overflowComponent: React.FunctionComponent; + overflowComponent: React.FunctionComponent; onPress: () => void; } diff --git a/frontend/src/Artist/Index/Select/AudioTags/RetagArtistModalContent.tsx b/frontend/src/Artist/Index/Select/AudioTags/RetagArtistModalContent.tsx index 5e7d1f1ff..b67ee60aa 100644 --- a/frontend/src/Artist/Index/Select/AudioTags/RetagArtistModalContent.tsx +++ b/frontend/src/Artist/Index/Select/AudioTags/RetagArtistModalContent.tsx @@ -28,9 +28,15 @@ function RetagArtistModalContent(props: RetagArtistModalContentProps) { const dispatch = useDispatch(); const artistNames = useMemo(() => { - const artists = artistIds.map((id) => { - return allArtists.find((a) => a.id === id); - }); + const artists = artistIds.reduce((acc: Artist[], id) => { + const a = allArtists.find((a) => a.id === id); + + if (a) { + acc.push(a); + } + + return acc; + }, []); const sorted = orderBy(artists, ['sortName']); diff --git a/frontend/src/Artist/Index/Select/Delete/DeleteArtistModalContent.tsx b/frontend/src/Artist/Index/Select/Delete/DeleteArtistModalContent.tsx index c367a4550..4accc9f0e 100644 --- a/frontend/src/Artist/Index/Select/Delete/DeleteArtistModalContent.tsx +++ b/frontend/src/Artist/Index/Select/Delete/DeleteArtistModalContent.tsx @@ -15,6 +15,7 @@ import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; import { bulkDeleteArtist, setDeleteOption } from 'Store/Actions/artistActions'; import createAllArtistSelector from 'Store/Selectors/createAllArtistSelector'; +import { CheckInputChanged } from 'typings/inputs'; import translate from 'Utilities/String/translate'; import styles from './DeleteArtistModalContent.css'; @@ -37,16 +38,16 @@ function DeleteArtistModalContent(props: DeleteArtistModalContentProps) { const [deleteFiles, setDeleteFiles] = useState(false); - const artists = useMemo(() => { - const artists = artistIds.map((id) => { + const artists = useMemo((): Artist[] => { + const artistList = artistIds.map((id) => { return allArtists.find((a) => a.id === id); - }); + }) as Artist[]; - return orderBy(artists, ['sortName']); + return orderBy(artistList, ['sortName']); }, [artistIds, allArtists]); const onDeleteFilesChange = useCallback( - ({ value }) => { + ({ value }: CheckInputChanged) => { setDeleteFiles(value); }, [setDeleteFiles] diff --git a/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx b/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx index 94d1e87d2..f6f733f5f 100644 --- a/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx +++ b/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx @@ -66,7 +66,7 @@ function EditArtistModalContent(props: EditArtistModalContentProps) { const [isConfirmMoveModalOpen, setIsConfirmMoveModalOpen] = useState(false); const save = useCallback( - (moveFiles) => { + (moveFiles: boolean) => { let hasChanges = false; const payload: SavePayload = {}; @@ -114,7 +114,7 @@ function EditArtistModalContent(props: EditArtistModalContentProps) { ); const onInputChange = useCallback( - ({ name, value }) => { + ({ name, value }: { name: string; value: string }) => { switch (name) { case 'monitored': setMonitored(value); diff --git a/frontend/src/Artist/Index/Select/Tags/TagsModalContent.tsx b/frontend/src/Artist/Index/Select/Tags/TagsModalContent.tsx index c41c0c896..95a7eaae2 100644 --- a/frontend/src/Artist/Index/Select/Tags/TagsModalContent.tsx +++ b/frontend/src/Artist/Index/Select/Tags/TagsModalContent.tsx @@ -1,6 +1,7 @@ import { uniq } from 'lodash'; import React, { useCallback, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; +import { Tag } from 'App/State/TagsAppState'; import Artist from 'Artist/Artist'; import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; @@ -28,7 +29,7 @@ function TagsModalContent(props: TagsModalContentProps) { const { artistIds, onModalClose, onApplyTagsPress } = props; const allArtists: Artist[] = useSelector(createAllArtistSelector()); - const tagList = useSelector(createTagsSelector()); + const tagList: Tag[] = useSelector(createTagsSelector()); const [tags, setTags] = useState([]); const [applyTags, setApplyTags] = useState('add'); @@ -48,14 +49,14 @@ function TagsModalContent(props: TagsModalContentProps) { }, [artistIds, allArtists]); const onTagsChange = useCallback( - ({ value }) => { + ({ value }: { value: number[] }) => { setTags(value); }, [setTags] ); const onApplyTagsChange = useCallback( - ({ value }) => { + ({ value }: { value: string }) => { setApplyTags(value); }, [setApplyTags] diff --git a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx index 376fdb359..0398f5502 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx +++ b/frontend/src/Artist/Index/Table/ArtistIndexRow.tsx @@ -23,6 +23,7 @@ import Column from 'Components/Table/Column'; import TagListConnector from 'Components/TagListConnector'; import { icons } from 'Helpers/Props'; import { executeCommand } from 'Store/Actions/commandActions'; +import { SelectStateInputProps } from 'typings/props'; import formatBytes from 'Utilities/Number/formatBytes'; import firstCharToUpper from 'Utilities/String/firstCharToUpper'; import translate from 'Utilities/String/translate'; @@ -128,7 +129,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { }, [setIsDeleteArtistModalOpen]); const onSelectedChange = useCallback( - ({ id, value, shiftKey }) => { + ({ id, value, shiftKey }: SelectStateInputProps) => { selectDispatch({ type: 'toggleSelected', id, @@ -219,7 +220,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { if (name === 'qualityProfileId') { return ( - {qualityProfile.name} + {qualityProfile?.name ?? ''} ); } @@ -227,7 +228,7 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { if (name === 'metadataProfileId') { return ( - {metadataProfile.name} + {metadataProfile?.name ?? ''} ); } @@ -280,6 +281,8 @@ function ArtistIndexRow(props: ArtistIndexRowProps) { if (name === 'added') { return ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore ts(2739) ; + scrollerRef: RefObject; isSelectMode: boolean; isSmallScreen: boolean; } const columnsSelector = createSelector( - (state) => state.artistIndex.columns, + (state: AppState) => state.artistIndex.columns, (columns) => columns ); @@ -93,7 +94,7 @@ function ArtistIndexTable(props: ArtistIndexTableProps) { const columns = useSelector(columnsSelector); const { showBanners } = useSelector(selectTableOptions); - const listRef: React.MutableRefObject = useRef(); + const listRef = useRef>(null); const [measureRef, bounds] = useMeasure(); const [size, setSize] = useState({ width: 0, height: 0 }); const windowWidth = window.innerWidth; @@ -104,7 +105,7 @@ function ArtistIndexTable(props: ArtistIndexTableProps) { }, [showBanners]); useEffect(() => { - const current = scrollerRef.current as HTMLElement; + const current = scrollerRef?.current as HTMLElement; if (isSmallScreen) { setSize({ @@ -128,8 +129,8 @@ function ArtistIndexTable(props: ArtistIndexTableProps) { }, [isSmallScreen, windowWidth, windowHeight, scrollerRef, bounds]); useEffect(() => { - const currentScrollListener = isSmallScreen ? window : scrollerRef.current; - const currentScrollerRef = scrollerRef.current; + const currentScrollerRef = scrollerRef.current as HTMLElement; + const currentScrollListener = isSmallScreen ? window : currentScrollerRef; const handleScroll = throttle(() => { const { offsetTop = 0 } = currentScrollerRef; @@ -138,7 +139,7 @@ function ArtistIndexTable(props: ArtistIndexTableProps) { ? getWindowScrollTopPosition() : currentScrollerRef.scrollTop) - offsetTop; - listRef.current.scrollTo(scrollTop); + listRef.current?.scrollTo(scrollTop); }, 10); currentScrollListener.addEventListener('scroll', handleScroll); @@ -167,8 +168,8 @@ function ArtistIndexTable(props: ArtistIndexTableProps) { scrollTop += offset; } - listRef.current.scrollTo(scrollTop); - scrollerRef.current.scrollTo(0, scrollTop); + listRef.current?.scrollTo(scrollTop); + scrollerRef?.current?.scrollTo(0, scrollTop); } } }, [jumpToCharacter, rowHeight, items, scrollerRef, listRef]); diff --git a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.tsx b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.tsx index 2e903574d..1b325c225 100644 --- a/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.tsx +++ b/frontend/src/Artist/Index/Table/ArtistIndexTableHeader.tsx @@ -15,6 +15,7 @@ import { setArtistSort, setArtistTableOption, } from 'Store/Actions/artistIndexActions'; +import { CheckInputChanged } from 'typings/inputs'; import hasGrowableColumns from './hasGrowableColumns'; import styles from './ArtistIndexTableHeader.css'; @@ -32,21 +33,21 @@ function ArtistIndexTableHeader(props: ArtistIndexTableHeaderProps) { const [selectState, selectDispatch] = useSelect(); const onSortPress = useCallback( - (value) => { + (value: string) => { dispatch(setArtistSort({ sortKey: value })); }, [dispatch] ); const onTableOptionChange = useCallback( - (payload) => { + (payload: unknown) => { dispatch(setArtistTableOption(payload)); }, [dispatch] ); const onSelectAllChange = useCallback( - ({ value }) => { + ({ value }: CheckInputChanged) => { selectDispatch({ type: value ? 'selectAll' : 'unselectAll', }); @@ -94,6 +95,8 @@ function ArtistIndexTableHeader(props: ArtistIndexTableHeaderProps) { { + ({ name, value }: CheckInputChanged) => { onTableOptionChange({ tableOptions: { ...tableOptions, diff --git a/frontend/src/Artist/Index/createArtistIndexItemSelector.ts b/frontend/src/Artist/Index/createArtistIndexItemSelector.ts index 86ee8a560..4388a3aeb 100644 --- a/frontend/src/Artist/Index/createArtistIndexItemSelector.ts +++ b/frontend/src/Artist/Index/createArtistIndexItemSelector.ts @@ -1,5 +1,6 @@ import { createSelector } from 'reselect'; import Artist from 'Artist/Artist'; +import Command from 'Commands/Command'; import { ARTIST_SEARCH, REFRESH_ARTIST } from 'Commands/commandNames'; import createArtistMetadataProfileSelector from 'Store/Selectors/createArtistMetadataProfileSelector'; import createArtistQualityProfileSelector from 'Store/Selectors/createArtistQualityProfileSelector'; @@ -12,25 +13,21 @@ function createArtistIndexItemSelector(artistId: number) { createArtistQualityProfileSelector(artistId), createArtistMetadataProfileSelector(artistId), createExecutingCommandsSelector(), - (artist: Artist, qualityProfile, metadataProfile, executingCommands) => { - // If an artist is deleted this selector may fire before the parent - // selectors, which will result in an undefined artist, if that happens - // we want to return early here and again in the render function to avoid - // trying to show an artist that has no information available. - - if (!artist) { - return {}; - } - + ( + artist: Artist, + qualityProfile, + metadataProfile, + executingCommands: Command[] + ) => { const isRefreshingArtist = executingCommands.some((command) => { return ( - command.name === REFRESH_ARTIST && command.body.artistId === artist.id + command.name === REFRESH_ARTIST && command.body.artistId === artistId ); }); const isSearchingArtist = executingCommands.some((command) => { return ( - command.name === ARTIST_SEARCH && command.body.artistId === artist.id + command.name === ARTIST_SEARCH && command.body.artistId === artistId ); }); diff --git a/frontend/src/Commands/Command.ts b/frontend/src/Commands/Command.ts new file mode 100644 index 000000000..8b781355f --- /dev/null +++ b/frontend/src/Commands/Command.ts @@ -0,0 +1,37 @@ +import ModelBase from 'App/ModelBase'; + +export interface CommandBody { + sendUpdatesToClient: boolean; + updateScheduledTask: boolean; + completionMessage: string; + requiresDiskAccess: boolean; + isExclusive: boolean; + isLongRunning: boolean; + name: string; + lastExecutionTime: string; + lastStartTime: string; + trigger: string; + suppressMessages: boolean; + artistId?: number; +} + +interface Command extends ModelBase { + name: string; + commandName: string; + message: string; + body: CommandBody; + priority: string; + status: string; + result: string; + queued: string; + started: string; + ended: string; + duration: string; + trigger: string; + stateChangeTime: string; + sendUpdatesToClient: boolean; + updateScheduledTask: boolean; + lastExecutionTime: string; +} + +export default Command; diff --git a/frontend/src/Components/Page/PageContentBody.tsx b/frontend/src/Components/Page/PageContentBody.tsx index 972a9bade..ce9b0e7e4 100644 --- a/frontend/src/Components/Page/PageContentBody.tsx +++ b/frontend/src/Components/Page/PageContentBody.tsx @@ -1,5 +1,5 @@ -import React, { forwardRef, ReactNode, useCallback } from 'react'; -import Scroller from 'Components/Scroller/Scroller'; +import React, { ForwardedRef, forwardRef, ReactNode, useCallback } from 'react'; +import Scroller, { OnScroll } from 'Components/Scroller/Scroller'; import ScrollDirection from 'Helpers/Props/ScrollDirection'; import { isLocked } from 'Utilities/scrollLock'; import styles from './PageContentBody.css'; @@ -9,14 +9,11 @@ interface PageContentBodyProps { innerClassName?: string; children: ReactNode; initialScrollTop?: number; - onScroll?: (payload) => void; + onScroll?: (payload: OnScroll) => void; } const PageContentBody = forwardRef( - ( - props: PageContentBodyProps, - ref: React.MutableRefObject - ) => { + (props: PageContentBodyProps, ref: ForwardedRef) => { const { className = styles.contentBody, innerClassName = styles.innerContentBody, @@ -26,7 +23,7 @@ const PageContentBody = forwardRef( } = props; const onScrollWrapper = useCallback( - (payload) => { + (payload: OnScroll) => { if (onScroll && !isLocked()) { onScroll(payload); } diff --git a/frontend/src/Components/Scroller/Scroller.tsx b/frontend/src/Components/Scroller/Scroller.tsx index 2bcb899aa..37b16eebd 100644 --- a/frontend/src/Components/Scroller/Scroller.tsx +++ b/frontend/src/Components/Scroller/Scroller.tsx @@ -1,9 +1,21 @@ import classNames from 'classnames'; import { throttle } from 'lodash'; -import React, { forwardRef, ReactNode, useEffect, useRef } from 'react'; +import React, { + ForwardedRef, + forwardRef, + MutableRefObject, + ReactNode, + useEffect, + useRef, +} from 'react'; import ScrollDirection from 'Helpers/Props/ScrollDirection'; import styles from './Scroller.css'; +export interface OnScroll { + scrollLeft: number; + scrollTop: number; +} + interface ScrollerProps { className?: string; scrollDirection?: ScrollDirection; @@ -12,11 +24,11 @@ interface ScrollerProps { scrollTop?: number; initialScrollTop?: number; children?: ReactNode; - onScroll?: (payload) => void; + onScroll?: (payload: OnScroll) => void; } const Scroller = forwardRef( - (props: ScrollerProps, ref: React.MutableRefObject) => { + (props: ScrollerProps, ref: ForwardedRef) => { const { className, autoFocus = false, @@ -30,7 +42,7 @@ const Scroller = forwardRef( } = props; const internalRef = useRef(); - const currentRef = ref ?? internalRef; + const currentRef = (ref as MutableRefObject) ?? internalRef; useEffect( () => { diff --git a/frontend/src/Components/Table/VirtualTable.js b/frontend/src/Components/Table/VirtualTable.js index 4a597e795..5473413cb 100644 --- a/frontend/src/Components/Table/VirtualTable.js +++ b/frontend/src/Components/Table/VirtualTable.js @@ -7,6 +7,8 @@ import { scrollDirections } from 'Helpers/Props'; import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder'; import styles from './VirtualTable.css'; +const ROW_HEIGHT = 38; + function overscanIndicesGetter(options) { const { cellCount, @@ -48,8 +50,7 @@ class VirtualTable extends Component { const { items, scrollIndex, - scrollTop, - onRecompute + scrollTop } = this.props; const { @@ -57,10 +58,7 @@ class VirtualTable extends Component { scrollRestored } = this.state; - if (this._grid && - (prevState.width !== width || - hasDifferentItemsOrOrder(prevProps.items, items))) { - onRecompute(width); + if (this._grid && (prevState.width !== width || hasDifferentItemsOrOrder(prevProps.items, items))) { // recomputeGridSize also forces Grid to discard its cache of rendered cells this._grid.recomputeGridSize(); } @@ -103,7 +101,6 @@ class VirtualTable extends Component { className, items, scroller, - scrollTop: ignored, header, headerHeight, rowHeight, @@ -149,6 +146,7 @@ class VirtualTable extends Component { {header}
@@ -192,16 +189,14 @@ VirtualTable.propTypes = { scroller: PropTypes.instanceOf(Element).isRequired, header: PropTypes.node.isRequired, headerHeight: PropTypes.number.isRequired, - rowHeight: PropTypes.oneOfType([PropTypes.func, PropTypes.number]).isRequired, rowRenderer: PropTypes.func.isRequired, - onRecompute: PropTypes.func.isRequired + rowHeight: PropTypes.number.isRequired }; VirtualTable.defaultProps = { className: styles.tableContainer, headerHeight: 38, - rowHeight: 38, - onRecompute: () => {} + rowHeight: ROW_HEIGHT }; export default VirtualTable; diff --git a/frontend/src/Components/withScrollPosition.tsx b/frontend/src/Components/withScrollPosition.tsx index ec13c6ab8..f688a6253 100644 --- a/frontend/src/Components/withScrollPosition.tsx +++ b/frontend/src/Components/withScrollPosition.tsx @@ -1,24 +1,30 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import { RouteComponentProps } from 'react-router-dom'; import scrollPositions from 'Store/scrollPositions'; -function withScrollPosition(WrappedComponent, scrollPositionKey) { - function ScrollPosition(props) { +interface WrappedComponentProps { + initialScrollTop: number; +} + +interface ScrollPositionProps { + history: RouteComponentProps['history']; + location: RouteComponentProps['location']; + match: RouteComponentProps['match']; +} + +function withScrollPosition( + WrappedComponent: React.FC, + scrollPositionKey: string +) { + function ScrollPosition(props: ScrollPositionProps) { const { history } = props; const initialScrollTop = - history.action === 'POP' || - (history.location.state && history.location.state.restoreScrollPosition) - ? scrollPositions[scrollPositionKey] - : 0; + history.action === 'POP' ? scrollPositions[scrollPositionKey] : 0; return ; } - ScrollPosition.propTypes = { - history: PropTypes.object.isRequired, - }; - return ScrollPosition; } diff --git a/frontend/src/Store/scrollPositions.js b/frontend/src/Store/scrollPositions.js deleted file mode 100644 index 287a58593..000000000 --- a/frontend/src/Store/scrollPositions.js +++ /dev/null @@ -1,5 +0,0 @@ -const scrollPositions = { - artistIndex: 0 -}; - -export default scrollPositions; diff --git a/frontend/src/Store/scrollPositions.ts b/frontend/src/Store/scrollPositions.ts new file mode 100644 index 000000000..199bfa84c --- /dev/null +++ b/frontend/src/Store/scrollPositions.ts @@ -0,0 +1,5 @@ +const scrollPositions: Record = { + artistIndex: 0, +}; + +export default scrollPositions; diff --git a/frontend/src/Store/thunks.js b/frontend/src/Store/thunks.js deleted file mode 100644 index 6daa843f4..000000000 --- a/frontend/src/Store/thunks.js +++ /dev/null @@ -1,27 +0,0 @@ -const thunks = {}; - -function identity(payload) { - return payload; -} - -export function createThunk(type, identityFunction = identity) { - return function(payload = {}) { - return function(dispatch, getState) { - const thunk = thunks[type]; - - if (thunk) { - return thunk(getState, identityFunction(payload), dispatch); - } - - throw Error(`Thunk handler has not been registered for ${type}`); - }; - }; -} - -export function handleThunks(handlers) { - const types = Object.keys(handlers); - - types.forEach((type) => { - thunks[type] = handlers[type]; - }); -} diff --git a/frontend/src/Store/thunks.ts b/frontend/src/Store/thunks.ts new file mode 100644 index 000000000..fd277211e --- /dev/null +++ b/frontend/src/Store/thunks.ts @@ -0,0 +1,39 @@ +import { Dispatch } from 'redux'; +import AppState from 'App/State/AppState'; + +type GetState = () => AppState; +type Thunk = ( + getState: GetState, + identityFn: never, + dispatch: Dispatch +) => unknown; + +const thunks: Record = {}; + +function identity(payload: T): TResult { + return payload as unknown as TResult; +} + +export function createThunk(type: string, identityFunction = identity) { + return function (payload?: T) { + return function (dispatch: Dispatch, getState: GetState) { + const thunk = thunks[type]; + + if (thunk) { + const finalPayload = payload ?? {}; + + return thunk(getState, identityFunction(finalPayload), dispatch); + } + + throw Error(`Thunk handler has not been registered for ${type}`); + }; + }; +} + +export function handleThunks(handlers: Record) { + const types = Object.keys(handlers); + + types.forEach((type) => { + thunks[type] = handlers[type]; + }); +} diff --git a/frontend/src/Utilities/Table/getSelectedIds.js b/frontend/src/Utilities/Table/getSelectedIds.js deleted file mode 100644 index 705f13a5d..000000000 --- a/frontend/src/Utilities/Table/getSelectedIds.js +++ /dev/null @@ -1,15 +0,0 @@ -import _ from 'lodash'; - -function getSelectedIds(selectedState, { parseIds = true } = {}) { - return _.reduce(selectedState, (result, value, id) => { - if (value) { - const parsedId = parseIds ? parseInt(id) : id; - - result.push(parsedId); - } - - return result; - }, []); -} - -export default getSelectedIds; diff --git a/frontend/src/Utilities/Table/getSelectedIds.ts b/frontend/src/Utilities/Table/getSelectedIds.ts new file mode 100644 index 000000000..b84db6245 --- /dev/null +++ b/frontend/src/Utilities/Table/getSelectedIds.ts @@ -0,0 +1,18 @@ +import { reduce } from 'lodash'; +import { SelectedState } from 'Helpers/Hooks/useSelectState'; + +function getSelectedIds(selectedState: SelectedState): number[] { + return reduce( + selectedState, + (result: number[], value, id) => { + if (value) { + result.push(parseInt(id)); + } + + return result; + }, + [] + ); +} + +export default getSelectedIds; diff --git a/frontend/src/typings/callbacks.ts b/frontend/src/typings/callbacks.ts new file mode 100644 index 000000000..0114efeb0 --- /dev/null +++ b/frontend/src/typings/callbacks.ts @@ -0,0 +1,6 @@ +import SortDirection from 'Helpers/Props/SortDirection'; + +export type SortCallback = ( + sortKey: string, + sortDirection: SortDirection +) => void; diff --git a/frontend/src/typings/inputs.ts b/frontend/src/typings/inputs.ts new file mode 100644 index 000000000..c0fda305c --- /dev/null +++ b/frontend/src/typings/inputs.ts @@ -0,0 +1,4 @@ +export type CheckInputChanged = { + name: string; + value: boolean; +}; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 4ff9d4e87..611c872ed 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -7,7 +7,15 @@ "jsx": "react", "module": "esnext", "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "strict": true, "esModuleInterop": true, "typeRoots": ["node_modules/@types", "typings"], "paths": { diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index a05bb0b65..4ce0670c3 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -680,6 +680,7 @@ "Monitored": "Monitored", "MonitoredHelpText": "Download monitored albums from this artist", "MonitoredOnly": "Monitored Only", + "MonitoredStatus": "Monitored/Status", "Monitoring": "Monitoring", "MonitoringOptions": "Monitoring Options", "MonitoringOptionsHelpText": "Which albums should be monitored after the artist is added (one-time adjustment)", From c744231141147b05e4eedd939e1688d51050e782 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 00:06:22 +0200 Subject: [PATCH 023/491] Translations for settings index --- .../Components/Page/Sidebar/PageSidebar.js | 2 +- frontend/src/Settings/Settings.js | 48 +++++++++---------- frontend/src/Settings/UI/UISettings.js | 8 ++-- src/NzbDrone.Core/Localization/Core/ar.json | 10 ++-- src/NzbDrone.Core/Localization/Core/bg.json | 10 ++-- src/NzbDrone.Core/Localization/Core/ca.json | 10 ++-- src/NzbDrone.Core/Localization/Core/cs.json | 10 ++-- src/NzbDrone.Core/Localization/Core/da.json | 10 ++-- src/NzbDrone.Core/Localization/Core/de.json | 10 ++-- src/NzbDrone.Core/Localization/Core/el.json | 10 ++-- src/NzbDrone.Core/Localization/Core/en.json | 23 +++++++-- src/NzbDrone.Core/Localization/Core/es.json | 10 ++-- src/NzbDrone.Core/Localization/Core/fi.json | 10 ++-- src/NzbDrone.Core/Localization/Core/fr.json | 10 ++-- src/NzbDrone.Core/Localization/Core/he.json | 10 ++-- src/NzbDrone.Core/Localization/Core/hi.json | 10 ++-- src/NzbDrone.Core/Localization/Core/hr.json | 2 +- src/NzbDrone.Core/Localization/Core/hu.json | 10 ++-- src/NzbDrone.Core/Localization/Core/id.json | 2 +- src/NzbDrone.Core/Localization/Core/is.json | 10 ++-- src/NzbDrone.Core/Localization/Core/it.json | 10 ++-- src/NzbDrone.Core/Localization/Core/ja.json | 10 ++-- src/NzbDrone.Core/Localization/Core/ko.json | 10 ++-- .../Localization/Core/nb_NO.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 10 ++-- src/NzbDrone.Core/Localization/Core/pl.json | 10 ++-- src/NzbDrone.Core/Localization/Core/pt.json | 10 ++-- .../Localization/Core/pt_BR.json | 10 ++-- src/NzbDrone.Core/Localization/Core/ro.json | 10 ++-- src/NzbDrone.Core/Localization/Core/ru.json | 10 ++-- src/NzbDrone.Core/Localization/Core/sk.json | 2 +- src/NzbDrone.Core/Localization/Core/sv.json | 10 ++-- src/NzbDrone.Core/Localization/Core/th.json | 10 ++-- src/NzbDrone.Core/Localization/Core/tr.json | 10 ++-- src/NzbDrone.Core/Localization/Core/uk.json | 8 ++-- src/NzbDrone.Core/Localization/Core/vi.json | 10 ++-- .../Localization/Core/zh_CN.json | 10 ++-- 37 files changed, 195 insertions(+), 182 deletions(-) diff --git a/frontend/src/Components/Page/Sidebar/PageSidebar.js b/frontend/src/Components/Page/Sidebar/PageSidebar.js index 09a69b459..d6db8d612 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebar.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebar.js @@ -129,7 +129,7 @@ const links = [ to: '/settings/general' }, { - title: () => translate('UI'), + title: () => translate('Ui'), to: '/settings/ui' } ] diff --git a/frontend/src/Settings/Settings.js b/frontend/src/Settings/Settings.js index 36f47d82e..d2a86adc6 100644 --- a/frontend/src/Settings/Settings.js +++ b/frontend/src/Settings/Settings.js @@ -18,132 +18,132 @@ function Settings() { className={styles.link} to="/settings/mediamanagement" > - Media Management + {translate('MediaManagement')}
- Naming, file management settings and root folders + {translate('MediaManagementSettingsSummary')}
- Profiles + {translate('Profiles')}
- Quality, Metadata, Delay, and Release profiles + {translate('ProfilesSettingsArtistSummary')}
- Quality + {translate('Quality')}
- Quality sizes and naming + {translate('QualitySettingsSummary')}
- Custom Formats + {translate('CustomFormats')}
- Custom Formats and Settings + {translate('CustomFormatsSettingsSummary')}
- Indexers + {translate('Indexers')}
- Indexers and indexer options + {translate('IndexersSettingsSummary')}
- Download Clients + {translate('DownloadClients')}
- Download clients, download handling and remote path mappings + {translate('DownloadClientsSettingsSummary')}
- Import Lists + {translate('ImportLists')}
- Import Lists + {translate('ImportListsSettingsSummary')}
- Connect + {translate('Connect')}
- Notifications, connections to media servers/players and custom scripts + {translate('ConnectSettingsSummary')}
- Metadata + {translate('Metadata')}
- Create metadata files when tracks are imported or artist are refreshed + {translate('MetadataSettingsArtistSummary')}
- Tags + {translate('Tags')}
- Manage artist, profile, restriction, and notification tags + {translate('TagsSettingsSummary')}
- General + {translate('General')}
- Port, SSL, username/password, proxy, analytics and updates + {translate('GeneralSettingsSummary')}
- UI + {translate('Ui')}
- Calendar, date and color impaired options + {translate('UiSettingsSummary')}
diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index 902b922f9..c8135e17f 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -69,7 +69,7 @@ class UISettings extends Component { .map((theme) => ({ key: theme, value: titleCase(theme) })); return ( - +
- {translate('UILanguage')} + {translate('UiLanguage')} Date: Wed, 7 Feb 2024 00:35:35 +0200 Subject: [PATCH 024/491] New: Artist info in Album Delete event for Webhooks Fixes #4552 --- .../Notifications/Webhook/WebhookAlbumDeletePayload.cs | 1 + src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbumDeletePayload.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbumDeletePayload.cs index a3d98bc1a..405776a6e 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbumDeletePayload.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookAlbumDeletePayload.cs @@ -2,6 +2,7 @@ namespace NzbDrone.Core.Notifications.Webhook { public class WebhookAlbumDeletePayload : WebhookPayload { + public WebhookArtist Artist { get; set; } public WebhookAlbum Album { get; set; } public bool DeletedFiles { get; set; } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs index 9504a87a8..9c84efb3e 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookBase.cs @@ -160,6 +160,7 @@ 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), DeletedFiles = deleteMessage.DeletedFiles }; From 0871949b740adf3fa86b17ffddc49bd265a190a8 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 1 Feb 2024 20:19:26 -0800 Subject: [PATCH 025/491] Fixed: Redirecting after login (cherry picked from commit 745b92daf4bf4b9562ffe52dad84a12a5561add5) --- .../Authentication/AuthenticationController.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Lidarr.Http/Authentication/AuthenticationController.cs b/src/Lidarr.Http/Authentication/AuthenticationController.cs index e787f6930..447ea4c22 100644 --- a/src/Lidarr.Http/Authentication/AuthenticationController.cs +++ b/src/Lidarr.Http/Authentication/AuthenticationController.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; @@ -46,7 +47,17 @@ namespace Lidarr.Http.Authentication await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties); - return Redirect(_configFileProvider.UrlBase + "/"); + if (returnUrl.IsNullOrWhiteSpace()) + { + return Redirect(_configFileProvider.UrlBase + "/"); + } + + if (_configFileProvider.UrlBase.IsNullOrWhiteSpace() || returnUrl.StartsWith(_configFileProvider.UrlBase)) + { + return Redirect(returnUrl); + } + + return Redirect(_configFileProvider.UrlBase + returnUrl); } [HttpGet("logout")] From f5eee5219445b826cfb2719f8b8153d44961fe31 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 6 Feb 2024 19:58:49 -0800 Subject: [PATCH 026/491] New: Log database engine version on startup (cherry picked from commit 6ab1d8e16b29e98b4d2ebb68e0356f6f2d3a2c10) --- .../000_database_engine_version_check.cs | 69 +++++++++++++++++++ .../Framework/MigrationController.cs | 3 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs diff --git a/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs b/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs new file mode 100644 index 000000000..93bfc0afc --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/000_database_engine_version_check.cs @@ -0,0 +1,69 @@ +using System.Data; +using System.Text.RegularExpressions; +using FluentMigrator; +using NLog; +using NzbDrone.Common.Instrumentation; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Maintenance(MigrationStage.BeforeAll, TransactionBehavior.None)] + public class DatabaseEngineVersionCheck : FluentMigrator.Migration + { + protected readonly Logger _logger; + + public DatabaseEngineVersionCheck() + { + _logger = NzbDroneLogger.GetLogger(this); + } + + public override void Up() + { + IfDatabase("sqlite").Execute.WithConnection(LogSqliteVersion); + IfDatabase("postgres").Execute.WithConnection(LogPostgresVersion); + } + + public override void Down() + { + // No-op + } + + private void LogSqliteVersion(IDbConnection conn, IDbTransaction tran) + { + using (var versionCmd = conn.CreateCommand()) + { + versionCmd.Transaction = tran; + versionCmd.CommandText = "SELECT sqlite_version();"; + + using (var reader = versionCmd.ExecuteReader()) + { + while (reader.Read()) + { + var version = reader.GetString(0); + + _logger.Info("SQLite {0}", version); + } + } + } + } + + private void LogPostgresVersion(IDbConnection conn, IDbTransaction tran) + { + using (var versionCmd = conn.CreateCommand()) + { + versionCmd.Transaction = tran; + versionCmd.CommandText = "SHOW server_version"; + + using (var reader = versionCmd.ExecuteReader()) + { + while (reader.Read()) + { + var version = reader.GetString(0); + var cleanVersion = Regex.Replace(version, @"\(.*?\)", ""); + + _logger.Info("Postgres {0}", cleanVersion); + } + } + } + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index dea8365c1..8ef3b647a 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -42,12 +42,13 @@ namespace NzbDrone.Core.Datastore.Migration.Framework serviceProvider = new ServiceCollection() .AddLogging(b => b.AddNLog()) .AddFluentMigratorCore() + .Configure(cfg => cfg.IncludeUntaggedMaintenances = true) .ConfigureRunner( builder => builder .AddPostgres() .AddNzbDroneSQLite() .WithGlobalConnectionString(connectionString) - .WithMigrationsIn(Assembly.GetExecutingAssembly())) + .ScanIn(Assembly.GetExecutingAssembly()).For.All()) .Configure(opt => opt.Namespace = "NzbDrone.Core.Datastore.Migration") .Configure(opt => { From 6c90ac74e9817d43650582f26b77b6d78815669b Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 6 Feb 2024 16:47:20 -0800 Subject: [PATCH 027/491] Fixed: Don't use sub folder to check for free disk space for update (cherry picked from commit f722d49b3a9efefa65bef1b24d90be9332ca62ea) Closes #4566 --- src/NzbDrone.Core/Update/InstallUpdateService.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index f4616f155..f365e2d2a 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -105,11 +105,12 @@ namespace NzbDrone.Core.Update return false; } + var tempFolder = _appFolderInfo.TempFolder; var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); - if (_diskProvider.GetTotalSize(updateSandboxFolder) < 1.Gigabytes()) + if (_diskProvider.GetTotalSize(tempFolder) < 1.Gigabytes()) { - _logger.Warn("Temporary location '{0}' has less than 1 GB free space, Lidarr may not be able to update itself.", updateSandboxFolder); + _logger.Warn("Temporary location '{0}' has less than 1 GB free space, Lidarr may not be able to update itself.", tempFolder); } var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); From 59efffd40fd603a8782786cb59dd5337de3bc8f8 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 11 Feb 2024 02:59:35 +0000 Subject: [PATCH 028/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Fixer Co-authored-by: Havok Dan Co-authored-by: Hicabi Erdem Co-authored-by: Magyar Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: aghus Co-authored-by: bai0012 Co-authored-by: bogdan-rgb Co-authored-by: savin-msk 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/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/he/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ 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/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/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ 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 | 22 +++- src/NzbDrone.Core/Localization/Core/bg.json | 22 +++- src/NzbDrone.Core/Localization/Core/ca.json | 25 +++- src/NzbDrone.Core/Localization/Core/cs.json | 21 +++- src/NzbDrone.Core/Localization/Core/da.json | 26 +++- src/NzbDrone.Core/Localization/Core/el.json | 24 +++- src/NzbDrone.Core/Localization/Core/es.json | 73 +++++++----- src/NzbDrone.Core/Localization/Core/fi.json | 111 ++++++++++++------ src/NzbDrone.Core/Localization/Core/he.json | 25 +++- src/NzbDrone.Core/Localization/Core/hu.json | 42 ++++--- src/NzbDrone.Core/Localization/Core/it.json | 2 +- src/NzbDrone.Core/Localization/Core/ja.json | 25 +++- src/NzbDrone.Core/Localization/Core/nl.json | 20 +++- src/NzbDrone.Core/Localization/Core/pl.json | 23 +++- src/NzbDrone.Core/Localization/Core/pt.json | 20 +++- .../Localization/Core/pt_BR.json | 19 ++- src/NzbDrone.Core/Localization/Core/ru.json | 8 +- src/NzbDrone.Core/Localization/Core/tr.json | 43 +++++-- src/NzbDrone.Core/Localization/Core/vi.json | 22 +++- .../Localization/Core/zh_CN.json | 40 ++++++- 20 files changed, 498 insertions(+), 115 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index ee8d50e1f..b2830e5ee 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -705,5 +705,25 @@ "ExtraFileExtensionsHelpText": "قائمة مفصولة بفواصل بالملفات الإضافية المراد استيرادها (سيتم استيراد .nfo كـ .nfo-Orig)", "IncludeHealthWarnings": "قم بتضمين التحذيرات الصحية", "RemoveQueueItemConfirmation": "هل تريد بالتأكيد إزالة {0} عنصر {1} من قائمة الانتظار؟", - "AutoRedownloadFailed": "التحميل فشل" + "AutoRedownloadFailed": "التحميل فشل", + "DefaultCase": "الحالة الافتراضية", + "FileNameTokens": "رموز اسم الملف", + "KeyboardShortcuts": "اختصارات لوحة المفاتيح", + "Links": "الروابط", + "Lowercase": "أحرف صغيرة", + "Uppercase": "الأحرف الكبيرة", + "CustomFormatsSettings": "إعدادات التنسيقات المخصصة", + "CustomFormatsSettingsSummary": "التنسيقات والإعدادات المخصصة", + "DownloadClientsSettingsSummary": "تنزيل العملاء وتنزيل المناولة وتعيينات المسار البعيد", + "GeneralSettingsSummary": "المنفذ ، SSL ، اسم المستخدم / كلمة المرور ، الوكيل ، التحليلات والتحديثات", + "ImportListsSettingsSummary": "قوائم الاستيراد ، قائمة الاستبعادات", + "QualitySettingsSummary": "أحجام الجودة والتسمية", + "TagsSettingsSummary": "اطلع على جميع العلامات وكيفية استخدامها. يمكن إزالة العلامات غير المستخدمة", + "UiSettingsSummary": "التقويم والتاريخ وخيارات الألوان الضعيفة", + "MonitoredStatus": "مراقب / الحالة", + "ConnectSettingsSummary": "الإخطارات والاتصالات بخوادم / مشغلات الوسائط والبرامج النصية المخصصة", + "ImportLists": "القوائم", + "ArtistIndexFooterDownloading": "جارى التحميل", + "ImportList": "القوائم", + "AutomaticSearch": "البحث التلقائي" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index bcceeab68..257340859 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -707,5 +707,25 @@ "DeleteArtistFoldersHelpText": "Изтрийте папката с филма и съдържанието му", "IncludeHealthWarnings": "Включете здравни предупреждения", "AutoRedownloadFailed": "Изтеглянето се провали", - "RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?" + "RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?", + "DefaultCase": "Дело по подразбиране", + "FileNameTokens": "Токени за име на файл", + "Lowercase": "Малка буква", + "Uppercase": "Главна буква", + "ConnectSettingsSummary": "Известия, връзки към медийни сървъри / плейъри и персонализирани скриптове", + "CustomFormatsSettings": "Настройки на персонализирани формати", + "CustomFormatsSettingsSummary": "Персонализирани формати и настройки", + "DownloadClientsSettingsSummary": "Изтегляне на клиенти, обработка на изтегляния и отдалечени картографски пътища", + "GeneralSettingsSummary": "Порт, SSL, потребителско име / парола, прокси, анализи и актуализации", + "ImportListsSettingsSummary": "Списъци за импортиране, списъци с изключения", + "KeyboardShortcuts": "Комбинация от клавиши", + "Links": "Връзки", + "ImportLists": "Списъци", + "QualitySettingsSummary": "Качествени размери и именуване", + "TagsSettingsSummary": "Вижте всички тагове и как се използват. Неизползваните маркери могат да бъдат премахнати", + "UiSettingsSummary": "Опции за увреждане на календар, дата и цвят", + "MonitoredStatus": "Наблюдавано / Състояние", + "ArtistIndexFooterDownloading": "Изтегляне", + "ImportList": "Списъци", + "AutomaticSearch": "Автоматично търсене" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 02e21c975..1cf17f05c 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -869,5 +869,28 @@ "ExpandOtherByDefaultHelpText": "Altres", "IncludeHealthWarnings": "Inclou advertències de salut", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Cerqueu i intenteu baixar automàticament una versió diferent quan es trobi una versió fallida a la cerca interactiva", - "RemoveQueueItemConfirmation": "Esteu segur que voleu eliminar '{sourceTitle}' de la cua?" + "RemoveQueueItemConfirmation": "Esteu segur que voleu eliminar '{sourceTitle}' de la cua?", + "Dash": "Guió", + "DefaultCase": "Cas per defecte", + "FileNameTokens": "Testimonis de nom de fitxer", + "KeyboardShortcuts": "Dreceres de teclat", + "Lowercase": "Minúscules", + "Underscore": "Guió baix", + "Period": "Període", + "Space": "Espai", + "Uppercase": "Majúscula", + "MonitoredStatus": "Monitorat/Estat", + "ConnectSettingsSummary": "Notificacions, connexions a servidors/reproductors multimèdia i scripts personalitzats", + "CustomFormatsSettings": "Configuració de formats personalitzats", + "CustomFormatsSettingsSummary": "Formats i configuracions personalitzades", + "DownloadClientsSettingsSummary": "Descàrrega de clients, gestió de descàrregues i mapes de camins remots", + "ProfilesSettingsArtistSummary": "Perfils de qualitat, idioma, retard i llançament", + "QualitySettingsSummary": "Mides i denominació de qualitat", + "TagsSettingsSummary": "Consulta totes les etiquetes i com s'utilitzen. Les etiquetes no utilitzades es poden eliminar", + "GeneralSettingsSummary": "Port, SSL, nom d'usuari/contrasenya, servidor intermediari, analítiques i actualitzacions", + "ImportListsSettingsSummary": "Importa llistes, exclusions de llista", + "UiSettingsSummary": "Opcions de calendari, data i color alternats", + "Links": "Enllaços", + "ArtistIndexFooterDownloading": "S'està baixant", + "AutomaticSearch": "Cerca automàtica" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 26dce553f..13648ed86 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -824,5 +824,24 @@ "AutoRedownloadFailed": "Opětovné stažení se nezdařilo", "AutoRedownloadFailedFromInteractiveSearch": "Opětovné stažení z interaktivního vyhledávání selhalo", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání", - "IncludeHealthWarnings": "Zahrnout zdravotní varování" + "IncludeHealthWarnings": "Zahrnout zdravotní varování", + "Dash": "Pomlčka", + "DefaultCase": "Výchozí případ", + "FileNameTokens": "Tokeny názvů souborů", + "Uppercase": "Velká písmena", + "Links": "Odkazy", + "MonitoredStatus": "Monitorováno / Stav", + "ConnectSettingsSummary": "Oznámení, připojení k mediálním serverům/přehrávačům a vlastní skripty", + "CustomFormatsSettings": "Nastavení vlastních formátů", + "DownloadClientsSettingsSummary": "Stahování klientů, zpracování stahování a mapování vzdálených cest", + "GeneralSettingsSummary": "Port, SSL, uživatelské jméno / heslo, proxy, analytika a aktualizace", + "ImportListsSettingsSummary": "Importovat seznamy, vyloučit seznamy", + "KeyboardShortcuts": "Klávesové zkratky", + "Lowercase": "Malá písmena", + "QualitySettingsSummary": "Kvalitní velikosti a pojmenování", + "TagsSettingsSummary": "Podívejte se na všechny značky a na to, jak se používají. Nepoužité značky lze odstranit", + "UiSettingsSummary": "Možnosti kalendáře, data a barev", + "CustomFormatsSettingsSummary": "Vlastní formáty a nastavení", + "ArtistIndexFooterDownloading": "Stahování", + "AutomaticSearch": "Vyhledat automaticky" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index d8770600e..e9790d36c 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -716,5 +716,29 @@ "AddConnectionImplementation": "Tilføj forbindelse - {implementationName}", "AddConnection": "Tilføj forbindelse", "AddAutoTag": "Tilføj automatisk Tag", - "AddCondition": "Tilføj betingelse" + "AddCondition": "Tilføj betingelse", + "DefaultCase": "Standard sag", + "FileNameTokens": "Filnavn tokens", + "Lowercase": "Små bogstaver", + "Uppercase": "Store bogstaver", + "ImportList": "Lister", + "ImportLists": "Lister", + "EditConditionImplementation": "Tilføj forbindelse - {implementationName}", + "EditIndexerImplementation": "Tilføj betingelse - {implementationName}", + "KeyboardShortcuts": "Keyboard Genveje", + "MonitoredStatus": "Overvåget / Status", + "ConnectSettingsSummary": "Notifikationer, forbindelser til media servere/afspillere og custom scripts", + "ImportListsSettingsSummary": "Importlister, listeekskluderinger", + "Links": "Links", + "QualitySettingsSummary": "Kvalitetsstørrelser og navngivning", + "TagsSettingsSummary": "Se alle tags og hvordan de bruges. Ubrugte tags kan fjernes", + "UiSettingsSummary": "Indstillinger for kalender, dato og farve", + "AddIndexerImplementation": "Tilføj betingelse - {implementationName}", + "EditConnectionImplementation": "Tilføj forbindelse - {implementationName}", + "CustomFormatsSettings": "Indstillinger for brugerdefinerede formater", + "CustomFormatsSettingsSummary": "Bruger Tilpassede Formater og Indstillinger", + "DownloadClientsSettingsSummary": "Download klienter, download håndtering og remote path mappings", + "GeneralSettingsSummary": "Port, SSL, brugernavn/adgangskode, proxy, analyser og opdateringer", + "ArtistIndexFooterDownloading": "Downloader", + "AutomaticSearch": "Automatisk søgning" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 58b0cc24a..55e1cebb0 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1063,5 +1063,27 @@ "ArtistIsMonitored": "Ο συγγραφέας δεν παρακολουθείται", "IncludeHealthWarnings": "Συμπεριλάβετε προειδοποιήσεις για την υγεία", "AutoRedownloadFailed": "Η λήψη απέτυχε", - "RemoveQueueItemConfirmation": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;" + "RemoveQueueItemConfirmation": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;", + "DefaultCase": "Προεπιλεγμένη περίπτωση", + "FileNameTokens": "Διακριτικά ονόματος αρχείου", + "Links": "Συνδέσεις", + "Lowercase": "Πεζά", + "Uppercase": "Κεφαλαία", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Είστε βέβαιοι ότι θέλετε να αναζητήσετε όλα τα άλμπουμ \"{0}\" που λείπουν;", + "MonitoredStatus": "Παρακολούθηση / Κατάσταση", + "CustomFormatsSettings": "Ρυθμίσεις προσαρμοσμένων μορφών", + "CustomFormatsSettingsSummary": "Προσαρμοσμένες Μορφές και Ρυθμίσεις", + "GeneralSettingsSummary": "Θύρα, SSL, όνομα χρήστη/κωδικός, proxy, analytics και αναβαθμίσεις", + "MediaManagementSettingsSummary": "Ονομασία, ρυθμίσεις διαχείρισης αρχείων και ριζικοί φάκελοι", + "MetadataSettingsArtistSummary": "Δημιουργήστε αρχεία μεταδεδομένων κατά την εισαγωγή βιβλίων ή την ανανέωση του συγγραφέα", + "ProfilesSettingsArtistSummary": "Προφίλ ποιότητας, μεταδεδομένων, καθυστέρησης και κυκλοφορίας", + "QualitySettingsSummary": "Ποιοτικά μεγέθη και ονομασίες", + "TagsSettingsSummary": "Δείτε όλες τις ετικέτες και πώς χρησιμοποιούνται. Οι αχρησιμοποίητες ετικέτες μπορούν να αφαιρεθούν", + "ConnectSettingsSummary": "Ειδοποιήσεις, συνδέσεις με διακομιστές πολυμέσων/προγράμματα αναπαραγωγής και προσαρμοσμένα σενάρια", + "DownloadClientsSettingsSummary": "Προγράμματα λήψης, διαχείριση λήψεων και αντιστοίχηση remote path", + "ImportListsSettingsSummary": "Εισαγωγή λιστών, εξαιρέσεις λίστας", + "UiSettingsSummary": "Ημερολόγιο, ημερομηνία και επιλογές με προβλήματα χρώματος", + "ArtistIndexFooterDownloading": "Λήψη", + "AutomaticSearch": "Αυτόματη αναζήτηση", + "KeyboardShortcuts": "Συντομεύσεις πληκτρολογίου" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index fda7a194d..a444779c0 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -52,13 +52,13 @@ "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", "LidarrTags": "Etiquetas de {appName}", "Local": "Local", - "LocalPath": "Ruta local", + "LocalPath": "Ruta Local", "LocalPathHelpText": "La ruta que {appName} tiene que usar para acceder a la ruta remota localmente", "LogFiles": "Archivos de Registro", "Logging": "Registro de eventos", "LogLevel": "Nivel de Registro", - "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "El registro de seguimiento se ha de habilitar solo temporalmente", - "LongDateFormat": "Formato Largo de Fecha", + "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "El registro de seguimiento sólo debe activarse temporalmente", + "LongDateFormat": "Formato de Fecha Larga", "MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle", "ManualImport": "Importar Manualmente", "MarkAsFailed": "Marcar como Fallida", @@ -176,7 +176,7 @@ "SslPortHelpTextWarning": "Requiere reiniciar para que surta efecto", "StandardTrackFormat": "Formato de Película Estándar", "StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo", - "StartupDirectory": "Directorio de arranque", + "StartupDirectory": "Directorio de Arranque", "Status": "Estado", "Style": "Estilo", "SuccessMyWorkIsDoneNoFilesToRename": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.", @@ -217,8 +217,8 @@ "UnableToLoadHistory": "No se ha podido cargar la historia", "UnableToLoadImportListExclusions": "No se pueden cargas las Excluidas de la Lista", "UnableToLoadIndexerOptions": "No se han podido cargar las opciones del indexer", - "UnableToLoadIndexers": "No se pueden cargar los indexers", - "UnableToLoadLists": "No se puden cargar las Listas", + "UnableToLoadIndexers": "No se pueden cargar los indexadores", + "UnableToLoadLists": "No se pueden cargar las Listas", "UnableToLoadMediaManagementSettings": "No se han podido cargar los ajustes de Manipulación multimedia", "UnableToLoadMetadata": "No se pueden cargar los Metadatos", "UnableToLoadMetadataProfiles": "No se pueden cargar los Perfiles de Retraso", @@ -353,7 +353,7 @@ "EnableHelpText": "Habilitar la creación de un fichero de metadatos para este tipo de metadato", "EnableRSS": "Habilitar RSS", "EnableSSL": "Habilitar SSL", - "Ended": "Finalizado", + "Ended": "Terminado", "ErrorLoadingContents": "Error cargando contenidos", "FirstDayOfWeek": "Primer día de la semana", "Fixed": "Arreglado", @@ -511,10 +511,10 @@ "Import": "Importar", "IndexerDownloadClientHelpText": "Especifica qué cliente de descarga es usado para capturas desde este indexador", "IndexerTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.", - "InstanceName": "Nombre de Instancia", - "InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog", - "LastDuration": "Duración", - "LastExecution": "Última ejecución", + "InstanceName": "Nombre de la Instancia", + "InstanceNameHelpText": "Nombre de la instancia en la pestaña y para la aplicación Syslog", + "LastDuration": "Última Duración", + "LastExecution": "Última Ejecución", "LastWriteTime": "Última Fecha de Escritura", "Library": "Biblioteca", "MediaManagement": "Multimedia", @@ -571,7 +571,7 @@ "EditDelayProfile": "Editar perfil de retraso", "Info": "Info", "InteractiveImport": "Importación Interactiva", - "LastUsed": "Utilizado por última vez", + "LastUsed": "Usado por última vez", "Replace": "Reemplazar", "Started": "Iniciado", "AddConnection": "Añadir Conexión", @@ -639,7 +639,7 @@ "IndexerSearchCheckNoAutomaticMessage": "No hay indexers con Búsqueda Automática disponibles, {appName} no dará ningún resultado de búsquedas automáticas", "IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexers están temporalmente inactivos debido a errores recientes con ellos", "IndexerSearchCheckNoInteractiveMessage": "No hay indexadores disponibles con la búsqueda interactiva activada, {appName} no proporcionará ningún resultado con la búsqueda interactiva", - "IndexerStatusCheckAllClientMessage": "Los indexers no están disponibles debido a errores", + "IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores", "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. StatusCode: {0}", "ProxyCheckFailedToTestMessage": "Fallo al comprobar el proxy: {0}", "ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}", @@ -664,7 +664,7 @@ "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar", "DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible", "DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.", - "IndexerStatusCheckSingleClientMessage": "Indexers no disponibles debido a errores: {0}", + "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}", "MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ", "RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero {appName} no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.", "RemotePathMappingCheckFilesLocalWrongOSPath": "El cliente de descarga local {0} informó de la existencia de archivos en {1}, pero no es una ruta válida {2}. Revise la configuración de su cliente de descarga.", @@ -683,7 +683,7 @@ "Required": "Necesario", "ResetQualityDefinitions": "Restablecer definiciones de calidad", "DownloadClientSortingCheckMessage": "El cliente de descarga {0} tiene activada la clasificación {1} para la categoría de {appName}. Debe desactivar la clasificación en su cliente de descarga para evitar problemas de importación.", - "DeleteSelectedDownloadClients": "Borrar Gestor de Descargas", + "DeleteSelectedDownloadClients": "Borrar Cliente(s) de Descarga Seleccionado(s)", "DeleteSelectedIndexers": "Borrar indexer(s)", "No": "No", "NoChange": "Sin Cambio", @@ -694,9 +694,9 @@ "Yes": "Sí", "NoEventsFound": "No se encontraron eventos", "ResetTitlesHelpText": "Restablecer los títulos y valores de las definiciones", - "ApplyTagsHelpTextAdd": "Añadir: Añadir las etiquetas la lista existente de etiquetas", - "ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas", - "ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)", + "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", + "ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas", + "ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)", "RemoveSelectedItemQueueMessageText": "¿Está seguro de que desea eliminar el {0} elemento {1} de la cola?", "RemoveSelectedItemsQueueMessageText": "¿Estás seguro de que quieres eliminar {0} elementos de la cola?", "DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.", @@ -706,7 +706,7 @@ "ResetQualityDefinitionsMessageText": "¿Está seguro de que desea restablecer las definiciones de calidad?", "ApplyTagsHelpTextHowToApplyArtists": "Cómo añadir etiquetas a las películas seleccionadas", "ApplyTagsHelpTextHowToApplyImportLists": "Cómo añadir etiquetas a las listas de importación seleccionadas", - "ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados", + "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", "DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?", "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", @@ -746,12 +746,12 @@ "DeleteRootFolder": "Eliminar Carpeta Raíz", "ImportListRootFolderMissingRootHealthCheckMessage": "Falta la capeta raíz para las listas: {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Múltiples carpetas raíz faltan para las listas de importación: {0}", - "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y necesitará ser recargada para restaurar su funcionalidad.", + "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", "AppUpdated": "{appName} Actualizado", - "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes necesitará recargar {appName}", + "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", "ConnectionLost": "Conexión perdida", - "ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.", + "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", "AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros", "AllowFingerprintingHelpTextWarning": "Esto requiere que Readarr lea partes del archivo, lo que ralentizará los escaneos y puede provocar una alta actividad en el disco o en la red.", "ReleaseProfiles": "perfil de lanzamiento", @@ -762,11 +762,11 @@ "ArtistNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)", "Artists": "artista", "DeleteImportList": "Eliminar Lista(s) de Importación", - "Artist": "artista", + "Artist": "Artista", "ArtistFolderFormat": "Formato de Carpeta de Autor", "BackupIntervalHelpText": "Intervalo para respaldar la base de datos y configuraciones de Readarr", "CloneCondition": "Clonar Condición", - "EditConnectionImplementation": "Editar conexión - {implementationName}", + "EditConnectionImplementation": "Editar Conexión - {implementationName}", "Enabled": "Habilitado", "Loading": "Cargando", "Priority": "Prioridad", @@ -778,17 +778,17 @@ "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} libros descargados", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddImportList": "Añadir Lista de Importación", - "AddIndexerImplementation": "Añadir Indexador - {implementationName}", - "Album": "álbum", + "AddIndexerImplementation": "Agregar Indexador - {implementationName}", + "Album": "Álbum", "Albums": "álbum", "EditConditionImplementation": "Editar Condición - {implementationName}", "EditReleaseProfile": "Editar perfil de lanzamiento", "Absolute": "Absoluto", "AddNewArtistRootFolderHelpText": "La subcarpeta '{folder}' será creada automáticamente", "AddConditionImplementation": "Agregar Condición - { implementationName}", - "EditIndexerImplementation": "Editar indexador - {implementationName}", + "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AddImportListImplementation": "Añadir lista de importación - {implementationName}", - "DisabledForLocalAddresses": "Desactivado para direcciones locales", + "DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña", "ClearBlocklist": "Limpiar lista de bloqueos", "NoHistoryBlocklist": "Sin historial de la lista de bloqueos", @@ -832,7 +832,7 @@ "AutoTagging": "Etiquetado Automático", "DeleteSpecification": "Borrar especificacion", "EditAutoTag": "Editar Etiquetado Automático", - "EditDownloadClientImplementation": "Añadir Cliente de Descarga - {implementationName}", + "EditDownloadClientImplementation": "Editar Cliente de Descarga - {implementationName}", "EditImportListImplementation": "Añadir lista de importación - {implementationName}", "GrabId": "Capturar ID", "ImportList": "Importar lista", @@ -843,7 +843,7 @@ "AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación", "AuthenticationRequired": "Autenticación requerida", "AuthBasic": "Básico (ventana emergente del navegador)", - "AuthForm": "Formularios (página de inicio de sesión)", + "AuthForm": "Formularios (Página de inicio de sesión)", "AuthenticationMethod": "Método de autenticación", "DeleteAutoTag": "Eliminar Etiquetado Automático", "DeleteAutoTagHelpText": "¿Está seguro de querer eliminar el etiquetado automático '{name}'?", @@ -882,7 +882,7 @@ "DeleteArtistFoldersHelpText": "Eliminar la carpeta de películas y su contenido", "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} esta configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas del cliente antes que {1} las pueda importar.", "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada", - "DownloadClientPriorityHelpText": "Prioridad del cliente de descarga desde 1 (la más alta) hasta 50 (la más baja). Predeterminada: 1. Se usa round-robin para clientes con la misma prioridad.", + "DownloadClientPriorityHelpText": "Prioridad del cliente de descarga desde 1 (la más alta) hasta 50 (la más baja). Por defecto: 1. Se usa Round-Robin para clientes con la misma prioridad.", "AutomaticallySwitchRelease": "Desbloqueo automático", "AllMonitoringOptionHelpText": "Supervisar los artistas y todos los álbumes de cada artista incluido en la lista de importación", "ArtistName": "Nombre del artista", @@ -953,5 +953,14 @@ "IgnoreDownloadHint": "Detiene {appName} de procesar esta descarga más adelante", "IgnoreDownload": "Ignorar descarga", "IgnoreDownloads": "Ignorar descargas", - "IgnoreDownloadsHint": "Detiene {appName} de procesar estas descargas más adelante" + "IgnoreDownloadsHint": "Detiene {appName} de procesar estas descargas más adelante", + "PasswordConfirmation": "Confirmación de Contraseña", + "NoIndexersFound": "No se han encontrado indexadores", + "OnHealthRestored": "Al resolver las incidencias", + "NoDownloadClientsFound": "No se han encontrado clientes de descarga", + "KeyboardShortcuts": "Atajos de Teclado", + "Links": "Enlaces", + "Logout": "Cerrar Sesión", + "Lowercase": "Minúscula", + "IndexersSettingsSummary": "Indexadores y opciones de indexación" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index ff6954771..acca6e9da 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -30,7 +30,7 @@ "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille esittäjille. Käytä kaikille jättämällä tyhjäksi.", "WriteAudioTagsHelpTextWarning": "'Kaikki tiedostot' -valinnat käsittelevät myös olemassa olevien tiedostojen tagit tuonnin yhteydessä.", "Refresh": "Päivitä", - "ResetAPIKey": "Uudista API-avain", + "ResetAPIKey": "Korvaa rajapinnan avain", "Restart": "Käynnistä uudelleen", "Scheduled": "Ajoitukset", "SSLCertPath": "SSL-varmenteen sijainti", @@ -65,11 +65,11 @@ "Actions": "Toiminnot", "AddListExclusion": "Lisää listapoikkeus", "ApiKeyHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", - "APIKey": "API-avain", + "APIKey": "Rajapinnan avain", "AppDataDirectory": "AppData-kansio", "Authentication": "Tunnistautuminen", "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", - "AutoRedownloadFailedHelpText": "Hae ja pyri laaamaan eri julkaisu automaattisesti.", + "AutoRedownloadFailedHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti.", "BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.", "BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", "BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.", @@ -175,7 +175,7 @@ "QualityDefinitions": "Laatumääritykset", "Reload": "Lataa uudelleen", "RemotePathHelpText": "Lataustyökalun käyttämän kansion juurisijainti.", - "RemoveTagExistingTag": "Olemassa oleva tunniste", + "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.", "Reset": "Uudista", @@ -206,13 +206,13 @@ "TestAllIndexers": "Tietolähteiden testaus", "UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui", "UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu", - "UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.", + "UnableToLoadGeneralSettings": "Virhe ladattaessa yleisiä asetuksia", "UnableToLoadIndexers": "Tietolähteiden lataus epäonnistui.", - "UnableToLoadIndexerOptions": "Tietolähdeasetusten lataus ei onnistu.", - "UnableToLoadImportListExclusions": "Tuontilistojen poikkeuksien lataus epäonnistui", + "UnableToLoadIndexerOptions": "Tietolähdeasetusten lataus ei onnistu", + "UnableToLoadImportListExclusions": "Tuontilistapoikkeusten lataus epäonnistui", "UnableToLoadHistory": "Historian lataus epäonnistui", "UnableToLoadTags": "Tunnisteiden lataus ei onnistu", - "UnableToLoadQualityDefinitions": "Laatumäärityksien lataus epäonnistui.", + "UnableToLoadQualityDefinitions": "Virhe ladattaessa laatumäärityksiä", "UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.", "UrlBaseHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.", @@ -244,12 +244,12 @@ "ChmodFolder": "chmod-kansio", "UnableToAddANewNotificationPleaseTryAgain": "Kytköksen lisäys epäonnistui. Yritä uudelleen.", "ApplyTags": "Tunnistetoimenpide", - "UnableToLoadNotifications": "Kytkösten lataus epäonnistui.", + "UnableToLoadNotifications": "Virhe ladattaessa kytköksiä", "DownloadClientSettings": "Lataustyökalujen asetukset", "GeneralSettings": "Yleiset asetukset", "QualitySettings": "Laatuasetukset", "Settings": "Asetukset", - "UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.", + "UnableToLoadUISettings": "Virhe ladattaesssa käyttöliittymän asetuksia", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Filename": "Tiedostonimi", "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", @@ -261,8 +261,8 @@ "RefreshInformationAndScanDisk": "Päivitä tiedot ja tarkista levy", "ErrorLoadingPreviews": "Virhe ladattaessa esikatselua", "FileManagement": "Tiedostojen hallinta", - "FileDateHelpText": "Tiedoston päiväyksen muutos tuonnin ja uudellentarkistuksen yhteydessä.", - "EnabledHelpText": "Käytä julkaisuprofiilia valitsemalla tämä.", + "FileDateHelpText": "Muuta tiedoston päiväys tuonnin/kirjaston uudelleentarkistuksen yhteydessä.", + "EnabledHelpText": "Käytä julkaisuprofiilia merkitsemällä tämä.", "Files": "Tiedostot", "Fixed": "Korjattu", "GoToInterp": "Siirry kohteeseen '{0}'", @@ -286,7 +286,7 @@ "RecyclingBin": "Roskakori", "RecycleBinHelpText": "Pysyvän poiston sijaan kappaletiedostot siirretään tähän kansioon.", "RecyclingBinCleanup": "Roskakorin tyhjennys", - "RequiredHelpText": "Julkaisun on sisällettävä ainakin yksi näistä termeistä (kirjainkokoa ei huomioida).", + "RequiredHelpText": "Julkaisun on sisällettävä ainakin yksi näistä termeistä (kirjainkoolla ei ole merkitystä).", "RequiredPlaceHolder": "Lisää rajoitus", "RescanAfterRefreshHelpTextWarning": "{appName} ei tunnista tiedostomuutoksia automaattisesti, jos asetuksena ei ole \"Aina\".", "ReplaceIllegalCharacters": "Korvaa kielletyt merkit", @@ -296,26 +296,26 @@ "UnableToAddANewQualityProfilePleaseTryAgain": "Laatuprofiilin lisäys epäonnistui. Yritä uudelleen.", "UnableToAddANewRemotePathMappingPleaseTryAgain": "Etäsijainnin kohdistuksen lisäys epäonnistui. Yritä uudelleen.", "UnableToLoadBlocklist": "Estonlistan lataus epäonnistui.", - "UnableToLoadDelayProfiles": "Viiveprofiilien 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.", "Unmonitored": "Valvomattomat", - "UnableToLoadMediaManagementSettings": "Medianhallinnan asetuksien lataus epäonnistui.", - "UnableToLoadMetadata": "Metatietojen lataus epäonnistui.", - "UnableToLoadNamingSettings": "Nimeämisen asetuksien lataus epäonnistui.", + "UnableToLoadMediaManagementSettings": "Virhe ladattaessa mediatiedostojen hallinta-asetuksia", + "UnableToLoadMetadata": "Virhe ladattaessa metatietoja", + "UnableToLoadNamingSettings": "Virhe ladattaessa nimeämisasetuksia", "UnableToLoadQualities": "Laatujen lataus epäonnistui.", - "UnableToLoadQualityProfiles": "Laatuprofiilien lataus epäonnistui.", + "UnableToLoadQualityProfiles": "Virhe ladattaessa laatuprofiileja", "UnableToLoadRemotePathMappings": "Etäsijaintien kohdistusten lataus epäonnistui", "UnmonitoredHelpText": "Sisällytä ei-valvotut albumit iCal-syötteeseen.", "UpdateAll": "Päivitä kaikki", "UpgradeAllowedHelpText": "Jos käytöstä poistettuja laatuja ei päivitetä.", "RemoveFromBlocklist": "Poista estolistalta", "UseHardlinksInsteadOfCopy": "Käytä hardlink-kytköksiä", - "MinimumFreeSpaceWhenImportingHelpText": "Estä tuonti, jos sen jälkeinen vapaa levytila olisi tässä määritettyä arvoa pienempi.", + "MinimumFreeSpaceWhenImportingHelpText": "Estä tuonti, jos sen jälkeinen vapaa levytila olisi tässä määritettyä pienempi.", "Folders": "Kansiot", - "RecycleBinCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattityhjennyksen käytöstä.", + "RecycleBinCleanupDaysHelpText": "Arvo \"0\" (nolla) poistaa automaattisen tyhjennyksen käytöstä.", "RecycleBinCleanupDaysHelpTextWarning": "Määritettyä päiväystä vanhemmat tiedostot poistetaan roskakorista automaattisesti.", "RootFolders": "Juurikansiot", "Path": "Tiedostosijainti", @@ -325,7 +325,7 @@ "ShowCutoffUnmetIconHelpText": "Näytä kuvake tiedostoille, joiden määritettyä katkaisutasoa ei ole vielä saavutettu.", "ShowMonitoredHelpText": "Näytä valvonnan tila julisteen alla.", "ShowMonitored": "Näytä valvontatila", - "ShouldMonitorHelpText": "Tältä tuontilistalta lisätyt albumit lisätään ja niitä valvotaan.", + "ShouldMonitorHelpText": "Valvo tältä tuontilistalta lisättyjä uusia esittäjiä ja albumeita.", "TimeFormat": "Kellonajan esitys", "Quality": "Laatu", "Local": "Paikalliset", @@ -362,7 +362,7 @@ "UnableToLoadReleaseProfiles": "Viiveprofiileja ei voi ladata", "UsenetDelayHelpText": "Minuuttiviive, joka odotetaan ennen julkaisun Usenet-kaappausta.", "UseProxy": "Käytä välityspalvelinta", - "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti sovellus, joka kommunikoi API:n kanssa", + "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent-tiedon ilmoitti rajapinnan kanssa viestinyt sovellus.", "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "{appName}in versiopäivityksiin käytettävä kehityshaara.", "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.", "SearchAll": "Etsi kaikkia", @@ -440,7 +440,7 @@ "Remove": "Poista", "RemoveCompletedDownloadsHelpText": "Poista tuodut lataukset lataustyökalun historiasta", "RemovedFromTaskQueue": "Poistettu tehtäväjonosta", - "RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset lataustyökalun historiasta", + "RemoveFailedDownloadsHelpText": "Poista epäonnistuneet lataukset lataustyökalun historiasta.", "RemoveFilter": "Poista suodatin", "RemoveFromDownloadClient": "Poista lataustyökalusta", "RemoveFromQueue": "Poista jonosta", @@ -448,7 +448,7 @@ "RenameTracksHelpText": "Jos uudelleennimeäminen ei ole käytössä, käytetään nykyistä tiedostonimeä.", "Reorder": "Järjestä uudelleen", "RescanArtistFolderAfterRefresh": "Tarkista kirjailijakansio päivityksen jälkeen uudelleen", - "ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?", + "ResetAPIKeyMessageText": "Haluatko varmasti korvata rajapinnan avaimen uudella?", "Result": "Tulos", "Retention": "Säilytys", "RootFolder": "Juurikansio", @@ -467,7 +467,7 @@ "UnableToAddANewImportListExclusionPleaseTryAgain": "Uuden luettelon poissulkemisen lisääminen epäonnistui, yritä uudelleen.", "UnableToAddANewMetadataProfilePleaseTryAgain": "Uutta laatuprofiilia ei voi lisätä, yritä uudelleen.", "UnableToAddANewRootFolderPleaseTryAgain": "Uutta mukautettua muotoa ei voi lisätä, yritä uudelleen.", - "UnableToLoadMetadataProfiles": "Metatietoprofiileja ei voida ladata.", + "UnableToLoadMetadataProfiles": "Metatietoprofiilien lataus epäonnistui", "Updates": "Päivitykset", "UsenetDelay": "Usenet-viive", "NETCore": ".NET", @@ -577,7 +577,7 @@ "LastDuration": "Edellinen kesto", "LastExecution": "Edellinen suoritus", "LastUsed": "Viimeksi käytetty", - "LastWriteTime": "Viimeksi tallennettu", + "LastWriteTime": "Edellinen tallennus", "Library": "Kirjasto", "Location": "Sijainti", "Manual": "Manuaalinen", @@ -651,7 +651,7 @@ "DiscCount": "Levyjen määrä", "EnableProfile": "Käytä profiilia", "MissingAlbums": "Puuttuvat albumit", - "MissingAlbumsData": "Seuraa albumeita, joille ei ole tiedostoja tai joita ei ole vielä julkaistu.", + "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)", @@ -732,7 +732,7 @@ "TheAlbumsFilesWillBeDeleted": "Albumin tiedostot poistetaan.", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "Esittäjäkansio \"{0}\" ja kaikki sen sisältö poistetaan.", "Theme": "Teema", - "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.", + "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä käyttöjärjestelmän teeman mukaan. Innoittanut Theme.Park.", "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "Yhteensä {0} kappaletta. {1} kappaleelle on tiedostoja.", "TrackArtist": "Kappaleen esittäjä", "TrackCount": "Kappaleiden määrä", @@ -784,12 +784,12 @@ "ImportListSettings": "Tuontilistojen yleiset asetukset", "HideAlbums": "Piilota albumit", "HideTracks": "Piilota kappaleet", - "LatestAlbum": "Viimeisin albumi", - "LatestAlbumData": "Valvo viimeisimpiä ja tulevia albumeita", + "LatestAlbum": "Uusin albumi", + "LatestAlbumData": "Valvo uusimpia ja tulevia albumeita", "ManageTracks": "Hallitse kappaleita", "ManualDownload": "Manuaalinen lataus", "NewAlbums": "Uudet albumit", - "NoneMonitoringOptionHelpText": "Älä valvo esittäjiä tai albumeita", + "NoneMonitoringOptionHelpText": "Älä valvo esittäjiä äläkä albumeita.", "NotDiscography": "Ei ole diskografia", "Playlist": "Soittolista", "Proceed": "Jatka", @@ -800,7 +800,7 @@ "SearchAlbum": "Etsi albumia", "SelectAlbum": "Valitse albumi", "SelectAlbumRelease": "Valitse albumin julkaisu", - "FutureAlbumsData": "Seuraa albumeita, joita ei ole vielä julkaistu.", + "FutureAlbumsData": "Valvo albumeita, joita ei ole vielä julkaistu.", "SearchForAllMissingAlbumsConfirmationCount": "Haluatko varmasti etsiä '{0}' puuttuvaa albumia?", "EditArtist": "Muokkaa esittäjää", "DeleteSelected": "Poista valitut", @@ -809,7 +809,7 @@ "IndexerIdHelpText": "Määritä mitä tietolähdettä profiili koskee.", "Inactive": "Ei aktiivinen", "EnableRssHelpText": "Käytetään {appName}in etsiessä julkaisuja ajoitetusti RSS-synkronoinnilla.", - "AllMonitoringOptionHelpText": "Valvo esittäjiä ja jokaisen esittäjän kaikkia tuontilistan sisältämiä albumeita", + "AllMonitoringOptionHelpText": "Valvo jokaista tuontilistalla olevaa esittäjää ja heidän kaikkia albumeitaan.", "ContinuingOnly": "Vain jatkuvat", "EntityName": "Entiteetin nimi", "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Jaksolla ei ole tarkkaa jaksonumeroa", @@ -877,7 +877,7 @@ "PreferProtocol": "Suosi {preferredProtocol}-protokollaa", "ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.", "QueueIsEmpty": "Jono on tyhjä", - "RecentChanges": "Viimeisimmät muutokset", + "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.", "DeleteSelectedIndexers": "Poista tietoläh(de/teet)", @@ -892,7 +892,7 @@ "ResetTitlesHelpText": "Palauta määritysten nimet ja arvot.", "ResetQualityDefinitions": "Palauta laatumääritykset", "UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".", - "WhatsNew": "Mitä uutta?", + "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ä.", @@ -1009,7 +1009,7 @@ "NoEventsFound": "Tapahtumia ei löytynyt", "Implementation": "Toteutus", "OnHealthRestored": "Terveystilan vakautuessa", - "ApiKeyValidationHealthCheckMessage": "Muuta API-avaimesi ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", + "ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {0} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.", "FailedLoadingSearchResults": "Hakutulosten lataus epäonnistui. Yritä uudelleen.", "ManageImportLists": "Tuontilistojen hallinta", "SelectReleaseGroup": "Aseta julkaisuryhmä", @@ -1019,7 +1019,7 @@ "PasswordConfirmation": "Salasanan vahvistus", "QueueFilterHasNoItems": "Mikään kohde ei vastaa valittua jonon suodatinta", "EditSelectedImportLists": "Muokkaa valittuja tuontilistoja", - "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi automaattisesti ja pyri lataamaan eri julkaisu vaikka epäonnistunut julkaisu oli kaapattu manuaalihausta.", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti vaikka epäonnistunut julkaisu oli kaapattu manuaalihaun tuloksista.", "IgnoreDownload": "Ohita lataus", "IgnoreDownloadHint": "Estää {appName}ia käsittelemästä tätä latausta jatkossa.", "IgnoreDownloads": "Ohita lataukset", @@ -1068,5 +1068,40 @@ "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.", - "AutoRedownloadFailedFromInteractiveSearch": "Uudelleenlataus manuaalihaun tuloksista epäonnistui" + "AutoRedownloadFailedFromInteractiveSearch": "Uudelleenlataus manuaalihaun tuloksista epäonnistui", + "ImportListRootFolderMissingRootHealthCheckMessage": "Tuontilistalta tai -listoilta puuttuu juurikansio: {0}.", + "HiddenClickToShow": "Piilotettu, näytä painalla", + "Dash": "Yhdysmerkki", + "RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä](http://regexstorm.net/tester).", + "MonitorArtists": "Valvo esittäjiä", + "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": "Virhe ladattaessa mukautettuja muotoja", + "Customformat": "Mukautettu muoto", + "ExportCustomFormat": "Vie mukautettu muoto", + "MountCheckMessage": "Kohteen sijainnin sisältävä media on kytketty vain luku -tilassa: ", + "NoResultsFound": "Tuloksia ei löytynyt.", + "CustomFormatSettings": "Mukautettujen muotojen asetukset", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} kappaletta ladattu", + "AlbumStudioTruncated": "Vain 20 uusinta albumia näytetään. Näet kaikki albumit lisätiedoista.", + "CopyToClipboard": "Kopioi leikepöydälle", + "AutoRedownloadFailed": "Uudelleenlataus epäonnistui", + "ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}", + "Period": "Piste", + "RootFolderPathHelpText": "Juurikansio, johon listan kohteet lisätään.", + "Space": "Välilyönti", + "Underscore": "Alaviiva", + "RegularExpressionsTutorialLink": "Lisätietoja säännöllisistä lausekkeista löytyy [täältä](https://www.regular-expressions.info/tutorial.html).", + "RootFolderCheckSingleMessage": "Juurikansio puuttuu: {0}.", + "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voida asentaa, koska käynnistyskansio \"{0}\" sijaitsee \"App Translocation\" -kansiossa.", + "RemovingTag": "Tunniste poistetaan", + "Required": "Pakollinen", + "ShownClickToHide": "Näkyvissä, piilota painamalla", + "Menu": "Valikko", + "SupportedAutoTaggingProperties": "{appName} tukee automaattimerkinnän säännöissä seuraavia arvoja", + "RemoveSelectedItemBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?", + "ResetDefinitions": "Palauta määritykset" } diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 9775389e4..2a8ef8aa1 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -735,5 +735,28 @@ "Release": " מְשׁוּחרָר", "AutoTaggingNegateHelpText": "אם מסומן, הפורמט המותאם אישית לא יחול אם תנאי זה {0} תואם.", "DeleteArtistFoldersHelpText": "מחק את תיקיית הסרט ואת תוכנו", - "DeleteSpecificationHelpText": "האם אתה בטוח שברצונך למחוק את פרופיל האיכות {0}" + "DeleteSpecificationHelpText": "האם אתה בטוח שברצונך למחוק את פרופיל האיכות {0}", + "DefaultCase": "מקרה ברירת מחדל", + "KeyboardShortcuts": "קיצורי דרך במקלדת", + "Links": "קישורים", + "Uppercase": "אוֹתִיוֹת גְדוֹלוֹת", + "ImportList": "רשימות", + "ImportLists": "רשימות", + "MonitoredStatus": "פיקוח / סטטוס", + "ConnectSettingsSummary": "התראות, חיבורים לשרתי מדיה / נגנים ותסריטים מותאמים אישית", + "CustomFormatsSettings": "הגדרות תבניות מותאמות אישית", + "CustomFormatsSettingsSummary": "פורמטים והגדרות מותאמים אישית", + "DownloadClientsSettingsSummary": "הורד לקוחות, הורד טיפול ומיפוי נתיבים מרוחק", + "GeneralSettingsSummary": "יציאה, SSL, שם משתמש / סיסמה, פרוקסי, ניתוחים ועדכונים", + "ImportListsSettingsSummary": "ייבוא רשימות, אי הכללות רשימות", + "Lowercase": "אוֹתִיוֹת קְטָנוֹת", + "QualitySettingsSummary": "מידות איכות ושמות", + "TagsSettingsSummary": "ראה את כל התגים ואופן השימוש בהם. ניתן להסיר תגים שאינם בשימוש", + "FileNameTokens": "אסימונים לשם קובץ", + "UiSettingsSummary": "אפשרויות לקויות לוח שנה, תאריך וצבע", + "IncludeHealthWarnings": "כלול אזהרות בריאות", + "RemoveQueueItemConfirmation": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?", + "ArtistIndexFooterDownloading": "מוריד", + "AutoRedownloadFailed": "הורדה נכשלה", + "AutomaticSearch": "חיפוש אוטומטי" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 9cb6081fb..38a93885e 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -29,15 +29,15 @@ "Connections": "Kapcsolatok", "ConnectSettings": "Csatlakozási beállítások", "Dates": "Dátumok", - "DatabaseMigration": "DB Migráció", + "DatabaseMigration": "Adatbázis-migráció", "Delete": "Törlés", "DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?", "DeleteDownloadClient": "Letöltőkliens törlése", - "DeleteIndexer": "Indexer Törlése", + "DeleteIndexer": "Indexelő törlése", "DeleteIndexerMessageText": "Biztosan törli a(z) \"{name}\" indexelőt?", - "DeleteNotification": "Értesítés Törlése", + "DeleteNotification": "Értesítés törlése", "DeleteNotificationMessageText": "Biztosan törli a(z) „{name}” értesítést?", - "DeleteTag": "Címke Törlése", + "DeleteTag": "Címke törlése", "DeleteTagMessageText": "Biztosan törli a „{label}” címkét?", "Docker": "Docker", "DownloadClient": "Letöltési kliens", @@ -209,7 +209,7 @@ "AuthenticationMethodHelpText": "Felhasználónév és jelszó szükséges a(z) {appName} eléréséhez", "AutoRedownloadFailedHelpText": "Egy másik kiadás automatikus keresése és letöltése", "AutomaticallySwitchRelease": "Automatikusan váltson másik megjelenésre", - "BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek", + "BackupFolderHelpText": "A relatív elérési utak a(z) {appName} AppData könyvtárában találhatók", "BackupIntervalHelpText": "Időköz a {appName} adatbázis és a beállítások biztonsági mentéséhez", "BindAddressHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", "Blocklist": "Feketelista", @@ -249,7 +249,7 @@ "DelayingDownloadUntil": "Késleltetni a letöltést {0} -tól {1} -ig", "DeleteDelayProfile": "Késleltetési Profil törlése", "DefaultTagsHelpText": "Az ebben a mappában észlelt előadók alapértelmezett {appName} címkéi", - "DeleteReleaseProfile": "Késleltetési Profil Törlése", + "DeleteReleaseProfile": "Release profil törlése", "DeleteReleaseProfileMessageText": "Biztos hogy törölni szeretnéd ezt a késleltetési profilt?", "DeleteRootFolder": "Gyökérmappa törlés", "DeleteRootFolderMessageText": "Biztosan törlöd a(z) „{0}” gyökérmappát?", @@ -259,7 +259,7 @@ "DeleteEmptyFoldersHelpText": "Törölje az üres előadó- és albummappákat a lemezellenőrzés és a műsorszámfájlok törlésekor", "DeleteFilesHelpText": "Törölje a számfájlokat és az előadói mappát", "DeleteImportList": "Importálási lista törlése", - "DeleteImportListExclusion": "Az importlista kizárásásainak törlése", + "DeleteImportListExclusion": "Importálási lista kizárásának törlése", "DeleteImportListExclusionMessageText": "Biztosan törli ezt az importlista-kizárást?", "DeleteImportListMessageText": "Biztosan törli a(z) „{name}” listát?", "DeleteMetadataProfile": "Metaadat-profil törlése", @@ -267,7 +267,7 @@ "Component": "Összetevő", "Level": "Szint", "DeleteMetadataProfileMessageText": "Biztosan törli a {0} minőségi profilt?", - "DeleteQualityProfile": "Minőségi Profil Törlése", + "DeleteQualityProfile": "Törölje a minőségi profilt", "DeleteQualityProfileMessageText": "Biztosan törli a(z) „{name}” minőségi profilt?", "RemotePathHelpText": "Gyökérútvonal a könyvtárhoz, amelyhez a letöltőkliens hozzáfér", "SkipFreeSpaceCheckWhenImportingHelpText": "Akkor használja, ha a(z) {appName} nem tud szabad helyet észlelni a gyökérmappában a fájlimportálás során", @@ -325,8 +325,8 @@ "DeleteSelectedTrackFilesMessageText": "Biztos benne, hogy törölni kívánja a kiválasztott sávfájlokat?", "DeleteTrackFile": "Track fájl törlése", "DeleteTrackFileMessageText": "Biztosan törli a következőt: {0}?", - "DestinationPath": "Célmappa Útvonala", - "DetailedProgressBar": "Részletes Folyamat Sáv", + "DestinationPath": "Cél útvonal", + "DetailedProgressBar": "Részletes folyamatjelző sáv", "Disambiguation": "Egyértelművé tétel", "DiscCount": "Lemezszám", "DiscNumber": "Lemez száma", @@ -372,11 +372,11 @@ "IgnoredHelpText": "A kiadás elutasításra kerül, ha egy vagy több kifejezést tartalmaz (A kis- és nagybetűket nem vesszük figyelembe)", "IgnoredPlaceHolder": "Új korlátozás hozzáadása", "ImportedTo": "Importálva Ide", - "ImportExtraFiles": "Extra Fájlok Importálása", + "ImportExtraFiles": "Extra fájlok importálása", "ImportExtraFilesHelpText": "A megfelelő extra fájlok importálása (feliratok, nfo stb.) a zenefájl importálása után", "ImportFailedInterp": "Importálás sikertelen: {0}", "ImportFailures": "Importálási hibák", - "ImportListExclusions": "Lista kizárások importálása", + "ImportListExclusions": "Listakizárások importálása", "ImportLists": "Listák importálása", "IndexerSettings": "Indexer Beállítások", "IsCutoffCutoff": "Küszöbhatár", @@ -677,7 +677,7 @@ "Close": "Bezárás", "Connect": "Csatlakozás", "Custom": "Egyedi", - "CustomFilters": "Egyéni Szűrők", + "CustomFilters": "Egyedi Szűrők", "Date": "Dátum", "DefaultDelayProfileHelpText": "Ez az alapértelmezett profil. Minden filmre vonatkozik, amelynek nincs más profilja.", "Deleted": "Törölve", @@ -829,7 +829,7 @@ "SelectReleaseGroup": "Release csoport kiválasztása", "BypassIfHighestQuality": "Kihagyás ha a legjobb minőség elérhető", "EnableRssHelpText": "Akkor használatos, amikor a {appName} rendszeresen keres kiadásokat az RSS Sync segítségével", - "CustomFormatScore": "Egyéni formátum pontszám", + "CustomFormatScore": "Egyéni formátum pontszáma", "MinimumCustomFormatScore": "Minimális egyéni formátum pontszám", "CloneCustomFormat": "Egyéni formátum klónozása", "Conditions": "Körülmények", @@ -838,7 +838,7 @@ "CustomFormat": "Egyéni formátum", "CustomFormatRequiredHelpText": "Ennek a {0} feltételnek meg kell egyeznie az egyéni formátum alkalmazásához. Ellenkező esetben egyetlen {1} egyezés elegendő.", "CustomFormatSettings": "Egyéni Formátum Beállításai", - "CustomFormats": "Egyéni Formátumok", + "CustomFormats": "Egyéni formátumok", "Customformat": "Egyéni formátum", "CutoffFormatScoreHelpText": "Amint eléri ezt az egyéni minőséget, a {appName} többé nem fogja tovább keresni a filmet", "DeleteCustomFormat": "Egyéni formátum törlése", @@ -965,7 +965,7 @@ "ApplyTagsHelpTextHowToApplyImportLists": "Címkék alkalmazása a kiválasztott importlistákra", "ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre", "AutoAdd": "Automatikus hozzáadás", - "AddConditionImplementation": "Feltétel hozzáadása –{megvalósítás név}", + "AddConditionImplementation": "Feltétel hozzáadása –{implementationName}", "AddDownloadClientImplementation": "Letöltési kliens hozzáadása – {implementationName}", "AddAutoTag": "Automatikus címke hozzáadása", "AddAlbumWithTitle": "{albumTitle} hozzáadása", @@ -1050,5 +1050,13 @@ "ChangeCategoryMultipleHint": "Módosítja a letöltéseket az „Importálás utáni kategóriára” a Download Clientből", "Total": "Összesen", "Table": "Táblázat", - "CustomFormatsSpecificationRegularExpression": "Reguláris kifejezés" + "CustomFormatsSpecificationRegularExpression": "Reguláris kifejezés", + "ImportList": "Importálási lista", + "AutoTaggingNegateHelpText": "Ha be van jelölve, az automatikus címkézési szabály nem érvényesül, ha ez a {implementationName} feltétel megfelel.", + "CustomFormatsSpecificationRegularExpressionHelpText": "Az egyéni formátumú reguláris kifejezés nem különbözteti meg a kis- és nagybetűket", + "DoNotBlocklist": "Ne tiltsa le", + "DoNotBlocklistHint": "Eltávolítás tiltólista nélkül", + "AutoTaggingRequiredHelpText": "Ennek az {implementationName} feltételnek meg kell egyeznie az automatikus címkézési szabály érvényesítéséhez. Ellenkező esetben egyetlen {implementationName} egyezés elegendő.", + "DeleteSpecification": "Specifikáció törlése", + "DeleteSpecificationHelpText": "Biztosan törli a(z) „{name}” specifikációt?" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index fab9067bd..f303c69d3 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -802,7 +802,7 @@ "AuthenticationRequiredHelpText": "Cambia a quali richieste l'autenticazione verrà chiesta. Non cambiare se non comprendi i rischi.", "Auto": "Auto", "UpdateFiltered": "Aggiorna Filtrati", - "AddAutoTagError": "Non è stato possibile aggiungere una nuova etichetta automatica. Riprova.", + "AddAutoTagError": "Impossibile aggiungere un nuovo tag automatico, riprova.", "AddConditionError": "Non è stato possibile aggiungere una nuova condizione. Riprova.", "DeleteSpecification": "Cancella la Notifica", "DeleteSpecificationHelpText": "Sei sicuro di voler eliminare la condizione '{name}'?", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index af8088110..1078d8664 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -698,5 +698,28 @@ "PreferredSize": "推奨サイズ", "Unlimited": "無制限", "ExtraFileExtensionsHelpText": "インポートする追加ファイルのコンマ区切りリスト(.nfoは.nfo-origとしてインポートされます)", - "ExtraFileExtensionsHelpTextsExamples": "例: '。sub、.nfo'または 'sub、nfo'" + "ExtraFileExtensionsHelpTextsExamples": "例: '。sub、.nfo'または 'sub、nfo'", + "DefaultCase": "デフォルトのケース", + "FileNameTokens": "ファイル名トークン", + "Links": "リンク", + "RemoveQueueItemConfirmation": "キューから{0}アイテム{1}を削除してもよろしいですか?", + "ImportList": "リスト", + "Uppercase": "大文字", + "ImportLists": "リスト", + "AutoRedownloadFailed": "ダウンロードに失敗しました", + "MonitoredStatus": "監視/ステータス", + "ConnectSettingsSummary": "通知、メディアサーバー/プレーヤーへの接続、およびカスタムスクリプト", + "CustomFormatsSettings": "カスタムフォーマット設定", + "DownloadClientsSettingsSummary": "クライアントのダウンロード、ダウンロード処理、リモートパスマッピング", + "GeneralSettingsSummary": "ポート、SSL、ユーザー名/パスワード、プロキシ、分析、更新", + "Lowercase": "小文字", + "QualitySettingsSummary": "品質のサイズと命名", + "TagsSettingsSummary": "すべてのタグとその使用方法を確認してください。未使用のタグは削除できます", + "UiSettingsSummary": "カレンダー、日付、色が損なわれたオプション", + "CustomFormatsSettingsSummary": "カスタムフォーマットと設定", + "ImportListsSettingsSummary": "リストのインポート、リストの除外", + "IncludeHealthWarnings": "健康上の警告を含める", + "ArtistIndexFooterDownloading": "ダウンロード", + "AutomaticSearch": "自動検索", + "KeyboardShortcuts": "キーボードショートカット" } diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index 2c51b3d8c..fe7c7ec2e 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -821,5 +821,23 @@ "AutoRedownloadFailedFromInteractiveSearch": "Opnieuw downloaden mislukt vanuit interactief zoeken", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Zoek en download automatisch een andere release als een release vanuit interactief zoeken mislukt is", "RemoveQueueItemConfirmation": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?", - "IncludeHealthWarnings": "Voeg Gezondheidswaarschuwingen Toe" + "IncludeHealthWarnings": "Voeg Gezondheidswaarschuwingen Toe", + "DefaultCase": "Standaard Geval", + "FileNameTokens": "Bestandsnaam Tokens", + "Uppercase": "Hoofdletters", + "KeyboardShortcuts": "Sneltoetsen", + "Links": "Koppelingen", + "Lowercase": "Kleine letters", + "MonitoredStatus": "Bewaakt/Status", + "ConnectSettingsSummary": "Notificaties, connecties met media servers/spelers en scripts", + "CustomFormatsSettings": "Eigen Formaten Instellingen", + "DownloadClientsSettingsSummary": "Download applicaties, download afhandeling en externe pad verwijzing", + "GeneralSettingsSummary": "Poort, SSL, gebruikersnaam/wachtwoord, proxy, statistieken en updates", + "ImportListsSettingsSummary": "Lijsten en uitzonderingen", + "TagsSettingsSummary": "Bekijk alle tags en hun gebruik. Ongebruikte tags kunnen worden verwijderd", + "UiSettingsSummary": "Kalender, datum en tijd, kleurenblindheid en taal instellingen", + "CustomFormatsSettingsSummary": "Eigen Formaten en instellingen", + "QualitySettingsSummary": "Kwaliteitsdefinities en benaming", + "ArtistIndexFooterDownloading": "Downloaden", + "AutomaticSearch": "Automatisch Zoeken" } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 39a97eaca..d4b0c86aa 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -766,5 +766,26 @@ "AddIndexerImplementation": "Dodaj condition - {implementationName}", "IncludeHealthWarnings": "Uwzględnij ostrzeżenia zdrowotne", "EditConnectionImplementation": "Dodaj Connection - {implementationName}", - "RemoveQueueItemConfirmation": "Czy na pewno chcesz usunąć elementy ({0}) z kolejki?" + "RemoveQueueItemConfirmation": "Czy na pewno chcesz usunąć elementy ({0}) z kolejki?", + "MonitoredStatus": "Monitorowane / Stan", + "DefaultCase": "Przypadek domyślny", + "KeyboardShortcuts": "Skróty klawiszowe", + "Links": "Spinki do mankietów", + "ImportList": "Lista", + "FileNameTokens": "Tokeny nazw plików", + "Uppercase": "Z dużej litery", + "CustomFormatsSettings": "Ustawienia niestandardowych formatów", + "CustomFormatsSettingsSummary": "Niestandardowe formaty i ustawienia", + "EditIndexerImplementation": "Dodaj condition - {implementationName}", + "GeneralSettingsSummary": "Port, SSL, nazwa użytkownika / hasło, proxy, analizy i aktualizacje", + "ImportListsSettingsSummary": "Listy importowe, wykluczenia z list", + "QualitySettingsSummary": "Jakościowe rozmiary i nazewnictwo", + "ConnectSettingsSummary": "Powiadomienia, połączenia z serwerami / odtwarzaczami multimedialnymi i niestandardowe skrypty", + "DownloadClientsSettingsSummary": "Pobieranie klientów, obsługa pobierania i mapowanie ścieżek zdalnych", + "Lowercase": "Z małej litery", + "TagsSettingsSummary": "Zobacz wszystkie tagi i sposób ich używania. Nieużywane tagi można usunąć", + "UiSettingsSummary": "Opcje z osłabionym kalendarzem, datą i kolorem", + "ArtistIndexFooterDownloading": "Ściąganie", + "ImportLists": "Listy", + "AutomaticSearch": "Automatyczne wyszukiwanie" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 338fc2a12..c850cff50 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -892,5 +892,23 @@ "AutoRedownloadFailedFromInteractiveSearch": "Falha na transferência a partir da Pesquisa interactiva", "IncludeHealthWarnings": "Incluir avisos de estado de funcionamento", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Procurar automaticamente e tentar transferir uma versão diferente quando a versão falhada foi obtida a partir da pesquisa interactiva", - "RemoveQueueItemConfirmation": "Tem a certeza que deseja remover {0} da fila?" + "RemoveQueueItemConfirmation": "Tem a certeza que deseja remover {0} da fila?", + "MonitoredStatus": "Monitorado/Estado", + "DefaultCase": "Caixa padrão", + "Links": "Ligações", + "Lowercase": "Minúsculas", + "Uppercase": "Maiúsculas", + "FileNameTokens": "Tokens de nome do ficheiro", + "KeyboardShortcuts": "Atalhos do teclado", + "CustomFormatsSettings": "Definições de formatos personalizados", + "CustomFormatsSettingsSummary": "Definições e formatos personalizados", + "UiSettingsSummary": "Opções de calendário, data e modo de daltonismo", + "ConnectSettingsSummary": "Notificações, ligações para servidores/leitores de multimédia e scripts personalizados", + "DownloadClientsSettingsSummary": "Clientes de transferências, processamento de transferências e mapeamentos de caminho remoto", + "GeneralSettingsSummary": "Porta, SSL, utilizador/palavra-passe, proxy, análises e atualizações", + "ImportListsSettingsSummary": "Listas de importação, exclusões de lista", + "QualitySettingsSummary": "Tamanhos de qualidade e nomenclatura", + "TagsSettingsSummary": "Ver todas as etiquetas e como são utilizadas. Etiquetas não utilizadas podem ser removidas", + "ArtistIndexFooterDownloading": "Transferindo", + "AutomaticSearch": "Pesquisa automática" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 20cb9f560..617f5b9c1 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1203,5 +1203,22 @@ "EmbedCoverArtInAudioFiles": "Incorporar capa em arquivos de áudio", "EmbedCoverArtHelpText": "Incorpore a arte do álbum Lidarr em arquivos de áudio ao escrever etiquetas", "Lowercase": "Minúscula", - "Underscore": "Sublinhar" + "Underscore": "Sublinhar", + "MassSearchCancelWarning": "Isso não pode ser cancelado depois de iniciado sem reiniciar {appName} ou desabilitar todos os seus indexadores.", + "NoTracksInThisMedium": "Nenhuma faixa neste meio", + "MonitoredStatus": "Monitorado/Status", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "Tem certeza de que deseja pesquisar todos os álbuns do {totalRecords} corte não atingido?", + "ConnectSettingsSummary": "Notificações, conexões com servidores/players de mídia e scripts personalizados", + "CustomFormatsSettingsSummary": "Configurações e Formatos Personalizados", + "IndexersSettingsSummary": "Indexadores e opções de indexador", + "MediaManagementSettingsSummary": "Nomenclatura, configurações de gerenciamento de arquivos e pastas raiz", + "QualitySettingsSummary": "Tamanhos e nomenclatura de qualidade", + "TagsSettingsSummary": "Veja todas as etiquetas e como elas são usadas. Etiquetas não utilizadas podem ser removidas", + "UiSettingsSummary": "Opções de calendário, data e cores para daltônicos", + "CustomFormatsSettings": "Configurações de Formatos Personalizados", + "DownloadClientsSettingsSummary": "Clientes de download, gerenciamento de download e mapeamentos de caminhos remotos", + "GeneralSettingsSummary": "Porta, SSL, nome de usuário/senha, proxy, análises e atualizações", + "ImportListsSettingsSummary": "Importe de outra instância do {appName} ou listas do Trakt e gerencie exclusões de listas", + "MetadataSettingsArtistSummary": "Crie arquivos de metadados quando as faixas forem importadas ou o artista for atualizado", + "ProfilesSettingsArtistSummary": "Perfis de Qualidade, Metadados, Atraso e Lançamento" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 36a8d5c19..0e8569ff8 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -362,7 +362,7 @@ "Remove": "Удалить", "RemovedFromTaskQueue": "Удалено из очереди задач", "Analytics": "Аналитика", - "AnalyticsEnabledHelpText": "Отправлять в {appName} информацию о использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы загружены, сообщения об ошибках, а так же операционной системе. Мы используем эту информацию для выявления ошибок, а так же для разработки нового функционала.", + "AnalyticsEnabledHelpText": "Отправлять в {appName} анонимную информацию об использовании и ошибках. Анонимная статистика включает в себя информацию о браузере, какие страницы веб-интерфейса {appName} загружены, сообщения об ошибках, а также операционной системе. Мы используем эту информацию для выявления ошибок, а также для разработки нового функционала.", "AnalyticsEnabledHelpTextWarning": "Для вступления в силу требуется перезапуск", "RestartNow": "Перезапустить сейчас", "ShowUnknownArtistItems": "Показать неизвестные элементы фильма", @@ -402,7 +402,7 @@ "Ungroup": "Разгруппировать", "Actions": "Действия", "ApiKeyHelpTextWarning": "Для вступления в силу требуется перезапуск", - "AppDataDirectory": "AppData директория", + "AppDataDirectory": "Директория AppData", "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Для получения дополнительной информации о каждом из клиентов загрузки нажмите на кнопки с дополнительной информацией.", "FileManagement": "Управление файлами", "Filename": "Имя файла", @@ -757,5 +757,7 @@ "DeleteRemotePathMappingMessageText": "Вы уверены, что хотите удалить это сопоставление удаленного пути?", "ResetQualityDefinitionsMessageText": "Вы уверены, что хотите сбросить определения качества?", "OnHealthRestored": "При восстановлении работоспособности", - "AllResultsAreHiddenByTheAppliedFilter": "Все результаты скрыты фильтром" + "AllResultsAreHiddenByTheAppliedFilter": "Все результаты скрыты фильтром", + "CustomFormatsSettings": "Настройки пользовательских форматов", + "CustomFormatsSpecificationRegularExpression": "Регулярное выражение" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 00f34239c..ef22d638c 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -453,9 +453,9 @@ "Ok": "Tamam", "Test": "Ölçek", "UnmappedFilesOnly": "Yalnızca Eşlenmemiş Dosyalar", - "Activity": "Aktivite", + "Activity": "Etkinlik", "Add": "Ekle", - "AddDelayProfile": "Gecikme Profili Ekle", + "AddDelayProfile": "Gecikme Profili Ekleme", "Replace": "Değiştir", "RestartRequiredHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ShowAdvanced": "Gelişmiş'i Göster", @@ -472,11 +472,11 @@ "Connect": "Bağlan", "Added": "Eklendi", "AddIndexer": "Dizin Oluşturucu Ekle", - "AddNew": "Yeni ekle", + "AddNew": "Yeni Ekle", "AddQualityProfile": "Kalite Profili Ekle", - "AddRemotePathMapping": "Uzak Yol Eşleme Ekle", + "AddRemotePathMapping": "Uzak Yol Eşleme Ekleme", "AddRootFolder": "Kök Klasör Ekle", - "AfterManualRefresh": "Manuel Yenilemeden Sonra", + "AfterManualRefresh": "Manüel Yenilemeden Sonra", "Age": "Yaş", "All": "Herşey", "AllFiles": "Tüm dosyalar", @@ -680,7 +680,7 @@ "EditConditionImplementation": "Koşul Ekle - {uygulama Adı}", "Overview": "Genel Bakış", "GrabId": "Grab ID", - "AddIndexerImplementation": "Koşul Ekle - {implementationName}", + "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "DeleteArtistFolderHelpText": "Film klasörünü ve içeriğini silin", "DeleteAutoTagHelpText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteSpecification": "Bildirimi Sil", @@ -694,7 +694,7 @@ "Large": "Büyük", "OrganizeSelectedArtists": "Seçili Filmleri Düzenleyin", "Table": "Tablo", - "AddAutoTagError": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.", + "AddAutoTagError": "Yeni bir otomatik etiket eklenemiyor, lütfen tekrar deneyin.", "AddConditionError": "Yeni bir koşul eklenemiyor, lütfen tekrar deneyin.", "AlbumsLoadError": "Yedeklemeler yüklenemiyor", "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", @@ -719,5 +719,32 @@ "Unlimited": "Sınırsız", "IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et", "RemoveQueueItemConfirmation": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", - "AutoRedownloadFailed": "Yükleme başarısız" + "AutoRedownloadFailed": "Yükleme başarısız", + "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", + "AddImportList": "İçe Aktarım Listesi Ekle", + "AddReleaseProfile": "Sürüm Profili Ekle", + "AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", + "ImportLists": "Listeler", + "EditReleaseProfile": "Sürüm Profili Ekle", + "DefaultCase": "Varsayılan Durum", + "FileNameTokens": "Dosya Adı Belirteçleri", + "KeyboardShortcuts": "Klavye kısayolları", + "MonitoredStatus": "İzlendi / Durum", + "Lowercase": "Küçük Harf", + "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", + "EditImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", + "ImportList": "Listeler", + "Uppercase": "Büyük Harf", + "TagsSettingsSummary": "Tüm etiketleri ve nasıl kullanıldıklarını göster. Kullanılmayan etiketler kaldırılabilinir", + "UiSettingsSummary": "Takvim, tarih ve renk engelli seçenekler", + "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları", + "CustomFormatsSettings": "Özel Biçim Ayarları", + "CustomFormatsSettingsSummary": "Özel Biçimler ve Ayarlar", + "DownloadClientsSettingsSummary": "İstemcileri indirin, indirme işlemlerini ve uzak yol haritalarını indirin", + "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler", + "ImportListsSettingsSummary": "Listeleri İçe Aktar, hariç tutulanları listele", + "QualitySettingsSummary": "Kalite boyutları ve adlandırma", + "ArtistIndexFooterDownloading": "İndiriliyor", + "AutomaticSearch": "Otomatik Arama", + "Links": "Bağlantılar" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index d17b4330b..e7c7f662e 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -707,5 +707,25 @@ "Unlimited": "Vô hạn", "RemoveQueueItemConfirmation": "Bạn có chắc chắn muốn xóa {0} khỏi hàng đợi không?", "AutoRedownloadFailed": "Tải xuống không thành công", - "IncludeHealthWarnings": "Bao gồm các cảnh báo về sức khỏe" + "IncludeHealthWarnings": "Bao gồm các cảnh báo về sức khỏe", + "FileNameTokens": "Mã thông báo tên tệp", + "ImportLists": "Danh sách", + "KeyboardShortcuts": "Các phím tắt bàn phím", + "Links": "Liên kết", + "Lowercase": "Chữ thường", + "MonitoredStatus": "Theo dõi / Trạng thái", + "Uppercase": "Chữ hoa", + "ImportList": "Danh sách", + "DefaultCase": "Trường hợp mặc định", + "ConnectSettingsSummary": "Thông báo, kết nối với máy chủ / trình phát đa phương tiện và tập lệnh tùy chỉnh", + "CustomFormatsSettings": "Cài đặt định dạng tùy chỉnh", + "CustomFormatsSettingsSummary": "Định dạng và Cài đặt Tùy chỉnh", + "DownloadClientsSettingsSummary": "Tải xuống ứng dụng khách, xử lý tải xuống và ánh xạ đường dẫn từ xa", + "GeneralSettingsSummary": "Cổng, SSL, tên người dùng / mật khẩu, proxy, phân tích và cập nhật", + "ImportListsSettingsSummary": "Nhập danh sách, loại trừ danh sách", + "QualitySettingsSummary": "Kích thước chất lượng và cách đặt tên", + "TagsSettingsSummary": "Xem tất cả các thẻ và cách chúng được sử dụng. Các thẻ không sử dụng có thể bị xóa", + "UiSettingsSummary": "Lịch, ngày tháng và các tùy chọn bị suy giảm màu sắc", + "ArtistIndexFooterDownloading": "Đang tải xuống", + "AutomaticSearch": "Tìm kiếm tự động" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index dfd2934da..5eb925319 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -191,7 +191,7 @@ "AllowArtistChangeClickToChangeArtist": "更改艺术家", "AllowFingerprinting": "允许指纹识别", "AllowFingerprintingHelpText": "利用指纹技术提高航迹匹配的准确性", - "AllowFingerprintingHelpTextWarning": "这需要读取部分文件,这将减慢扫描速度,并可能导致磁盘或网络活动频繁。", + "AllowFingerprintingHelpTextWarning": "这需要{appName}读取部分文件,这将减慢扫描速度,并可能导致磁盘或网络活动频繁。", "AlternateTitles": "别名", "MinimumAgeHelpText": "仅限Usenet:抓取NewzBin文件的最小时间间隔(分钟)。开启此功能会让新版本有时间传播到你的usenet提供商。", "OnApplicationUpdate": "程序更新时", @@ -973,7 +973,7 @@ "Album": "专辑", "SomeResultsAreHiddenByTheAppliedFilter": "部分结果已被过滤隐藏", "SuggestTranslationChange": "建议翻译改变 Suggest translation change", - "BlocklistReleaseHelpText": "防止Radarr再次自动抓取此版本", + "BlocklistReleaseHelpText": "防止{appName}再次自动抓取此版本", "UpdateSelected": "更新选择的内容", "DeleteConditionMessageText": "您确定要删除条件“{name}”吗?", "DownloadClientSortingCheckMessage": "下载客户端 {0} 为 Radarr 的类别启用了 {1} 排序。 您应该在下载客户端中禁用排序以避免导入问题。", @@ -1150,5 +1150,39 @@ "DownloadClientAriaSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", "CustomFormatsSpecificationRegularExpression": "正则表达式", "RemoveQueueItemConfirmation": "您确定要从队列中删除'{sourceTitle}'吗?", - "AutoRedownloadFailed": "重新下载失败" + "AutoRedownloadFailed": "重新下载失败", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} 条音轨已下载", + "ArtistProgressBarText": "{trackFileCount} / {trackCount} (共: {totalTrackCount}, 正在下载: {downloadingCount})", + "ChangeCategory": "改变分类", + "ArtistMonitoring": "监控中的艺术家", + "ArtistIndexFooterDownloading": "正在下载", + "AutomaticSearch": "自动搜索", + "Dash": "破折号", + "DefaultCase": "默认大小写", + "KeyboardShortcuts": "快捷键", + "Links": "链接", + "Period": "时期", + "Space": "空间", + "MonitoredStatus": "已监控的/状态", + "Logout": "注销", + "Lowercase": "小写字母", + "MassSearchCancelWarning": "一旦启动,如果不重启{appName}或禁用所有索引器,就无法取消此操作。", + "Underscore": "下划线", + "Uppercase": "大写字母", + "Donate": "捐赠", + "DownloadClientsSettingsSummary": "下载客户端,下载处理和远程地址映射", + "FileNameTokens": "文件名标记", + "GeneralSettingsSummary": "端口、SSL、用户名/密码、代理、分析、更新", + "IndexersSettingsSummary": "索引器和索引器选项", + "MediaManagementSettingsSummary": "命名,文件管理和根文件夹设置", + "MetadataSettingsArtistSummary": "在导入书籍或刷新作者时创建元数据文件", + "QualitySettingsSummary": "质量尺寸和命名", + "ConnectSettingsSummary": "通知、与媒体服务器/播放器的链接、自定义脚本", + "CustomFormatsSettings": "自定义格式设置", + "CustomFormatsSettingsSummary": "自定义格式和设置", + "ImportListsSettingsSummary": "导入影片列表、排除列表", + "ProfilesSettingsArtistSummary": "质量、元数据、延迟、发行配置", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "您确定要搜索所有{totalRecords}Cutoff Unmet的剧集吗?", + "TagsSettingsSummary": "显示全部标签和标签使用情况,可删除未使用的标签", + "UiSettingsSummary": "日历、日期和色弱模式选项" } From f1efd052078f3d5378c8993b988cf8f8ef5b03d3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 11 Feb 2024 06:04:57 +0200 Subject: [PATCH 029/491] Fixed: Spotify Playlist selection --- frontend/src/Components/Form/PlaylistInput.js | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/frontend/src/Components/Form/PlaylistInput.js b/frontend/src/Components/Form/PlaylistInput.js index 77718f4f1..0b3966f60 100644 --- a/frontend/src/Components/Form/PlaylistInput.js +++ b/frontend/src/Components/Form/PlaylistInput.js @@ -9,7 +9,6 @@ import TableBody from 'Components/Table/TableBody'; import TableRow from 'Components/Table/TableRow'; import tagShape from 'Helpers/Props/Shapes/tagShape'; import translate from 'Utilities/String/translate'; -import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; import styles from './PlaylistInput.css'; @@ -46,7 +45,17 @@ class PlaylistInput extends Component { onChange } = this.props; - const oldSelected = getSelectedIds(prevState.selectedState, { parseIds: false }).sort(); + const oldSelected = _.reduce( + prevState.selectedState, + (result, value, id) => { + if (value) { + result.push(id); + } + + return result; + }, + [] + ).sort(); const newSelected = this.getSelectedIds().sort(); if (!_.isEqual(oldSelected, newSelected)) { @@ -61,7 +70,17 @@ class PlaylistInput extends Component { // Control getSelectedIds = () => { - return getSelectedIds(this.state.selectedState, { parseIds: false }); + return _.reduce( + this.state.selectedState, + (result, value, id) => { + if (value) { + result.push(id); + } + + return result; + }, + [] + ); }; // From d68f207e9b1b9157b94e7bbaa0bf898135dc624d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 11 Feb 2024 06:20:59 +0200 Subject: [PATCH 030/491] Ignore spotify mapping test temporarily --- .../ImportListTests/Spotify/SpotifyMappingFixture.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs index 2e19400fc..224b21148 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs @@ -158,6 +158,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] + [Ignore("Pending mapping fixes", Until = "2024-02-20 00:00:00Z")] public void map_album_should_work() { UseRealHttp(); From 7f0fab0cf6e3ce44a18495fcbe1b24d75c1e4a8b Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 11 Feb 2024 22:57:47 +0000 Subject: [PATCH 031/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Lucas Co-authored-by: Magyar Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/fr.json | 4 +- src/NzbDrone.Core/Localization/Core/hu.json | 82 ++++++++++++++++----- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index ed0cdb5c7..0fc97bd51 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1099,7 +1099,6 @@ "AuthenticationRequiredWarning": "Pour empêcher l'accès à distance sans authentification, {appName} exige désormais que l'authentification soit activée. Vous pouvez éventuellement désactiver l'authentification pour les adresses locales.", "UpdateFiltered": "Mise à jour filtrée", "AddAutoTag": "Ajouter un tag automatique", - "AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer.", "AddCondition": "Ajouter une condition", "AddConditionError": "Impossible d'ajouter une nouvelle condition, Réessayer.", "QueueFilterHasNoItems": "Le filtre de file d'attente sélectionné ne contient aucun élément", @@ -1184,5 +1183,6 @@ "RemoveQueueItem": "Retirer - {sourceTitle}", "RemoveQueueItemConfirmation": "Êtes-vous sûr de vouloir retirer '{sourceTitle}' de la file d'attente ?", "RemoveQueueItemRemovalMethod": "Méthode de suppression", - "RemoveQueueItemsRemovalMethodHelpTextWarning": "Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement." + "RemoveQueueItemsRemovalMethodHelpTextWarning": "Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement.", + "AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer." } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 38a93885e..89d748523 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -44,13 +44,13 @@ "DownloadClients": "Letöltő kliensek", "Edit": "Szerkeszt", "Enable": "Aktiválás", - "EnableAutomaticAdd": "Engedélyezd az automatikus hozzáadást", + "EnableAutomaticAdd": "Automatikus hozzáadás engedélyezése", "EnableCompletedDownloadHandlingHelpText": "A befejezett letöltések automatikus importálása a letöltési kliensből", - "EnableHelpText": "Engedélyezze a metaadatfájlok létrehozását ehhez a metaadat típushoz", + "EnableHelpText": "Metaadatfájl létrehozásának engedélyezése ehhez a metaadattípushoz", "EnableInteractiveSearch": "Interaktív keresés engedélyezése", "EnableSSL": "SSL Engedélyezése", "EnableSslHelpText": " A hatálybalépéshez újra kell indítani rendszergazdaként", - "ErrorLoadingContents": "Hiba történt a tartalom betöltésekor", + "ErrorLoadingContents": "Hiba a tartalom betöltésekor", "Exception": "Kivétel", "Filename": "Fájlnév", "Files": "Fájlok", @@ -187,7 +187,7 @@ "AllowArtistChangeClickToChangeArtist": "Kattints az előadó módosításához", "AllowFingerprinting": "Engedélyezze az ujjlenyomatot", "AllowFingerprintingHelpText": "Használjon ujjlenyomatot a számegyeztetés pontosságának javítására", - "AllowFingerprintingHelpTextWarning": "Ehhez a Liddarr-nak el kell olvasnia a fájl olyan részeit, amelyek lelassítják a beolvasást, és magas lemez- vagy hálózati aktivitást okozhatnak.", + "AllowFingerprintingHelpTextWarning": "Ehhez a(z) {appName} alkalmazásnak be kell olvasnia a fájl egyes részeit, ami lelassítja a keresést, és magas lemez- vagy hálózati tevékenységet okozhat.", "AlreadyInYourLibrary": "Már a könyvtárban", "AlternateTitles": "Alternatív címek", "AlternateTitleslength1Title": "Cím", @@ -252,7 +252,7 @@ "DeleteReleaseProfile": "Release profil törlése", "DeleteReleaseProfileMessageText": "Biztos hogy törölni szeretnéd ezt a késleltetési profilt?", "DeleteRootFolder": "Gyökérmappa törlés", - "DeleteRootFolderMessageText": "Biztosan törlöd a(z) „{0}” gyökérmappát?", + "DeleteRootFolderMessageText": "Biztosan törli a(z) \"{name}\" gyökérmappát?", "Time": "Idő", "DeleteDelayProfileMessageText": "Biztosan törli ezt a késleltetési profilt?", "DeleteEmptyFolders": "Üres Mappa Törlése", @@ -266,7 +266,7 @@ "Actions": "Teendők", "Component": "Összetevő", "Level": "Szint", - "DeleteMetadataProfileMessageText": "Biztosan törli a {0} minőségi profilt?", + "DeleteMetadataProfileMessageText": "Biztosan törli a(z) „{name}” metaadat-profilt?", "DeleteQualityProfile": "Törölje a minőségi profilt", "DeleteQualityProfileMessageText": "Biztosan törli a(z) „{name}” minőségi profilt?", "RemotePathHelpText": "Gyökérútvonal a könyvtárhoz, amelyhez a letöltőkliens hozzáfér", @@ -348,7 +348,7 @@ "FileNames": "Fájlnevek", "FirstAlbum": "Első album", "FirstAlbumData": "Figyelje az első albumokat. Az összes többi album figyelmen kívül lesz hagyva", - "FirstDayOfWeek": "A Hét Első Napja", + "FirstDayOfWeek": "A hét első napja", "FutureAlbums": "Jövőbeni albumok", "FutureAlbumsData": "Figyelje meg azokat az albumokat, amelyek még nem jelentek meg", "FutureDays": "Jövendő Napok", @@ -522,7 +522,7 @@ "UnableToLoadRemotePathMappings": "Nem lehet betölteni a Távoli útvonal-hozzárendeléseket", "UnableToLoadRootFolders": "Nem lehet betölteni a gyökérmappákat", "Ungroup": "Csoport eltávolítása", - "UnmappedFiles": "Feltérképezetlen fájlok", + "UnmappedFiles": "Leképezés nélküli fájlok", "UnmonitoredHelpText": "A nem felügyelt albumok is bekerülnek az iCal hírcsatornába", "UpdateAll": "Összes frissítése", "UpgradeAllowedHelpText": "Ha ki van kapcsolva, a meglévő minőségűnél nem lesz jobb minőségű letöltve", @@ -691,11 +691,11 @@ "EditQualityProfile": "Minőségi profil szerkesztése", "EditRemotePathMapping": "Távoli útvonal-leképezés szerkesztése", "EditRootFolder": "Gyökérmappa hozzáadása", - "ErrorRestoringBackup": "Hiba a mentés visszaállítása közben", + "ErrorRestoringBackup": "Hiba a biztonsági mentés visszaállításakor", "Events": "Események", - "EventType": "Események Típusa", + "EventType": "Esemény típus", "Filters": "Szűrők", - "FreeSpace": "Szabad Tárhely", + "FreeSpace": "Szabad hely", "General": "Általános", "Genres": "Műfajok", "Grabbed": "Megragadta", @@ -766,7 +766,7 @@ "UpgradesAllowed": "Frissítések Engedélyezve", "Wanted": "Keresett", "Warn": "Figyelmeztetés", - "WouldYouLikeToRestoreBackup": "Szeretnéd visszaállítani a {0} biztonsági mentést?", + "WouldYouLikeToRestoreBackup": "Szeretné visszaállítani a(z) „{name}” biztonsági másolatot?", "WriteMetadataTags": "Írjon metaadat-címkéket", "Peers": "Peerek", "Ui": "Felület", @@ -832,7 +832,7 @@ "CustomFormatScore": "Egyéni formátum pontszáma", "MinimumCustomFormatScore": "Minimális egyéni formátum pontszám", "CloneCustomFormat": "Egyéni formátum klónozása", - "Conditions": "Körülmények", + "Conditions": "Állapot", "CopyToClipboard": "Másold a Vágólapra", "CouldntFindAnyResultsForTerm": "Nincsen találat a következőre: \"{0}\"", "CustomFormat": "Egyéni formátum", @@ -842,7 +842,7 @@ "Customformat": "Egyéni formátum", "CutoffFormatScoreHelpText": "Amint eléri ezt az egyéni minőséget, a {appName} többé nem fogja tovább keresni a filmet", "DeleteCustomFormat": "Egyéni formátum törlése", - "DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{0}' egyéni formátumot?", + "DeleteCustomFormatMessageText": "Biztosan törli a(z) „{name}” egyéni formátumot?", "DeleteFormatMessageText": "Biztosan törlöd a(z) {0} formátumú címkét?", "DownloadPropersAndRepacksHelpTextWarning": "Használjon egyéni formátumokat a Propers / Repacks automatikus frissítéséhez", "DownloadedUnableToImportCheckLogsForDetails": "Letölve - Nem lehet importálni: Ellenőrízze a naplókat a részletekért", @@ -933,8 +933,8 @@ "DownloadClientSortingCheckMessage": "A(z) {0} letöltési kliensben engedélyezve van a(z) {1} rendezés a {appName} kategóriájához. Az importálási problémák elkerülése érdekében le kell tiltania a rendezést a letöltési kliensben.", "ApplyChanges": "Változások alkalmazása", "AutomaticAdd": "Automatikus hozzáadás", - "CountIndexersSelected": "{0} Indexelő(k) kiválasztva", - "DeleteConditionMessageText": "Biztosan törölni akarod a '{0}' feltételt?", + "CountIndexersSelected": "{selectedCount} indexelő(k) kiválasztva", + "DeleteConditionMessageText": "Biztosan törli a(z) „{name}” feltételt?", "DeleteSelectedDownloadClients": "Letöltőkliens Törlése", "DeleteSelectedImportLists": "Importálási lista(k) törlése", "DeleteSelectedIndexers": "Indexelő(k) törlése", @@ -1044,7 +1044,7 @@ "BlocklistAndSearch": "Feketelista és Keresés", "BlocklistAndSearchHint": "Indítsa el a csere keresését a tiltólistázás után", "BlocklistMultipleOnlyHint": "Blokklista helyettesítők keresése nélkül", - "BlocklistOnly": "Csak blokkolólista", + "BlocklistOnly": "Csak blokklistára", "BlocklistOnlyHint": "Blokklista csere keresése nélkül", "ChangeCategory": "Kategória módosítása", "ChangeCategoryMultipleHint": "Módosítja a letöltéseket az „Importálás utáni kategóriára” a Download Clientből", @@ -1058,5 +1058,51 @@ "DoNotBlocklistHint": "Eltávolítás tiltólista nélkül", "AutoTaggingRequiredHelpText": "Ennek az {implementationName} feltételnek meg kell egyeznie az automatikus címkézési szabály érvényesítéséhez. Ellenkező esetben egyetlen {implementationName} egyezés elegendő.", "DeleteSpecification": "Specifikáció törlése", - "DeleteSpecificationHelpText": "Biztosan törli a(z) „{name}” specifikációt?" + "DeleteSpecificationHelpText": "Biztosan törli a(z) „{name}” specifikációt?", + "AlbumCount": "Album száma", + "ListWillRefreshEveryInterp": "A lista minden {0} napon frissül", + "Loading": "Betöltés", + "RemoveQueueItemRemovalMethod": "Eltávolítási módszer", + "RemoveQueueItemRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.", + "DeleteFormat": "Formátum Törlés", + "ListRefreshInterval": "Lista frissítési időköz", + "AddImportListExclusionArtistHelpText": "Az importálási listákkal megakadályozhatja, hogy előadót hozzáadjanak a {appName} alkalmazáshoz", + "AddImportListExclusionAlbumHelpText": "Megakadályozza, hogy az importálási listákkal album adható legyen a {appName} alkalmazáshoz", + "NoMissingItems": "Nincsenek hiányzó elemek", + "RemoveSelectedItemBlocklistMessageText": "Biztosan eltávolítja a kijelölt elemeket a tiltólistáról?", + "CountImportListsSelected": "{selectedCount} importálási lista kiválasztva", + "ResetQualityDefinitionsMessageText": "Biztosan vissza szeretné állítani a minőségi definíciókat?", + "HealthMessagesInfoBox": "Az állapotfelmérés okáról további információkat találhat, ha a sor végén található wikilinkre (könyv ikonra) kattint, vagy megnézi [logs] ({link}). Ha nehézségei vannak ezen üzenetek értelmezése során, forduljon ügyfélszolgálatunkhoz az alábbi linkeken.", + "RemoveMultipleFromDownloadClientHint": "Eltávolítja a letöltéseket és fájlokat a letöltési kliensből", + "ThereWasAnErrorLoadingThisPage": "Hiba történt az oldal betöltésekor", + "ThereWasAnErrorLoadingThisItem": "Hiba történt az elem betöltésekor", + "BypassIfAboveCustomFormatScoreHelpText": "Engedélyezze az áthidalást, ha a kiadás pontszáma magasabb, mint a konfigurált minimális egyéni formátum pontszám", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "A(z) {0} letöltési kliens a befejezett letöltések eltávolítására van beállítva. Ez azt eredményezheti, hogy a letöltések eltávolításra kerülnek az ügyfélprogramból, mielőtt {1} importálhatná őket.", + "ErrorLoadingContent": "Hiba történt a tartalom betöltésekor", + "NoCutoffUnmetItems": "Nincsenek teljesítetlen elemek levágása", + "CountDownloadClientsSelected": "{selectedCount} letöltési kliens kiválasztva", + "GeneralSettingsSummary": "Port, SSL, felhasználónév/jelszó, proxy, elemzések és frissítések", + "IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {0}.", + "AddNewAlbum": "Új album hozzáadása", + "AddNewArtist": "Új előadó hozzáadása", + "AddNewArtistRootFolderHelpText": "A „{folder}” almappa automatikusan létrejön", + "AddListExclusionHelpText": "Akadályozza meg, hogy a listák alapján előadókat adjanak hozzá a(z) {appName} alkalmazáshoz", + "AlbumDetails": "Az album részletei", + "AlbumStudioTruncated": "Csak a legújabb 20 album jelenik meg, az összes album megtekintéséhez lépjen a részletekre", + "ArtistIsMonitored": "A művészt figyelve", + "IgnoreDownload": "Letöltés figyelmen kívül hagyása", + "IgnoreDownloadHint": "Leállítja a(z) {appName} alkalmazásnak a letöltés további feldolgozását", + "IgnoreDownloads": "Letöltések figyelmen kívül hagyása", + "IgnoreDownloadsHint": "Leállítja a(z) {appName} alkalmazást, hogy feldolgozza ezeket a letöltéseket", + "AddNewAlbumSearchForNewAlbum": "Kezdje el az új album keresését", + "AddNewArtistSearchForMissingAlbums": "Kezdje el a hiányzó albumok keresését", + "AlbumsLoadError": "Nem sikerült betölteni az albumokat", + "DeleteSelected": "Kijelöltek eltávolítása", + "RemoveQueueItem": "Eltávolítás – {sourceTitle}", + "RemoveQueueItemConfirmation": "Biztosan eltávolítja a következőt a sorból: \"{sourceTitle}\"?", + "ArtistIndexFooterDownloading": "Letöltés", + "BypassIfAboveCustomFormatScore": "Kihagyás, ha az egyéni formátum pontszáma felett van", + "MinimumCustomFormatScoreHelpText": "Minimális egyéni formátum pontszám a preferált protokoll késleltetésének megkerüléséhez", + "RemoveFromDownloadClientHint": "Távolítsa el a letöltést és a fájlokat) a letöltési kliensből", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből." } From c7faf7cc25d94d0a1d3fa2c0b27d00afe7f775db Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 11 Feb 2024 19:29:42 -0600 Subject: [PATCH 032/491] Bump version to 2.2.0 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 579799208..643fb6b54 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.1.7' + majorVersion: '2.2.0' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From a4af75b60cdc531c2280d994a1ef1141bb7c830e Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 11 Feb 2024 20:51:28 -0600 Subject: [PATCH 033/491] New: Calendar filtering by tags Closes #3658 Closes #4211 Co-Authored-By: Mark McDowall --- frontend/src/App/State/AppState.ts | 2 + frontend/src/App/State/CalendarAppState.ts | 10 ++++ frontend/src/Calendar/CalendarFilterModal.tsx | 54 +++++++++++++++++ frontend/src/Calendar/CalendarPage.js | 6 +- .../src/Calendar/CalendarPageConnector.js | 4 ++ frontend/src/Store/Actions/calendarActions.js | 59 +++++++++++++++---- .../Calendar/CalendarController.cs | 40 ++++++++++++- 7 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 frontend/src/App/State/CalendarAppState.ts create mode 100644 frontend/src/Calendar/CalendarFilterModal.tsx diff --git a/frontend/src/App/State/AppState.ts b/frontend/src/App/State/AppState.ts index 04f7a609f..a8850b16f 100644 --- a/frontend/src/App/State/AppState.ts +++ b/frontend/src/App/State/AppState.ts @@ -1,5 +1,6 @@ import AlbumAppState from './AlbumAppState'; import ArtistAppState, { ArtistIndexAppState } from './ArtistAppState'; +import CalendarAppState from './CalendarAppState'; import HistoryAppState from './HistoryAppState'; import QueueAppState from './QueueAppState'; import SettingsAppState from './SettingsAppState'; @@ -52,6 +53,7 @@ interface AppState { app: AppSectionState; artist: ArtistAppState; artistIndex: ArtistIndexAppState; + calendar: CalendarAppState; history: HistoryAppState; queue: QueueAppState; settings: SettingsAppState; diff --git a/frontend/src/App/State/CalendarAppState.ts b/frontend/src/App/State/CalendarAppState.ts new file mode 100644 index 000000000..503d2c25b --- /dev/null +++ b/frontend/src/App/State/CalendarAppState.ts @@ -0,0 +1,10 @@ +import Album from 'Album/Album'; +import AppSectionState, { + AppSectionFilterState, +} from 'App/State/AppSectionState'; + +interface CalendarAppState + extends AppSectionState, + AppSectionFilterState {} + +export default CalendarAppState; diff --git a/frontend/src/Calendar/CalendarFilterModal.tsx b/frontend/src/Calendar/CalendarFilterModal.tsx new file mode 100644 index 000000000..e26b2928b --- /dev/null +++ b/frontend/src/Calendar/CalendarFilterModal.tsx @@ -0,0 +1,54 @@ +import React, { useCallback } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import FilterModal from 'Components/Filter/FilterModal'; +import { setCalendarFilter } from 'Store/Actions/calendarActions'; + +function createCalendarSelector() { + return createSelector( + (state: AppState) => state.calendar.items, + (calendar) => { + return calendar; + } + ); +} + +function createFilterBuilderPropsSelector() { + return createSelector( + (state: AppState) => state.calendar.filterBuilderProps, + (filterBuilderProps) => { + return filterBuilderProps; + } + ); +} + +interface CalendarFilterModalProps { + isOpen: boolean; +} + +export default function CalendarFilterModal(props: CalendarFilterModalProps) { + const sectionItems = useSelector(createCalendarSelector()); + const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); + const customFilterType = 'calendar'; + + const dispatch = useDispatch(); + + const dispatchSetFilter = useCallback( + (payload: unknown) => { + dispatch(setCalendarFilter(payload)); + }, + [dispatch] + ); + + return ( + + ); +} diff --git a/frontend/src/Calendar/CalendarPage.js b/frontend/src/Calendar/CalendarPage.js index 3a4603e82..bf7f46c10 100644 --- a/frontend/src/Calendar/CalendarPage.js +++ b/frontend/src/Calendar/CalendarPage.js @@ -14,6 +14,7 @@ import { align, icons } from 'Helpers/Props'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; import translate from 'Utilities/String/translate'; import CalendarConnector from './CalendarConnector'; +import CalendarFilterModal from './CalendarFilterModal'; import CalendarLinkModal from './iCal/CalendarLinkModal'; import LegendConnector from './Legend/LegendConnector'; import CalendarOptionsModal from './Options/CalendarOptionsModal'; @@ -78,6 +79,7 @@ class CalendarPage extends Component { const { selectedFilterKey, filters, + customFilters, hasArtist, artistError, artistIsFetching, @@ -137,7 +139,8 @@ class CalendarPage extends Component { isDisabled={!hasArtist} selectedFilterKey={selectedFilterKey} filters={filters} - customFilters={[]} + customFilters={customFilters} + filterModalConnectorComponent={CalendarFilterModal} onFilterSelect={onFilterSelect} /> @@ -204,6 +207,7 @@ class CalendarPage extends Component { CalendarPage.propTypes = { selectedFilterKey: PropTypes.string.isRequired, filters: PropTypes.arrayOf(PropTypes.object).isRequired, + customFilters: PropTypes.arrayOf(PropTypes.object).isRequired, hasArtist: PropTypes.bool.isRequired, artistError: PropTypes.object, artistIsFetching: PropTypes.bool.isRequired, diff --git a/frontend/src/Calendar/CalendarPageConnector.js b/frontend/src/Calendar/CalendarPageConnector.js index d0e7e87af..03ae0ad64 100644 --- a/frontend/src/Calendar/CalendarPageConnector.js +++ b/frontend/src/Calendar/CalendarPageConnector.js @@ -5,6 +5,7 @@ import * as commandNames from 'Commands/commandNames'; import withCurrentPage from 'Components/withCurrentPage'; import { searchMissing, setCalendarDaysCount, setCalendarFilter } from 'Store/Actions/calendarActions'; import { executeCommand } from 'Store/Actions/commandActions'; +import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import createArtistCountSelector from 'Store/Selectors/createArtistCountSelector'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import createCommandsSelector from 'Store/Selectors/createCommandsSelector'; @@ -59,6 +60,7 @@ function createMapStateToProps() { return createSelector( (state) => state.calendar.selectedFilterKey, (state) => state.calendar.filters, + createCustomFiltersSelector('calendar'), createArtistCountSelector(), createUISettingsSelector(), createMissingAlbumIdsSelector(), @@ -67,6 +69,7 @@ function createMapStateToProps() { ( selectedFilterKey, filters, + customFilters, artistCount, uiSettings, missingAlbumIds, @@ -76,6 +79,7 @@ function createMapStateToProps() { return { selectedFilterKey, filters, + customFilters, colorImpairedMode: uiSettings.enableColorImpairedMode, hasArtist: !!artistCount.count, artistError: artistCount.error, diff --git a/frontend/src/Store/Actions/calendarActions.js b/frontend/src/Store/Actions/calendarActions.js index d473f1368..e13ff4672 100644 --- a/frontend/src/Store/Actions/calendarActions.js +++ b/frontend/src/Store/Actions/calendarActions.js @@ -4,9 +4,10 @@ import { createAction } from 'redux-actions'; import { batchActions } from 'redux-batched-actions'; import * as calendarViews from 'Calendar/calendarViews'; import * as commandNames from 'Commands/commandNames'; -import { filterTypes } from 'Helpers/Props'; +import { filterBuilderTypes, filterBuilderValueTypes, filterTypes } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; +import findSelectedFilters from 'Utilities/Filter/findSelectedFilters'; import translate from 'Utilities/String/translate'; import { set, update } from './baseActions'; import { executeCommandHelper } from './commandActions'; @@ -54,8 +55,8 @@ export const defaultState = { label: () => translate('All'), filters: [ { - key: 'monitored', - value: false, + key: 'unmonitored', + value: [true], type: filterTypes.EQUAL } ] @@ -65,19 +66,35 @@ export const defaultState = { label: () => translate('MonitoredOnly'), filters: [ { - key: 'monitored', - value: true, + key: 'unmonitored', + value: [false], type: filterTypes.EQUAL } ] } + ], + + filterBuilderProps: [ + { + name: 'unmonitored', + label: () => translate('IncludeUnmonitored'), + type: filterBuilderTypes.EQUAL, + valueType: filterBuilderValueTypes.BOOL + }, + { + name: 'tags', + label: () => translate('Tags'), + type: filterBuilderTypes.CONTAINS, + valueType: filterBuilderValueTypes.TAG + } ] }; export const persistState = [ 'calendar.view', 'calendar.selectedFilterKey', - 'calendar.options' + 'calendar.options', + 'calendar.customFilters' ]; // @@ -189,6 +206,10 @@ function isRangePopulated(start, end, state) { return false; } +function getCustomFilters(state, type) { + return state.customFilters.items.filter((customFilter) => customFilter.type === type); +} + // // Action Creators @@ -210,7 +231,8 @@ export const actionHandlers = handleThunks({ [FETCH_CALENDAR]: function(getState, payload, dispatch) { const state = getState(); const calendar = state.calendar; - const unmonitored = calendar.selectedFilterKey === 'all'; + const customFilters = getCustomFilters(state, section); + const selectedFilters = findSelectedFilters(calendar.selectedFilterKey, calendar.filters, customFilters); const { time = calendar.time, @@ -237,13 +259,26 @@ export const actionHandlers = handleThunks({ dispatch(set(attrs)); + const requestParams = { + start, + end + }; + + selectedFilters.forEach((selectedFilter) => { + if (selectedFilter.key === 'unmonitored') { + requestParams.unmonitored = selectedFilter.value.includes(true); + } + + if (selectedFilter.key === 'tags') { + requestParams.tags = selectedFilter.value.join(','); + } + }); + + requestParams.unmonitored = requestParams.unmonitored ?? false; + const promise = createAjaxRequest({ url: '/calendar', - data: { - unmonitored, - start, - end - } + data: requestParams }).request; promise.done((data) => { diff --git a/src/Lidarr.Api.V1/Calendar/CalendarController.cs b/src/Lidarr.Api.V1/Calendar/CalendarController.cs index d499607be..ee88c5285 100644 --- a/src/Lidarr.Api.V1/Calendar/CalendarController.cs +++ b/src/Lidarr.Api.V1/Calendar/CalendarController.cs @@ -5,10 +5,12 @@ using Lidarr.Api.V1.Albums; using Lidarr.Http; using Lidarr.Http.Extensions; using Microsoft.AspNetCore.Mvc; +using NzbDrone.Common.Extensions; using NzbDrone.Core.ArtistStats; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.MediaCover; using NzbDrone.Core.Music; +using NzbDrone.Core.Tags; using NzbDrone.SignalR; namespace Lidarr.Api.V1.Calendar @@ -16,25 +18,59 @@ namespace Lidarr.Api.V1.Calendar [V1ApiController] public class CalendarController : AlbumControllerWithSignalR { + private readonly IArtistService _artistService; + private readonly ITagService _tagService; + public CalendarController(IAlbumService albumService, + IArtistService artistService, IArtistStatisticsService artistStatisticsService, IMapCoversToLocal coverMapper, IUpgradableSpecification upgradableSpecification, + ITagService tagService, IBroadcastSignalRMessage signalRBroadcaster) : base(albumService, artistStatisticsService, coverMapper, upgradableSpecification, signalRBroadcaster) { + _artistService = artistService; + _tagService = tagService; } [HttpGet] - public List GetCalendar(DateTime? start, DateTime? end, bool unmonitored = false, bool includeArtist = false) + [Produces("application/json")] + public List GetCalendar(DateTime? start, DateTime? end, bool unmonitored = false, bool includeArtist = false, string tags = "") { // TODO: Add Album Image support to AlbumControllerWithSignalR var includeAlbumImages = Request.GetBooleanQueryParameter("includeAlbumImages"); var startUse = start ?? DateTime.Today; var endUse = end ?? DateTime.Today.AddDays(2); + var albums = _albumService.AlbumsBetweenDates(startUse, endUse, unmonitored); + var allArtists = _artistService.GetAllArtists(); + var parsedTags = new List(); + var result = new List(); - var resources = MapToResource(_albumService.AlbumsBetweenDates(startUse, endUse, unmonitored), includeArtist); + if (tags.IsNotNullOrWhiteSpace()) + { + parsedTags.AddRange(tags.Split(',').Select(_tagService.GetTag).Select(t => t.Id)); + } + + foreach (var album in albums) + { + var artist = allArtists.SingleOrDefault(s => s.Id == album.ArtistId); + + if (artist == null) + { + continue; + } + + if (parsedTags.Any() && parsedTags.None(artist.Tags.Contains)) + { + continue; + } + + result.Add(album); + } + + var resources = MapToResource(result, includeArtist); return resources.OrderBy(e => e.ReleaseDate).ToList(); } From f13b095040f10776dbc2cab77c39cc5d3f9407ec Mon Sep 17 00:00:00 2001 From: Servarr Date: Mon, 12 Feb 2024 02:57:48 +0000 Subject: [PATCH 034/491] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index 05700cd97..c798949f3 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -1136,20 +1136,20 @@ "type": "boolean", "default": false } + }, + { + "name": "tags", + "in": "query", + "schema": { + "type": "string", + "default": "" + } } ], "responses": { "200": { "description": "Success", "content": { - "text/plain": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AlbumResource" - } - } - }, "application/json": { "schema": { "type": "array", @@ -1157,14 +1157,6 @@ "$ref": "#/components/schemas/AlbumResource" } } - }, - "text/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AlbumResource" - } - } } } } From 8b85d4c941e5fc3b1fc8f0f3c6be83658e58c942 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 11 Feb 2024 21:30:31 -0600 Subject: [PATCH 035/491] Translate Frontend Utilities Closes #4096 Co-Authored-By: Stevie Robinson --- .../Artist/monitorNewItemsOptions.js | 6 +-- .../src/Utilities/Artist/monitorOptions.js | 51 ++++++++++++++++--- frontend/src/Utilities/Date/formatDateTime.js | 12 +++-- .../src/Utilities/Date/formatShortTimeSpan.js | 7 +-- frontend/src/Utilities/Date/formatTimeSpan.js | 3 +- .../src/Utilities/Date/getRelativeDate.js | 7 +-- frontend/src/Utilities/Number/formatAge.js | 8 +-- src/NzbDrone.Core/Localization/Core/en.json | 29 +++++++++-- 8 files changed, 96 insertions(+), 27 deletions(-) diff --git a/frontend/src/Utilities/Artist/monitorNewItemsOptions.js b/frontend/src/Utilities/Artist/monitorNewItemsOptions.js index 2f352be3a..f45095b6e 100644 --- a/frontend/src/Utilities/Artist/monitorNewItemsOptions.js +++ b/frontend/src/Utilities/Artist/monitorNewItemsOptions.js @@ -4,19 +4,19 @@ const monitorNewItemsOptions = [ { key: 'all', get value() { - return translate('AllAlbums'); + return translate('MonitorAllAlbums'); } }, { key: 'none', get value() { - return translate('None'); + return translate('MonitorNoNewAlbums'); } }, { key: 'new', get value() { - return translate('New'); + return translate('MonitorNewAlbums'); } } ]; diff --git a/frontend/src/Utilities/Artist/monitorOptions.js b/frontend/src/Utilities/Artist/monitorOptions.js index b5e942ae6..a06a79a96 100644 --- a/frontend/src/Utilities/Artist/monitorOptions.js +++ b/frontend/src/Utilities/Artist/monitorOptions.js @@ -1,11 +1,48 @@ +import translate from 'Utilities/String/translate'; + const monitorOptions = [ - { key: 'all', value: 'All Albums' }, - { key: 'future', value: 'Future Albums' }, - { key: 'missing', value: 'Missing Albums' }, - { key: 'existing', value: 'Existing Albums' }, - { key: 'first', value: 'Only First Album' }, - { key: 'latest', value: 'Only Latest Album' }, - { key: 'none', value: 'None' } + { + key: 'all', + get value() { + return translate('MonitorAllAlbums'); + } + }, + { + key: 'future', + get value() { + return translate('MonitorFutureAlbums'); + } + }, + { + key: 'missing', + get value() { + return translate('MonitorMissingAlbums'); + } + }, + { + key: 'existing', + get value() { + return translate('MonitorExistingAlbums'); + } + }, + { + key: 'first', + get value() { + return translate('MonitorFirstAlbum'); + } + }, + { + key: 'latest', + get value() { + return translate('MonitorLastestAlbum'); + } + }, + { + key: 'none', + get value() { + return translate('MonitorNoAlbums'); + } + } ]; export default monitorOptions; diff --git a/frontend/src/Utilities/Date/formatDateTime.js b/frontend/src/Utilities/Date/formatDateTime.js index f36f4f3e0..fb50230e1 100644 --- a/frontend/src/Utilities/Date/formatDateTime.js +++ b/frontend/src/Utilities/Date/formatDateTime.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import translate from 'Utilities/String/translate'; import formatTime from './formatTime'; import isToday from './isToday'; import isTomorrow from './isTomorrow'; @@ -10,15 +11,15 @@ function getRelativeDay(date, includeRelativeDate) { } if (isYesterday(date)) { - return 'Yesterday, '; + return translate('Yesterday'); } if (isToday(date)) { - return 'Today, '; + return translate('Today'); } if (isTomorrow(date)) { - return 'Tomorrow, '; + return translate('Tomorrow'); } return ''; @@ -33,7 +34,10 @@ function formatDateTime(date, dateFormat, timeFormat, { includeSeconds = false, const formattedDate = moment(date).format(dateFormat); const formattedTime = formatTime(date, timeFormat, { includeMinuteZero: true, includeSeconds }); - return `${relativeDay}${formattedDate} ${formattedTime}`; + if (relativeDay) { + return translate('FormatDateTimeRelative', { relativeDay, formattedDate, formattedTime }); + } + return translate('FormatDateTime', { formattedDate, formattedTime }); } export default formatDateTime; diff --git a/frontend/src/Utilities/Date/formatShortTimeSpan.js b/frontend/src/Utilities/Date/formatShortTimeSpan.js index c14251e68..148dc2627 100644 --- a/frontend/src/Utilities/Date/formatShortTimeSpan.js +++ b/frontend/src/Utilities/Date/formatShortTimeSpan.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import translate from 'Utilities/String/translate'; function formatShortTimeSpan(timeSpan) { if (!timeSpan) { @@ -12,14 +13,14 @@ function formatShortTimeSpan(timeSpan) { const seconds = Math.floor(duration.asSeconds()); if (hours > 0) { - return `${hours} hour(s)`; + return translate('FormatShortTimeSpanHours', { hours }); } if (minutes > 0) { - return `${minutes} minute(s)`; + return translate('FormatShortTimeSpanMinutes', { minutes }); } - return `${seconds} second(s)`; + return translate('FormatShortTimeSpanSeconds', { seconds }); } export default formatShortTimeSpan; diff --git a/frontend/src/Utilities/Date/formatTimeSpan.js b/frontend/src/Utilities/Date/formatTimeSpan.js index 1ebe6b9e3..2422e19d5 100644 --- a/frontend/src/Utilities/Date/formatTimeSpan.js +++ b/frontend/src/Utilities/Date/formatTimeSpan.js @@ -1,5 +1,6 @@ import moment from 'moment'; import padNumber from 'Utilities/Number/padNumber'; +import translate from 'Utilities/String/translate'; function formatTimeSpan(timeSpan) { if (!timeSpan) { @@ -16,7 +17,7 @@ function formatTimeSpan(timeSpan) { const time = `${hours}:${minutes}:${seconds}`; if (days > 0) { - return `${days}d ${time}`; + return translate('FormatTimeSpanDays', { days, time }); } return time; diff --git a/frontend/src/Utilities/Date/getRelativeDate.js b/frontend/src/Utilities/Date/getRelativeDate.js index 0a60135ce..812064272 100644 --- a/frontend/src/Utilities/Date/getRelativeDate.js +++ b/frontend/src/Utilities/Date/getRelativeDate.js @@ -4,6 +4,7 @@ import isInNextWeek from 'Utilities/Date/isInNextWeek'; import isToday from 'Utilities/Date/isToday'; import isTomorrow from 'Utilities/Date/isTomorrow'; import isYesterday from 'Utilities/Date/isYesterday'; +import translate from 'Utilities/String/translate'; function getRelativeDate(date, shortDateFormat, showRelativeDates, { timeFormat, includeSeconds = false, timeForToday = false } = {}) { if (!date) { @@ -21,15 +22,15 @@ function getRelativeDate(date, shortDateFormat, showRelativeDates, { timeFormat, } if (isYesterday(date)) { - return 'Yesterday'; + return translate('Yesterday'); } if (isTodayDate) { - return 'Today'; + return translate('Today'); } if (isTomorrow(date)) { - return 'Tomorrow'; + return translate('Tomorrow'); } if (isInNextWeek(date)) { diff --git a/frontend/src/Utilities/Number/formatAge.js b/frontend/src/Utilities/Number/formatAge.js index b8a4aacc5..a8f0e9f65 100644 --- a/frontend/src/Utilities/Number/formatAge.js +++ b/frontend/src/Utilities/Number/formatAge.js @@ -1,3 +1,5 @@ +import translate from 'Utilities/String/translate'; + function formatAge(age, ageHours, ageMinutes) { age = Math.round(age); ageHours = parseFloat(ageHours); @@ -5,13 +7,13 @@ function formatAge(age, ageHours, ageMinutes) { if (age < 2 && ageHours) { if (ageHours < 2 && !!ageMinutes) { - return `${ageMinutes.toFixed(0)} ${ageHours === 1 ? 'minute' : 'minutes'}`; + return `${ageMinutes.toFixed(0)} ${ageHours === 1 ? translate('FormatAgeMinute') : translate('FormatAgeMinutes')}`; } - return `${ageHours.toFixed(1)} ${ageHours === 1 ? 'hour' : 'hours'}`; + return `${ageHours.toFixed(1)} ${ageHours === 1 ? translate('FormatAgeHour') : translate('FormatAgeHours')}`; } - return `${age} ${age === 1 ? 'day' : 'days'}`; + return `${age} ${age === 1 ? translate('FormatAgeDay') : translate('FormatAgeDays')}`; } export default formatAge; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 4b5f966c9..520837a8f 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -476,6 +476,20 @@ "ForNewImportsOnly": "For new imports only", "ForeignId": "Foreign Id", "ForeignIdHelpText": "The Musicbrainz Id of the artist/album to exclude", + "FormatAgeDay": "day", + "FormatAgeDays": "days", + "FormatAgeHour": "hour", + "FormatAgeHours": "hours", + "FormatAgeMinute": "minute", + "FormatAgeMinutes": "minutes", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}h", + "FormatRuntimeMinutes": "{minutes}m", + "FormatShortTimeSpanHours": "{hours} hour(s)", + "FormatShortTimeSpanMinutes": "{minutes} minute(s)", + "FormatShortTimeSpanSeconds": "{seconds} second(s)", + "FormatTimeSpanDays": "{days}d {time}", "Formats": "Formats", "FreeSpace": "Free Space", "FutureAlbums": "Future Albums", @@ -680,12 +694,19 @@ "Monitor": "Monitor", "MonitorAlbum": "Monitor Album", "MonitorAlbumExistingOnlyWarning": "This is a one off adjustment of the monitored setting for each album. Use the option under Artist/Edit to control what happens for newly added albums", + "MonitorAllAlbums": "All Albums", "MonitorArtist": "Monitor Artist", "MonitorArtists": "Monitor Artists", - "MonitorExistingAlbums": "Monitor Existing Albums", - "MonitorNewAlbums": "Monitor New Albums", + "MonitorExistingAlbums": "Existing Albums", + "MonitorFirstAlbum": "First Album", + "MonitorFutureAlbums": "Future Albums", + "MonitorLastestAlbum": "Lastest Album", + "MonitorMissingAlbums": "Missing Albums", + "MonitorNewAlbums": "New Albums", "MonitorNewItems": "Monitor New Albums", "MonitorNewItemsHelpText": "Which new albums should be monitored", + "MonitorNoAlbums": "None", + "MonitorNoNewAlbums": "No New Albums", "Monitored": "Monitored", "MonitoredHelpText": "Download monitored albums from this artist", "MonitoredOnly": "Monitored Only", @@ -1099,6 +1120,7 @@ "TimeFormat": "Time Format", "TimeLeft": "Time Left", "Title": "Title", + "Tomorrow": "Tomorrow", "TorrentDelay": "Torrent Delay", "TorrentDelayHelpText": "Delay in minutes to wait before grabbing a torrent", "Torrents": "Torrents", @@ -1220,5 +1242,6 @@ "WriteMetadataToAudioFiles": "Write Metadata to Audio Files", "Year": "Year", "Yes": "Yes", - "YesCancel": "Yes, Cancel" + "YesCancel": "Yes, Cancel", + "Yesterday": "Yesterday" } From 616b529c9a99c43fd41cba1e9fedadc420c9d422 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 11 Feb 2024 21:31:38 -0600 Subject: [PATCH 036/491] Fix CalendarPageConnector import sort --- frontend/src/Calendar/CalendarPageConnector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Calendar/CalendarPageConnector.js b/frontend/src/Calendar/CalendarPageConnector.js index 03ae0ad64..4221c0339 100644 --- a/frontend/src/Calendar/CalendarPageConnector.js +++ b/frontend/src/Calendar/CalendarPageConnector.js @@ -5,8 +5,8 @@ import * as commandNames from 'Commands/commandNames'; import withCurrentPage from 'Components/withCurrentPage'; import { searchMissing, setCalendarDaysCount, setCalendarFilter } from 'Store/Actions/calendarActions'; import { executeCommand } from 'Store/Actions/commandActions'; -import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import createArtistCountSelector from 'Store/Selectors/createArtistCountSelector'; +import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import createCommandsSelector from 'Store/Selectors/createCommandsSelector'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; From 27723eb3ea212765b95f4d1e42ab9f22312867a6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 12 Feb 2024 22:11:25 +0200 Subject: [PATCH 037/491] Revert "New: Preserve replaygain tags" This reverts commit 2a8c67badcb10d2d74480167a9d7f5e8fee1a635. --- .../MediaFiles/AudioTagServiceFixture.cs | 34 +------------------ .../MediaFiles/AudioTagService.cs | 16 --------- 2 files changed, 1 insertion(+), 49 deletions(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs index 6a0520803..27cea2a0b 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs @@ -330,7 +330,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture [Test] public void should_ignore_non_parsable_id3v23_date() { - GivenFileCopy("nin.mp3"); + GivenFileCopy("nin.mp2"); using (var file = TagLib.File.Create(_copiedFile)) { @@ -444,37 +444,5 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Once()); } - - [TestCase("nin.mp3")] - public void should_ignore_replaygain_tags_during_scrub(string filename) - { - Mocker.GetMock() - .Setup(x => x.ScrubAudioTags) - .Returns(true); - - GivenFileCopy(filename); - - using (var preFile = TagLib.File.Create(_copiedFile)) - { - preFile.Tag.ReplayGainAlbumPeak = 1; - preFile.Tag.ReplayGainAlbumGain = 500; - preFile.Tag.ReplayGainTrackPeak = 2; - preFile.Tag.ReplayGainTrackGain = 250; - preFile.Save(); - } - - var file = GivenPopulatedTrackfile(0); - - file.Path = _copiedFile; - Subject.WriteTags(file, false, true); - - using (var postFile = TagLib.File.Create(_copiedFile)) - { - postFile.Tag.ReplayGainAlbumGain.Should().Be(500); - postFile.Tag.ReplayGainAlbumPeak.Should().Be(1); - postFile.Tag.ReplayGainTrackGain.Should().Be(250); - postFile.Tag.ReplayGainTrackPeak.Should().Be(2); - } - } } } diff --git a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs index 0263372dc..8b4dae447 100644 --- a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs +++ b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs @@ -155,24 +155,8 @@ namespace NzbDrone.Core.MediaFiles try { file = TagLib.File.Create(path); - - var replayGainAlbumGain = file.Tag.ReplayGainAlbumGain; - var replayGainAlbumPeak = file.Tag.ReplayGainAlbumPeak; - var replayGainTrackGain = file.Tag.ReplayGainTrackGain; - var replayGainTrackPeak = file.Tag.ReplayGainTrackPeak; - file.RemoveTags(TagLib.TagTypes.AllTags); file.Save(); - file.Dispose(); - - file = TagLib.File.Create(path); - - file.Tag.ReplayGainAlbumGain = replayGainAlbumGain; - file.Tag.ReplayGainAlbumPeak = replayGainAlbumPeak; - file.Tag.ReplayGainTrackGain = replayGainTrackGain; - file.Tag.ReplayGainTrackPeak = replayGainTrackPeak; - - file.Save(); } catch (CorruptFileException ex) { From 479e8cce2050bbead6a681e728fc14215bb8de97 Mon Sep 17 00:00:00 2001 From: abcasada <40399292+abcasada@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:07:41 -0600 Subject: [PATCH 038/491] Hints for week column and short dates in UI settings (cherry picked from commit 4558f552820b52bb1f9cd97fdabe03654ce9924a) (cherry picked from commit f1d343218cdbd5a63abeb2eb97bba1105dc8035d) --- frontend/src/Settings/UI/UISettings.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index c8135e17f..cc27829df 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -22,19 +22,19 @@ export const firstDayOfWeekOptions = [ ]; export const weekColumnOptions = [ - { key: 'ddd M/D', value: 'Tue 3/25' }, - { key: 'ddd MM/DD', value: 'Tue 03/25' }, - { key: 'ddd D/M', value: 'Tue 25/3' }, - { key: 'ddd DD/MM', value: 'Tue 25/03' } + { key: 'ddd M/D', value: 'Tue 3/25', hint: 'ddd M/D' }, + { key: 'ddd MM/DD', value: 'Tue 03/25', hint: 'ddd MM/DD' }, + { key: 'ddd D/M', value: 'Tue 25/3', hint: 'ddd D/M' }, + { key: 'ddd DD/MM', value: 'Tue 25/03', hint: 'ddd DD/MM' } ]; const shortDateFormatOptions = [ - { key: 'MMM D YYYY', value: 'Mar 25 2014' }, - { key: 'DD MMM YYYY', value: '25 Mar 2014' }, - { key: 'MM/D/YYYY', value: '03/25/2014' }, - { key: 'MM/DD/YYYY', value: '03/25/2014' }, - { key: 'DD/MM/YYYY', value: '25/03/2014' }, - { key: 'YYYY-MM-DD', value: '2014-03-25' } + { key: 'MMM D YYYY', value: 'Mar 25 2014', hint: 'MMM D YYYY' }, + { key: 'DD MMM YYYY', value: '25 Mar 2014', hint: 'DD MMM YYYY' }, + { key: 'MM/D/YYYY', value: '03/25/2014', hint: 'MM/D/YYYY' }, + { key: 'MM/DD/YYYY', value: '03/25/2014', hint: 'MM/DD/YYYY' }, + { key: 'DD/MM/YYYY', value: '25/03/2014', hint: 'DD/MM/YYYY' }, + { key: 'YYYY-MM-DD', value: '2014-03-25', hint: 'YYYY-MM-DD' } ]; const longDateFormatOptions = [ From 0431b257e1f7707b178f104fad5291fe619b52c5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 10:05:01 +0200 Subject: [PATCH 039/491] Show download client ID as hint in select options (cherry picked from commit c0b17d9345367ab6500b7cca6bb70c1e3b930284) --- .../src/Components/Form/DownloadClientSelectInputConnector.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/DownloadClientSelectInputConnector.js b/frontend/src/Components/Form/DownloadClientSelectInputConnector.js index c89016869..172b86752 100644 --- a/frontend/src/Components/Form/DownloadClientSelectInputConnector.js +++ b/frontend/src/Components/Form/DownloadClientSelectInputConnector.js @@ -25,7 +25,8 @@ function createMapStateToProps() { const values = _.map(filteredItems.sort(sortByName), (downloadClient) => { return { key: downloadClient.id, - value: downloadClient.name + value: downloadClient.name, + hint: `(${downloadClient.id})` }; }); From e7ae0b9e22605c6f661163a01ccbbfb0999385df Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 23:20:25 +0200 Subject: [PATCH 040/491] Fixed: Refresh tags state to clear removed tags by housekeeping (cherry picked from commit 2510f44c25bee6fede27d9fa2b9614176d12cb55) (cherry picked from commit ed27bcf213bdbc5cede650f89eb65593dc9631b4) --- frontend/src/Settings/Tags/TagsConnector.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/Settings/Tags/TagsConnector.js b/frontend/src/Settings/Tags/TagsConnector.js index 770dc4720..9f8bdee5b 100644 --- a/frontend/src/Settings/Tags/TagsConnector.js +++ b/frontend/src/Settings/Tags/TagsConnector.js @@ -3,7 +3,7 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { fetchDelayProfiles, fetchDownloadClients, fetchImportLists, fetchIndexers, fetchNotifications, fetchReleaseProfiles } from 'Store/Actions/settingsActions'; -import { fetchTagDetails } from 'Store/Actions/tagActions'; +import { fetchTagDetails, fetchTags } from 'Store/Actions/tagActions'; import Tags from './Tags'; function createMapStateToProps() { @@ -25,6 +25,7 @@ function createMapStateToProps() { } const mapDispatchToProps = { + dispatchFetchTags: fetchTags, dispatchFetchTagDetails: fetchTagDetails, dispatchFetchDelayProfiles: fetchDelayProfiles, dispatchFetchImportLists: fetchImportLists, @@ -41,6 +42,7 @@ class MetadatasConnector extends Component { componentDidMount() { const { + dispatchFetchTags, dispatchFetchTagDetails, dispatchFetchDelayProfiles, dispatchFetchImportLists, @@ -50,6 +52,7 @@ class MetadatasConnector extends Component { dispatchFetchDownloadClients } = this.props; + dispatchFetchTags(); dispatchFetchTagDetails(); dispatchFetchDelayProfiles(); dispatchFetchImportLists(); @@ -72,6 +75,7 @@ class MetadatasConnector extends Component { } MetadatasConnector.propTypes = { + dispatchFetchTags: PropTypes.func.isRequired, dispatchFetchTagDetails: PropTypes.func.isRequired, dispatchFetchDelayProfiles: PropTypes.func.isRequired, dispatchFetchImportLists: PropTypes.func.isRequired, From b2f595436bed03ad86ddb79d109ac3f5c1c41a9b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 7 Feb 2024 09:46:10 +0200 Subject: [PATCH 041/491] Improve messaging on indexer specified download client is not available (cherry picked from commit 84e657482d37eed35f09c6dab3c2b8b5ebd5bac4) --- src/NzbDrone.Core/Download/DownloadClientProvider.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Core/Download/DownloadClientProvider.cs b/src/NzbDrone.Core/Download/DownloadClientProvider.cs index 8e8bcf8be..769928f2f 100644 --- a/src/NzbDrone.Core/Download/DownloadClientProvider.cs +++ b/src/NzbDrone.Core/Download/DownloadClientProvider.cs @@ -59,13 +59,18 @@ namespace NzbDrone.Core.Download { var indexer = _indexerFactory.Find(indexerId); - if (indexer != null && indexer.DownloadClientId > 0) + if (indexer is { DownloadClientId: > 0 }) { var client = availableProviders.SingleOrDefault(d => d.Definition.Id == indexer.DownloadClientId); - if (client == null || (filterBlockedClients && blockedProviders.Contains(client.Definition.Id))) + if (client == null) { - throw new DownloadClientUnavailableException($"Indexer specified download client is not available"); + throw new DownloadClientUnavailableException($"Indexer specified download client does not exist for {indexer.Name}"); + } + + if (filterBlockedClients && blockedProviders.Contains(client.Definition.Id)) + { + throw new DownloadClientUnavailableException($"Indexer specified download client is not available due to recent failures for {indexer.Name}"); } return client; From 4abca0c896aee6101e1e6b42516310193f2cd170 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 16 Feb 2024 16:52:04 +0200 Subject: [PATCH 042/491] Fixed: Don't die on album deleted notifications with the artist already removed --- src/NzbDrone.Core/Music/Services/AlbumService.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Music/Services/AlbumService.cs b/src/NzbDrone.Core/Music/Services/AlbumService.cs index 91f3fd37c..69b1794d3 100644 --- a/src/NzbDrone.Core/Music/Services/AlbumService.cs +++ b/src/NzbDrone.Core/Music/Services/AlbumService.cs @@ -310,7 +310,14 @@ namespace NzbDrone.Core.Music public void Handle(ArtistsDeletedEvent message) { // TODO Do this in one call instead of one for each artist? - var albums = message.Artists.SelectMany(x => GetAlbumsByArtistMetadataId(x.ArtistMetadataId)).ToList(); + var albums = message.Artists.SelectMany(artist => + { + var artistAlbums = GetAlbumsByArtistMetadataId(artist.ArtistMetadataId); + artistAlbums.ForEach(a => a.Artist = artist); + + return artistAlbums; + }).ToList(); + DeleteMany(albums); } } From 30fc3fc70af8619891cb134464566999fc96e855 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 16 Feb 2024 14:52:44 +0000 Subject: [PATCH 043/491] 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: Anonymous Co-authored-by: Chaoshuai Lü Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/es.json | 55 ++++- src/NzbDrone.Core/Localization/Core/hu.json | 6 +- src/NzbDrone.Core/Localization/Core/it.json | 21 +- .../Localization/Core/pt_BR.json | 35 ++- .../Localization/Core/zh_CN.json | 215 +++++++++++------- 5 files changed, 234 insertions(+), 98 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index a444779c0..a4ea18f86 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -60,15 +60,15 @@ "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "El registro de seguimiento sólo debe activarse temporalmente", "LongDateFormat": "Formato de Fecha Larga", "MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle", - "ManualImport": "Importar Manualmente", - "MarkAsFailed": "Marcar como Fallida", + "ManualImport": "Importación manual", + "MarkAsFailed": "Marcar como Fallido", "MarkAsFailedMessageText": "Seguro que quieres marcar '{0}' como fallida?", - "MaximumLimits": "Límites Máximos", - "MaximumSize": "Tamaño Máximo", + "MaximumLimits": "Límites máximos", + "MaximumSize": "Tamaño máximo", "MaximumSizeHelpText": "Tamaño máximo de un lanzamiento para ser importado en MB. Ajustar a cero para ilimitado", "Mechanism": "Mecanismo", - "MediaInfo": "Información Multimedia", - "MetadataSettings": "Ajustes de Metadatos", + "MediaInfo": "Información de medios", + "MetadataSettings": "Opciones de metadatos", "MinimumAgeHelpText": "Sólo Usenet: Edad mínima en minutos de los NZB para ser descargados. Usa esto para dar a los nuevos lanzamientos tiempo de propagarse en tu proveedor de usenet.", "MinimumFreeSpace": "Espacio Libre Mínimo", "MinimumFreeSpaceWhenImportingHelpText": "Evitar importación si dejase menos de esta cantidad en disco disponible", @@ -400,8 +400,8 @@ "Level": "Nivel", "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Raddar soporta cualquier gestor de descargas que utilice el estandar Newznab, como también los clientes indicados debajo.", "Logs": "Registros", - "MediaManagementSettings": "Ajustes Multimedia", - "Medium": "Medio", + "MediaManagementSettings": "Opciones de gestión de medios", + "Medium": "Mediano", "Message": "Mensaje", "MIA": "MIA", "MinimumAge": "Edad Mínima", @@ -517,7 +517,7 @@ "LastExecution": "Última Ejecución", "LastWriteTime": "Última Fecha de Escritura", "Library": "Biblioteca", - "MediaManagement": "Multimedia", + "MediaManagement": "Gestión de medios", "Metadata": "Metadatos", "MonitoredOnly": "Monitoreadas Solamente", "Never": "Nunca", @@ -962,5 +962,40 @@ "Links": "Enlaces", "Logout": "Cerrar Sesión", "Lowercase": "Minúscula", - "IndexersSettingsSummary": "Indexadores y opciones de indexación" + "IndexersSettingsSummary": "Indexadores y opciones de indexación", + "Dash": "Guión", + "DefaultCase": "Caso predeterminado", + "DeleteEmptyFoldersHelpText": "Eliminar carpetas vacías de series y temporadas durante el escaneo del disco y cuando se eliminen archivos correspondientes a episodios", + "DeleteSelectedArtists": "Borrar artista seleccionado", + "EnableAutomaticAddHelpText": "Añade series de esta lista a {appName} cuando las sincronizaciones se llevan a cabo vía interfaz de usuario o por {appName}", + "FileNameTokens": "Tokens de nombre de archivos", + "RemoveQueueItemConfirmation": "¿Estás seguro de que quieres eliminar {0} elementos de la cola?", + "SearchForAllCutoffUnmetAlbums": "Buscar todos los episodios en Umbrales no alcanzados", + "Underscore": "Guion bajo", + "Uppercase": "Mayúsculas", + "QualityProfileIdHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con", + "ThereWasAnErrorLoadingThisPage": "Hubo un error cargando esta página", + "NoMissingItems": "No hay elementos faltantes", + "ThereWasAnErrorLoadingThisItem": "Hubo un error cargando este elemento", + "SearchForAllCutoffUnmetAlbumsConfirmationCount": "¿Estás seguro que quieres buscar los {totalRecords} episodios en Umbrales no alcanzados?", + "MonitoredStatus": "Monitoreado / Estado", + "RootFolderPathHelpText": "Los elementos de la lista de carpetas raíz se añadirán a", + "ConnectSettingsSummary": "Notificaciones, conexiones a servidores/reproductores y scripts personalizados", + "CustomFormatsSettings": "Configuración de formatos personalizados", + "CustomFormatsSettingsSummary": "Formatos y configuraciones personalizados", + "DownloadClientsSettingsSummary": "Clientes de descarga, manejo de descarga y mapeo de rutas remotas", + "EnabledHelpText": "Señalar para habilitar el perfil de lanzamiento", + "GeneralSettingsSummary": "Puerto, SSL, usuario/contraseña, proxy, analíticas y actualizaciones", + "ImportListsSettingsSummary": "Listas de importación, excluidas de la lista", + "QualitySettingsSummary": "Tamaños de calidad y nombrado", + "TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar", + "UiSettingsSummary": "Calendario, fecha y opciones de color deteriorado", + "IncludeHealthWarnings": "Incluir avisos de salud", + "DeleteArtistFolderCountWithFilesConfirmation": "Esta seguro que desea eliminar '{count}' seleccionadas y sus contenidos?", + "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "El episodio no tiene un número de episodio absoluto", + "ArtistIndexFooterDownloading": "Descargando", + "AutomaticSearch": "Búsqueda Automática", + "Donate": "Donar", + "MassSearchCancelWarning": "Esto no puede ser cancelado una vez empiece sin reiniciar {appName} o deshabilitar todos tus indexadores.", + "MediaManagementSettingsSummary": "Nombrado, opciones de gestión de archivos y carpetas raíz" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 89d748523..a3eaaaec1 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -298,7 +298,7 @@ "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "A {appName} számos népszerű torrent és usenet letöltő klienst támogat.", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "A nyomkövetést csak ideiglenesen szabad engedélyezni", "MetadataProfileIdHelpText": "A Metaadat-profil listaelemeket hozzá kell adni a", - "MinimumAgeHelpText": "Usenet: Az NZB-k minimális életkora percekben, mielőtt megragadnák őket. Használja ezt arra, hogy időt biztosítson az új kiadásoknak az usenet-szolgáltatóhoz történő továbbterjesztésre.", + "MinimumAgeHelpText": "Csak Usenet: Az NZB-k minimális életkora percekben, mielőtt elkapnák őket. Használja ezt, hogy időt adjon az új kiadásoknak, hogy eljuthassanak a usenet szolgáltatóhoz.", "NamingSettings": "Elnevezési beállítások", "PastDaysHelpText": "Napok száma az iCal-hírcsatornához a visszatekintéshez", "PathHelpText": "A zenekönyvtárat tartalmazó gyökérmappa", @@ -371,7 +371,7 @@ "IconForCutoffUnmet": "Ikon a Sikertelen Küszöbszint Elérésére", "IgnoredHelpText": "A kiadás elutasításra kerül, ha egy vagy több kifejezést tartalmaz (A kis- és nagybetűket nem vesszük figyelembe)", "IgnoredPlaceHolder": "Új korlátozás hozzáadása", - "ImportedTo": "Importálva Ide", + "ImportedTo": "Importált ide", "ImportExtraFiles": "Extra fájlok importálása", "ImportExtraFilesHelpText": "A megfelelő extra fájlok importálása (feliratok, nfo stb.) a zenefájl importálása után", "ImportFailedInterp": "Importálás sikertelen: {0}", @@ -554,7 +554,7 @@ "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Az egyes indexerekről további információkért kattints az info gombokra.", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Az egyes listákkal kapcsolatos további információkért kattintson az információs gombokra.", "IncludeUnknownArtistItemsHelpText": "Mutasson olyan elemeket, amelyekben nincs előadó a sorban, beleértve az eltávolított előadókat, filmeket vagy bármi mást a {appName} kategóriájában", - "IncludeUnmonitored": "Figyelmen Kívül hagyottakat is tartalmazza", + "IncludeUnmonitored": "Tartalmazza a Nem felügyeltet", "IndexerIdHelpText": "Adja meg, hogy a profil milyen indexelőre vonatkozik", "IndexerIdHelpTextWarning": "Egy adott indexer előnyben részesített szavakkal történő használata megismételt kiadások kiválasztásához vezethet", "ManualDownload": "Kézi letöltés", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index f303c69d3..85c3dc328 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -865,5 +865,24 @@ "EditImportListImplementation": "Aggiungi lista di importazione - {implementationName}", "EditIndexerImplementation": "Aggiungi indicizzatore - {implementationName}", "IncludeHealthWarnings": "Includi gli avvisi di salute", - "RemoveQueueItemConfirmation": "Sei sicuro di voler rimuovere {0} dalla coda?" + "RemoveQueueItemConfirmation": "Sei sicuro di voler rimuovere {0} dalla coda?", + "DefaultCase": "Caso Predefinito", + "FileNameTokens": "Token nome file", + "Lowercase": "Minuscolo", + "Uppercase": "Maiuscolo", + "ImportLists": "Liste", + "MonitoredStatus": "Monitorato / Stato", + "ConnectSettingsSummary": "Notifiche, collegamenti a server/riproduttori multimediali e script personalizzati", + "CustomFormatsSettings": "Formati Personalizzati Impostazioni", + "CustomFormatsSettingsSummary": "Formati Personalizzati Impostazioni", + "DownloadClientsSettingsSummary": "Client di download, gestione dei download e mappatura dei percorsi remoti", + "GeneralSettingsSummary": "Porta, SSL, Nome utente/password, proxy, statistiche e aggiornamenti", + "QualitySettingsSummary": "Dimensioni delle qualità e denominazione", + "TagsSettingsSummary": "Vedi tutte le etichette e come vengono utilizzate. Le etichette non utilizzate possono essere rimosse", + "UiSettingsSummary": "Opzioni calendario, data e visione dei colori", + "ImportListsSettingsSummary": "Liste di Importazione, esclusioni dalle liste", + "AutomaticSearch": "Ricerca Automatica", + "ArtistIndexFooterDownloading": "Scaricando", + "KeyboardShortcuts": "Scorciatoie Tastiera", + "Links": "Collegamenti" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 617f5b9c1..962a7e684 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -21,7 +21,7 @@ "Artists": "Artistas", "Authentication": "Autenticação", "AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o {appName}", - "AddListExclusion": "Adicionar exclusão à lista", + "AddListExclusion": "Adicionar Exclusão de Lista", "AlbumHasNotAired": "O álbum não foi lançado", "AlbumIsDownloading": "O álbum está baixando", "AppDataDirectory": "Diretório AppData", @@ -747,7 +747,7 @@ "Seeders": "Sementes", "Select...": "Selecionar...", "SelectFolder": "Selecionar Pasta", - "SelectQuality": "Selecionar Qualidade", + "SelectQuality": "Selecionar uma Qualidade", "ShouldMonitorExistingHelpText": "Monitorar automaticamente os álbuns nesta lista que já estão no {appName}", "ShouldSearch": "Pesquisar novos itens", "ShouldSearchHelpText": "Indexadores de pesquisa para novos itens adicionados. Tenha cuidado ao usar com listas grandes.", @@ -825,7 +825,7 @@ "OnArtistDelete": "Ao Excluir Artista", "ContinuingOnly": "Continuando apenas", "DeleteSelected": "Excluir Selecionado", - "SelectReleaseGroup": "Selecionar Grupo do Lançamento", + "SelectReleaseGroup": "Selecionar um Grupo de Lançamento", "Inactive": "Inativo", "ChooseImportMethod": "Escolha o método de importação", "ClickToChangeReleaseGroup": "Clique para alterar o grupo de lançamento", @@ -1013,8 +1013,8 @@ "RemoveFailedDownloads": "Remover downloads com falha", "FilterAlbumPlaceholder": "Filtrar álbum", "FilterArtistPlaceholder": "Filtrar artista", - "MonitorExistingAlbums": "Monitorar Álbuns Existentes", - "MonitorNewAlbums": "Monitorar Novos Álbuns", + "MonitorExistingAlbums": "Álbuns Existentes", + "MonitorNewAlbums": "Novos Álbuns", "UpdateSelected": "Atualizar Selecionada", "CountArtistsSelected": "{count} artista(s) selecionado(s)", "SuggestTranslationChange": "Sugerir mudança de tradução", @@ -1220,5 +1220,28 @@ "GeneralSettingsSummary": "Porta, SSL, nome de usuário/senha, proxy, análises e atualizações", "ImportListsSettingsSummary": "Importe de outra instância do {appName} ou listas do Trakt e gerencie exclusões de listas", "MetadataSettingsArtistSummary": "Crie arquivos de metadados quando as faixas forem importadas ou o artista for atualizado", - "ProfilesSettingsArtistSummary": "Perfis de Qualidade, Metadados, Atraso e Lançamento" + "ProfilesSettingsArtistSummary": "Perfis de Qualidade, Metadados, Atraso e Lançamento", + "FormatAgeDay": "dia", + "FormatAgeDays": "dias", + "FormatAgeHour": "hora", + "FormatAgeHours": "horas", + "FormatAgeMinute": "minuto", + "FormatAgeMinutes": "minutos", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}h", + "FormatRuntimeMinutes": "{minutes}m", + "FormatShortTimeSpanSeconds": "{seconds} segundo(s)", + "FormatTimeSpanDays": "{days}d {time}", + "FormatShortTimeSpanHours": "{hours} hora(s)", + "MonitorFirstAlbum": "Primeiro Álbum", + "MonitorFutureAlbums": "Álbuns Futuros", + "MonitorLastestAlbum": "Último Álbum", + "MonitorNoAlbums": "Nada", + "MonitorNoNewAlbums": "Sem Novos Álbuns", + "Yesterday": "Ontem", + "FormatShortTimeSpanMinutes": "{minutes} minuto(s)", + "MonitorAllAlbums": "Todos os Álbuns", + "MonitorMissingAlbums": "Álbuns Ausentes", + "Tomorrow": "Amanhã" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 5eb925319..cc2e72136 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -216,7 +216,7 @@ "Artists": "艺术家", "ArtistFolderFormat": "艺术家文件夹格式", "ArtistEditor": "艺术家编辑器", - "ArtistAlbumClickToChangeTrack": "单击以修改音轨", + "ArtistAlbumClickToChangeTrack": "单击以修改曲目", "ArtistClickToChangeAlbum": "单击以修改专辑", "AutoRedownloadFailedHelpText": "自动搜索并尝试下载不同的版本", "BackupFolderHelpText": "{appName} 的 AppData 目录下的相对路径", @@ -229,7 +229,7 @@ "ChangeFileDate": "修改文件日期", "ChmodFolder": "修改文件夹权限", "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "若需要查看有关下载客户端的详细信息,请点击“更多信息”按钮。", - "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Radarr支持许多常用的的torrent和usenet下载客户端。", + "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "{appName}支持许多常用的的torrent和usenet下载客户端。", "MediaInfo": "媒体信息", "MediaManagementSettings": "媒体管理设置", "Medium": "中", @@ -279,15 +279,15 @@ "RemoveSelected": "移除已选", "RemoveTagExistingTag": "已有标签", "RemoveTagRemovingTag": "移除标签", - "RenameTracksHelpText": "如果重命名未启用,Radarr会使用现有文件名", + "RenameTracksHelpText": "如果重命名未启用,{appName}会使用现有文件名", "Reorder": "重新排序Reorder", "ReplaceIllegalCharacters": "替换非法字符", - "ReplaceIllegalCharactersHelpText": "替换非法字符,如未勾选,则会被Radarr移除", + "ReplaceIllegalCharactersHelpText": "替换非法字符,如未勾选,则会被{appName}移除", "RequiredHelpText": "发布的歌曲必须至少包含一个这些项目(不区分大小写)", "RequiredPlaceHolder": "添加新限制", "RequiresRestartToTakeEffect": "需重启以生效", "RescanAfterRefreshHelpText": "刷新歌手信息后重新扫描歌手文件夹", - "RestartLidarr": "重启Radarr", + "RestartLidarr": "重启{appName}", "RetentionHelpText": "仅限Usenet:设置为零以设置无限保留", "RetryingDownloadOn": "尝试重新下载“{0}”在“{1}”", "RootFolder": "根目录", @@ -317,7 +317,7 @@ "SuccessMyWorkIsDoneNoFilesToRetag": "成功了!任务已完成,所有文件已重命名。", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "该搜刮器不支持RSS", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "该索引器不支持搜索", - "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "当自动搜索通过UI或Radarr执行时将被使用", + "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "当自动搜索通过UI或{appName}执行时将被使用", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "当手动搜索启用时使用", "TestAllIndexers": "测试全部搜刮器", "TestAllLists": "测试全部列表", @@ -368,7 +368,7 @@ "CompletedDownloadHandling": "完成下载处理", "Component": "组件", "CopyUsingHardlinksHelpText": "硬链接允许{appName}导入torrents种子到剧集文件夹,而无需占用额外的磁盘空间或复制文件的整个内容。只有当源和目标在同一卷上时,硬链接才会起作用", - "CopyUsingHardlinksHelpTextWarning": "有时候,文件锁可能会阻止对正在做种的文件进行重命名。您可以暂时禁用做种功能,并使用Radarr的重命名功能作为解决方案。", + "CopyUsingHardlinksHelpTextWarning": "有时候,文件锁可能会阻止对正在做种的文件进行重命名。您可以暂时禁用做种功能,并使用{appName}的重命名功能作为解决方案。", "CreateEmptyArtistFolders": "为艺术家创建空文件夹", "CreateEmptyArtistFoldersHelpText": "硬盘扫描过程中创建缺失的电影目录", "CreateGroup": "创建组", @@ -410,7 +410,7 @@ "GoToInterp": "跳转到 {0}", "Grab": "抓取", "GrabRelease": "抓取版本", - "GrabReleaseMessageText": "Radarr无法确定这个发布版本是哪部电影,Radarr可能无法自动导入此版本,你想要获取“{0}”吗?", + "GrabReleaseMessageText": "{appName}无法确定这个发布版本是哪部电影,{appName}可能无法自动导入此版本,你想要获取“{0}”吗?", "Group": "组", "HasPendingChangesNoChanges": "无修改", "HasPendingChangesSaveChanges": "保存更改", @@ -424,14 +424,14 @@ "ImportExtraFiles": "导入额外文件", "ImportExtraFilesHelpText": "导入歌曲后导入匹配的额外文件(字幕/nfo等)", "ImportFailedInterp": "导入失败: {0}", - "IncludeUnknownArtistItemsHelpText": "显示队列中没有电影的项目,这可能包括被删除的电影或Radarr类别中的任何其他内容", + "IncludeUnknownArtistItemsHelpText": "显示队列中没有艺术家的项目,这可能包括被删除的艺术家,影片以及{appName}类别中的任何其他内容", "IncludeUnmonitored": "包含未监控的", "IndexerSettings": "搜刮器设置", "IsCutoffCutoff": "截止", - "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "升级直到歌曲质量超出或者满足", + "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "升级直至达到或超过此质量", "IsTagUsedCannotBeDeletedWhileInUse": "使用中无法删除", "Label": "标签", - "LaunchBrowserHelpText": " 启动浏览器时导航到Radarr主页。", + "LaunchBrowserHelpText": " 启动浏览器时导航到{appName}主页。", "Level": "等级", "ShowSizeOnDisk": "显示占用空间", "UnableToLoadHistory": "无法加载历史记录。", @@ -449,21 +449,21 @@ "UsenetDelay": "Usenet延时", "UsenetDelayHelpText": "延迟几分钟才能等待从Usenet获取发布", "UserAgentProvidedByTheAppThatCalledTheAPI": "由调用API的应用程序提供的User-Agent", - "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "更新Radarr的分支", + "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "更新{appName}的分支", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "外部更新机制使用的分支", "WeekColumnHeader": "日期格式", "OnGrab": "抓取中", "OnHealthIssue": "健康度异常", "Path": "路径", "Permissions": "权限", - "RescanAfterRefreshHelpTextWarning": "当没有设置为“总是”时,Radarr将不会自动检测文件的更改", + "RescanAfterRefreshHelpTextWarning": "当没有设置为“总是”时,{appName}将不会自动检测文件的更改", "SearchSelected": "搜索已选", "Season": "季", "SetPermissionsLinuxHelpText": "当文件被导入或重命名时要更改文件权限吗?", "SetPermissionsLinuxHelpTextWarning": "如果您不确定这些设置的作用,请不要更改它们。", "ShortDateFormat": "短日期格式", "ShowCutoffUnmetIconHelpText": "终止监控条件未满足前为文件显示图标", - "UiLanguageHelpText": "Radarr使用的UI界面语言", + "UiLanguageHelpText": "{appName}使用的UI界面语言", "CutoffUnmet": "终止未满足", "AgeWhenGrabbed": "发布时长", "AnyReleaseOkHelpText": "{appName} 将会自动切换到与已下载文件最匹配的版本", @@ -473,10 +473,10 @@ "ChownGroupHelpText": "组名称或GID。对于远程文件系统请使用GID。", "DiskSpace": "硬盘空间", "IgnoredPlaceHolder": "添加新限制", - "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Radarr支持任何使用Newznab标准的搜刮器,以及下面列出的其他搜刮器。", - "LidarrTags": "Radarr标签", + "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName}支持任何使用Newznab标准的搜刮器,以及下面列出的其他搜刮器。", + "LidarrTags": "{appName}标签", "Local": "本地", - "LocalPathHelpText": "Radarr在本地访问远程路径时应该使用的路径", + "LocalPathHelpText": "{appName}在本地访问远程路径时应该使用的路径", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "追踪日志只应该暂时启用", "LongDateFormat": "长时间格式", "ManualImport": "手动导入", @@ -493,7 +493,7 @@ "Albums": "专辑", "Connect": "通知连接", "DoNotPrefer": "不要首选", - "ExistingAlbumsData": "监控书籍有文件或尚未发布", + "ExistingAlbumsData": "监控专辑有文件或尚未发布", "Ignored": "已忽略", "Location": "位置", "Ok": "完成", @@ -506,36 +506,36 @@ "TrackNumber": "跟踪编号", "WatchRootFoldersForFileChanges": "监测根目录文件夹的文件更改", "WriteAudioTagsHelpTextWarning": "选择“所有文件”将在导入时更改现有文件。", - "MissingAlbumsData": "监控没有文件或尚未发布的书籍", + "MissingAlbumsData": "监控没有文件或尚未发布的专辑", "OnReleaseImport": "在发行导入时", "QualityProfileIdHelpText": "质量配置列表项应该被添加", "ReleaseProfiles": "发行版概要", "RootFolderPathHelpText": "根目录文件夹列表项需添加", - "ScrubAudioTagsHelpText": "从文件中删除现有标签,只留下Readarr添加的标签。", + "ScrubAudioTagsHelpText": "从文件中删除现有标签,只留下{appName}添加的标签。", "ScrubExistingTags": "覆盖现有标签", - "SearchForAllCutoffUnmetAlbums": "搜索所有Cutoff Unmet书籍", - "SearchForMonitoredAlbums": "搜索监控中的书籍", + "SearchForAllCutoffUnmetAlbums": "搜索所有截止未满足的专辑", + "SearchForMonitoredAlbums": "搜索监控中的专辑", "SearchMonitored": "搜索已监控", "ShowTitleHelpText": "在海报下显示作者姓名", - "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} 书籍已下载", + "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} 曲目已下载", "UnableToLoadMetadataProviderSettings": "无法加载元数据源设置", "UnmappedFiles": "未映射文件", "UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "更新在docker容器内被禁用. 改为更新容器映像。", "OnDownloadFailure": "在下载失败时", - "PathHelpText": "根目录文件夹包含您的书籍库", + "PathHelpText": "根目录文件夹包含您的音乐库", "PathHelpTextWarning": "这必须与下载客户端放置文件的目录不同", - "SearchForAllMissingAlbums": "搜索所有丢失的书籍", + "SearchForAllMissingAlbums": "搜索所有丢失的专辑", "WatchLibraryForChangesHelpText": "当根目录文件夹中的文件发生变化时,会自动重新扫描", "MusicbrainzId": "Musicbrainz ID", - "DefaultLidarrTags": "默认Readarr标签", + "DefaultLidarrTags": "默认{appName}标签", "DefaultMetadataProfileIdHelpText": "此文件夹中检测到的作者的默认元数据配置文件", "DefaultQualityProfileIdHelpText": "此文件夹中检测到的作者的默认质量配置", - "DefaultTagsHelpText": "对于在此文件夹中检测到的作者使用默认Readarr标签", - "DefaultMonitorOptionHelpText": "对于在此文件夹中检测到的作者,应在初始添加时监控哪些书籍", + "DefaultTagsHelpText": "对于在此文件夹中检测到的作者使用默认{appName}标签", + "DefaultMonitorOptionHelpText": "对于在此文件夹中检测到的艺术家,应在初始添加时监控哪些专辑", "ExpandOtherByDefaultHelpText": "其他", "FirstAlbumData": "监控第一个专辑。其他专辑都将被忽略", - "ForeignIdHelpText": "作者/书籍的Musicbrainz ID排除", - "FutureAlbumsData": "监控尚未发布的书籍", + "ForeignIdHelpText": "需要排除的艺术家/专辑的Musicbrainz ID", + "FutureAlbumsData": "监控尚未发布的专辑", "FutureDays": "未来天数", "FutureDaysHelpText": "iCal订阅地址等待天数", "GoToArtistListing": "转到作者列表", @@ -553,28 +553,28 @@ "Age": "年龄", "All": "全部", "AllFiles": "全部文件", - "AllMonitoringOptionHelpText": "监控作者们及导入列表中每个作者的所有书籍", + "AllMonitoringOptionHelpText": "监控艺术家们及导入列表中每个艺术家的所有专辑", "Always": "总是", "ApplicationURL": "应用程序 URL", "ApplicationUrlHelpText": "此应用的外部URL,包含 http(s)://、端口和基本URL", "Apply": "应用", - "ArtistNameHelpText": "要排除的作者/书籍的名称(任何有涵义的均可)", + "ArtistNameHelpText": "要排除的艺术家/专辑的名称(任何有含义的均可)", "AudioInfo": "音频信息", "Backup": "备份", "BeforeUpdate": "更新前", "CatalogNumber": "目录编号", "ChownGroup": "修改组权限", "Close": "关闭", - "CollapseMultipleAlbumsHelpText": "折叠在同日发行的多本书籍", + "CollapseMultipleAlbumsHelpText": "折叠在同日发行的多张专辑", "Continuing": "仍在继续", - "ContinuingAllTracksDownloaded": "仍在继续(所有书籍已下载)", - "ContinuingNoAdditionalAlbumsAreExpected": "预计不会有其他书籍", + "ContinuingAllTracksDownloaded": "仍在继续(所有曲目已下载)", + "ContinuingNoAdditionalAlbumsAreExpected": "预计不会有其他专辑", "Country": "国家", "CustomFilters": "自定义过滤器", "Date": "日期", "DefaultDelayProfileHelpText": "这是默认配置档案,它适用于所有没有明确配置档案的歌手。", "Deleted": "已删除", - "DeleteFilesHelpText": "删除书籍文件及作者文件夹", + "DeleteFilesHelpText": "删除曲目文件及艺术家文件夹", "DeleteImportList": "删除导入的列表", "DeleteMetadataProfile": "删除元数据配置", "DeleteRootFolder": "删除根目录", @@ -588,9 +588,9 @@ "EditQualityProfile": "编辑质量档案", "EditRemotePathMapping": "编辑远程映射路径", "EditRootFolder": "添加根目录", - "EnableAutomaticAddHelpText": "当通过UI或Readarr执行同步时,将作者/书籍添加到Readarr", + "EnableAutomaticAddHelpText": "当通过UI或{appName}执行同步时,将艺术家/专辑添加到{appName}", "EnabledHelpText": "检查以启用发布配置文件", - "EndedAllTracksDownloaded": "完成(所以书籍已下载)", + "EndedAllTracksDownloaded": "完成(所有曲目已下载)", "EntityName": "实体名称", "Error": "错误", "ErrorRestoringBackup": "恢复备份错误", @@ -604,7 +604,7 @@ "Grabbed": "已抓取", "HardlinkCopyFiles": "硬链接/复制文件", "HideAdvanced": "隐藏高级", - "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "如果您不添加导入列表例外,并且作者元数据配置不是“无”,那这本书可能会在下次作者刷新是重新添加。", + "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "如果您不添加导入列表排除项,并且艺术家元数据配置不是“无”,那这张专辑可能会在下次艺术家刷新时重新添加。", "Import": "导入", "ImportFailures": "导入失败", "ImportListExclusions": "导入列表例外", @@ -624,16 +624,16 @@ "LastUsed": "上次使用", "LastWriteTime": "最后写入时间", "Library": "库", - "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "Readarr支持将书籍和作者导入数据库的多个列表。", + "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName}支持将专辑和艺术家导入数据库的多个列表。", "Manual": "手动", "ManualDownload": "手动下载", "MediaManagement": "媒体管理", "Metadata": "元数据", - "MonitorAlbumExistingOnlyWarning": "这是对每本书籍的监控设置的一次性调整 使用作者/编辑下的选项来控制新添加的书籍将如何", + "MonitorAlbumExistingOnlyWarning": "这是对每张专辑的监控设置的一次性调整 使用艺术家/编辑下的选项来控制新添加的专辑将如何", "MonitoredOnly": "仅监控", "MonitoringOptions": "监控选项", - "MonitoringOptionsHelpText": "添加作者后应该监控哪些书籍(一次性调整)", - "MonitorNewItemsHelpText": "哪些新书应被监控", + "MonitoringOptionsHelpText": "添加艺术家后应该监控哪些专辑(一次性调整)", + "MonitorNewItemsHelpText": "哪些新专辑应被监控", "MoveFiles": "移动文件", "MusicBrainzArtistID": "MusicBrainz作者ID", "MusicBrainzRecordingID": "MusicBrainz 唱片ID", @@ -641,7 +641,7 @@ "MusicBrainzTrackID": "MusicBrainz曲目ID", "Never": "永不", "NextExecution": "接下来执行", - "NoneData": "不会监控任何书籍", + "NoneData": "不会监控任何专辑", "NoTagsHaveBeenAddedYet": "未添加标签", "OnImportFailure": "在导入失败时", "OnlyTorrent": "只有torrent", @@ -660,14 +660,14 @@ "Renamed": "已重命名", "Replace": "替换", "RestartRequiredHelpTextWarning": "需重启以生效", - "RestoreBackupAdditionalInfo": "注意:Radarr将在恢复过程中自动重启并重新加载UI。", + "RestoreBackupAdditionalInfo": "注意:{appName}将在恢复过程中自动重启并重新加载UI。", "Save": "保存", "Seeders": "种子", "Select...": "'选择...", "SelectedCountArtistsSelectedInterp": "{selectedCount}艺术家已选中", "SelectFolder": "选择文件夹", - "SelectQuality": "选择品质", - "ShouldMonitorExistingHelpText": "自动监控此列表中已经在Readarr中的书籍", + "SelectQuality": "选择质量", + "ShouldMonitorExistingHelpText": "自动监控此列表中已经在{appName}中的专辑", "ShouldSearch": "搜索新项目", "ShouldSearchHelpText": "在索引器中搜索新添加的项目, 小心使用长列表。", "ShowBanners": "显示横幅", @@ -679,11 +679,11 @@ "System": "系统", "TagAudioFilesWithMetadata": "使用元数据标记音频文件", "Test": "测试", - "TheAlbumsFilesWillBeDeleted": "此书籍文件将删除。", + "TheAlbumsFilesWillBeDeleted": "此专辑的文件将被删除。", "TimeLeft": "剩余时间", "Title": "标题", "TotalSpace": "总空间", - "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "共{0}本书籍 . {1} 有文件.", + "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "共{0}首曲目 . {1} 首曲目有文件.", "TrackTitle": "跟踪标题", "Ui": "UI界面", "UnmappedFilesOnly": "仅限未映射的文件", @@ -779,7 +779,7 @@ "AlbumTitle": "专辑标题", "AlbumType": "专辑类型", "AreYouSure": "你确定么?", - "ArtistName": "歌手姓名", + "ArtistName": "艺术家姓名", "ArtistType": "歌手类型", "CollapseMultipleAlbums": "折叠多个专辑", "ContinuingMoreAlbumsAreExpected": "需要更多专辑", @@ -825,7 +825,7 @@ "BypassIfHighestQuality": "如果质量最高,则绕过", "CustomFormatScore": "自定义格式分数", "MinimumCustomFormatScore": "最小自定义格式分数", - "EnableRssHelpText": "当Radarr定期通过RSS同步查找发布时使用", + "EnableRssHelpText": "当{appName}定期通过RSS同步查找发布时使用", "SelectReleaseGroup": "选择发布组", "BypassIfAboveCustomFormatScore": "若高于自定义格式分数则绕过", "CloneCustomFormat": "复制自定义命名格式", @@ -846,7 +846,7 @@ "HiddenClickToShow": "隐藏,点击显示", "IncludeCustomFormatWhenRenamingHelpText": "在 {Custom Formats} 中包含重命名格式", "IndexerRssHealthCheckNoAvailableIndexers": "由于索引器错误,所有支持rss的索引器暂时不可用", - "IndexerRssHealthCheckNoIndexers": "没有任何索引器开启了RSS同步,{appName}不会自动抓取新发布的影片", + "IndexerRssHealthCheckNoIndexers": "没有任何索引器开启了RSS同步,{appName}不会自动抓取新发布的专辑", "IndexerSearchCheckNoInteractiveMessage": "没有可用的交互式搜索的索引器,因此 {appName} 不会提供任何交互式搜索的结果", "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "添加新的艺术家很容易,只需开始输入要添加的艺术家的名称即可。", "Loading": "加载中", @@ -858,7 +858,7 @@ "ProxyCheckBadRequestMessage": "测试代理失败,状态码: {0}", "ProxyCheckFailedToTestMessage": "测试代理失败: {0}", "ProxyCheckResolveIpMessage": "无法解析已设置的代理服务器主机{0}的IP地址", - "RecycleBinUnableToWriteHealthCheck": "无法写入配置的回收站文件夹:{0}。确保此路径存在,并且可由运行Radarr的用户写入", + "RecycleBinUnableToWriteHealthCheck": "无法写入配置的回收站文件夹:{0}。确保此路径存在,并且可由运行{appName}的用户写入", "RemotePathMappingCheckBadDockerPath": "您正在使用docker;下载客户端 {0} 的下载目录为 {1} ,但是该地址 {2} 不合法。请检查您的远程地址映射和下载客户端设置。", "RemotePathMappingCheckLocalWrongOSPath": "本地下载客户端 {0} 报告文件在目录 {1} 中,但是该地址 {2} 非法。请检查您的下载客户端设置。", "ShownClickToHide": "显示,点击隐藏", @@ -867,7 +867,7 @@ "CustomFormatSettings": "自定义格式设置", "CustomFormats": "自定义命名格式", "Customformat": "自定义命名格式", - "CutoffFormatScoreHelpText": "一旦自定义格式分数满足则Radarr不会再下载影片", + "CutoffFormatScoreHelpText": "一旦自定义格式分数满足则{appName}不会再抓取专辑", "DeleteCustomFormatMessageText": "您确定要删除自定义格式“{name}”吗?", "DeleteFormatMessageText": "您确定要删除格式标签“{name}”吗?", "ImportListStatusCheckAllClientMessage": "所有的列表因错误不可用", @@ -876,14 +876,14 @@ "IndexerStatusCheckAllClientMessage": "所有搜刮器都因错误不可用", "IndexerStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}", "RemotePathMappingCheckDockerFolderMissing": "您正在使用docker;下载客户端 {0} 报告文件在 {1} 中,但是该目录似乎不存在docker容器中。请检查您的远程地址映射和容器的卷设置。", - "RemotePathMappingCheckDownloadPermissions": "Radarr可以找到但无法访问已下载的电影 {0} ,可能是权限错误。", + "RemotePathMappingCheckDownloadPermissions": "{appName}可以找到但无法访问已下载的电影 {0} ,可能是权限错误。", "RemotePathMappingCheckFileRemoved": "文件{0} 在处理的过程中被部分删除。", "RemotePathMappingCheckFilesBadDockerPath": "您正在使用docker;下载客户端 {0} 的下载目录为 {1} ,但是该地址 {2} 不合法。请检查您的远程地址映射和下载客户端设置。", - "RemotePathMappingCheckFilesGenericPermissions": "下载{1}中客户端{0}报告的文件,但Radarr无法看到此目录。您可能需要调整文件夹的权限。", + "RemotePathMappingCheckFilesGenericPermissions": "下载{1}中客户端{0}报告的文件,但{appName}无法看到此目录。您可能需要调整文件夹的权限。", "RemotePathMappingCheckFilesLocalWrongOSPath": "本地下载客户端 {0} 报告文件在目录 {1} 中,但是该地址 {2} 非法。请检查您的下载客户端设置。", "RemotePathMappingCheckFilesWrongOSPath": "远程下载客户端 {0} 报告文件在 {1} 中,但是该地址 {2} 非法。请检查您的远程地址映射和下载客户端设置。", "RemotePathMappingCheckGenericPermissions": "下载客户端{0}将下载放置在{1}中,但 {appName} 无法看到此目录。您可能需要调整文件夹的权限。", - "RemotePathMappingCheckImportFailed": "Radarr导入电影失败,请查看日志文件获取详细信息。", + "RemotePathMappingCheckImportFailed": "{appName}导入电影失败,请查看日志文件获取详细信息。", "RemotePathMappingCheckLocalFolderMissing": "远程客户端 {0} 将下载文件放置在 {1} 中,但该目录似乎不存在,可能目录确实或远程地址映射错误。", "RemotePathMappingCheckRemoteDownloadClient": "远程客户端 {0} 将下载文件放置在 {1} 中,但该目录似乎不存在,可能目录确实或远程地址映射错误。", "RemotePathMappingCheckWrongOSPath": "远程下载客户端 {0} 报告文件在 {1} 中,但是该地址 {2} 非法。请检查您的远程地址映射和下载客户端设置。", @@ -899,7 +899,7 @@ "IndexerSearchCheckNoAutomaticMessage": "没有索引器开启自动搜索,{appName}不会提供任何自动搜索结果", "MinFormatScoreHelpText": "允许下载的最小自定义格式分数", "Monitoring": "监控中", - "RemotePathMappingCheckFolderPermissions": "Radarr可以找到但是无法访问已下载的目录 {0} ,可能是权限错误。", + "RemotePathMappingCheckFolderPermissions": "{appName}可以找到但是无法访问已下载的目录 {0} ,可能是权限错误。", "ReplaceWithDash": "使用破折号替换", "ReplaceWithSpaceDash": "使用空格破折号替换", "ReplaceWithSpaceDashSpace": "使用空格破折号空格替换", @@ -908,12 +908,12 @@ "ResetTitles": "重置标题", "RootFolderCheckMultipleMessage": "多个根目录缺失:{0}", "RootFolderCheckSingleMessage": "缺少根目录: {0}", - "SpecificMonitoringOptionHelpText": "监控作者,但只监控明确包含在列表中的书籍", + "SpecificMonitoringOptionHelpText": "监控艺术家,但只监控明确包含在列表中的专辑", "SystemTimeCheckMessage": "系统时间相差超过1天。在纠正时间之前,计划的任务可能无法正确运行", "ThereWasAnErrorLoadingThisItem": "加载此项目时出错", "ThereWasAnErrorLoadingThisPage": "加载此页时出错", "UnableToLoadCustomFormats": "无法加载自定义格式", - "UnableToLoadInteractiveSearch": "无法加载该影片的搜索结果,请稍后重试", + "UnableToLoadInteractiveSearch": "无法加载该专辑的搜索结果,请稍后重试", "UpdateAvailable": "有新的更新可用", "UpdateCheckStartupNotWritableMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", "UpdateCheckStartupTranslocationMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{0}' is in an App Translocation folder.", @@ -976,10 +976,10 @@ "BlocklistReleaseHelpText": "防止{appName}再次自动抓取此版本", "UpdateSelected": "更新选择的内容", "DeleteConditionMessageText": "您确定要删除条件“{name}”吗?", - "DownloadClientSortingCheckMessage": "下载客户端 {0} 为 Radarr 的类别启用了 {1} 排序。 您应该在下载客户端中禁用排序以避免导入问题。", + "DownloadClientSortingCheckMessage": "下载客户端 {0} 为 {appName} 的类别启用了 {1} 排序。 您应该在下载客户端中禁用排序以避免导入问题。", "FailedToLoadQueue": "读取队列失败", - "MonitorExistingAlbums": "监测现存专辑", - "MonitorNewAlbums": "监控新专辑", + "MonitorExistingAlbums": "监测已有专辑", + "MonitorNewAlbums": "新专辑", "ApplyTagsHelpTextHowToApplyArtists": "如何将标记应用于所选剧集", "DeleteRemotePathMapping": "删除远程路径映射", "DownloadClientTagHelpText": "仅将此下载客户端用于至少具有一个匹配标签的电影。留空可用于所有电影。", @@ -990,7 +990,7 @@ "RemoveSelectedItemQueueMessageText": "您确定要从队列中删除 1 项吗?", "RemoveSelectedItemsQueueMessageText": "您确定要从队列中删除 {0} 个项目吗?", "ShowNextAlbum": "显示最后专辑", - "CountArtistsSelected": "{selectedCount}艺术家已选中", + "CountArtistsSelected": "{count}位艺术家已选中", "AllResultsAreHiddenByTheAppliedFilter": "根据过滤条件所有结果已隐藏", "NoResultsFound": "无结果", "ConnectionLost": "连接丢失", @@ -1015,9 +1015,9 @@ "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "导入列表中缺失多个根目录文件夹", "NoCutoffUnmetItems": "没有未达截止条件的项目", "BypassIfAboveCustomFormatScoreHelpText": "当抓取发布版本的分数高于配置的最低自定义格式分数时跳过延时", - "BypassIfHighestQualityHelpText": "当发布版本在质量配置文件中具有最高启用质量时,跳过延迟", + "BypassIfHighestQualityHelpText": "当发布版本在使用首选协议的质量配置文件中具有最高启用质量时,跳过延迟", "PreferProtocol": "首选 {preferredProtocol}", - "SkipRedownloadHelpText": "阻止 Readarr 尝试下载已删除项目的替代版本", + "SkipRedownloadHelpText": "阻止 {appName} 尝试下载已删除项目的替代版本", "AppUpdatedVersion": "{appName}已更新为版本` {version}`,为了获得最新的更改,您需要重新加载{appName}", "DeleteFormat": "删除格式", "CloneCondition": "克隆条件", @@ -1090,7 +1090,7 @@ "Deceased": "已故", "External": "外部的", "UpdateMonitoring": "更新监控的内容", - "ArtistIsUnmonitored": "作者未监控", + "ArtistIsUnmonitored": "艺术家未监控", "ArtistsEditRootFolderHelpText": "将系列移动到相同的根文件夹可用于重命名系列文件夹以匹配已更新的标题或命名格式", "ConditionUsingRegularExpressions": "此条件使用正则表达式匹配。请注意字符 `\\^$.|?*+()[{` 具有特殊含义,需要用转义符 `\\`", "DeleteSpecification": "删除规范", @@ -1126,8 +1126,8 @@ "PasswordConfirmation": "确认密码", "Small": "小", "AlbumStudioTruncated": "只显示最新的25季,点击详情查看所有的季", - "ArtistIsMonitored": "作者未监控", - "AddNewArtistSearchForMissingAlbums": "开始搜索缺失影片", + "ArtistIsMonitored": "艺术家未监控", + "AddNewArtistSearchForMissingAlbums": "开始搜索缺失的专辑", "EnableProfile": "启用配置", "AlbumDetails": "专辑详情", "AddAlbumWithTitle": "添加 {albumTitle}", @@ -1139,19 +1139,19 @@ "DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)", "NoLimitForAnyDuration": "不限制任何运行环境", "NoMinimumForAnyDuration": "运行环境没有最小限制", - "PreferredSize": "首选影片大小", + "PreferredSize": "首选专辑大小", "Unlimited": "无限制", "DownloadClientPriorityHelpText": "下载客户端优先级,从1(最高)到50(最低),默认为1。具有相同优先级的客户端将轮换使用。", "IndexerSettingsRejectBlocklistedTorrentHashes": "抓取时舍弃列入黑名单的种子散列值", - "AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索中重新下载失败", + "AutoRedownloadFailedFromInteractiveSearch": "手动搜索重新下载失败", "IncludeHealthWarnings": "包含健康度警告", - "RemoveQueueItem": "删除- {sourceTitle}", - "AutoRedownloadFailedFromInteractiveSearchHelpText": "当从交互式搜索中获取失败的版本时,自动搜索并尝试下载其他版本", + "RemoveQueueItem": "移除 - {sourceTitle}", + "AutoRedownloadFailedFromInteractiveSearchHelpText": "当从手动搜索中获取失败的发行版时,自动搜索并尝试下载不同的发行版", "DownloadClientAriaSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", "CustomFormatsSpecificationRegularExpression": "正则表达式", - "RemoveQueueItemConfirmation": "您确定要从队列中删除'{sourceTitle}'吗?", + "RemoveQueueItemConfirmation": "您确定要从队列中移除“{sourceTitle}”吗?", "AutoRedownloadFailed": "重新下载失败", - "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} 条音轨已下载", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} 首曲目已下载", "ArtistProgressBarText": "{trackFileCount} / {trackCount} (共: {totalTrackCount}, 正在下载: {downloadingCount})", "ChangeCategory": "改变分类", "ArtistMonitoring": "监控中的艺术家", @@ -1175,14 +1175,73 @@ "GeneralSettingsSummary": "端口、SSL、用户名/密码、代理、分析、更新", "IndexersSettingsSummary": "索引器和索引器选项", "MediaManagementSettingsSummary": "命名,文件管理和根文件夹设置", - "MetadataSettingsArtistSummary": "在导入书籍或刷新作者时创建元数据文件", + "MetadataSettingsArtistSummary": "在导入专辑或刷新艺术家时创建元数据文件", "QualitySettingsSummary": "质量尺寸和命名", "ConnectSettingsSummary": "通知、与媒体服务器/播放器的链接、自定义脚本", "CustomFormatsSettings": "自定义格式设置", "CustomFormatsSettingsSummary": "自定义格式和设置", - "ImportListsSettingsSummary": "导入影片列表、排除列表", + "ImportListsSettingsSummary": "从另一个 {appName} 实例或 Trakt 列表导入并管理列表排除项", "ProfilesSettingsArtistSummary": "质量、元数据、延迟、发行配置", "SearchForAllCutoffUnmetAlbumsConfirmationCount": "您确定要搜索所有{totalRecords}Cutoff Unmet的剧集吗?", "TagsSettingsSummary": "显示全部标签和标签使用情况,可删除未使用的标签", - "UiSettingsSummary": "日历、日期和色弱模式选项" + "UiSettingsSummary": "日历、日期和色弱模式选项", + "CustomFormatsSpecificationRegularExpressionHelpText": "自定义格式正则表达式不区分大小写", + "DeleteArtistFolders": "删除艺术家的多个文件夹", + "DoNotBlocklistHint": "删除而不列入黑名单", + "DoNotBlocklist": "不要列入黑名单", + "IgnoreDownloads": "忽略下载", + "IgnoreDownloadHint": "阻止 {appName} 进一步处理此下载", + "IgnoreDownload": "忽略下载", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "如果 torrent 的哈希被屏蔽了,某些索引器在使用RSS或者搜索期间可能无法正确拒绝它,启用此功能将允许在抓取 torrent 之后但在将其发送到客户端之前拒绝它。", + "Menu": "菜单", + "RemoveMultipleFromDownloadClientHint": "从下载客户端删除下载和文件", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "“从下载客户端移除”将从下载客户端移除下载内容和文件。", + "SetAppTags": "设置 {appName} 标签", + "TrackFileDeletedTooltip": "曲目文件已删除", + "TrackFileMissingTooltip": "曲目文件丢失", + "RetagSelectedArtists": "重新标记选定的艺术家", + "TrackFilesLoadError": "无法加载曲目文件", + "RemoveQueueItemRemovalMethod": "删除方法", + "RemoveQueueItemRemovalMethodHelpTextWarning": "“从下载客户端移除”将从下载客户端移除下载内容和文件。", + "TrackFileRenamedTooltip": "曲目文件已被重命名", + "EmbedCoverArtHelpText": "编写标签时将 {appName} 专辑封面嵌入到音频文件中", + "EmbedCoverArtInAudioFiles": "在音频文件中嵌入封面艺术", + "IgnoreDownloadsHint": "阻止 {appName} 进一步处理这些下载", + "RemoveFromDownloadClientHint": "从下载客户端删除下载和文件", + "TrackFileTagsUpdatedTooltip": "曲目文件标签已更新", + "EditSelectedArtists": "编辑所选艺术家", + "NoTracksInThisMedium": "该媒体中没有曲目", + "DeleteArtistFolder": "删除艺术家文件夹", + "FormatAgeDay": "天", + "FormatAgeDays": "天", + "FormatAgeHour": "小时", + "FormatAgeHours": "小时", + "FormatAgeMinute": "分钟", + "FormatAgeMinutes": "分钟", + "FormatDateTimeRelative": "{relativeDay},{formattedDate} {formattedTime}", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}小时", + "FormatRuntimeMinutes": "{minutes}分", + "FormatShortTimeSpanHours": "{hours}小时", + "FormatTimeSpanDays": "{days}天 {time}", + "FormatShortTimeSpanMinutes": "{minutes}分钟", + "FormatShortTimeSpanSeconds": "{seconds}秒钟", + "MonitorAllAlbums": "全部专辑", + "MonitorFirstAlbum": "第一张专辑", + "MonitorFutureAlbums": "未来的专辑", + "MonitorLastestAlbum": "最新的专辑", + "MonitorMissingAlbums": "缺失的专辑", + "MonitorNoAlbums": "无", + "MonitorNoNewAlbums": "没有新专辑", + "Tomorrow": "明天", + "Yesterday": "昨天", + "ChangeCategoryMultipleHint": "将下载从下载客户端更改为“导入后类别”", + "ChangeCategoryHint": "将下载从下载客户端更改为“导入后类别”", + "OnArtistAdd": "在添加艺术家时", + "BlocklistAndSearch": "黑名单和搜索", + "BlocklistAndSearchHint": "列入黑名单后开始寻找一个替代版本", + "BlocklistAndSearchMultipleHint": "列入黑名单后开始搜索替代版本", + "BlocklistMultipleOnlyHint": "无需搜索替换的黑名单", + "BlocklistOnly": "仅限黑名单", + "BlocklistOnlyHint": "无需寻找替代版本的黑名单" } From 87f88af7eeda585a47a26b8ddd1fb2b25a3be0c2 Mon Sep 17 00:00:00 2001 From: bakerboy448 <55419169+bakerboy448@users.noreply.github.com> Date: Wed, 21 Feb 2024 17:01:40 -0600 Subject: [PATCH 044/491] Update name for errors with metadata API --- src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 444bbc204..726c383f6 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -233,7 +233,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook catch (WebException ex) { _logger.Warn(ex); - throw new SkyHookException("Search for '{0}' failed. Unable to communicate with SkyHook.", ex, title, ex.Message); + throw new SkyHookException("Search for '{0}' failed. Unable to communicate with LidarrAPI.", ex, title, ex.Message); } catch (Exception ex) { From 57926a61d27e0fbb02f7e1a3f90bfba71f3bd294 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 23 Feb 2024 20:18:29 +0200 Subject: [PATCH 045/491] Bump node to v20.x on builder --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 643fb6b54..59b034a78 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -16,7 +16,7 @@ variables: sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' dotnetVersion: '6.0.417' - nodeVersion: '16.X' + nodeVersion: '20.X' innoVersion: '6.2.0' windowsImage: 'windows-2022' linuxImage: 'ubuntu-20.04' From 3ff9b8bd8546e0260a9a1c3e37ba31d57ec58e71 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 29 Feb 2024 06:43:28 +0200 Subject: [PATCH 046/491] Bump version to 2.2.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 59b034a78..fbde1ee5e 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.2.0' + majorVersion: '2.2.1' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 022fbf864cc2c64b1204eaadf03490ab47432286 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 23 Feb 2024 05:30:37 +0200 Subject: [PATCH 047/491] Fixed: Selection of last added custom filter (cherry picked from commit 1f97679868012b70beecc553557e96e6c8bc80e3) Closes #4627 --- .../Filter/Builder/FilterBuilderModalContent.js | 11 +++++++---- .../Components/Filter/CustomFilters/CustomFilter.js | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 4 +++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js index d33f4d4fb..0c4a31657 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js @@ -1,3 +1,4 @@ +import { maxBy } from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import FormInputGroup from 'Components/Form/FormInputGroup'; @@ -50,7 +51,7 @@ class FilterBuilderModalContent extends Component { if (id) { dispatchSetFilter({ selectedFilterKey: id }); } else { - const last = customFilters[customFilters.length -1]; + const last = maxBy(customFilters, 'id'); dispatchSetFilter({ selectedFilterKey: last.id }); } @@ -108,7 +109,7 @@ class FilterBuilderModalContent extends Component { this.setState({ labelErrors: [ { - message: 'Label is required' + message: translate('LabelIsRequired') } ] }); @@ -146,7 +147,7 @@ class FilterBuilderModalContent extends Component { return ( - Custom Filter + {translate('CustomFilter')} @@ -166,7 +167,9 @@ class FilterBuilderModalContent extends Component { -
{translate('Filters')}
+
+ {translate('Filters')} +
{ diff --git a/frontend/src/Components/Filter/CustomFilters/CustomFilter.js b/frontend/src/Components/Filter/CustomFilters/CustomFilter.js index 7407f729a..9f378d5a2 100644 --- a/frontend/src/Components/Filter/CustomFilters/CustomFilter.js +++ b/frontend/src/Components/Filter/CustomFilters/CustomFilter.js @@ -37,8 +37,8 @@ class CustomFilter extends Component { dispatchSetFilter } = this.props; - // Assume that delete and then unmounting means the delete was successful. - // Moving this check to a ancestor would be more accurate, but would have + // Assume that delete and then unmounting means the deletion was successful. + // Moving this check to an ancestor would be more accurate, but would have // more boilerplate. if (this.state.isDeleting && id === selectedFilterKey) { dispatchSetFilter({ selectedFilterKey: 'all' }); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 520837a8f..b903ae491 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -245,6 +245,7 @@ "CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan", "CreateGroup": "Create group", "Custom": "Custom", + "CustomFilter": "Custom Filter", "CustomFilters": "Custom Filters", "CustomFormat": "Custom Format", "CustomFormatRequiredHelpText": "This {0} condition must match for the custom format to apply. Otherwise a single {0} match is sufficient.", @@ -482,8 +483,8 @@ "FormatAgeHours": "hours", "FormatAgeMinute": "minute", "FormatAgeMinutes": "minutes", - "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", "FormatRuntimeHours": "{hours}h", "FormatRuntimeMinutes": "{minutes}m", "FormatShortTimeSpanHours": "{hours} hour(s)", @@ -609,6 +610,7 @@ "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "It's easy to add a new artist, just start typing the name of the artist you want to add.", "KeyboardShortcuts": "Keyboard Shortcuts", "Label": "Label", + "LabelIsRequired": "Label is required", "Language": "Language", "Large": "Large", "LastAlbum": "Last Album", From d38c101acda907604db8349f66faf89d0f00b8cb Mon Sep 17 00:00:00 2001 From: "servarr[bot]" <68984020+servarr[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 03:33:37 +0200 Subject: [PATCH 048/491] Fixed: Multi-word genres in Auto Tags (#4601) (cherry picked from commit 5c4f82999368edfedd038a0a27d323e04b81a400) Co-authored-by: Mark McDowall --- frontend/src/Components/Form/TextTagInputConnector.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/Components/Form/TextTagInputConnector.js b/frontend/src/Components/Form/TextTagInputConnector.js index bd2d0c9d0..94ec481ea 100644 --- a/frontend/src/Components/Form/TextTagInputConnector.js +++ b/frontend/src/Components/Form/TextTagInputConnector.js @@ -77,6 +77,7 @@ class TextTagInputConnector extends Component { render() { return ( Date: Thu, 29 Feb 2024 02:16:46 +0200 Subject: [PATCH 049/491] New: Options button for Missing/Cutoff Unmet (cherry picked from commit 2773f77e1c4e3a8c8d01bcbea67333801c7840df) --- frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js | 11 +++++++++++ frontend/src/Wanted/Missing/Missing.js | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js b/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js index e13d6b539..6710118b1 100644 --- a/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js +++ b/frontend/src/Wanted/CutoffUnmet/CutoffUnmet.js @@ -12,6 +12,7 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; +import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper'; import TablePager from 'Components/Table/TablePager'; import { align, icons, kinds } from 'Helpers/Props'; import getFilterValue from 'Utilities/Filter/getFilterValue'; @@ -173,6 +174,16 @@ class CutoffUnmet extends Component { + + + + + + + + Date: Thu, 29 Feb 2024 02:35:49 +0200 Subject: [PATCH 050/491] Update caniuse-lite (cherry picked from commit 64f4365fe98b569efdf436710d5f56684f2aab66) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 870de8cae..abfd571f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2275,9 +2275,9 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== + version "1.0.30001591" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz" + integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== chalk@^1.1.3: version "1.1.3" From 98a90e2f8f6860253cd8a85434502231c43470f0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 26 Feb 2024 20:56:59 -0800 Subject: [PATCH 051/491] New: Bypass archived history for failed downloads in SABnzbd (cherry picked from commit c99d81e79ba5e6ecec01ddd942440d8a48a1c23b) --- .../Download/Clients/Sabnzbd/Sabnzbd.cs | 4 ++-- .../Download/Clients/Sabnzbd/SabnzbdProxy.cs | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs index dc788f9e4..eea96653e 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/Sabnzbd.cs @@ -203,11 +203,11 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd DeleteItemData(item); } - _proxy.RemoveFrom("history", item.DownloadId, deleteData, Settings); + _proxy.RemoveFromHistory(item.DownloadId, deleteData, item.Status == DownloadItemStatus.Failed, Settings); } else { - _proxy.RemoveFrom("queue", item.DownloadId, deleteData, Settings); + _proxy.RemoveFromQueue(item.DownloadId, deleteData, Settings); } } diff --git a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdProxy.cs b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdProxy.cs index 9afc0623e..ed40dc5fc 100644 --- a/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Sabnzbd/SabnzbdProxy.cs @@ -14,7 +14,8 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd { string GetBaseUrl(SabnzbdSettings settings, string relativePath = null); SabnzbdAddResponse DownloadNzb(byte[] nzbData, string filename, string category, int priority, SabnzbdSettings settings); - void RemoveFrom(string source, string id, bool deleteData, SabnzbdSettings settings); + void RemoveFromQueue(string id, bool deleteData, SabnzbdSettings settings); + void RemoveFromHistory(string id, bool deleteData, bool deletePermanently, SabnzbdSettings settings); string GetVersion(SabnzbdSettings settings); SabnzbdConfig GetConfig(SabnzbdSettings settings); SabnzbdFullStatus GetFullStatus(SabnzbdSettings settings); @@ -60,9 +61,9 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd return response; } - public void RemoveFrom(string source, string id, bool deleteData, SabnzbdSettings settings) + public void RemoveFromQueue(string id, bool deleteData, SabnzbdSettings settings) { - var request = BuildRequest(source, settings); + var request = BuildRequest("queue", settings); request.AddQueryParam("name", "delete"); request.AddQueryParam("del_files", deleteData ? 1 : 0); request.AddQueryParam("value", id); @@ -70,6 +71,17 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd ProcessRequest(request, settings); } + public void RemoveFromHistory(string id, bool deleteData, bool deletePermanently, SabnzbdSettings settings) + { + var request = BuildRequest("history", settings); + request.AddQueryParam("name", "delete"); + request.AddQueryParam("del_files", deleteData ? 1 : 0); + request.AddQueryParam("value", id); + request.AddQueryParam("archive", deletePermanently ? 0 : 1); + + ProcessRequest(request, settings); + } + public string GetVersion(SabnzbdSettings settings) { var request = BuildRequest("version", settings); From adecb7f73c05836c7bc2792738e625b28be620ba Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 1 Mar 2024 17:03:05 -0800 Subject: [PATCH 052/491] Increase migration timeout to 5 minutes (cherry picked from commit 086d3b5afaa7680d22835ca66da2afcb6dd5865e) --- .../Datastore/Migration/Framework/MigrationController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs index 8ef3b647a..992f2a26f 100644 --- a/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs +++ b/src/NzbDrone.Core/Datastore/Migration/Framework/MigrationController.cs @@ -53,7 +53,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework .Configure(opt => { opt.PreviewOnly = false; - opt.Timeout = TimeSpan.FromSeconds(60); + opt.Timeout = TimeSpan.FromMinutes(5); }) .Configure(cfg => { From 7e0c5e0da53a1edd8cdb914a46e69db52b548a5d Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 2 Mar 2024 01:33:45 +0000 Subject: [PATCH 053/491] 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 Co-authored-by: EDUYO Co-authored-by: Havok Dan Co-authored-by: Magyar Co-authored-by: Sadi A. Nogueira Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: wgwqd Co-authored-by: 闫锦彪 Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/hu/ 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/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/es.json | 53 +++++++------- src/NzbDrone.Core/Localization/Core/hu.json | 72 +++++++++++-------- src/NzbDrone.Core/Localization/Core/pt.json | 34 ++++++++- .../Localization/Core/pt_BR.json | 8 ++- src/NzbDrone.Core/Localization/Core/ru.json | 2 +- .../Localization/Core/zh_CN.json | 6 +- 6 files changed, 111 insertions(+), 64 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index a4ea18f86..123b56d74 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -69,15 +69,15 @@ "Mechanism": "Mecanismo", "MediaInfo": "Información de medios", "MetadataSettings": "Opciones de metadatos", - "MinimumAgeHelpText": "Sólo Usenet: Edad mínima en minutos de los NZB para ser descargados. Usa esto para dar a los nuevos lanzamientos tiempo de propagarse en tu proveedor de usenet.", - "MinimumFreeSpace": "Espacio Libre Mínimo", + "MinimumAgeHelpText": "Solo Usenet: Edad mínima en minutos de NZBs antes de que sean capturados. Usa esto para dar tiempo a los nuevos lanzamientos para propagarse a tu proveedor usenet.", + "MinimumFreeSpace": "Espacio libre mínimo", "MinimumFreeSpaceWhenImportingHelpText": "Evitar importación si dejase menos de esta cantidad en disco disponible", - "MinimumLimits": "Límites Mínimos", + "MinimumLimits": "Límites mínimos", "Missing": "Faltantes", - "MustNotContain": "No Debe Contener", + "MustNotContain": "No debe contener", "NoHistory": "Sin historia", - "NoLeaveIt": "No, Déjalo", - "NoLogFiles": "Sin archivos de registro", + "NoLeaveIt": "No, déjalo", + "NoLogFiles": "No hay archivos de registro", "OpenBrowserOnStart": "Abrir navegador al arrancar", "Options": "Opciones", "Original": "Original", @@ -404,17 +404,17 @@ "Medium": "Mediano", "Message": "Mensaje", "MIA": "MIA", - "MinimumAge": "Edad Mínima", + "MinimumAge": "Edad mínima", "Mode": "Modo", "Monitored": "Monitorizado", - "MoreInfo": "Más Información", - "MustContain": "Debe Contener", + "MoreInfo": "Más información", + "MustContain": "Debe contener", "Name": "Nombre", - "NamingSettings": "Ajustes de Renombrado", + "NamingSettings": "Opciones de nombrado", "New": "Nuevo", "NoBackupsAreAvailable": "No hay copias de seguridad disponibles", - "None": "Ninguna", - "NotificationTriggers": "Desencadenantes de Notificaciones", + "None": "Ninguno", + "NotificationTriggers": "Disparadores de notificación", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", "PortNumber": "Número de Puerto", "Reason": "Razón", @@ -519,10 +519,10 @@ "Library": "Biblioteca", "MediaManagement": "Gestión de medios", "Metadata": "Metadatos", - "MonitoredOnly": "Monitoreadas Solamente", + "MonitoredOnly": "Solo monitorizados", "Never": "Nunca", "NextExecution": "Siguiente ejecución", - "NoTagsHaveBeenAddedYet": "No se han añadido etiquetas todavía", + "NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún", "Ok": "Ok", "OnlyTorrent": "Solo Torrent", "OnlyUsenet": "Solo Usenet", @@ -562,7 +562,7 @@ "Location": "Ubicación", "Manual": "Manual", "MoveAutomatically": "Mover Automáticamente", - "MoveFiles": "Mover Archivos", + "MoveFiles": "Mover archivos", "Organize": "Organizar", "Warn": "Advertencia", "BeforeUpdate": "Antes de actualizar", @@ -610,7 +610,7 @@ "IncludeCustomFormatWhenRenamingHelpText": "Incluir en el formato de renombrado {Formatos Propios}", "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Es fácil añadir una película nueva, tan solo comienza a escribir el título de la que quieres añadir", "MinFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar", - "Monitor": "Monitorear", + "Monitor": "Monitorizar", "NegateHelpText": "Si se activa, el formato propio no se aplicará si esta condición {0} se iguala.", "ResetDefinitionTitlesHelpText": "Restablecer los títulos y valores de las definiciones", "ResetDefinitions": "Restablecer definiciones", @@ -679,20 +679,20 @@ "FailedToLoadQueue": "No se pudo cargar la cola", "BlocklistReleases": "Lista de bloqueos de lanzamientos", "DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", - "Negated": "Negado", + "Negated": "Anulado", "Required": "Necesario", "ResetQualityDefinitions": "Restablecer definiciones de calidad", "DownloadClientSortingCheckMessage": "El cliente de descarga {0} tiene activada la clasificación {1} para la categoría de {appName}. Debe desactivar la clasificación en su cliente de descarga para evitar problemas de importación.", "DeleteSelectedDownloadClients": "Borrar Cliente(s) de Descarga Seleccionado(s)", "DeleteSelectedIndexers": "Borrar indexer(s)", "No": "No", - "NoChange": "Sin Cambio", + "NoChange": "Sin cambio", "QueueIsEmpty": "La cola está vacía", "RemoveSelectedItemBlocklistMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?", "RemoveSelectedItems": "Eliminar los elementos seleccionados", "SetTags": "Poner Etiquetas", "Yes": "Sí", - "NoEventsFound": "No se encontraron eventos", + "NoEventsFound": "Ningún evento encontrado", "ResetTitlesHelpText": "Restablecer los títulos y valores de las definiciones", "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", "ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas", @@ -714,7 +714,7 @@ "SuggestTranslationChange": "Sugerir un cambio en la traducción", "UpdateSelected": "Actualizar Seleccionadas", "AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado", - "NoResultsFound": "No se han encontrado resultados", + "NoResultsFound": "Ningún resultado encontrado", "SomeResultsAreHiddenByTheAppliedFilter": "Algunos resultados están ocultos por el filtro aplicado", "EditSelectedIndexers": "Editar Indexadores Seleccionados", "DeleteCondition": "Eliminar Condición", @@ -774,7 +774,7 @@ "WriteMetadataToAudioFiles": "Escribir metadatos en archivos de audio", "ExpandAlbumByDefaultHelpText": "álbum", "AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no son compatibles directamente al usar el mecanismo de actualización de Docker. Deberás actualizar la imagen del contenedor fuera de {appName} o utilizar un script", - "NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores", + "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos", "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} libros descargados", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddImportList": "Añadir Lista de Importación", @@ -824,7 +824,6 @@ "Posters": "Carátulas", "Table": "Tabla", "AddAutoTag": "Añadir Etiqueta Automática", - "AddAutoTagError": "No se pudo añadir una nueva etiqueta automática, inténtelo de nuevo.", "AddCondition": "Añadir Condición", "AddConditionError": "No se pudo añadir una nueva condición, inténtelo de nuevo.", "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", @@ -978,7 +977,7 @@ "NoMissingItems": "No hay elementos faltantes", "ThereWasAnErrorLoadingThisItem": "Hubo un error cargando este elemento", "SearchForAllCutoffUnmetAlbumsConfirmationCount": "¿Estás seguro que quieres buscar los {totalRecords} episodios en Umbrales no alcanzados?", - "MonitoredStatus": "Monitoreado / Estado", + "MonitoredStatus": "Monitorizados/Estado", "RootFolderPathHelpText": "Los elementos de la lista de carpetas raíz se añadirán a", "ConnectSettingsSummary": "Notificaciones, conexiones a servidores/reproductores y scripts personalizados", "CustomFormatsSettings": "Configuración de formatos personalizados", @@ -997,5 +996,11 @@ "AutomaticSearch": "Búsqueda Automática", "Donate": "Donar", "MassSearchCancelWarning": "Esto no puede ser cancelado una vez empiece sin reiniciar {appName} o deshabilitar todos tus indexadores.", - "MediaManagementSettingsSummary": "Nombrado, opciones de gestión de archivos y carpetas raíz" + "MediaManagementSettingsSummary": "Nombrado, opciones de gestión de archivos y carpetas raíz", + "CustomFilter": "Filtros personalizados", + "LabelIsRequired": "Se requiere etiqueta", + "Monitoring": "Monitorizando", + "MonitoringOptions": "Opciones de monitorización", + "NoImportListsFound": "Ninguna lista de importación encontrada", + "AddAutoTagError": "No se pudo añadir una nueva etiqueta automática, por favor inténtalo de nuevo." } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index a3eaaaec1..a13d994f4 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -69,7 +69,7 @@ "LogLevel": "Napló szint", "Logs": "Naplók", "MIA": "MIA", - "ProxyType": "Proxy Típusa", + "ProxyType": "Proxy típus", "Mechanism": "Gépezet", "Message": "Üzenet", "MinimumLimits": "Minimális korlátok", @@ -89,17 +89,17 @@ "PortNumber": "Port száma", "Protocol": "Protokoll", "Proxy": "Proxy", - "ProxyBypassFilterHelpText": "Használja elválasztóként a ',' és a '*' karaktereket, az aldomainek helyettesítőjeként", + "ProxyBypassFilterHelpText": "Használja a ',' jelet elválasztóként és a '*' jelet. helyettesítő karakterként az aldomainekhez", "QualityDefinitions": "Minőségi meghatározások", - "QualitySettings": "Minőségi beállítások", + "QualitySettings": "Minőség Beállítások", "Queue": "Várakozási sor", "ReadTheWikiForMoreInformation": "További információkért olvassa el a Wikit", "Refresh": "Frissítés", "Reload": "Újratölt", - "RemoveFilter": "Szűrő törlése", + "RemoveFilter": "Szűrő Eltávolítás", "Reset": "Visszaállítás", "Restart": "Újrakezd", - "RestartNow": "Újraindítás Most", + "RestartNow": "Újraindítás most", "Restore": "Visszaállít", "RestoreBackup": "Biztonsági mentés visszaállítása", "Result": "Eredmények", @@ -155,10 +155,10 @@ "NoBackupsAreAvailable": "Nincsenek biztonsági mentések", "NoUpdatesAreAvailable": "Nem érhetők el frissítések", "PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma", - "ProxyPasswordHelpText": "Csak akkor kell megadnod felhasználónevet és jelszót, ha szükséges. Egyébként hagyd üresen.", - "ProxyUsernameHelpText": "Csak akkor kell megadnod felhasználónevet és jelszót, ha szükséges. Egyébként hagyd üresen.", - "RemovedFromTaskQueue": "Eltávolítva a feladatsorról", - "ResetAPIKey": "API Kulcs visszaállítása", + "ProxyPasswordHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", + "ProxyUsernameHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.", + "RemovedFromTaskQueue": "Eltávolítva a feladatsorból", + "ResetAPIKey": "API Kulcs Visszaállítása", "Scheduled": "Ütemezve", "SendAnonymousUsageData": "Névtelen használati adatok küldése", "StartTypingOrSelectAPathBelow": "Kezdd el gépelni, vagy válassz az alábbi útvonalak közül", @@ -307,16 +307,16 @@ "RecycleBinCleanupDaysHelpTextWarning": "A kiválasztott napoknál régebbi fájlok a lomtárban automatikusan törlésre kerülnek", "ReleaseStatuses": "Kiadások állapota", "RemotePath": "Távoli útvonal", - "RemoveCompletedDownloadsHelpText": "Távolítsa el az importált letöltéseket a letöltési kliens előzményeiből", + "RemoveCompletedDownloadsHelpText": "Távolítsa el az importált letöltéseket a letöltési ügyfélelőzményekből", "RenameTracks": "Számok átnevezése", "RenameTracksHelpText": "A {appName} a meglévő fájlnevet fogja használni, ha az átnevezés le van tiltva", "ReplaceIllegalCharactersHelpText": "Cserélje ki az illegális karaktereket. Ha nincs bejelölve, akkor a {appName} eltávolítja őket", "RescanAfterRefreshHelpTextWarning": "A {appName} nem érzékeli automatikusan a fájlok változását, ha nincs beállítva „Always”-re", "RootFolderPathHelpText": "A gyökérmappa listaelemei hozzáadódnak a mappához", - "RssSyncIntervalHelpText": "Intervallum percekben. A letiltáshoz állítsa nullára (ez megállítja az összes automatikus keresést)", + "RssSyncIntervalHelpText": "Intervallum percekben. A letiltáshoz állítsa nullára (ez leállítja az összes automatikus feloldást)", "ScrubAudioTagsHelpText": "Távolítsa el a meglévő címkéket a fájlokból, és csak azokat hagyja meg, amelyeket a {appName} adott hozzá.", "SecondaryAlbumTypes": "Másodlagos albumtípusok", - "SetPermissionsLinuxHelpText": "Futtatni kell a chmod-ot fájlok importálásakor / átnevezésekor?", + "SetPermissionsLinuxHelpText": "Futtatandó a chmod a fájlok importálásakor", "ShowBannersHelpText": "Bannerek megjelenítése nevek helyett", "ShowMonitoredHelpText": "A figyelt állapot megjelenítése a plakát alatt", "SkipFreeSpaceCheck": "Kihagyja a szabad hely ellenőrzését", @@ -439,15 +439,15 @@ "Path": "Útvonal", "PathHelpTextWarning": "Ennek különböznie kell attól a könyvtártól, ahová a letöltési kliens fájlokat tesz", "Permissions": "Engedélyek", - "PosterSize": "Poszter mérete", - "PreviewRename": "Előnézet átnevezése", + "PosterSize": "Poszter méret", + "PreviewRename": "Előnézet Átnevezés", "PreviewRetag": "Előnézet újrataggelése", "PrimaryAlbumTypes": "Elsődleges albumtípusok", "PrimaryTypes": "Elsődleges típusok", "Profiles": "Profil(ok)", "Proper": "Proper", "PropersAndRepacks": "Properek és Repackok", - "ProtocolHelpText": "Válasszd ki a használni kívánt protokoll(oka)t és melyiket részesíted előnyben, ha az egyébként egyforma kiadások közül választasz", + "ProtocolHelpText": "Válassza ki, melyik protokoll(oka)t használja, és melyiket részesíti előnyben, ha az egyébként egyenlő kiadások közül választ", "Reason": "Ok", "RecycleBinCleanupDaysHelpText": "Állítsd 0-ra az automatikus tisztítás letiltásához", "RecycleBinHelpText": "A zeneszámok törléskor ide kerülnek a végleges törlés helyett", @@ -466,18 +466,18 @@ "ReleaseWillBeProcessedInterp": "A kiadás feldolgozása {0}", "RemotePathMappings": "Távoli útvonal-leképezések", "Remove": "Eltávolítás", - "RemoveFailedDownloadsHelpText": "Távolítsa el a sikertelen letöltéseket a letöltési kliens előzményeiből", + "RemoveFailedDownloadsHelpText": "A sikertelen letöltések eltávolítása a letöltési ügyfélelőzményekből", "RemoveFromBlocklist": "Eltávolítás a feketelistáról", "RemoveFromDownloadClient": "Eltávolítás a Letöltési kliensből", "RemoveFromQueue": "Eltávolítás a sorból", - "RemoveSelected": "Kiválaszottak törlése", + "RemoveSelected": "A kiválasztott eltávolítása", "RemoveTagExistingTag": "Meglévő Címke", "RemoveTagRemovingTag": "Címke eltávolítása", "RestartLidarr": "{appName} újraindítása", - "RetentionHelpText": "Usenet: Állítsa nullára a korlátlan megőrzés beállításához", + "RetentionHelpText": "Csak Usenet: Állítsa nullára a korlátlan megőrzéshez", "RetryingDownloadOn": "A letöltés újrapróbálása {0} itt {1}", "RootFolder": "Gyökérmappa", - "RootFolders": "Gyökérmappák", + "RootFolders": "Gyökér mappák", "RSSSync": "RSS Szinkronizálás", "RSSSyncInterval": "RSS Szikronizálás Intervalluma", "ShowRelativeDatesHelpText": "Relatív (Ma / Tegnap / stb.) vagy valós dátumok megjelenítése", @@ -571,15 +571,15 @@ "QualityProfile": "Minőségi profil", "QualityProfiles": "Minőségi profilok", "Real": "Igaz", - "Reorder": "Átrendezés", - "ReplaceIllegalCharacters": "Az illegális karakterek cseréje", + "Reorder": "Újrarendelés", + "ReplaceIllegalCharacters": "Cserélje ki az illegális karaktereket", "RequiredHelpText": "A kiadásnak tartalmaznia kell legalább egy ilyen kifejezést (a kis- és nagybetűk nem számítanak)", "RequiredPlaceHolder": "Új korlátozás hozzáadása", "RequiresRestartToTakeEffect": "Újraindítás szükséges a hatálybalépéshez", "RescanAfterRefreshHelpText": "Az előadó frissítése után olvassa be újra az előadói mappát", "RescanArtistFolderAfterRefresh": "Frissítés után keresse újra az előadói mappát", - "ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?", - "SceneInformation": "Jelenet információ", + "ResetAPIKeyMessageText": "Biztosan visszaállítja API-kulcsát?", + "SceneInformation": "Jelenet Információ", "SceneNumberHasntBeenVerifiedYet": "A jelenet száma még nem lett ellenőrizve", "ScrubExistingTags": "Meglévő címkék törlése", "SearchAlbum": "Album keresése", @@ -634,7 +634,7 @@ "UiLanguageHelpText": "A {appName} által a felhasználói felülethez használt nyelv", "UiLanguageHelpTextWarning": "Böngésző újratöltése szükséges", "RemoveCompleted": "Eltávolítás kész", - "RemoveDownloadsAlert": "Az eltávolításhoz szükséges beállítások átkerültek a fenti táblázatban található egyéni letöltő beállítások közé.", + "RemoveDownloadsAlert": "Az Eltávolítási beállítások átkerültek a fenti táblázatban a Letöltési kliens egyéni beállításaiba.", "RemoveFailed": "Eltávolítás nem sikerült", "OnDownloadFailure": "Letöltési hiba esetén", "OnGrab": "Kiválasztás alatt", @@ -733,15 +733,15 @@ "PreferAndUpgrade": "Preferálás és frissítés", "PreferredProtocol": "Preferált protokoll", "Presets": "Előbeállítások", - "Progress": "Folyamat", + "Progress": "Előrehalad", "QualityLimitsHelpText": "A korlátozások automatikusan beállítódnak a film hossza szerint.", "Queued": "Sorban", "Rating": "Értékelés", "RejectionCount": "Elutasítások száma", - "ReleaseTitle": "Kiadás címe", + "ReleaseTitle": "Release kiadás", "Renamed": "Átnevezve", "Replace": "Kicserél", - "RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez", + "RestartRequiredHelpTextWarning": "Újraindítás szükséges az életbe lépéshez", "RestoreBackupAdditionalInfo": "Megjegyzés: A {appName} automatikusan újraindítja és újratölti a felületet a visszaállítási folyamatban.", "Save": "Mentés", "Seeders": "Seederek", @@ -860,7 +860,7 @@ "PreferUsenet": "Usenet preferálása", "ResetDefinitionTitlesHelpText": "A definíciócímek és értékek visszaállítása", "ResetDefinitions": "Definíciók visszaállítása", - "ResetTitles": "Címek visszaállítása", + "ResetTitles": "Címek Visszaállítása", "SpecificMonitoringOptionHelpText": "Monitorozza a szerzőket, de csak a listán kifejezetten szereplő könyveket", "UnableToLoadCustomFormats": "Nem lehet betölteni az egyéni formátumokat", "UnableToLoadInteractiveSearch": "Nem lehetséges betölteni a film keresés eredményeit. Próbálja meg később", @@ -926,7 +926,7 @@ "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", "BlocklistReleaseHelpText": "Megakadályozza, hogy a {appName} automatikusan letöltse újra", "FailedToLoadQueue": "Nem sikerült betölteni a várólistát", - "QueueIsEmpty": "A várakozási sor üres", + "QueueIsEmpty": "A sor üres", "BlocklistReleases": "Feketelista kiadása", "Negated": "Negatív", "NoHistoryBlocklist": "Nincs előzmény a tiltólistán", @@ -948,7 +948,7 @@ "RemovingTag": "Címke eltávolítása", "Yes": "Igen", "NoEventsFound": "Nem található események", - "ResetQualityDefinitions": "Állítsd vissza a minőségi meghatározásokat", + "ResetQualityDefinitions": "Minőségi meghatározások Visszaállítása", "ResetTitlesHelpText": "A definíciócímek és értékek visszaállítása", "ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához", "ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket", @@ -1104,5 +1104,15 @@ "BypassIfAboveCustomFormatScore": "Kihagyás, ha az egyéni formátum pontszáma felett van", "MinimumCustomFormatScoreHelpText": "Minimális egyéni formátum pontszám a preferált protokoll késleltetésének megkerüléséhez", "RemoveFromDownloadClientHint": "Távolítsa el a letöltést és a fájlokat) a letöltési kliensből", - "RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből." + "RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből.", + "RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt](https://www.regular-expressions.info/tutorial.html).", + "QueueFilterHasNoItems": "A kiválasztott sorszűrőben nincsenek elemek", + "PosterOptions": "Poszter opciók", + "Posters": "Poszterek", + "PreferredSize": "Preferált méret", + "QualitySettingsSummary": "Minőségi méretek és elnevezések", + "RenameFiles": "Fájlok átnevezése", + "RemoveTagsAutomatically": "Címkék automatikus eltávolítása", + "RemoveTagsAutomaticallyHelpText": "Ha a feltételek nem teljesülnek, automatikusan távolítsa el a címkéket", + "PasswordConfirmation": "Jelszó megerősítése" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index c850cff50..588f67cb7 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -843,7 +843,7 @@ "AutoTaggingNegateHelpText": "Se marcada, a regra de etiqueta automática não será aplicada se esta condição {implementationName} corresponder.", "AddAutoTag": "Adicionar Etiqueta Automática", "RenameFiles": "Renomear ficheiros", - "AddAutoTagError": "Não foi possível adicionar uma nova etiqueta automática, tente novamente.", + "AddAutoTagError": "Não foi possível adicionar uma nova tag automática. Por favor, tente novamente.", "AddCondition": "Adicionar Condição", "AddConditionError": "Não foi possível adicionar uma nova condição, tente novamente.", "AddImportListExclusionArtistHelpText": "Impedir série de ser adicionada ao {appName} através de listas", @@ -910,5 +910,35 @@ "QualitySettingsSummary": "Tamanhos de qualidade e nomenclatura", "TagsSettingsSummary": "Ver todas as etiquetas e como são utilizadas. Etiquetas não utilizadas podem ser removidas", "ArtistIndexFooterDownloading": "Transferindo", - "AutomaticSearch": "Pesquisa automática" + "AutomaticSearch": "Pesquisa automática", + "AlbumRelease": "Lançamento do Álbum", + "AlbumReleaseDate": "Data de Lançamento do Álbum", + "AlbumStatus": "status do álbum", + "AllMonitoringOptionHelpText": "Monitore artistas e todos os álbuns de cada artista incluído na lista de importação", + "AddNewAlbum": "Adicionar", + "AddNewArtist": "Adicionar um novo Artista", + "AlbumCount": "Contagem de álbuns", + "AllAlbumsData": "Monitore todos os álbuns, exceto especiais", + "AllArtistAlbums": "Todos os Álbuns de Artistas", + "AllExpandedExpandAll": "Expandir Tudo", + "AllowFingerprintingHelpText": "Use impressões digitais para melhorar a precisão da correspondência de faixas", + "AnyReleaseOkHelpText": "{appName} mudará automaticamente para a faixa baixada com melhor correspondência", + "ArtistClickToChangeAlbum": "Clique para mudar de álbum", + "AlbumType": "Tipo de Álbum", + "AlbumTitle": "Título do álbum", + "AreYouSure": "Você tem certeza?", + "AllowFingerprinting": "Permitir impressão digital", + "AddAlbumWithTitle": "Adicionar", + "AddArtistWithName": "Adicionar", + "AddNewAlbumSearchForNewAlbum": "Iniciar busca por novo álbum", + "AlbumDetails": "Detalhes do álbum", + "AlbumHasNotAired": "Álbum não lançado", + "AlbumIsNotMonitored": "O álbum não é monitorado", + "AlbumStudio": "Estúdio do Álbum", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} trilhas baixadas", + "AllAlbums": "Todos os Álbuns", + "AnchorTooltip": "Este arquivo já está na sua biblioteca para uma versão que você está importando no momento", + "ArtistFolderFormat": "Formato da pasta do artista", + "AlbumIsDownloading": "O álbum está sendo baixado", + "AlbumStudioTruncated": "Apenas os últimos 20 álbuns são mostrados, acesse os detalhes para ver todos os álbuns" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 962a7e684..22025dfdf 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1154,8 +1154,8 @@ "AutoRedownloadFailedFromInteractiveSearch": "Falha no Novo Download da Pesquisa Interativa", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Procure e tente baixar automaticamente uma versão diferente quando a versão com falha for obtida da pesquisa interativa", "DownloadClientAriaSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Aria2", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Torrent com Hashes na Lista de Bloqueio Enquanto Capturando", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Hashes de Torrent Bloqueados Durante a Captura", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.", "TrackFileDeletedTooltip": "Arquivo da faixa excluído", "TrackFileMissingTooltip": "Arquivo da faixa ausente", "TrackFileRenamedTooltip": "Arquivo da faixa renomeado", @@ -1243,5 +1243,7 @@ "FormatShortTimeSpanMinutes": "{minutes} minuto(s)", "MonitorAllAlbums": "Todos os Álbuns", "MonitorMissingAlbums": "Álbuns Ausentes", - "Tomorrow": "Amanhã" + "Tomorrow": "Amanhã", + "CustomFilter": "Filtro Personalizado", + "LabelIsRequired": "Rótulo é requerido" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 0e8569ff8..9c7690b1e 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -445,7 +445,7 @@ "45MinutesFourtyFive": "60 минут: {0}", "60MinutesSixty": "60 минут: {0}", "APIKey": "API ключ", - "About": "Подробности", + "About": "Об", "AgeWhenGrabbed": "Возраст (когда захвачен)", "AlbumIsDownloadingInterp": "Фильм скачивается - {0}% {1}", "AlreadyInYourLibrary": "Уже в вашей библиотеке", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index cc2e72136..9b10d8089 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -170,7 +170,7 @@ "Automatic": "自动化", "AlreadyInYourLibrary": "已经在你的库中", "Actions": "动作", - "AddListExclusion": "添加列表例外", + "AddListExclusion": "新增 列表", "MinimumAge": "最低间隔", "MinimumFreeSpaceWhenImportingHelpText": "如果导入的磁盘空间不足,则禁止导入", "Absolute": "绝对", @@ -1104,8 +1104,8 @@ "RenameFiles": "重命名文件", "AutoTagging": "自动标记", "AutoTaggingLoadError": "无法加载自动标记", - "AutoTaggingNegateHelpText": "如果选中,当 {implementationName} 条件匹配时,自动标记不会应用。", - "AutoTaggingRequiredHelpText": "此 {implementationName} 条件必须匹配才能应用自动标记规则。否则,一个 {implementationName} 匹配就足够了。", + "AutoTaggingNegateHelpText": "如果选中,当 {0} 条件匹配时,自动标记不会应用。", + "AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。", "CloneAutoTag": "复制自动标签", "Connection": "连接", "DeleteArtistFolderCountConfirmation": "确定要删除选定的 {count} 个的网站吗?", From 2c19b5aa61dfb146fbe0b295d0c2fe8ecc1d9e97 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 2 Mar 2024 09:19:32 +0200 Subject: [PATCH 054/491] Ignore spotify mapping test more temporarily --- .../ImportListTests/Spotify/SpotifyMappingFixture.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs index 224b21148..f6da386f3 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs @@ -80,6 +80,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] + [Ignore("Pending mapping fixes", Until = "2024-03-20 00:00:00Z")] public void map_artist_should_work() { UseRealHttp(); @@ -158,7 +159,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - [Ignore("Pending mapping fixes", Until = "2024-02-20 00:00:00Z")] + [Ignore("Pending mapping fixes", Until = "2024-03-20 00:00:00Z")] public void map_album_should_work() { UseRealHttp(); From 0ca0f68af1786c726af06b16462b25c29b33df6a Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 3 Mar 2024 00:29:54 +0000 Subject: [PATCH 055/491] 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: GkhnGRBZ Co-authored-by: Nicolò Castagnola Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/it.json | 1 - src/NzbDrone.Core/Localization/Core/tr.json | 71 ++++++++++++++++----- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 85c3dc328..5116bc12a 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -7,7 +7,6 @@ "60MinutesSixty": "60 Minuti: {0}", "APIKey": "Chiavi API", "Absolute": "Assoluto", - "AddListExclusion": "Aggiungi Lista Esclusioni", "AddMissing": "Aggiungi ai mancanti", "AddNewItem": "Aggiungi Nuovo Elemento", "AddingTag": "Aggiungendo etichetta", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index ef22d638c..487145c64 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -31,7 +31,7 @@ "60MinutesSixty": "60 Dakika: {0}", "APIKey": "API Anahtarı", "About": "Hakkında", - "AddListExclusion": "Liste Hariç Tutma Ekle", + "AddListExclusion": "Hariç Tutma Listesine Ekle", "AddingTag": "Etiket ekleniyor", "AgeWhenGrabbed": "Yaş (yakalandığında)", "AlbumIsDownloadingInterp": "Film indiriliyor - {0}% {1}", @@ -76,7 +76,7 @@ "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", "Backups": "Yedeklemeler", "BindAddress": "Bağlama Adresi", - "BindAddressHelpText": "Tüm arayüzler için geçerli IP4 adresi veya '*'", + "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", "BindAddressHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "Blocklist": "Kara liste", "BlocklistRelease": "Kara Liste Yayını", @@ -84,10 +84,10 @@ "BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla", "Calendar": "Takvim", "CalendarWeekColumnHeaderHelpText": "Aktif görünüm hafta olduğunda her bir sütunun üzerinde gösterilir", - "Cancel": "İptal etmek", + "Cancel": "Vazgeç", "CancelMessageText": "Bu bekleyen görevi iptal etmek istediğinizden emin misiniz?", "CertificateValidation": "Sertifika Doğrulama", - "CertificateValidationHelpText": "HTTPS sertifika doğrulamasının ne kadar katı olduğunu değiştirin", + "CertificateValidationHelpText": "HTTPS sertifika doğrulamasının sıkılığını değiştirin. Riskleri anlamadığınız sürece değişmeyin.", "ChangeFileDate": "Dosya Tarihini Değiştir", "ChangeHasNotBeenSavedYet": "Değişiklik henüz kaydedilmedi", "ChmodFolder": "chmod Klasörü", @@ -436,7 +436,7 @@ "UnableToLoadReleaseProfiles": "Gecikme Profilleri yüklenemiyor", "UnableToLoadRemotePathMappings": "Uzak Yol Eşlemeleri yüklenemiyor", "Updates": "Güncellemeler", - "AppDataDirectory": "AppData dizini", + "AppDataDirectory": "Uygulama Veri Dizini", "20MinutesTwenty": "60 Dakika: {0}", "Automatic": "Otomatik", "DelayingDownloadUntil": "İndirme işlemi {0} saat {1} itibarıyla erteleniyor", @@ -629,7 +629,7 @@ "FailedToLoadQueue": "Sıra yüklenemedi", "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", - "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri temizlemek için hiçbir etiket girmeyin)", + "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", "RemoveSelectedItemQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", "RemoveSelectedItemsQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", "SetTags": "Etiketleri Ayarla", @@ -648,9 +648,9 @@ "RemoveSelectedItemBlocklistMessageText": "Kara listeden seçili öğeleri kaldırmak istediğinizden emin misiniz?", "RemovingTag": "Etiket kaldırılıyor", "ApplyTagsHelpTextHowToApplyArtists": "Seçilen filmlere etiketler nasıl uygulanır", - "ApplyTagsHelpTextHowToApplyImportLists": "Seçilen filmlere etiketler nasıl uygulanır", - "ApplyTagsHelpTextHowToApplyIndexers": "Seçilen filmlere etiketler nasıl uygulanır", - "ApplyTagsHelpTextHowToApplyDownloadClients": "Seçilen filmlere etiketler nasıl uygulanır", + "ApplyTagsHelpTextHowToApplyImportLists": "Seçilen içe aktarma listelerine etiketler nasıl uygulanır?", + "ApplyTagsHelpTextHowToApplyIndexers": "Seçilen indeksleyicilere etiketler nasıl uygulanır?", + "ApplyTagsHelpTextHowToApplyDownloadClients": "Seçilen indirme istemcilerine etiketler nasıl uygulanır?", "NoResultsFound": "Sonuç bulunamadı", "SuggestTranslationChange": "Çeviri değişikliği önerin", "UpdateSelected": "Seçilmişleri güncelle", @@ -661,7 +661,7 @@ "WhatsNew": "Ne var ne yok?", "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", - "ConnectionLostReconnect": "Radarr otomatik olarak bağlanmayı deneyecek veya aşağıdan yeniden yükle'yi tıklayabilirsiniz.", + "ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz.", "MetadataProfile": "üstveri profili", "Episode": "bölüm", "Enabled": "Etkin", @@ -699,8 +699,8 @@ "AlbumsLoadError": "Yedeklemeler yüklenemiyor", "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", "DeleteSpecificationHelpText": "Kalite profilini silmek istediğinizden emin misiniz {0}", - "AutoTaggingNegateHelpText": "İşaretlenirse, bu {0} koşulu eşleşirse özel biçim uygulanmaz.", - "ConditionUsingRegularExpressions": "Bu koşul, Normal İfadeler kullanılarak eşleşir. {0} karakterlerinin özel anlamları olduğunu ve {1} ile çıkış yapılması gerektiğini unutmayın.", + "AutoTaggingNegateHelpText": "İşaretlenirse, {implementationName} koşulu eşleştiğinde otomatik etiketleme kuralı uygulanmayacaktır.", + "ConditionUsingRegularExpressions": "Bu koşul Normal İfadeler kullanılarak eşleşir. `\\^$.|?*+()[{` karakterlerinin özel anlamlara sahip olduğunu ve `\\` ile kaçılması gerektiğini unutmayın.", "Connection": "Bağlantılar", "RenameFiles": "Yeniden Adlandır", "Small": "Küçük", @@ -719,7 +719,7 @@ "Unlimited": "Sınırsız", "IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et", "RemoveQueueItemConfirmation": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", - "AutoRedownloadFailed": "Yükleme başarısız", + "AutoRedownloadFailed": "Yeniden İndirme Başarısız", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", "AddImportList": "İçe Aktarım Listesi Ekle", "AddReleaseProfile": "Sürüm Profili Ekle", @@ -737,7 +737,7 @@ "Uppercase": "Büyük Harf", "TagsSettingsSummary": "Tüm etiketleri ve nasıl kullanıldıklarını göster. Kullanılmayan etiketler kaldırılabilinir", "UiSettingsSummary": "Takvim, tarih ve renk engelli seçenekler", - "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut kodları", + "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları", "CustomFormatsSettings": "Özel Biçim Ayarları", "CustomFormatsSettingsSummary": "Özel Biçimler ve Ayarlar", "DownloadClientsSettingsSummary": "İstemcileri indirin, indirme işlemlerini ve uzak yol haritalarını indirin", @@ -746,5 +746,46 @@ "QualitySettingsSummary": "Kalite boyutları ve adlandırma", "ArtistIndexFooterDownloading": "İndiriliyor", "AutomaticSearch": "Otomatik Arama", - "Links": "Bağlantılar" + "Links": "Bağlantılar", + "AppUpdated": "{appName} Güncellendi", + "AppUpdatedVersion": "{appName}, `{version}` sürümüne güncellendi; en son değişikliklerin etkin olabilmesi için {appName} uygulamasını yeniden başlatmanız gerekli", + "ConnectionLostToBackend": "{appName}'ın arka uçla bağlantısı kesildi ve işlevselliğin geri kazanılması için yeniden yüklenmesi gerekecek.", + "ApplyChanges": "Değişiklikleri Uygula", + "CustomFilter": "Özel Filtre", + "CustomFormatsSpecificationRegularExpression": "Düzenli ifade", + "CustomFormatsSpecificationRegularExpressionHelpText": "Özel Format RegEx Büyük/Küçük Harfe Duyarsızdır", + "AutomaticUpdatesDisabledDocker": "Docker güncelleme mekanizması kullanıldığında otomatik güncellemeler doğrudan desteklenmez. Kapsayıcı görüntüsünü {appName} dışında güncellemeniz veya bir komut dosyası kullanmanız gerekecek", + "ApplicationURL": "Uygulama URL'si", + "ApplicationUrlHelpText": "Bu uygulamanın http(s)://, bağlantı noktası ve URL tabanını içeren harici URL'si", + "AuthenticationRequiredPasswordHelpTextWarning": "Yeni şifre girin", + "ChangeCategory": "Kategoriyi Değiştir", + "ChangeCategoryHint": "İndirme İstemcisi'nden indirme işlemini 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir", + "Auto": "Otomatik", + "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Yeni şifreyi onayla", + "AuthenticationRequiredUsernameHelpTextWarning": "Yeni kullanıcı adınızı girin", + "AuthenticationRequiredWarning": "Kimlik doğrulaması olmadan uzaktan erişimi engellemek için, {appName}'da artık kimlik doğrulamanın etkinleştirilmesini gerektiriyor. İsteğe bağlı olarak yerel adresler için kimlik doğrulamayı devre dışı bırakabilirsiniz.", + "AutoTagging": "Otomatik Etiketleme", + "AutoTaggingLoadError": "Otomatik etiketleme yüklenemiyor", + "AuthenticationMethod": "Kimlik Doğrulama Yöntemi", + "AuthenticationMethodHelpTextWarning": "Lütfen geçerli bir kimlik doğrulama yöntemi seçin", + "AuthenticationRequired": "Kimlik Doğrulama Gerekli", + "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", + "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", + "BlocklistAndSearchHint": "Engellenenler listesine ekledikten sonra yenisini aramaya başlayın", + "BlocklistAndSearchMultipleHint": "Engellenenler listesine ekledikten sonra yedekleri aramaya başlayın", + "BlocklistMultipleOnlyHint": "Yedekleri aramadan engelleme listesi", + "BlocklistOnly": "Yalnızca Engellenenler Listesi", + "BlocklistOnlyHint": "Yenisini aramadan engelleme listesi", + "ChangeCategoryMultipleHint": "İndirme istemcisinden indirmeleri 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir", + "ChownGroup": "Chown Grubu", + "ClearBlocklist": "Engellenenler listesini temizle", + "ClearBlocklistMessageText": "Engellenenler listesindeki tüm öğeleri temizlemek istediğinizden emin misiniz?", + "ClickToChangeReleaseGroup": "Sürüm grubunu değiştirmek için tıklayın", + "Clone": "Klon", + "CloneAutoTag": "Otomatik Etiketi Klonla", + "CloneCondition": "Klon Durumu" } From 475590a21bf2d09b06e9cfce25b44f695e08f8ed Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Mar 2024 13:11:33 +0200 Subject: [PATCH 056/491] Bump version to 2.2.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fbde1ee5e..98d9d1513 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.2.1' + majorVersion: '2.2.2' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From cea5ee503fcb64895d21623d38dfe522e6975f7c Mon Sep 17 00:00:00 2001 From: nopoz Date: Sat, 2 Mar 2024 21:22:03 -0800 Subject: [PATCH 057/491] New: Add download directory & move completed for Deluge (cherry picked from commit 07bd159436935a7adb87ae1b6924a4d42d719b0f) --- .../Download/Clients/Deluge/DelugeProxy.cs | 38 +++++++++++++++---- .../Download/Clients/Deluge/DelugeSettings.cs | 6 +++ src/NzbDrone.Core/Localization/Core/en.json | 4 ++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs index 4b012efa0..e6071fb53 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.Dynamic; using System.Linq; using System.Net; using Newtonsoft.Json.Linq; using NLog; using NzbDrone.Common.Cache; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; @@ -101,11 +103,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings) { - var options = new + dynamic options = new ExpandoObject(); + + options.add_paused = settings.AddPaused; + options.remove_at_ratio = false; + + if (settings.DownloadDirectory.IsNotNullOrWhiteSpace()) { - add_paused = settings.AddPaused, - remove_at_ratio = false - }; + options.download_location = settings.DownloadDirectory; + } + + if (settings.CompletedDirectory.IsNotNullOrWhiteSpace()) + { + options.move_completed_path = settings.CompletedDirectory; + options.move_completed = true; + } var response = ProcessRequest(settings, "core.add_torrent_magnet", magnetLink, options); @@ -114,11 +126,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge public string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings) { - var options = new + dynamic options = new ExpandoObject(); + + options.add_paused = settings.AddPaused; + options.remove_at_ratio = false; + + if (settings.DownloadDirectory.IsNotNullOrWhiteSpace()) { - add_paused = settings.AddPaused, - remove_at_ratio = false - }; + options.download_location = settings.DownloadDirectory; + } + + if (settings.CompletedDirectory.IsNotNullOrWhiteSpace()) + { + options.move_completed_path = settings.CompletedDirectory; + options.move_completed = true; + } var response = ProcessRequest(settings, "core.add_torrent_file", filename, fileContent, options); return response; diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs index 42d579d8d..058654854 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeSettings.cs @@ -59,6 +59,12 @@ namespace NzbDrone.Core.Download.Clients.Deluge [FieldDefinition(9, Label = "Add Paused", Type = FieldType.Checkbox)] public bool AddPaused { get; set; } + [FieldDefinition(10, Label = "DownloadClientDelugeSettingsDirectory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryHelpText")] + public string DownloadDirectory { get; set; } + + [FieldDefinition(11, Label = "DownloadClientDelugeSettingsDirectoryCompleted", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryCompletedHelpText")] + public string CompletedDirectory { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index b903ae491..077e7e289 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -362,6 +362,10 @@ "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", + "DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optional location to move completed downloads to, leave blank to use the default Deluge location", + "DownloadClientDelugeSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Deluge location", "DownloadClientPriorityHelpText": "Download Client Priority from 1 (Highest) to 50 (Lowest). Default: 1. Round-Robin is used for clients with the same priority.", "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+)", From 33b12a532c8483a61a5de9d9ec77c9269ab643d3 Mon Sep 17 00:00:00 2001 From: Louis R Date: Sun, 3 Mar 2024 06:20:36 +0100 Subject: [PATCH 058/491] Fixed: Don't disable IPv6 in IPv6-only Environment (cherry picked from commit 13af6f57796e54c3949cf340e03f020e6f8575c4) --- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index e3459f985..756e3f08e 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -1,7 +1,9 @@ using System; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; +using System.Net.NetworkInformation; using System.Net.Security; using System.Net.Sockets; using System.Text; @@ -249,6 +251,18 @@ namespace NzbDrone.Common.Http.Dispatchers return _credentialCache.Get("credentialCache", () => new CredentialCache()); } + private static bool HasRoutableIPv4Address() + { + // Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + + return networkInterfaces.Any(ni => + ni.OperationalStatus == OperationalStatus.Up && + ni.GetIPProperties().UnicastAddresses.Any(ip => + ip.Address.AddressFamily == AddressFamily.InterNetwork && + !IPAddress.IsLoopback(ip.Address))); + } + private static async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) { // Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way. @@ -272,10 +286,8 @@ namespace NzbDrone.Common.Http.Dispatchers } catch { - // very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt. - // note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance) - // but in the interest of keeping this implementation simple, this is acceptable. - useIPv6 = false; + // Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections. + useIPv6 = !HasRoutableIPv4Address(); } finally { From fb1b7274d029dff5e87a58c57cb1858f38447bda Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 1 Mar 2024 23:24:47 -0800 Subject: [PATCH 059/491] Queue Manual Import commands at high priority (cherry picked from commit 64c6a8879beb1b17122c8f6f74bf7b3cf4dd1570) --- src/Lidarr.Api.V1/Commands/CommandController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Lidarr.Api.V1/Commands/CommandController.cs b/src/Lidarr.Api.V1/Commands/CommandController.cs index b8d39152a..8d5a44389 100644 --- a/src/Lidarr.Api.V1/Commands/CommandController.cs +++ b/src/Lidarr.Api.V1/Commands/CommandController.cs @@ -11,6 +11,7 @@ using NzbDrone.Common.Composition; using NzbDrone.Common.Serializer; using NzbDrone.Common.TPL; using NzbDrone.Core.Datastore.Events; +using NzbDrone.Core.MediaFiles.TrackImport.Manual; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.ProgressMessaging; @@ -61,6 +62,9 @@ namespace Lidarr.Api.V1.Commands using (var reader = new StreamReader(Request.Body)) { var body = reader.ReadToEnd(); + var priority = commandType == typeof(ManualImportCommand) + ? CommandPriority.High + : CommandPriority.Normal; dynamic command = STJson.Deserialize(body, commandType); @@ -69,7 +73,8 @@ namespace Lidarr.Api.V1.Commands command.SendUpdatesToClient = true; command.ClientUserAgent = Request.Headers["UserAgent"]; - var trackedCommand = _commandQueueManager.Push(command, CommandPriority.Normal, CommandTrigger.Manual); + var trackedCommand = _commandQueueManager.Push(command, priority, CommandTrigger.Manual); + return Created(trackedCommand.Id); } } From f6529d5ad3059a6bd1f4430cec47d257ec0e0bc7 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 27 Feb 2024 21:03:35 -0800 Subject: [PATCH 060/491] New: URL Base setting for Media Server connections Plus some translations (cherry picked from commit 9fd193d2a82d5c2cdc0f36c1f984e4b6b68aaa8d) --- src/NzbDrone.Core/Localization/Core/en.json | 21 ++++++++++++++++++ .../MediaBrowser/MediaBrowserService.cs | 2 +- .../MediaBrowser/MediaBrowserSettings.cs | 17 +++++++++----- .../Plex/Server/PlexServerProxy.cs | 2 +- .../Plex/Server/PlexServerSettings.cs | 20 ++++++++++++----- .../Notifications/Xbmc/XbmcSettings.cs | 22 ++++++++++++------- 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 077e7e289..ff5d7380b 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -225,6 +225,7 @@ "ConnectionLost": "Connection Lost", "ConnectionLostReconnect": "{appName} will try to connect automatically, or you can click reload below.", "ConnectionLostToBackend": "{appName} has lost its connection to the backend and will need to be reloaded to restore functionality.", + "ConnectionSettingsUrlBaseHelpText": "Adds a prefix to the {connectionName} url, such as {url}", "Connections": "Connections", "Continuing": "Continuing", "ContinuingAllTracksDownloaded": "Continuing (All tracks downloaded)", @@ -771,6 +772,25 @@ "NotificationStatusAllClientHealthCheckMessage": "All notifications are unavailable due to failures", "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {0}", "NotificationTriggers": "Notification Triggers", + "NotificationsEmbySettingsSendNotifications": "Send Notifications", + "NotificationsEmbySettingsSendNotificationsHelpText": "Have MediaBrowser send notifications to configured providers", + "NotificationsEmbySettingsUpdateLibraryHelpText": "Update Library on Import, Rename, or Delete?", + "NotificationsKodiSettingAlwaysUpdate": "Always Update", + "NotificationsKodiSettingAlwaysUpdateHelpText": "Update library even when a video is playing?", + "NotificationsKodiSettingsCleanLibrary": "Clean Library", + "NotificationsKodiSettingsCleanLibraryHelpText": "Clean library after update", + "NotificationsKodiSettingsDisplayTime": "Display Time", + "NotificationsKodiSettingsDisplayTimeHelpText": "How long the notification will be displayed for (In seconds)", + "NotificationsKodiSettingsGuiNotification": "GUI Notification", + "NotificationsKodiSettingsUpdateLibraryHelpText": "Update library on Import & Rename?", + "NotificationsPlexSettingsAuthToken": "Auth Token", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "Authenticate with Plex.tv", + "NotificationsSettingsUpdateLibrary": "Update Library", + "NotificationsSettingsUpdateMapPathsFrom": "Map Paths From", + "NotificationsSettingsUpdateMapPathsFromHelpText": "{appName} path, used to modify series paths when {serviceName} sees library path location differently from {appName} (Requires 'Update Library')", + "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", "Ok": "Ok", "OnAlbumDelete": "On Album Delete", "OnApplicationUpdate": "On Application Update", @@ -1228,6 +1248,7 @@ "UrlBaseHelpTextWarning": "Requires restart to take effect", "UseHardlinksInsteadOfCopy": "Use Hardlinks instead of Copy", "UseProxy": "Use Proxy", + "UseSsl": "Use SSL", "Usenet": "Usenet", "UsenetDelay": "Usenet Delay", "UsenetDelayHelpText": "Delay in minutes to wait before grabbing a release from Usenet", diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserService.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserService.cs index 8a7216411..3d92d5c18 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserService.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserService.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Notifications.Emby { try { - _logger.Debug("Testing connection to MediaBrowser: {0}", settings.Address); + _logger.Debug("Testing connection to Emby/Jellyfin : {0}", settings.Address); Notify(settings, "Test from Lidarr", "Success! MediaBrowser has been successfully configured!"); } diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserSettings.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserSettings.cs index add572239..a3f344516 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserSettings.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserSettings.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.Notifications.Emby { RuleFor(c => c.Host).ValidHost(); RuleFor(c => c.ApiKey).NotEmpty(); + RuleFor(c => c.UrlBase).ValidUrlBase(); } } @@ -31,20 +32,26 @@ namespace NzbDrone.Core.Notifications.Emby [FieldDefinition(1, Label = "Port")] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Connect to Emby over HTTPS instead of HTTP")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "NotificationsSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Emby/Jellyfin")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "API Key", Privacy = PrivacyLevel.ApiKey)] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Emby/Jellyfin")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/mediabrowser")] + public string UrlBase { get; set; } + + [FieldDefinition(4, Label = "ApiKey", Privacy = PrivacyLevel.ApiKey)] public string ApiKey { get; set; } - [FieldDefinition(4, Label = "Send Notifications", HelpText = "Have MediaBrowser send notifications to configured providers", Type = FieldType.Checkbox)] + [FieldDefinition(5, Label = "NotificationsEmbySettingsSendNotifications", HelpText = "NotificationsEmbySettingsSendNotificationsHelpText", Type = FieldType.Checkbox)] public bool Notify { get; set; } - [FieldDefinition(5, Label = "Update Library", HelpText = "Update Library on Import, Rename, & Delete?", Type = FieldType.Checkbox)] + [FieldDefinition(6, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsEmbySettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)] public bool UpdateLibrary { get; set; } [JsonIgnore] - public string Address => $"{Host.ToUrlHost()}:{Port}"; + public string Address => $"{Host.ToUrlHost()}:{Port}{UrlBase}"; public bool IsValid => !string.IsNullOrWhiteSpace(Host) && Port > 0; diff --git a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerProxy.cs b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerProxy.cs index cceed18b7..53d14012d 100644 --- a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerProxy.cs +++ b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerProxy.cs @@ -94,7 +94,7 @@ namespace NzbDrone.Core.Notifications.Plex.Server { var scheme = settings.UseSsl ? "https" : "http"; - var requestBuilder = new HttpRequestBuilder($"{scheme}://{settings.Host.ToUrlHost()}:{settings.Port}") + var requestBuilder = new HttpRequestBuilder($"{scheme}://{settings.Host.ToUrlHost()}:{settings.Port}{settings.UrlBase}") .Accept(HttpAccept.Json) .AddQueryParam("X-Plex-Client-Identifier", _configService.PlexClientIdentifier) .AddQueryParam("X-Plex-Product", BuildInfo.AppName) diff --git a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerSettings.cs b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerSettings.cs index 6d125168d..de76f9eef 100644 --- a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerSettings.cs +++ b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServerSettings.cs @@ -34,22 +34,30 @@ namespace NzbDrone.Core.Notifications.Plex.Server [FieldDefinition(1, Label = "Port")] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Connect to Plex over HTTPS instead of HTTP")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "NotificationsSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Plex")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Auth Token", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, Advanced = true)] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Plex")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/plex")] + public string UrlBase { get; set; } + + [FieldDefinition(4, Label = "NotificationsPlexSettingsAuthToken", Type = FieldType.Textbox, Privacy = PrivacyLevel.ApiKey, Advanced = true)] public string AuthToken { get; set; } - [FieldDefinition(4, Label = "Authenticate with Plex.tv", Type = FieldType.OAuth)] + [FieldDefinition(5, Label = "NotificationsPlexSettingsAuthenticateWithPlexTv", Type = FieldType.OAuth)] public string SignIn { get; set; } - [FieldDefinition(5, Label = "Update Library", Type = FieldType.Checkbox)] + [FieldDefinition(6, Label = "NotificationsSettingsUpdateLibrary", Type = FieldType.Checkbox)] public bool UpdateLibrary { get; set; } - [FieldDefinition(6, Label = "Map Paths From", Type = FieldType.Textbox, Advanced = true, HelpText = "Lidarr path, used to modify series paths when Plex sees library path location differently from Lidarr")] + [FieldDefinition(7, Label = "NotificationsSettingsUpdateMapPathsFrom", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsFromHelpText")] + [FieldToken(TokenField.HelpText, "NotificationsSettingsUpdateMapPathsFrom", "serviceName", "Plex")] public string MapFrom { get; set; } - [FieldDefinition(7, Label = "Map Paths To", Type = FieldType.Textbox, Advanced = true, HelpText = "Plex path, used to modify series paths when Plex sees library path location differently from Lidarr")] + [FieldDefinition(8, Label = "NotificationsSettingsUpdateMapPathsTo", Type = FieldType.Textbox, Advanced = true, HelpText = "NotificationsSettingsUpdateMapPathsToHelpText")] + [FieldToken(TokenField.HelpText, "NotificationsSettingsUpdateMapPathsTo", "serviceName", "Plex")] public string MapTo { get; set; } public bool IsValid => !string.IsNullOrWhiteSpace(Host); diff --git a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs index 8f2e00870..2d54157f2 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs @@ -33,29 +33,35 @@ namespace NzbDrone.Core.Notifications.Xbmc [FieldDefinition(1, Label = "Port")] public int Port { get; set; } - [FieldDefinition(2, Label = "Use SSL", Type = FieldType.Checkbox, HelpText = "Connect to Kodi over HTTPS instead of HTTP")] + [FieldDefinition(2, Label = "UseSsl", Type = FieldType.Checkbox, HelpText = "NotificationsSettingsUseSslHelpText")] + [FieldToken(TokenField.HelpText, "UseSsl", "serviceName", "Kodi")] public bool UseSsl { get; set; } - [FieldDefinition(3, Label = "Username", Privacy = PrivacyLevel.UserName)] + [FieldDefinition(3, Label = "UrlBase", Type = FieldType.Textbox, Advanced = true, HelpText = "ConnectionSettingsUrlBaseHelpText")] + [FieldToken(TokenField.HelpText, "UrlBase", "connectionName", "Kodi")] + [FieldToken(TokenField.HelpText, "UrlBase", "url", "http://[host]:[port]/[urlBase]/kodi")] + public string UrlBase { get; set; } + + [FieldDefinition(4, Label = "Username", Privacy = PrivacyLevel.UserName)] public string Username { get; set; } - [FieldDefinition(4, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] + [FieldDefinition(5, Label = "Password", Type = FieldType.Password, Privacy = PrivacyLevel.Password)] public string Password { get; set; } [DefaultValue(5)] - [FieldDefinition(5, Label = "Display Time", HelpText = "How long the notification will be displayed for (In seconds)")] + [FieldDefinition(6, Label = "NotificationsKodiSettingsDisplayTime", HelpText = "NotificationsKodiSettingsDisplayTimeHelpText")] public int DisplayTime { get; set; } - [FieldDefinition(6, Label = "GUI Notification", Type = FieldType.Checkbox)] + [FieldDefinition(7, Label = "NotificationsKodiSettingsGuiNotification", Type = FieldType.Checkbox)] public bool Notify { get; set; } - [FieldDefinition(7, Label = "Update Library", HelpText = "Update Library on Import & Rename?", Type = FieldType.Checkbox)] + [FieldDefinition(8, Label = "NotificationsSettingsUpdateLibrary", HelpText = "NotificationsKodiSettingsUpdateLibraryHelpText", Type = FieldType.Checkbox)] public bool UpdateLibrary { get; set; } - [FieldDefinition(8, Label = "Clean Library", HelpText = "Clean Library after update?", Type = FieldType.Checkbox)] + [FieldDefinition(9, Label = "NotificationsKodiSettingsCleanLibrary", HelpText = "NotificationsKodiSettingsCleanLibraryHelpText", Type = FieldType.Checkbox)] public bool CleanLibrary { get; set; } - [FieldDefinition(9, Label = "Always Update", HelpText = "Update Library even when a file is playing?", Type = FieldType.Checkbox)] + [FieldDefinition(10, Label = "NotificationsKodiSettingAlwaysUpdate", HelpText = "NotificationsKodiSettingAlwaysUpdateHelpText", Type = FieldType.Checkbox)] public bool AlwaysUpdate { get; set; } [JsonIgnore] From 47e647ddb10190ba9a272931ff9b483a3f0b7bd5 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Mar 2024 13:44:47 +0200 Subject: [PATCH 061/491] Fixed: URL Base setting for Kodi connections --- src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs index 2d54157f2..6fd8cfa25 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs @@ -14,6 +14,7 @@ namespace NzbDrone.Core.Notifications.Xbmc { RuleFor(c => c.Host).ValidHost(); RuleFor(c => c.DisplayTime).GreaterThanOrEqualTo(2); + RuleFor(c => c.UrlBase).ValidUrlBase(); } } @@ -65,7 +66,7 @@ namespace NzbDrone.Core.Notifications.Xbmc public bool AlwaysUpdate { get; set; } [JsonIgnore] - public string Address => $"{Host.ToUrlHost()}:{Port}"; + public string Address => $"{Host.ToUrlHost()}:{Port}{UrlBase}"; public NzbDroneValidationResult Validate() { From c9743448fd950e93fbe0757588742f4967487e7d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 3 Mar 2024 13:44:47 +0200 Subject: [PATCH 062/491] Configurable URL Base setting for Kodi connections --- src/NzbDrone.Core/Notifications/Xbmc/XbmcJsonApiProxy.cs | 2 +- src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Xbmc/XbmcJsonApiProxy.cs b/src/NzbDrone.Core/Notifications/Xbmc/XbmcJsonApiProxy.cs index b2bd6895e..1f862a088 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/XbmcJsonApiProxy.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/XbmcJsonApiProxy.cs @@ -83,7 +83,7 @@ namespace NzbDrone.Core.Notifications.Xbmc private string ProcessRequest(XbmcSettings settings, string method, params object[] parameters) { - var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, "jsonrpc"); + var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase); var requestBuilder = new JsonRpcRequestBuilder(url, method, parameters); requestBuilder.LogResponseContent = true; diff --git a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs index 6fd8cfa25..97331f333 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/XbmcSettings.cs @@ -20,11 +20,12 @@ namespace NzbDrone.Core.Notifications.Xbmc public class XbmcSettings : IProviderConfig { - private static readonly XbmcSettingsValidator Validator = new XbmcSettingsValidator(); + private static readonly XbmcSettingsValidator Validator = new (); public XbmcSettings() { Port = 8080; + UrlBase = "/jsonrpc"; DisplayTime = 5; } From be8f7e561853365ab14645d6b867c3173624cf76 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 3 Mar 2024 09:34:02 -0800 Subject: [PATCH 063/491] Fixed: Overly aggressive exception release group parsing (cherry picked from commit 0183812cc58dad0e555125ddd8b33a85cbdecbf2) --- src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs | 1 + src/NzbDrone.Core/Parser/Parser.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs index cd5c5ff56..694ff264a 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ReleaseGroupParserFixture.cs @@ -17,6 +17,7 @@ namespace NzbDrone.Core.Test.ParserTests [TestCase("[TR24][OF] Good Charlotte - Generation Rx - 2018", null)] [TestCase("The.Good.Series.S05E03.Series.of.Intelligence.1080p.10bit.AMZN.WEB-DL.DDP5.1.HEVC-Vyndros", "Vyndros")] [TestCase("Artist.Title-Album.Title.1080p.DSNP.WEB-DL.DDP2.0.H.264-VARYG", "VARYG")] + [TestCase("Artist Title - Album Title (Showtime) (1080p.BD.DD5.1.x265-TheSickle[TAoE])", "TheSickle")] // [TestCase("", "")] public void should_parse_release_group(string title, string expected) diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index 9a19a64b1..09baede29 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -207,7 +207,7 @@ namespace NzbDrone.Core.Parser private static readonly Regex ExceptionReleaseGroupRegexExact = new Regex(@"(?(?:D\-Z0N3|Fight-BB|VARYG|E\.N\.D)\b)", RegexOptions.IgnoreCase | RegexOptions.Compiled); // groups whose releases end with RlsGroup) or RlsGroup] - private static readonly Regex ExceptionReleaseGroupRegex = new Regex(@"(?(Silence|afm72|Panda|Ghost|MONOLITH|Tigole|Joy|ImE|UTR|t3nzin|Anime Time|Project Angel|Hakata Ramen|HONE|Vyndros|SEV|Garshasp|Kappa|Natty|RCVR|SAMPA|YOGI|r00t|EDGE2020|RZeroX)(?=\]|\)))", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex ExceptionReleaseGroupRegex = new Regex(@"(?<=[._ \[])(?(Silence|afm72|Panda|Ghost|MONOLITH|Tigole|Joy|ImE|UTR|t3nzin|Anime Time|Project Angel|Hakata Ramen|HONE|Vyndros|SEV|Garshasp|Kappa|Natty|RCVR|SAMPA|YOGI|r00t|EDGE2020|RZeroX)(?=\]|\)))", RegexOptions.IgnoreCase | RegexOptions.Compiled); private static readonly Regex WordDelimiterRegex = new Regex(@"(\s|\.|,|_|-|=|\|)+", RegexOptions.Compiled); private static readonly Regex PunctuationRegex = new Regex(@"[^\w\s]", RegexOptions.Compiled); From 881fabad93004192ce4364d1b4bf9f2b47c56c8d Mon Sep 17 00:00:00 2001 From: Helvio Pedreschi Date: Thu, 7 Mar 2024 20:29:50 -0500 Subject: [PATCH 064/491] Fixed: WebApp functionality on Apple devices (cherry picked from commit c7dd7abf892eead7796fcc482aa2f2aabaf88712) --- frontend/src/index.ejs | 7 +++++-- frontend/src/login.html | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/src/index.ejs b/frontend/src/index.ejs index b99a39a0d..5968082b4 100644 --- a/frontend/src/index.ejs +++ b/frontend/src/index.ejs @@ -3,13 +3,16 @@ - - + + + + + diff --git a/frontend/src/login.html b/frontend/src/login.html index a65106664..9474c8544 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -3,13 +3,16 @@ - - + + + + + From 340ae78f466c7db962e2681cbd9cd84080f0a89f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 7 Mar 2024 21:34:57 +0200 Subject: [PATCH 065/491] Prevent NullRef in naming when truncating a null Release Group (cherry picked from commit 13e29bd257ccfccb09e66c940ffabeb6503c05b5) --- src/NzbDrone.Core/Organizer/FileNameBuilder.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index c8cb22a64..abfa9399d 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -380,7 +380,7 @@ namespace NzbDrone.Core.Organizer { tokenHandlers["{Original Title}"] = m => GetOriginalTitle(trackFile); tokenHandlers["{Original Filename}"] = m => GetOriginalFileName(trackFile); - tokenHandlers["{Release Group}"] = m => Truncate(trackFile.ReleaseGroup, m.CustomFormat) ?? m.DefaultValue("Lidarr"); + tokenHandlers["{Release Group}"] = m => trackFile.ReleaseGroup.IsNullOrWhiteSpace() ? m.DefaultValue("Lidarr") : Truncate(trackFile.ReleaseGroup, m.CustomFormat); } private void AddQualityTokens(Dictionary> tokenHandlers, Artist artist, TrackFile trackFile) @@ -739,6 +739,11 @@ namespace NzbDrone.Core.Organizer private string Truncate(string input, string formatter) { + if (input.IsNullOrWhiteSpace()) + { + return string.Empty; + } + var maxLength = GetMaxLengthFromFormatter(formatter); if (maxLength == 0 || input.Length <= Math.Abs(maxLength)) From 3df140b1f03a0d09fdc4835b763e4303eae7808a Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 8 Mar 2024 06:30:20 +0000 Subject: [PATCH 066/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Havok Dan Co-authored-by: Jason54 Co-authored-by: Mark Martines Co-authored-by: Maxence Winandy Co-authored-by: Stevie Robinson Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: linkin931 <931linkin@gmail.com> Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ 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/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/hu/ 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/pt/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ru/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/cs.json | 4 +- src/NzbDrone.Core/Localization/Core/de.json | 4 +- src/NzbDrone.Core/Localization/Core/el.json | 4 +- src/NzbDrone.Core/Localization/Core/es.json | 319 ++++++++++-------- src/NzbDrone.Core/Localization/Core/fi.json | 16 +- src/NzbDrone.Core/Localization/Core/fr.json | 57 ++-- src/NzbDrone.Core/Localization/Core/hu.json | 3 +- src/NzbDrone.Core/Localization/Core/ko.json | 2 +- src/NzbDrone.Core/Localization/Core/nl.json | 40 ++- src/NzbDrone.Core/Localization/Core/pt.json | 8 +- .../Localization/Core/pt_BR.json | 33 +- src/NzbDrone.Core/Localization/Core/ru.json | 6 +- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- 13 files changed, 302 insertions(+), 196 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 13648ed86..a5336acc1 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -30,8 +30,8 @@ "About": "O aplikaci", "AddListExclusion": "Přidat vyloučení seznamu", "ChmodFolder": "Složka chmod", - "ChmodFolderHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient správně nastavil oprávnění.", - "ChownGroupHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient používal stejnou skupinu jako {appName}.", + "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", "AgeWhenGrabbed": "Stáří (kdy bylo získáno)", "AlbumIsDownloadingInterp": "Film se stahuje - {0}% {1}", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 833f64ce8..ddcf65067 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -96,7 +96,7 @@ "Blocklist": "Sperrliste", "Backups": "Sicherungen", "BindAddress": "Adresse binden", - "DelayingDownloadUntil": "Download verzögern bis {0} um {1}", + "DelayingDownloadUntil": "Download wird bis zum {date} um {time} verzögert", "QualityDefinitions": "Qualitätsdefinitionen", "FileDateHelpText": "Aktualisiere das Erstelldatum beim Import oder Re-Scan", "FileManagement": "Dateiverwaltung", @@ -191,7 +191,7 @@ "RestartNow": "Jetzt neustarten", "Restore": "Wiederherstellen", "Retention": "Aufbewahrung ( Retention )", - "RetryingDownloadOn": "Herunterladen nochmal versuchen {0} um {1}", + "RetryingDownloadOn": "Erneuter Downloadversuch am {date} um {time}", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Wird in der Wochenansicht über jeder Spalte angezeigt", "ShowQualityProfileHelpText": "Qualitätsprofil unter dem Plakat anzeigen", "ShowRelativeDates": "Relatives Datum anzeigen", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 55e1cebb0..3cce5ecb1 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1009,8 +1009,8 @@ "AppUpdated": "{appName} Ενημερώθηκε", "AppUpdatedVersion": "ξαναφορτωθεί", "AutoAdd": "Προσθήκη", - "AddConditionImplementation": "Προσθήκη", - "AddConnectionImplementation": "Προσθήκη", + "AddConditionImplementation": "Προσθήκη - {implementationName}", + "AddConnectionImplementation": "Προσθήκη - {implementationName}", "AddImportListExclusionArtistHelpText": "Αποτρέψτε την προσθήκη ταινίας στο {appName} από λίστες", "EditConditionImplementation": "Προσθήκη", "EditConnectionImplementation": "Προσθήκη", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 123b56d74..9727a716b 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1,6 +1,6 @@ { "Language": "Idioma", - "UiLanguage": "Lenguaje de UI", + "UiLanguage": "Idioma de interfaz", "Connections": "Conexiones", "Quality": "Calidad", "AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder {appName}", @@ -78,7 +78,7 @@ "NoHistory": "Sin historia", "NoLeaveIt": "No, déjalo", "NoLogFiles": "No hay archivos de registro", - "OpenBrowserOnStart": "Abrir navegador al arrancar", + "OpenBrowserOnStart": "Abrir navegador al inicio", "Options": "Opciones", "Original": "Original", "PackageVersion": "Versión del paquete", @@ -88,85 +88,85 @@ "Path": "Ruta", "Permissions": "Permisos", "Port": "Puerto", - "PosterSize": "Tamaño del Poster", - "PreviewRename": "Previsualizar Renombrado", + "PosterSize": "Tamaño de póster", + "PreviewRename": "Previsualizar renombrado", "Profiles": "Perfiles", - "Proper": "Apropiado", + "Proper": "Proper", "PropersAndRepacks": "Propers y Repacks", "Protocol": "Protocolo", - "ProtocolHelpText": "Elige qué protocolo(s) se usará y cual será el preferido cuando haya que elegir entre lanzamientos iguales", + "ProtocolHelpText": "Elige qué protocolo(s) usar y cuál se prefiere cuando se elige entre lanzamientos equivalentes", "Proxy": "Proxy", - "ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como wildcard para subdominios", - "ProxyPasswordHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.", - "ProxyType": "Tipo de Proxy", - "ProxyUsernameHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.", - "PublishedDate": "Fecha de Publicación", - "QualityDefinitions": "Definiciones de Calidad", - "QualityProfile": "Perfil de Calidad", - "QualityProfiles": "Perfiles de Calidad", - "QualitySettings": "Ajustes de Calidad", + "ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como comodín para subdominios", + "ProxyPasswordHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.", + "ProxyType": "Tipo de proxy", + "ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.", + "PublishedDate": "Fecha de publicación", + "QualityDefinitions": "Definiciones de calidad", + "QualityProfile": "Perfil de calidad", + "QualityProfiles": "Perfiles de calidad", + "QualitySettings": "Opciones de calidad", "Queue": "Cola", "ReadTheWikiForMoreInformation": "Lee la Wiki para más información", "Real": "Real", "RecycleBinHelpText": "Los archivos iran aquí una vez se hayan borrado en vez de ser borrados permanentemente", - "RecyclingBinCleanup": "Limpieza de Papelera de Reciclaje", + "RecyclingBinCleanup": "Limpieza de la papelera de reciclaje", "Redownload": "Volver a descargar", "Refresh": "Actualizar", "RefreshInformationAndScanDisk": "Actualizar la información al escanear el disco", "RefreshScan": "Actualizar y Escanear", "ReleaseDate": "Fechas de Estreno", - "ReleaseGroup": "Grupo de Estreno", - "ReleaseRejected": "Lanzamiento Rechazado", + "ReleaseGroup": "Grupo de lanzamiento", + "ReleaseRejected": "Lanzamiento rechazado", "ReleaseStatuses": "Estado del Estreno", "ReleaseWillBeProcessedInterp": "El lanzamiento será procesado {0}", "Reload": "Recargar", "RemotePath": "Ruta remota", "RemotePathHelpText": "Ruta de origen al directorio al que accede el Gestor de Descargas", - "RemotePathMappings": "Mapeados de Rutas Remotas", + "RemotePathMappings": "Mapeos de ruta remota", "Remove": "Eliminar", - "RemoveFailedDownloadsHelpText": "Eliminar descargas fallidas del historial del gestor de descargas", + "RemoveFailedDownloadsHelpText": "Eliminar descargas fallidas desde el historial del cliente de descarga", "RemoveFilter": "Eliminar filtro", "RemoveFromBlocklist": "Eliminar de lista de bloqueados", - "RemoveFromDownloadClient": "Eliminar del Gestor de Descargas", + "RemoveFromDownloadClient": "Eliminar del cliente de descarga", "RemoveFromQueue": "Eliminar de la cola", - "RemoveSelected": "Borrar Seleccionados", + "RemoveSelected": "Eliminar seleccionado", "RemoveTagExistingTag": "Etiqueta existente", "RemoveTagRemovingTag": "Eliminando etiqueta", "RenameTracksHelpText": "{appName} usará el nombre del archivo si el renombrado está deshabilitado", "Reorder": "Reordenar", - "ReplaceIllegalCharacters": "Reemplazar Caracteres Ilegales", - "ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, {appName} los eliminará si no", + "ReplaceIllegalCharacters": "Reemplazar caracteres ilegales", + "ReplaceIllegalCharactersHelpText": "Reemplaza los caracteres ilegales. Si no está marcado, {appName} los eliminará en su lugar", "RequiredHelpText": "El comunicado debe contener al menos uno de estos términos (no distingue entre mayúsculas y minúsculas)", "RequiredPlaceHolder": "Añadir nueva restricción", "RequiresRestartToTakeEffect": "Requiere reiniciar para que surta efecto", "RescanAfterRefreshHelpText": "Reescanear la carpeta de películas después de actualizar la película", "RescanAfterRefreshHelpTextWarning": "{appName} no detectará los cambios automáticamente en los ficheros si no se ajusta a 'Siempre'", "RescanArtistFolderAfterRefresh": "Reescanear la Carpeta de Películas después de Actualizar", - "ResetAPIKey": "Reajustar API", - "ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?", + "ResetAPIKey": "Restablecer clave API", + "ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?", "Restart": "Reiniciar", "RestartLidarr": "Reiniciar {appName}", - "RestartNow": "Reiniciar Ahora", + "RestartNow": "Reiniciar ahora", "Restore": "Restaurar", - "RestoreBackup": "Recuperar Backup", + "RestoreBackup": "Restaurar copia de seguridad", "Result": "Resultado", "Retention": "Retención", - "RetentionHelpText": "Sólo Usenet: Ajustar a cero para retención ilimitada", - "RetryingDownloadOn": "Re-intentando descarga {0} en {1}", - "RootFolder": "Carpeta de Origen", - "RootFolders": "Carpetas de Origen", + "RetentionHelpText": "Solo usenet: Establece a cero para establecer una retención ilimitada", + "RetryingDownloadOn": "Reintentar descarga en {date} a las {time}", + "RootFolder": "Carpeta raíz", + "RootFolders": "Carpetas raíz", "RSSSync": "Sincronización RSS", "RSSSyncInterval": "Intervalo de Sincronización de RSS", - "RssSyncIntervalHelpText": "Intervalo en minutos. Ajustar a cero para inhabilitar (esto dentendrá toda captura de estrenos automática)", + "RssSyncIntervalHelpText": "Intervalo en minutos. Configurar a cero para deshabilitar (esto detendrá todas las capturas automáticas de lanzamientos)", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Mostrado sobre cada columna cuando la vista activa es semana", - "ShowPath": "Mostrar Ruta", - "ShowQualityProfile": "Mostrar Perfil de Calidad", - "ShowQualityProfileHelpText": "Mostrar el perfil de calidad debajo del poster", - "ShowRelativeDates": "Mostrar Fechas Relativas", - "ShowRelativeDatesHelpText": "Mostrar fechas relativas (Hoy/Ayer/etc) o absolutas", - "ShowSearch": "Mostrar Búsqueda", + "ShowPath": "Mostrar ruta", + "ShowQualityProfile": "Mostrar perfil de calidad", + "ShowQualityProfileHelpText": "Muestra el perfil de calidad bajo el póster", + "ShowRelativeDates": "Mostrar fechas relativas", + "ShowRelativeDatesHelpText": "Muestra fechas absolutas o relativas (Hoy/Ayer/etc)", + "ShowSearch": "Mostrar búsqueda", "ShowSearchActionHelpText": "Mostrar botón de búsqueda al pasar el cursor por encima", - "ShowSizeOnDisk": "Mostrar Tamaño en Disco", + "ShowSizeOnDisk": "Mostrar tamaño en disco", "ShowUnknownArtistItems": "Mostrar Elementos Desconocidos", "SSLCertPassword": "Contraseña del Certificado SSL", "SSLCertPath": "Ruta del Certificado SSL", @@ -188,19 +188,19 @@ "TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada", "Tags": "Etiquetas", "Tasks": "Tareas", - "TestAll": "Testear Todo", - "TestAllClients": "Comprobar Todos los Gestores", - "TestAllIndexers": "Comprobar Todos los Indexers", - "TestAllLists": "Comprobar Todas las Listas", + "TestAll": "Probar todo", + "TestAllClients": "Probar todos los clientes", + "TestAllIndexers": "Probar todos los indexadores", + "TestAllLists": "Probar todas las listas", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexers, por favor sigue las reglas de los mismos", "Time": "Tiempo", - "TimeFormat": "Formato de Hora", - "TorrentDelay": "Retraso del Torrent", - "TorrentDelayHelpText": "Retraso en minutos a esperar antes de descargar un torrent", + "TimeFormat": "Formato de hora", + "TorrentDelay": "Retraso de torrent", + "TorrentDelayHelpText": "Retraso en minutos a esperar antes de capturar un torrent", "Torrents": "Torrents", - "UiLanguageHelpText": "Lenguaje que {appName} usara para el UI", + "UiLanguageHelpText": "Idioma que {appName} usará en la interfaz", "UiLanguageHelpTextWarning": "Recargar el Navegador", - "UiSettings": "Ajustes del UI", + "UiSettings": "Opciones de interfaz", "UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.", "UnableToAddANewImportListExclusionPleaseTryAgain": "No se ha podido añadir una nueva lista de exclusión, prueba otra vez.", "UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", @@ -208,7 +208,7 @@ "UnableToAddANewMetadataProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", "UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.", "UnableToAddANewQualityProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", - "UnableToLoadBackups": "No se han podido cargar las copias de seguridad", + "UnableToLoadBackups": "No se pudo cargar las copias de seguridad", "UnableToLoadBlocklist": "No se han podido cargar las bloqueadas", "UnableToLoadDelayProfiles": "No se pueden cargar los Perfiles de Retraso", "UnableToLoadDownloadClientOptions": "No se han podido cargar las opciones del gestor de descargas", @@ -233,25 +233,25 @@ "UnableToLoadTags": "No se pueden cargar las Etiquetas", "UnableToLoadTheCalendar": "No se ha podido cargar el calendario", "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", - "Ungroup": "Desagrupar", + "Ungroup": "Sin agrupar", "Unmonitored": "Sin monitorizar", "UnmonitoredHelpText": "Incluir las peliculas no monitoreadas en el feed de iCal", - "UpdateAll": "Actualizar Todo", - "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también", + "UpdateAll": "Actualizar todo", + "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones", "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", "Updates": "Actualizaciones", - "UpdateScriptPathHelpText": "Ruta del script propio que toma el paquete de actualización y se encarga del proceso de actualización restante", + "UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización", "UpgradeAllowedHelpText": "Si está desactivado las calidades no serán actualizadas", "Uptime": "Tiempo de actividad", "URLBase": "URL Base", - "UrlBaseHelpText": "Para soporte de reverse proxy, vacio por defecto", + "UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío", "UrlBaseHelpTextWarning": "Requiere reiniciar para que surta efecto", - "UseHardlinksInsteadOfCopy": "Usar Hardlinks en vez de Copia", - "UsenetDelayHelpText": "Retraso en minutos a esperar antes de descargar un lanzamiento de Usenet", - "UseProxy": "Usar el Proxy", + "UseHardlinksInsteadOfCopy": "Utilizar enlaces directos en lugar de copiar", + "UsenetDelayHelpText": "Retraso en minutos a esperar antes de capturar un lanzamiento desde usenet", + "UseProxy": "Usar proxy", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Rama usada por el mecanismo de actualización externo", "Version": "Versión", - "WeekColumnHeader": "Encabezado de la columna semanal", + "WeekColumnHeader": "Cabecera de columna de semana", "45MinutesFourtyFive": "45 Minutos: {0}", "60MinutesSixty": "60 Minutos: {0}", "AgeWhenGrabbed": "Antigüedad (cuando se añadió)", @@ -265,29 +265,29 @@ "AnalyticsEnabledHelpTextWarning": "Requiere reiniciar para que surta efecto", "Dates": "Fechas", "Scheduled": "Programado", - "ScriptPath": "Ruta del Script", + "ScriptPath": "Ruta del script", "Search": "Buscar", - "SearchAll": "Buscar Todas", - "SearchForMissing": "Buscar faltantes", - "SearchSelected": "Buscar Seleccionadas", + "SearchAll": "Buscar todo", + "SearchForMissing": "Buscar perdidos", + "SearchSelected": "Buscar seleccionados", "Security": "Seguridad", - "SendAnonymousUsageData": "Enviar Datos de Uso Anónimamente", - "SetPermissions": "Ajustar Permisos", - "SetPermissionsLinuxHelpText": "Debe chmod ser ejecutado una vez los archivos hayan sido importados/renombrados?", - "SetPermissionsLinuxHelpTextWarning": "Si no estas seguro de lo que hacen estos ajustes, no los modifiques.", + "SendAnonymousUsageData": "Enviar datos de uso anónimos", + "SetPermissions": "Establecer permisos", + "SetPermissionsLinuxHelpText": "¿Debería ejecutarse chmod cuando los archivos son importados/renombrados?", + "SetPermissionsLinuxHelpTextWarning": "Si no estás seguro qué configuraciones hacer, no las cambies.", "Settings": "Ajustes", - "ShortDateFormat": "Formato Corto de Fecha", + "ShortDateFormat": "Formato de fecha breve", "ShowCutoffUnmetIconHelpText": "Mostrar el icono para los ficheros cuando no se ha alcanzado el corte", - "ShowDateAdded": "Mostrar Fecha de Añadido", - "ShowMonitored": "Mostrar Monitoreadas", - "ShowMonitoredHelpText": "Mostrar el estado de monitoreo debajo del poster", + "ShowDateAdded": "Mostrar fecha de adición", + "ShowMonitored": "Mostrar monitorizado", + "ShowMonitoredHelpText": "Muestra el estado monitorizado bajo el póster", "Size": " Tamaño", - "SkipFreeSpaceCheck": "Saltarse Comprobación de Espacio Disponible", - "SkipFreeSpaceCheckWhenImportingHelpText": "Usar cuando {appName} no pueda detectar el espacio disponible en la carpeta de películas", + "SkipFreeSpaceCheck": "Saltar comprobación de espacio libre", + "SkipFreeSpaceCheckWhenImportingHelpText": "Se usa cuando {appName} no puede detectar el espacio libre de tu carpeta raíz durante la importación de archivo", "SorryThatAlbumCannotBeFound": "Lo siento, no he encontrado esa película.", "SorryThatArtistCannotBeFound": "Lo siento, no he encontrado esa película.", "Source": "Fuente", - "SourcePath": "Ruta de Origen", + "SourcePath": "Ruta de la fuente", "About": "Acerca de", "Actions": "Acciones", "AddingTag": "Añadir etiqueta", @@ -416,22 +416,22 @@ "None": "Ninguno", "NotificationTriggers": "Disparadores de notificación", "NoUpdatesAreAvailable": "No hay actualizaciones disponibles", - "PortNumber": "Número de Puerto", + "PortNumber": "Número de puerto", "Reason": "Razón", "RecycleBinCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática", "RecycleBinCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente", - "RecyclingBin": "Papelera de Reciclaje", - "RemoveCompletedDownloadsHelpText": "Eliminar las descargas ya importadas del historial del gestor de descargas", + "RecyclingBin": "Papelera de reciclaje", + "RemoveCompletedDownloadsHelpText": "Elimina las descargas importadas desde el historial del cliente de descarga", "RemovedFromTaskQueue": "Eliminar de la cola de tareas", "Reset": "Reiniciar", "SslCertPasswordHelpText": "Contraseña para el archivo pfx", "SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto", - "TotalFileSize": "Tamaño Total del Archivo", + "TotalFileSize": "Tamaño total de archivo", "Track": "Rastro", "Tracks": "Rastro", "Type": "Tipo", - "UsenetDelay": "Retraso de Usenet", - "Username": "Nombre de usuario", + "UsenetDelay": "Retraso de usenet", + "Username": "Usuario", "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Qué rama usar para actualizar {appName}", "NETCore": ".NET", "UnableToAddANewRemotePathMappingPleaseTryAgain": "No se ha podido añadir una nueva ruta remota, prueba otra vez.", @@ -447,20 +447,20 @@ "AddNewItem": "Añadir nuevo item", "AllExpandedCollapseAll": "Cerrar todo", "AllExpandedExpandAll": "Expandir todo", - "RemoveFailed": "La eliminación falló", - "RemoveDownloadsAlert": "Los ajustes de eliminación se han trasladado a los ajustes individuales del cliente de descarga en la tabla anterior.", + "RemoveFailed": "Fallo al eliminar", + "RemoveDownloadsAlert": "Las opciones de Eliminar fueron movidas a las opciones del cliente de descarga individual en la table anterior.", "Duration": "Duración", "OnApplicationUpdate": "Al actualizar la aplicación", - "RemoveCompleted": "Eliminación completada", + "RemoveCompleted": "Eliminar completado", "AllowFingerprinting": "Permitir impresión digital", - "OnRename": "En Renombrado", + "OnRename": "Al renombrar", "Season": "Temporada", - "OnGrab": "Al Capturar", - "OnHealthIssue": "En Problema de Salud", + "OnGrab": "Al capturar", + "OnHealthIssue": "Al haber un problema de salud", "MetadataProfile": "perfil de metadatos", "MetadataProfiles": "perfil de metadatos", "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", - "OnUpgrade": "Al Actualizar", + "OnUpgrade": "Al actualizar", "DeleteTrackFileMessageText": "¿Seguro que quieres eliminar {0}?", "Label": "Etiqueta", "AllowArtistChangeClickToChangeArtist": "Click para cambiar el autor", @@ -524,9 +524,9 @@ "NextExecution": "Siguiente ejecución", "NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún", "Ok": "Ok", - "OnlyTorrent": "Solo Torrent", + "OnlyTorrent": "Solo torrent", "OnlyUsenet": "Solo Usenet", - "OutputPath": "Ruta de Output", + "OutputPath": "Ruta de salida", "Peers": "Pares", "PreferAndUpgrade": "Preferir y actualizar", "Presets": "Preajustes", @@ -534,29 +534,29 @@ "QualityLimitsHelpText": "Los límites se ajustan automáticamente para el tiempo de ejecución de la película.", "Queued": "Encolado", "Rating": "Valoración", - "RejectionCount": "Número de Rechazos", - "ReleaseTitle": "Título del Estreno", + "RejectionCount": "Recuento de rechazos", + "ReleaseTitle": "Título de lanzamiento", "Renamed": "Renombrado", - "RestartRequiredHelpTextWarning": "Requiere reiniciar para que surta efecto", + "RestartRequiredHelpTextWarning": "Requiere reiniciar para que tenga efecto", "RestoreBackupAdditionalInfo": "Nota: {appName} se reiniciará y recargará automáticamente la IU durante el proceso de restauración.", "Save": "Guardar", "Seeders": "Semillas", "Select...": "Seleccione...", - "SelectFolder": "Seleccionar Carpeta", - "SelectQuality": "Seleccionar Calidad", - "ShowAdvanced": "Mostrar Avanzado", - "SizeLimit": "Tamaño límite", + "SelectFolder": "Seleccionar carpeta", + "SelectQuality": "Seleccionar calidad", + "ShowAdvanced": "Mostrar avanzado", + "SizeLimit": "Límite de tamaño", "SizeOnDisk": "Tamaño en Disco", - "SourceTitle": "Título de Origen", + "SourceTitle": "Título de la fuente", "System": "Sistema", - "Test": "Test", + "Test": "Prueba", "TimeLeft": "Tiempo restante", "Title": "Título", "TotalSpace": "Espacio Total", "Ui": "UI", - "UnmappedFilesOnly": "Solo archivos sin asignar", - "UnmonitoredOnly": "Monitoreadas Solamente", - "UpgradesAllowed": "Mejoras permitidas", + "UnmappedFilesOnly": "Solo archivos sin mapear", + "UnmonitoredOnly": "Solo sin monitorizar", + "UpgradesAllowed": "Actualizaciones permitidas", "Wanted": "Buscado", "WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?", "Location": "Ubicación", @@ -584,7 +584,7 @@ "DoneEditingGroups": "Terminado de editar grupos", "ChooseImportMethod": "Elegir Modo de Importación", "ClickToChangeReleaseGroup": "Clic para cambiar el grupo de lanzamiento", - "SelectReleaseGroup": "Seleccionar Grupo De Lanzamiento", + "SelectReleaseGroup": "Seleccionar grupo de lanzamiento", "BypassIfHighestQuality": "Pasar sí es la calidad más alta", "CustomFormatScore": "Puntuación de Formato personalizado", "MinimumCustomFormatScore": "Puntuación mínima de formato personalizado", @@ -612,15 +612,15 @@ "MinFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar", "Monitor": "Monitorizar", "NegateHelpText": "Si se activa, el formato propio no se aplicará si esta condición {0} se iguala.", - "ResetDefinitionTitlesHelpText": "Restablecer los títulos y valores de las definiciones", + "ResetDefinitionTitlesHelpText": "Restablecer títulos de definición también como valores", "ResetDefinitions": "Restablecer definiciones", "ResetTitles": "Restablecer títulos", "UnableToLoadCustomFormats": "No se pueden cargar los Formatos Propios", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "Se eliminará la carpeta de películas '{0}' y todo su contenido.", - "ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por Theme.Park", + "ThemeHelpText": "Cambiar el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park", "Theme": "Tema", - "PreferTorrent": "Prefiero Torrent", - "PreferUsenet": "Prefiero Usenet", + "PreferTorrent": "Preferir torrent", + "PreferUsenet": "Preferir usenet", "UnableToLoadInteractiveSearch": "No se pueden cargar los resultados de esta búsqueda de películas. Vuelve a intentarlo más tarde", "EnableRssHelpText": "Se usará cuando {appName} busque periódicamente lanzamientos vía Sincronización RSS", "HiddenClickToShow": "Oculto, click para mostrar", @@ -651,17 +651,17 @@ "RemotePathMappingCheckFilesWrongOSPath": "El cliente de descarga remota {0} informó de la existencia de archivos en {1}, pero ésta no es una ruta válida de {2}. Revise los mapeos de la ruta remota y la configuración del cliente de descarga.", "RemotePathMappingCheckFolderPermissions": "{appName} puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.", "RemotePathMappingCheckRemoteDownloadClient": "El cliente de descarga remota {0} informó de la existencia de archivos en {1} pero este directorio no parece existir. Probablemente falta mapear la ruta remota.", - "ReplaceWithDash": "Reemplazar con Dash", - "ReplaceWithSpaceDash": "Reemplazar con Space Dash", - "ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space", + "ReplaceWithDash": "Reemplazar con guion", + "ReplaceWithSpaceDash": "Reemplazar por barra espaciadora", + "ReplaceWithSpaceDashSpace": "Reemplazar por espacio en la barra espaciadora", "RootFolderCheckMultipleMessage": "Varias carpetas de origen no existen: {0}", "RootFolderCheckSingleMessage": "La carpeta de origen no existe: {0}", "SystemTimeCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido", "UpdateAvailable": "La nueva actualización está disponible", "UpdateCheckStartupNotWritableMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' no tiene permisos de escritura para el usuario '{1}'.", "UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".", - "ShownClickToHide": "Mostrado, clic para ocultar", - "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar", + "ShownClickToHide": "Mostrado, haz clic para ocultar", + "AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar", "DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible", "DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.", "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}", @@ -680,7 +680,7 @@ "BlocklistReleases": "Lista de bloqueos de lanzamientos", "DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", "Negated": "Anulado", - "Required": "Necesario", + "Required": "Solicitado", "ResetQualityDefinitions": "Restablecer definiciones de calidad", "DownloadClientSortingCheckMessage": "El cliente de descarga {0} tiene activada la clasificación {1} para la categoría de {appName}. Debe desactivar la clasificación en su cliente de descarga para evitar problemas de importación.", "DeleteSelectedDownloadClients": "Borrar Cliente(s) de Descarga Seleccionado(s)", @@ -689,21 +689,21 @@ "NoChange": "Sin cambio", "QueueIsEmpty": "La cola está vacía", "RemoveSelectedItemBlocklistMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?", - "RemoveSelectedItems": "Eliminar los elementos seleccionados", - "SetTags": "Poner Etiquetas", + "RemoveSelectedItems": "Eliminar elementos seleccionados", + "SetTags": "Establecer etiquetas", "Yes": "Sí", "NoEventsFound": "Ningún evento encontrado", "ResetTitlesHelpText": "Restablecer los títulos y valores de las definiciones", "ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente", "ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas", "ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)", - "RemoveSelectedItemQueueMessageText": "¿Está seguro de que desea eliminar el {0} elemento {1} de la cola?", + "RemoveSelectedItemQueueMessageText": "¿Estás seguro que quieres eliminar 1 elemento de la cola?", "RemoveSelectedItemsQueueMessageText": "¿Estás seguro de que quieres eliminar {0} elementos de la cola?", "DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.", "ExistingTag": "Etiquetas existentes", - "RemoveSelectedItem": "Eliminar el elemento seleccionado", + "RemoveSelectedItem": "Eliminar elemento seleccionado", "RemovingTag": "Eliminando etiqueta", - "ResetQualityDefinitionsMessageText": "¿Está seguro de que desea restablecer las definiciones de calidad?", + "ResetQualityDefinitionsMessageText": "¿Estás seguro que quieres restablecer las definiciones de calidad?", "ApplyTagsHelpTextHowToApplyArtists": "Cómo añadir etiquetas a las películas seleccionadas", "ApplyTagsHelpTextHowToApplyImportLists": "Cómo añadir etiquetas a las listas de importación seleccionadas", "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", @@ -712,7 +712,7 @@ "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", "ApplyTagsHelpTextHowToApplyDownloadClients": "Cómo añadir etiquetas a los clientes de descargas seleccionados", "SuggestTranslationChange": "Sugerir un cambio en la traducción", - "UpdateSelected": "Actualizar Seleccionadas", + "UpdateSelected": "Actualizar seleccionados", "AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado", "NoResultsFound": "Ningún resultado encontrado", "SomeResultsAreHiddenByTheAppliedFilter": "Algunos resultados están ocultos por el filtro aplicado", @@ -754,7 +754,7 @@ "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", "AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros", "AllowFingerprintingHelpTextWarning": "Esto requiere que Readarr lea partes del archivo, lo que ralentizará los escaneos y puede provocar una alta actividad en el disco o en la red.", - "ReleaseProfiles": "perfil de lanzamiento", + "ReleaseProfiles": "Perfiles de lanzamiento", "AnyReleaseOkHelpText": "Readarrcambiará automáticamente a la versión que mejor coincida con las pistas descargadas", "CatalogNumber": "número de catálogo", "WhatsNew": "Que es lo nuevo?", @@ -793,8 +793,8 @@ "ClearBlocklist": "Limpiar lista de bloqueos", "NoHistoryBlocklist": "Sin historial de la lista de bloqueos", "Connection": "Conexiones", - "AutoTaggingNegateHelpText": "Si está marcado, la regla de etiquetado automático no aplicará si la condición {implementationName} coincide.", - "AutoTaggingRequiredHelpText": "Esta condición {implementationName} debe coincidir para que la regla de etiquetado automático se aplique. De lo contrario una sola coincidencia de {0} será suficiente.", + "AutoTaggingNegateHelpText": "Si está marcado, la regla de etiquetado automático no se aplicará si esta condición {implementationName} coincide.", + "AutoTaggingRequiredHelpText": "Esta condición {implementationName} debe coincidir para que la regla de etiquetado automático se aplique. De lo contrario una sola coincidencia de {implementationName} será suficiente.", "CloneCustomFormat": "Clonar formato personalizado", "CloneProfile": "Clonar Perfil", "Close": "Cerrar", @@ -817,11 +817,11 @@ "DeleteArtistFolderCountConfirmation": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?", "DeleteArtistFolderHelpText": "Eliminar la carpeta de películas y su contenido", "Large": "Grande", - "Small": "Pequeña", + "Small": "Pequeño", "External": "Externo", - "Overview": "Resumen", - "OverviewOptions": "Opciones de Resumen", - "Posters": "Carátulas", + "Overview": "Vista general", + "OverviewOptions": "Opciones de vista general", + "Posters": "Pósteres", "Table": "Tabla", "AddAutoTag": "Añadir Etiqueta Automática", "AddCondition": "Añadir Condición", @@ -837,8 +837,8 @@ "ImportList": "Importar lista", "Negate": "Negar", "OrganizeSelectedArtists": "Organizar películas seleccionadas", - "RenameFiles": "Renombrar Archivos", - "ReleaseProfile": "perfil de lanzamiento", + "RenameFiles": "Renombrar archivos", + "ReleaseProfile": "Perfil de lanzamiento", "AuthenticationMethodHelpTextWarning": "Por favor selecciona un método válido de autenticación", "AuthenticationRequired": "Autenticación requerida", "AuthBasic": "Básico (ventana emergente del navegador)", @@ -854,7 +854,7 @@ "CloneAutoTag": "Clonar Etiquetado Automático", "ConditionUsingRegularExpressions": "Esta condición coincide con el uso de expresiones regulares. Tenga en cuenta que los caracteres `\\^$.|?*+()[{` tienen significados especiales y deben escaparse con un `\\`", "DeleteSpecificationHelpText": "Esta seguro que desea borrar la especificacion '{name}'?", - "PosterOptions": "Opciones del Poster", + "PosterOptions": "Opciones de póster", "EnableProfile": "Habilitar perfil", "AddNewAlbum": "Añadir nuevo álbum", "AddAlbumWithTitle": "Añadir {albumTitle}", @@ -869,7 +869,7 @@ "ChownGroup": "Cambiar grupo propietario", "NoLimitForAnyDuration": "SIn límite para el tiempo de ejecución", "NoMinimumForAnyDuration": "Sin mínimo para el tiempo de ejecución", - "PreferredSize": "Tamaño Preferido", + "PreferredSize": "Tamaño preferido", "ImportLists": "Importar listas", "Unlimited": "Ilimitado", "AddImportListExclusionAlbumHelpText": "Evitar que las series sean agregadas a {appName} por las listas", @@ -968,7 +968,7 @@ "DeleteSelectedArtists": "Borrar artista seleccionado", "EnableAutomaticAddHelpText": "Añade series de esta lista a {appName} cuando las sincronizaciones se llevan a cabo vía interfaz de usuario o por {appName}", "FileNameTokens": "Tokens de nombre de archivos", - "RemoveQueueItemConfirmation": "¿Estás seguro de que quieres eliminar {0} elementos de la cola?", + "RemoveQueueItemConfirmation": "¿Estás seguro que quieres eliminar '{sourceTitle}' de la cola?", "SearchForAllCutoffUnmetAlbums": "Buscar todos los episodios en Umbrales no alcanzados", "Underscore": "Guion bajo", "Uppercase": "Mayúsculas", @@ -987,8 +987,8 @@ "GeneralSettingsSummary": "Puerto, SSL, usuario/contraseña, proxy, analíticas y actualizaciones", "ImportListsSettingsSummary": "Listas de importación, excluidas de la lista", "QualitySettingsSummary": "Tamaños de calidad y nombrado", - "TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar", - "UiSettingsSummary": "Calendario, fecha y opciones de color deteriorado", + "TagsSettingsSummary": "Vea todas las etiquetas y cómo se usan. Las etiquetas sin usar pueden ser eliminadas", + "UiSettingsSummary": "Opciones de calendario, fecha y color alterado", "IncludeHealthWarnings": "Incluir avisos de salud", "DeleteArtistFolderCountWithFilesConfirmation": "Esta seguro que desea eliminar '{count}' seleccionadas y sus contenidos?", "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "El episodio no tiene un número de episodio absoluto", @@ -1002,5 +1002,58 @@ "Monitoring": "Monitorizando", "MonitoringOptions": "Opciones de monitorización", "NoImportListsFound": "Ninguna lista de importación encontrada", - "AddAutoTagError": "No se pudo añadir una nueva etiqueta automática, por favor inténtalo de nuevo." + "AddAutoTagError": "No se pudo añadir una nueva etiqueta automática, por favor inténtalo de nuevo.", + "RemoveFromDownloadClientHint": "Elimina la descarga y archivo(s) del cliente de descarga", + "RemoveMultipleFromDownloadClientHint": "Elimina descargas y archivos del cliente de descarga", + "Period": "Periodo", + "RemoveQueueItemRemovalMethod": "Método de eliminación", + "RemoveQueueItemRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará la descarga y el archivo(s) del cliente de descarga.", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga.", + "Space": "Espacio", + "RemoveCompletedDownloads": "Eliminar descargas completadas", + "RemoveTagsAutomaticallyHelpText": "Eliminar etiquetas automáticamente si las condiciones no se cumplen", + "UpdateMonitoring": "Actualizar monitorizando", + "RemoveFailedDownloads": "Eliminar descargas fallidas", + "SmartReplace": "Reemplazo inteligente", + "SupportedAutoTaggingProperties": "{appName} soporta las siguientes propiedades para reglas de etiquetado automáticas", + "Yesterday": "Ayer", + "SceneInformation": "Información de escena", + "ShowBanners": "Mostrar banners", + "PreferProtocol": "Preferir {preferredProtocol}", + "RemoveQueueItem": "Eliminar - {sourceTitle}", + "RemoveTagsAutomatically": "Eliminar etiquetas automáticamente", + "Total": "Total", + "Other": "Otro", + "SkipRedownload": "Saltar redescarga", + "RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente solicitados, si {appName} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información mira la [wiki]({wikiLink})", + "SearchMonitored": "Buscar monitorizados", + "RootFolderPath": "Ruta de carpeta raíz", + "Tomorrow": "Mañana", + "UpdateFiltered": "Actualizar filtrados", + "QueueFilterHasNoItems": "Seleccionado filtro de cola que no tiene elementos", + "DownloadClientDelugeSettingsDirectory": "Directorio de descarga", + "DownloadClientDelugeSettingsDirectoryCompleted": "Directorio al que mover cuando se complete", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicación opcional a la que mover las descargas completadas, dejar en blanco para usar la ubicación predeterminada de Deluge", + "NotificationsEmbySettingsSendNotifications": "Enviar notificaciones", + "NotificationsKodiSettingAlwaysUpdateHelpText": "¿Actualiza la biblioteca incluso cuando un video se esté reproduciendo?", + "NotificationsKodiSettingAlwaysUpdate": "Actualizar siempre", + "NotificationsKodiSettingsCleanLibrary": "Limpiar biblioteca", + "NotificationsKodiSettingsCleanLibraryHelpText": "Limpia la biblioteca después de actualizar", + "NotificationsKodiSettingsDisplayTimeHelpText": "Durante cuánto tiempo serán mostradas las notificaciones (en segundos)", + "NotificationsKodiSettingsDisplayTime": "Tiempo de visualización", + "NotificationsKodiSettingsGuiNotification": "Notificación de interfaz gráfica", + "NotificationsPlexSettingsAuthToken": "Token de autenticación", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "Autenticar con Plex.tv", + "NotificationsSettingsUpdateLibrary": "Actualizar biblioteca", + "NotificationsSettingsUpdateMapPathsFrom": "Mapear rutas desde", + "NotificationsSettingsUpdateMapPathsTo": "Mapear rutas a", + "NotificationsSettingsUseSslHelpText": "Conectar a {serviceName} sobre HTTPS en vez de HTTP", + "UseSsl": "Usar SSL", + "ConnectionSettingsUrlBaseHelpText": "Añade un prefijo a la url {connectionName}, como {url}", + "DownloadClientDelugeSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Deluge", + "NotificationsEmbySettingsUpdateLibraryHelpText": "¿Actualiza biblioteca en importar, renombrar o borrar?", + "NotificationsEmbySettingsSendNotificationsHelpText": "Hacer que MediaBrowser envíe notificaciones a los proveedores configurados", + "NotificationsKodiSettingsUpdateLibraryHelpText": "¿Actualiza la biblioteca durante Importar y renombrar?", + "NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", + "NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index acca6e9da..fa21925d9 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -57,7 +57,7 @@ "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 \"{0}\"?", + "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.", "Security": "Suojaus", @@ -68,7 +68,7 @@ "APIKey": "Rajapinnan avain", "AppDataDirectory": "AppData-kansio", "Authentication": "Tunnistautuminen", - "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.", + "AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana", "AutoRedownloadFailedHelpText": "Etsi ja pyri lataamaan eri julkaisu automaattisesti.", "BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.", "BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", @@ -252,7 +252,6 @@ "UnableToLoadUISettings": "Virhe ladattaesssa käyttöliittymän asetuksia", "UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.", "Filename": "Tiedostonimi", - "UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.", "YesCancel": "Kyllä, peru", "Enable": "Käytä", "EnableAutomaticAdd": "Käytä automaattilisäystä", @@ -602,7 +601,7 @@ "RejectionCount": "Hylkäysmäärä", "ReleaseTitle": "Julkaisun nimike", "Replace": "Korvaa", - "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.", + "RestartRequiredHelpTextWarning": "Käyttöönotto vaatii in uudelleenkäynnistyksen.", "RestoreBackupAdditionalInfo": "Huomioi: {appName} käynnistyy palautusprosessin aikana automaattisesti uudelleen.", "Save": "Tallenna", "Seeders": "Jakajat", @@ -820,7 +819,7 @@ "RemotePathMappingCheckGenericPermissions": "Lataustyökalu \"{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.", - "AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.", + "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.", @@ -949,11 +948,11 @@ "ClearBlocklist": "Tyhjennä estolista", "ChownGroup": "chown-ryhmä", "ClearBlocklistMessageText": "Haluatko varmasti tyhjentää kaikki estolistan kohteet?", - "ConditionUsingRegularExpressions": "Ehto vastaa säännöllisiä lausekkeita. Huomioi, että merkeillä \"\\^$.|?*+()[{\" on erityismerkityksiä ja ne on erotettava \"\\\"-merkillä.", + "ConditionUsingRegularExpressions": "Ehto vastaa säännöllisiä lausekkeita. Huomioi, että merkeillä `\\^$.|?*+()[{`on erityismerkityksiä ja ne on erotettava `\\`-merkillä", "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.", "CloneAutoTag": "Monista automaattimerkintä", "DeleteCondition": "Poista ehto", - "DeleteAutoTagHelpText": "Haluatko varmasti poistaa automaattitunnisteen '\"0}\"?", + "DeleteAutoTagHelpText": "Haluatko varmasti poistaa automaattitunnisteen '{name}'?", "DeleteAutoTag": "Poista automaattitunniste", "DeleteRemotePathMappingMessageText": "Haluatko varmasti poistaa tämän etäsijainnin kohdistuksen?", "DeleteSelectedImportLists": "Poista tuontilista(t)", @@ -1103,5 +1102,6 @@ "Menu": "Valikko", "SupportedAutoTaggingProperties": "{appName} tukee automaattimerkinnän säännöissä seuraavia arvoja", "RemoveSelectedItemBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?", - "ResetDefinitions": "Palauta määritykset" + "ResetDefinitions": "Palauta määritykset", + "NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 0fc97bd51..3a49e07af 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -72,7 +72,7 @@ "CutoffHelpText": "Quand cette qualité est atteinte, {appName} ne téléchargera plus de films", "CutoffUnmet": "Seuil non atteint", "Dates": "Dates", - "DatabaseMigration": "Migration de la base de données", + "DatabaseMigration": "Migration des bases de données", "DelayProfiles": "Profils de retard", "Delete": "Supprimer", "DeleteBackup": "Supprimer la sauvegarde", @@ -84,14 +84,14 @@ "DeleteEmptyFolders": "Supprimer les dossiers vides", "DeleteImportListExclusion": "Supprimer l'exclusion de la liste d'importation", "DeleteImportListExclusionMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?", - "DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?", + "DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer la liste « {name} » ?", "DeleteIndexer": "Supprimer l'indexeur", "DeleteIndexerMessageText": "Voulez-vous vraiment supprimer l'indexeur « {name} » ?", "DeleteMetadataProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de métadonnées « {name} » ?", "DeleteNotification": "Supprimer la notification", "DeleteNotificationMessageText": "Voulez-vous supprimer la notification « {name} » ?", "DeleteQualityProfile": "Supprimer le profil de qualité", - "DeleteQualityProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de qualité « {name} » ?", + "DeleteQualityProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de qualité \"{name}\" ?", "DeleteReleaseProfile": "Supprimer le profil de version", "DeleteReleaseProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de version ?", "DeleteRootFolderMessageText": "Êtes-vous sûr de vouloir supprimer le dossier racine « {name} » ?", @@ -174,7 +174,7 @@ "IsCutoffCutoff": "Limite", "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Mettre à niveau jusqu'à ce que cette qualité soit atteinte ou dépassée", "IsTagUsedCannotBeDeletedWhileInUse": "Ne peut pas être supprimé pendant l'utilisation", - "Label": "Label", + "Label": "Étiquette", "LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de {appName} au démarrage de l'application.", "Level": "Niveau", "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "{appName} prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.", @@ -418,14 +418,14 @@ "AlternateTitles": "Titres alternatifs", "AlternateTitleslength1Title": "Titre", "AlternateTitleslength1Titles": "Titres", - "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de {appName}. Cela inclut des informations sur votre navigateur, quelle page {appName} WebUI vous utilisez, les rapports d'erreur ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.", + "AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs aux serveurs de {appName}. Cela inclut des informations sur votre navigateur, les pages de l'interface Web de {appName} que vous utilisez, les rapports d'erreurs ainsi que le système d'exploitation et la version d'exécution. Nous utiliserons ces informations pour prioriser les fonctionnalités et les corrections de bugs.", "AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "ArtistAlbumClickToChangeTrack": "Cliquer pour changer le film", "AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à {appName}", "AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente", - "BackupFolderHelpText": "Les chemins relatifs pointeront sous le repertoire AppData de {appName}", + "BackupFolderHelpText": "Les chemins d'accès relatifs se trouvent dans le répertoire AppData de {appName}", "BindAddressHelpTextWarning": "Nécessite un redémarrage pour prendre effet", - "DelayingDownloadUntil": "Retarder le téléchargement jusqu'au {0} à {1}", + "DelayingDownloadUntil": "Retarder le téléchargement jusqu'au {date} à {time}", "Scheduled": "Programmé", "ScriptPath": "Chemin du script", "Search": "Rechercher", @@ -715,7 +715,7 @@ "IndexerRssHealthCheckNoIndexers": "Aucun indexeur disponible avec la synchronisation RSS activée, {appName} ne récupérera pas automatiquement les nouvelles versions", "IndexerSearchCheckNoAutomaticMessage": "Aucun indexeur disponible avec la recherche automatique activée, {appName} ne fournira aucun résultat de recherche automatique", "IndexerSearchCheckNoAvailableIndexersMessage": "Tous les indexeurs compatibles avec la recherche sont temporairement indisponibles en raison d'erreurs d'indexation récentes", - "IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur actif n'est disponible avec la recherche interactive, {appName} ne fournira aucun résultat lors d'une recherche interactive", + "IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur n'est disponible avec la recherche interactive activée. {appName} ne fournira aucun résultat de recherche interactif.", "IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "Loading": "Chargement", @@ -749,8 +749,8 @@ "UpdateAvailable": "Une nouvelle mise à jour est disponible", "UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.", "UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.", - "DeleteRemotePathMapping": "Supprimer le mappage de chemin distant", - "DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir supprimer ce mappage de chemin distant ?", + "DeleteRemotePathMapping": "Supprimer la correspondance de chemin distant", + "DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir supprimer cette correspondance de chemin distant ?", "ApplyChanges": "Appliquer les modifications", "BlocklistReleaseHelpText": "Empêche {appName} de récupérer automatiquement cette version", "FailedToLoadQueue": "Erreur lors du chargement de la file", @@ -827,7 +827,7 @@ "AddImportListImplementation": "Ajouter une liste d'importation - {implementationName}", "Implementation": "Mise en œuvre", "AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}", - "Clone": "Cloner", + "Clone": "Dupliquer", "NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé", "ManageClients": "Gérer les clients", "NoHistoryBlocklist": "Pas d'historique de liste noire", @@ -838,7 +838,7 @@ "DeleteRootFolder": "Supprimer le dossier racine", "NoIndexersFound": "Aucun indexeur n'a été trouvé", "SmartReplace": "Remplacement intelligent", - "PreferProtocol": "Préféré {preferredProtocol}", + "PreferProtocol": "Préférer {preferredProtocol}", "DeleteCondition": "Supprimer la condition", "IsShowingMonitoredUnmonitorSelected": "Arrêter de surveiller la sélection", "NoMissingItems": "Aucun élément manquant", @@ -1102,23 +1102,23 @@ "AddCondition": "Ajouter une condition", "AddConditionError": "Impossible d'ajouter une nouvelle condition, Réessayer.", "QueueFilterHasNoItems": "Le filtre de file d'attente sélectionné ne contient aucun élément", - "RegularExpressionsTutorialLink": "Plus de détails sur les expressions régulières peuvent être trouvés [ici](https://www.regular-expressions.info/tutorial.html).", + "RegularExpressionsTutorialLink": "Vous trouverez plus de détails sur les expressions régulières [ici](https://www.regular-expressions.info/tutorial.html).", "ReleaseProfile": "Profil de version", "RenameFiles": "Renommer les fichiers", "AutoTagging": "Balisage automatique", "AutoTaggingLoadError": "Impossible de charger le balisage automatique", - "AutoTaggingNegateHelpText": "Si cette case est cochée, la règle de marquage automatique ne s'appliquera pas si la condition {implementationName} est remplie.", + "AutoTaggingNegateHelpText": "Si cette case est cochée, la règle de marquage automatique ne s'appliquera pas si cette condition {implementationName} correspond.", "DeleteArtistFolderCountConfirmation": "Voulez-vous vraiment supprimer {count} séries sélectionnées ?", "DeleteArtistFoldersHelpText": "Supprimez les dossiers de séries et tout leur contenu", - "SupportedAutoTaggingProperties": "{appName} prend en charge les propriétés suivantes pour les règles de marquage automatique", + "SupportedAutoTaggingProperties": "{appName} prend en charge les propriétés suivantes pour les règles d'étiquetage automatique", "AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne rien modifier si vous n'en comprenez pas les risques.", "ArtistsEditRootFolderHelpText": "Le déplacement d'une série vers le même dossier racine peut être utilisé pour renommer les dossiers de séries afin qu'ils correspondent au titre ou au format de dénomination mis à jour", - "AutoTaggingRequiredHelpText": "Cette condition {implementationName} doit être remplie pour que la règle de marquage automatique s'applique. Dans le cas contraire, une seule correspondance {implementationName} suffit.", + "AutoTaggingRequiredHelpText": "Cette condition {implementationName} doit correspondre pour que la règle de marquage automatique s'applique. Sinon, une seule correspondance {implementationName} suffit.", "ConditionUsingRegularExpressions": "Cette condition correspond à l'aide d'expressions régulières. Notez que les caractères `\\^$.|?*+()[{` ont des significations particulières et doivent être échappés par un `\\`", "DeleteAutoTagHelpText": "Voulez-vous vraiment supprimer la balise automatique « {name} » ?", "DeleteSelectedArtists": "Supprimer l'artiste sélectionné", "DeleteSpecification": "Supprimer la spécification", - "DeleteSpecificationHelpText": "Êtes-vous sûr de vouloir supprimer la spécification « {name} » ?", + "DeleteSpecificationHelpText": "Êtes-vous sûr de vouloir supprimer la spécification '{name}' ?", "EditAutoTag": "Modifier la balise automatique", "Negate": "Nier", "OverviewOptions": "Options de présentation", @@ -1142,7 +1142,7 @@ "ArtistIsUnmonitored": "Artiste non surveillé", "BannerOptions": "Options de la bannière", "Banners": "Bannières", - "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total: {totalTrackCount})", + "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total : {totalTrackCount}, Téléchargement : {downloadingCount})", "BlocklistAndSearch": "Liste de blocage et recherche", "BlocklistAndSearchHint": "Lancer la recherche d'un remplaçant après l'inscription sur la liste de blocage", "BlocklistAndSearchMultipleHint": "Lancer la recherche de remplaçants après l'inscription sur la liste de blocage", @@ -1184,5 +1184,24 @@ "RemoveQueueItemConfirmation": "Êtes-vous sûr de vouloir retirer '{sourceTitle}' de la file d'attente ?", "RemoveQueueItemRemovalMethod": "Méthode de suppression", "RemoveQueueItemsRemovalMethodHelpTextWarning": "Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement.", - "AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer." + "AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer.", + "Donate": "Faire un don", + "CustomFilter": "Filtre personnalisé", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Destination pour les téléchargements terminés (facultative), laissez ce champ vide pour utiliser le répertoire par défaut de Deluge", + "DownloadClientDelugeSettingsDirectoryHelpText": "Emplacement dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement Deluge par défaut", + "ConnectionSettingsUrlBaseHelpText": "Ajoute un préfixe l'url de {connectionName}, comme {url}", + "DownloadClientDelugeSettingsDirectory": "Dossier de téléchargement", + "DownloadClientDelugeSettingsDirectoryCompleted": "Dossier de déplacement une fois terminé", + "Dash": "Tiret", + "Space": "Espace", + "Underscore": "Tiret du bas", + "LabelIsRequired": "L'étiquette est requise", + "Menu": "Menu", + "ConnectSettingsSummary": "Notifications, connexions aux serveurs/lecteurs de médias et scripts personnalisés", + "UseSsl": "Utiliser SSL", + "ArtistIndexFooterDownloading": "Téléchargement", + "AutomaticSearch": "Recherche automatique", + "NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')", + "Period": "Période", + "NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')" } diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index a13d994f4..da6c1d01d 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -1114,5 +1114,6 @@ "RenameFiles": "Fájlok átnevezése", "RemoveTagsAutomatically": "Címkék automatikus eltávolítása", "RemoveTagsAutomaticallyHelpText": "Ha a feltételek nem teljesülnek, automatikusan távolítsa el a címkéket", - "PasswordConfirmation": "Jelszó megerősítése" + "PasswordConfirmation": "Jelszó megerősítése", + "FormatRuntimeMinutes": "{minutes} p" } diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 7bb87e0e6..482725a79 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -13,7 +13,7 @@ "ApplyTagsHelpTextReplace": "바꾸기 : 태그를 입력 한 태그로 바꿉니다 (모든 태그를 지우려면 태그를 입력하지 않음)", "ArtistAlbumClickToChangeTrack": "영화를 변경하려면 클릭", "Authentication": "입증", - "AuthenticationMethodHelpText": "Radarr에 액세스하려면 사용자 이름 및 암호 필요", + "AuthenticationMethodHelpText": "{appName}에 접근하려면 사용자 이름과 암호가 필요합니다", "AutoRedownloadFailedHelpText": "다른 릴리스를 자동으로 검색하고 다운로드 시도", "BackupFolderHelpText": "상대 경로는 Radarr의 AppData 디렉토리에 있습니다.", "BackupNow": "백업 지금", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index fe7c7ec2e..b2d6c72cf 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -4,11 +4,11 @@ "BindAddress": "Gebonden Adres", "Blocklist": "Blokkeerlijst", "BlocklistRelease": "Uitgave op blokkeerlijst zetten", - "AppDataDirectory": "AppData folder", + "AppDataDirectory": "AppData map", "ApplyTags": "Pas Tags Toe", "ApplyTagsHelpTextReplace": "Vervangen: Vervang de tags met de ingevoerde tags (vul geen tags in om alle tags te wissen)", "ArtistAlbumClickToChangeTrack": "Klik om film te wijzigen", - "BackupNow": "Nu backup nemen", + "BackupNow": "Back-up nu maken", "BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd", "Backups": "Veiligheidskopieën", "BindAddressHelpText": "Geldig IP-adres, localhost of '*' voor alle interfaces", @@ -53,7 +53,7 @@ "DeleteIndexerMessageText": "Bent u zeker dat u de indexeerder '{name}' wilt verwijderen?", "DeleteMetadataProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?", "DeleteNotification": "Verwijder Notificatie", - "DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?", + "DeleteNotificationMessageText": "Weet je zeker dat je de notificatie ‘{name}’ wil verwijderen?", "DeleteQualityProfile": "Verwijder Kwaliteitsprofiel", "DestinationPath": "Doelmap", "DetailedProgressBar": "Gedetailleerde voortgangsbalk", @@ -63,14 +63,14 @@ "DownloadPropersAndRepacksHelpTexts1": "Of dat er al dan niet moet worden bijgewerkt naar PROPERS/REPACKS", "DownloadWarningCheckDownloadClientForMoreDetails": "Download waarschuwing: controleer de downloader voor meer details", "Edit": "Bewerk", - "Enable": "Activeer", - "EnableAutomaticAdd": "Activeer Automatisch Toevoegen", - "EnableAutomaticSearch": "Activeer Automatisch Zoeken", - "EnableColorImpairedMode": "Activeer Kleurenblindheid-modus", + "Enable": "Inschakelen", + "EnableAutomaticAdd": "Schakel automatisch toevoegen in", + "EnableAutomaticSearch": "Schakel automatisch zoeken in", + "EnableColorImpairedMode": "Schakel kleurenblindheid-modus in", "EnableColorImpairedModeHelpText": "Aangepaste stijl voor gebruikers die kleurenblind zijn om gemakkelijker kleurgecodeerde informatie te onderscheiden", - "EnableCompletedDownloadHandlingHelpText": "Importeer automatisch voltooide downloads vanuit de downloader", + "EnableCompletedDownloadHandlingHelpText": "Importeer automatisch voltooide downloads vanuit de download cliënt", "EnableHelpText": "Schakel het maken van metadata bestanden in voor dit metadata type", - "EnableInteractiveSearch": "Activeer Interactief Zoeken", + "EnableInteractiveSearch": "Schakel interactief zoeken in", "EnableRSS": "Activeer RSS Synchronisatie", "EnableSSL": "Activeer SSL", "EnableSslHelpText": " Vereist herstart als administrator om in werking te treden", @@ -187,7 +187,7 @@ "RemoveFailedDownloadsHelpText": "Verwijder mislukte downloads uit de downloader geschiedenis", "RemoveFilter": "Verwijder filter", "RemoveFromBlocklist": "Verwijder van zwarte lijst", - "RemoveFromDownloadClient": "Verwijder uit downloader", + "RemoveFromDownloadClient": "Verwijder uit download cliënt", "RemoveFromQueue": "Verwijder uit wachtrij", "RemoveSelected": "Selectie Verwijderen", "RemoveTagExistingTag": "Bestaande tag", @@ -274,7 +274,7 @@ "UnableToAddANewRemotePathMappingPleaseTryAgain": "Kon geen nieuw externe pad verwijzing toevoegen, gelieve opnieuw te proberen.", "UnableToAddANewRootFolderPleaseTryAgain": "Kon geen nieuw eigen formaat toevoegen, gelieve opnieuw te proberen.", "UnableToLoadBackups": "Kon geen veiligheidskopieën laden", - "UnableToLoadBlocklist": "Kon zwarte lijst niet laden", + "UnableToLoadBlocklist": "Niet in staat om de blokkeerlijst te laden", "UnableToLoadDelayProfiles": "Vertragingsprofielen kunnen niet worden geladen", "UnableToLoadDownloadClientOptions": "Kon downloader opties niet inladen", "UnableToLoadDownloadClients": "Downloaders kunnen niet worden geladen", @@ -298,7 +298,7 @@ "UnableToLoadTheCalendar": "Kon kalender niet inladen", "UnmonitoredHelpText": "Voeg onbewaakte films toe aan de iCal informatiestrrom", "UpdateAutomaticallyHelpText": "Download en installeer updates automatisch. Je zal nog steeds kunnen installeren vanuit Systeem: Updates", - "UpdateMechanismHelpText": "Gebruik het ingebouwde updatemechanisme of een extern script", + "UpdateMechanismHelpText": "Gebruik de ingebouwde updater van {appName} of een script", "45MinutesFourtyFive": "45 Minuten: {0}", "60MinutesSixty": "60 Minuten: {0}", "APIKey": "API-sleutel", @@ -368,7 +368,7 @@ "DeleteSelectedTrackFiles": "Verwijder Geselecteerde Filmbestanden", "DeleteSelectedTrackFilesMessageText": "Bent u zeker dat u de geselecteerde filmbestanden wilt verwijderen?", "DeleteTag": "Verwijder Tag", - "DeleteTagMessageText": "Bent u zeker dat u de tag '{0}' wilt verwijderen?", + "DeleteTagMessageText": "Weet je zeker dat je de tag '{label}' wil verwijderen?", "DeleteTrackFileMessageText": "Weet u zeker dat u {0} wilt verwijderen?", "DetailedProgressBarHelpText": "Toon tekst op voortgangsbalk", "DiskSpace": "Schijfruimte", @@ -554,7 +554,7 @@ "UpgradesAllowed": "Upgrades toegestaan", "Wanted": "Gezocht", "Warn": "Waarschuwing", - "WouldYouLikeToRestoreBackup": "Wilt u de back-up {0} herstellen?", + "WouldYouLikeToRestoreBackup": "Wilt u de back-up {name} herstellen?", "AddRootFolder": "Voeg hoofdmap toe", "Info": "Info", "Never": "Nooit", @@ -712,7 +712,7 @@ "RemoveSelectedItem": "Verwijder geselecteerde item", "DownloadClientTagHelpText": "Gebruik deze indexer alleen voor films met ten minste één overeenkomende tag. Laat leeg om te gebruiken met alle films.", "QueueIsEmpty": "Wachtrij is leeg", - "RemoveSelectedItemQueueMessageText": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?", + "RemoveSelectedItemQueueMessageText": "Weet je zeker dat je 1 item van de wachtrij wilt verwijderen?", "RemoveSelectedItemsQueueMessageText": "Weet je zeker dat je {0} van de wachtrij wilt verwijderen?", "DeleteSelectedDownloadClientsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", "DeleteSelectedImportListsMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", @@ -833,11 +833,17 @@ "CustomFormatsSettings": "Eigen Formaten Instellingen", "DownloadClientsSettingsSummary": "Download applicaties, download afhandeling en externe pad verwijzing", "GeneralSettingsSummary": "Poort, SSL, gebruikersnaam/wachtwoord, proxy, statistieken en updates", - "ImportListsSettingsSummary": "Lijsten en uitzonderingen", + "ImportListsSettingsSummary": "Importeer van een andere {appName} of Trakt lijst en regel lijst uitzonderingen", "TagsSettingsSummary": "Bekijk alle tags en hun gebruik. Ongebruikte tags kunnen worden verwijderd", "UiSettingsSummary": "Kalender, datum en tijd, kleurenblindheid en taal instellingen", "CustomFormatsSettingsSummary": "Eigen Formaten en instellingen", "QualitySettingsSummary": "Kwaliteitsdefinities en benaming", "ArtistIndexFooterDownloading": "Downloaden", - "AutomaticSearch": "Automatisch Zoeken" + "AutomaticSearch": "Automatisch Zoeken", + "FormatAgeMinutes": "minuten", + "ClearBlocklistMessageText": "Weet je zeker dat je de blokkeerlijst wil legen?", + "ChangeCategory": "Verander categorie", + "RegularExpressionsCanBeTested": "Reguliere expressies kunnen [hier] worden getest (http:://regexstorm.net/tester).", + "AutomaticUpdatesDisabledDocker": "Automatische updates zijn niet ondersteund wanneer je het docker update mechanisme gebruikt. Je dient de container image up te daten buiten {appName} om of een script te gebruiken", + "ChownGroup": "chown groep" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 588f67cb7..3c0a93adf 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -773,8 +773,8 @@ "ApplyTagsHelpTextHowToApplyArtists": "Como aplicar etiquetas aos filmes selecionados", "ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar etiquetas às listas de importação selecionadas", "ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados", - "DeleteSelectedDownloadClientsMessageText": "Tem a certeza de que pretende eliminar o(s) cliente(s) de transferência selecionado(s)?", - "DeleteSelectedImportListsMessageText": "Tem a certeza de que pretende eliminar a(s) lista(s) de importação selecionada(s)?", + "DeleteSelectedDownloadClientsMessageText": "Tem a certeza de que pretende eliminar o(s) cliente(s) de {count} transferência selecionado(s)?", + "DeleteSelectedImportListsMessageText": "Tem a certeza de que pretende eliminar a(s) lista(s) de {count} importação selecionada(s)?", "DeleteSelectedIndexersMessageText": "Tem a certeza de que pretende eliminar {count} indexador(es) selecionado(s)?", "SomeResultsAreHiddenByTheAppliedFilter": "Alguns resultados estão ocultos pelo filtro aplicado", "SuggestTranslationChange": "Sugerir mudança na tradução", @@ -787,11 +787,11 @@ "ImportListRootFolderMissingRootHealthCheckMessage": "Pasta de raiz ausente para a(s) lista(s) de importação: {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Faltam várias pastas de raiz para a(s) lista(s) de importação: {0}", "ConnectionLost": "Ligação perdida", - "ConnectionLostReconnect": "O Radarr tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", + "ConnectionLostReconnect": "O {appName} tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.", "RecentChanges": "Mudanças recentes", "WhatsNew": "O que há de novo?", "AddNewArtistRootFolderHelpText": "A subpasta \"{0}\" será criada automaticamente", - "ConnectionLostToBackend": "O Radarr perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", + "ConnectionLostToBackend": "O {appName} perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.", "Enabled": "Ativado", "AppUpdated": "{appName} Atualizado", "AutoAdd": "Adicionar automaticamente", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 22025dfdf..f46330c83 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -422,7 +422,7 @@ "RestoreBackup": "Restaurar backup", "Retention": "Retenção", "RetentionHelpText": "Somente Usenet: defina como zero para definir a retenção ilimitada", - "RetryingDownloadOn": "Tentando novamente o download {0} em {1}", + "RetryingDownloadOn": "Tentando baixar novamente em {date} às {time}", "RootFolder": "Pasta raiz", "RootFolderPathHelpText": "Os itens da pasta raiz serão adicionados a", "RootFolders": "Pastas Raiz", @@ -481,7 +481,7 @@ "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} livros baixados", "TrackMissingFromDisk": "Livro ausente do disco", "TrackNumber": "Número da faixa", - "DelayingDownloadUntil": "Atrasando o download até {0} às {1}", + "DelayingDownloadUntil": "Atrasando o download até {date} às {time}", "Dates": "Datas", "MusicbrainzId": "ID do MusicBrainz", "RemovedFromTaskQueue": "Removido da Fila de Tarefas", @@ -645,7 +645,7 @@ "OnImportFailure": "Ao Falhar na Importação", "OnHealthIssue": "Ao Problema de Saúde", "ExpandBroadcastByDefaultHelpText": "Transmissão", - "SearchForAllMissingAlbumsConfirmationCount": "Tem certeza de que deseja pesquisar todos os '{0}' álbuns ausentes?", + "SearchForAllMissingAlbumsConfirmationCount": "Tem certeza de que deseja pesquisar todos os álbuns ausentes de {totalRecords}?", "MassAlbumsCutoffUnmetWarning": "Tem certeza de que deseja pesquisar todos os álbuns '{0}' que não atingiram o corte?", "ImportListSpecificSettings": "Importar configurações específicas da lista", "AddedArtistSettings": "Adicionado configurações de artista", @@ -1245,5 +1245,30 @@ "MonitorMissingAlbums": "Álbuns Ausentes", "Tomorrow": "Amanhã", "CustomFilter": "Filtro Personalizado", - "LabelIsRequired": "Rótulo é requerido" + "LabelIsRequired": "Rótulo é requerido", + "DownloadClientDelugeSettingsDirectory": "Diretório de Download", + "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", + "NotificationsKodiSettingAlwaysUpdate": "Sempre Atualizar", + "NotificationsKodiSettingAlwaysUpdateHelpText": "Atualizar a biblioteca mesmo quando um vídeo está sendo reproduzido?", + "NotificationsKodiSettingsCleanLibrary": "Limpar Biblioteca", + "NotificationsKodiSettingsCleanLibraryHelpText": "Limpar biblioteca após atualização", + "NotificationsKodiSettingsDisplayTime": "Tempo de Exibição", + "NotificationsKodiSettingsGuiNotification": "Notificação GUI", + "NotificationsKodiSettingsUpdateLibraryHelpText": "Atualizar biblioteca em Importar e Renomear?", + "NotificationsPlexSettingsAuthToken": "Token de Autenticação", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "Autenticar com Plex.tv", + "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')", + "NotificationsSettingsUseSslHelpText": "Conecte-se a {serviceName} por HTTPS em vez de HTTP", + "UseSsl": "Usar SSL", + "ConnectionSettingsUrlBaseHelpText": "Adiciona um prefixo a 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?", + "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')" } diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 9c7690b1e..2f5a65319 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -215,7 +215,7 @@ "UnableToLoadDelayProfiles": "Невозможно загрузить профили задержки", "UnableToLoadDownloadClientOptions": "Не удалось загрузить параметры клиента загрузки", "AddingTag": "Добавить ярлык", - "AddListExclusion": "Добавить исключения списка", + "AddListExclusion": "Добавить исключение из списка", "ApplyTags": "Применить тэги", "ApplyTagsHelpTextReplace": "Заменить: заменить теги введенными тегами (оставьте поле пустым, чтобы удалить все теги)", "ArtistAlbumClickToChangeTrack": "Нажать для смены фильма", @@ -759,5 +759,7 @@ "OnHealthRestored": "При восстановлении работоспособности", "AllResultsAreHiddenByTheAppliedFilter": "Все результаты скрыты фильтром", "CustomFormatsSettings": "Настройки пользовательских форматов", - "CustomFormatsSpecificationRegularExpression": "Регулярное выражение" + "CustomFormatsSpecificationRegularExpression": "Регулярное выражение", + "AddAutoTag": "Добавить автоматический тег", + "AddAutoTagError": "Не удалось добавить новый авто тег, пожалуйста повторите попытку." } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 487145c64..3dae16bf3 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -700,7 +700,7 @@ "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", "DeleteSpecificationHelpText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "AutoTaggingNegateHelpText": "İşaretlenirse, {implementationName} koşulu eşleştiğinde otomatik etiketleme kuralı uygulanmayacaktır.", - "ConditionUsingRegularExpressions": "Bu koşul Normal İfadeler kullanılarak eşleşir. `\\^$.|?*+()[{` karakterlerinin özel anlamlara sahip olduğunu ve `\\` ile kaçılması gerektiğini unutmayın.", + "ConditionUsingRegularExpressions": "Bu koşul Normal İfadeler kullanılarak eşleşir. `\\^$.|?*+()[{` karakterlerinin özel anlamlara sahip olduğunu ve `\\` ile kaçılması gerektiğini unutmayın", "Connection": "Bağlantılar", "RenameFiles": "Yeniden Adlandır", "Small": "Küçük", From 0d76fbcf0dfa38ba38670ae47425410c36d992d4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 15 Oct 2023 18:44:53 +0300 Subject: [PATCH 067/491] New: XXL modal size --- .../src/Album/Search/AlbumInteractiveSearchModal.js | 2 +- .../src/Artist/Search/ArtistInteractiveSearchModal.js | 2 +- frontend/src/Components/Modal/Modal.css | 10 +++++++++- frontend/src/Components/Modal/Modal.css.d.ts | 1 + frontend/src/Helpers/Props/sizes.js | 4 ++-- .../src/InteractiveImport/InteractiveImportModal.js | 2 +- 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/frontend/src/Album/Search/AlbumInteractiveSearchModal.js b/frontend/src/Album/Search/AlbumInteractiveSearchModal.js index 5049658a0..6ce488615 100644 --- a/frontend/src/Album/Search/AlbumInteractiveSearchModal.js +++ b/frontend/src/Album/Search/AlbumInteractiveSearchModal.js @@ -15,7 +15,7 @@ function AlbumInteractiveSearchModal(props) { return ( diff --git a/frontend/src/Artist/Search/ArtistInteractiveSearchModal.js b/frontend/src/Artist/Search/ArtistInteractiveSearchModal.js index d7feee98d..9ce7e8f9a 100644 --- a/frontend/src/Artist/Search/ArtistInteractiveSearchModal.js +++ b/frontend/src/Artist/Search/ArtistInteractiveSearchModal.js @@ -14,7 +14,7 @@ function ArtistInteractiveSearchModal(props) { return ( diff --git a/frontend/src/Components/Modal/Modal.css b/frontend/src/Components/Modal/Modal.css index 33f849945..f7a229501 100644 --- a/frontend/src/Components/Modal/Modal.css +++ b/frontend/src/Components/Modal/Modal.css @@ -63,6 +63,13 @@ width: 1280px; } + +.extraExtraLarge { + composes: modal; + + width: 1600px; +} + @media only screen and (max-width: $breakpointExtraLarge) { .modal.extraLarge { width: 90%; @@ -90,7 +97,8 @@ .modal.small, .modal.medium, .modal.large, - .modal.extraLarge { + .modal.extraLarge, + .modal.extraExtraLarge { max-height: 100%; width: 100%; height: 100% !important; diff --git a/frontend/src/Components/Modal/Modal.css.d.ts b/frontend/src/Components/Modal/Modal.css.d.ts index b6576c7de..e582ce0f9 100644 --- a/frontend/src/Components/Modal/Modal.css.d.ts +++ b/frontend/src/Components/Modal/Modal.css.d.ts @@ -1,6 +1,7 @@ // This file is automatically generated. // Please do not change this file! interface CssExports { + 'extraExtraLarge': string; 'extraLarge': string; 'large': string; 'medium': string; diff --git a/frontend/src/Helpers/Props/sizes.js b/frontend/src/Helpers/Props/sizes.js index d7f85df5e..6ac15f3bd 100644 --- a/frontend/src/Helpers/Props/sizes.js +++ b/frontend/src/Helpers/Props/sizes.js @@ -3,5 +3,5 @@ export const SMALL = 'small'; export const MEDIUM = 'medium'; export const LARGE = 'large'; export const EXTRA_LARGE = 'extraLarge'; - -export const all = [EXTRA_SMALL, SMALL, MEDIUM, LARGE, EXTRA_LARGE]; +export const EXTRA_EXTRA_LARGE = 'extraExtraLarge'; +export const all = [EXTRA_SMALL, SMALL, MEDIUM, LARGE, EXTRA_LARGE, EXTRA_EXTRA_LARGE]; diff --git a/frontend/src/InteractiveImport/InteractiveImportModal.js b/frontend/src/InteractiveImport/InteractiveImportModal.js index dda75152f..4d0e9f2f1 100644 --- a/frontend/src/InteractiveImport/InteractiveImportModal.js +++ b/frontend/src/InteractiveImport/InteractiveImportModal.js @@ -48,7 +48,7 @@ class InteractiveImportModal extends Component { return ( From d04bb5333afe0cbd8fe7c867e2ae0bc0b8d2156d Mon Sep 17 00:00:00 2001 From: bpoxy Date: Sat, 1 Apr 2023 18:03:53 -0600 Subject: [PATCH 068/491] Fixed: Matching of custom formats during track files import (cherry picked from commit 7fedfe7423a525f05008c2c7c15e3cb0c9c38fe5) Closes #3484 --- .../CustomFormats/CustomFormatCalculationService.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs index 6f8421c13..33f85050b 100644 --- a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs +++ b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs @@ -105,7 +105,7 @@ namespace NzbDrone.Core.CustomFormats var albumInfo = new ParsedAlbumInfo { ArtistName = localTrack.Artist.Name, - ReleaseTitle = localTrack.SceneName, + ReleaseTitle = localTrack.SceneName.IsNotNullOrWhiteSpace() ? localTrack.SceneName : Path.GetFileName(localTrack.Path), Quality = localTrack.Quality, ReleaseGroup = localTrack.ReleaseGroup }; @@ -114,7 +114,8 @@ namespace NzbDrone.Core.CustomFormats { AlbumInfo = albumInfo, Artist = localTrack.Artist, - Size = localTrack.Size + Size = localTrack.Size, + Filename = Path.GetFileName(localTrack.Path) }; return ParseCustomFormat(input); From 29c77ec3a1c89d949e4988020e8f8fcab8d1ae7a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 9 Mar 2024 10:57:24 +0200 Subject: [PATCH 069/491] Fix version in namespace for AutoTagging --- src/Lidarr.Api.V1/AutoTagging/AutoTaggingController.cs | 2 +- src/Lidarr.Api.V1/AutoTagging/AutoTaggingResource.cs | 2 +- src/Lidarr.Api.V1/AutoTagging/AutoTaggingSpecificationSchema.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingController.cs b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingController.cs index e37f103fc..6a3e670eb 100644 --- a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingController.cs +++ b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingController.cs @@ -11,7 +11,7 @@ using NzbDrone.Core.AutoTagging; using NzbDrone.Core.AutoTagging.Specifications; using NzbDrone.Core.Validation; -namespace Lidarr.Api.V3.AutoTagging +namespace Lidarr.Api.V1.AutoTagging { [V1ApiController] public class AutoTaggingController : RestController diff --git a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingResource.cs b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingResource.cs index 41ad7fee9..2a91d9044 100644 --- a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingResource.cs +++ b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingResource.cs @@ -7,7 +7,7 @@ using Lidarr.Http.REST; using NzbDrone.Core.AutoTagging; using NzbDrone.Core.AutoTagging.Specifications; -namespace Lidarr.Api.V3.AutoTagging +namespace Lidarr.Api.V1.AutoTagging { public class AutoTaggingResource : RestResource { diff --git a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingSpecificationSchema.cs b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingSpecificationSchema.cs index 2b7afc543..6baca55ff 100644 --- a/src/Lidarr.Api.V1/AutoTagging/AutoTaggingSpecificationSchema.cs +++ b/src/Lidarr.Api.V1/AutoTagging/AutoTaggingSpecificationSchema.cs @@ -3,7 +3,7 @@ using Lidarr.Http.ClientSchema; using Lidarr.Http.REST; using NzbDrone.Core.AutoTagging.Specifications; -namespace Lidarr.Api.V3.AutoTagging +namespace Lidarr.Api.V1.AutoTagging { public class AutoTaggingSpecificationSchema : RestResource { From 468f3acf85e1326c5e196fbd23db468470b8cd07 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 9 Mar 2024 11:04:36 +0200 Subject: [PATCH 070/491] Translations for InteractiveSearchRow Closes #4077 --- frontend/src/InteractiveSearch/InteractiveSearchRow.js | 8 +++++--- src/NzbDrone.Core/Localization/Core/en.json | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/InteractiveSearch/InteractiveSearchRow.js b/frontend/src/InteractiveSearch/InteractiveSearchRow.js index 3029d2d2f..db65ae575 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearchRow.js +++ b/frontend/src/InteractiveSearch/InteractiveSearchRow.js @@ -48,12 +48,12 @@ function getDownloadTooltip(isGrabbing, isGrabbed, grabError) { if (isGrabbing) { return ''; } else if (isGrabbed) { - return 'Added to downloaded queue'; + return translate('AddedToDownloadQueue'); } else if (grabError) { return grabError; } - return 'Add to downloaded queue'; + return translate('AddToDownloadQueue'); } class InteractiveSearchRow extends Component { @@ -236,7 +236,9 @@ class InteractiveSearchRow extends Component { isOpen={this.state.isConfirmGrabModalOpen} kind={kinds.WARNING} title={translate('GrabRelease')} - message={translate('GrabReleaseMessageText', [title])} + message={translate('GrabReleaseUnknownArtistOrAlbumMessageText', { + title + })} confirmLabel={translate('Grab')} onConfirm={this.onGrabConfirm} onCancel={this.onGrabCancel} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index ff5d7380b..55fdd57f2 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -41,8 +41,10 @@ "AddReleaseProfile": "Add Release Profile", "AddRemotePathMapping": "Add Remote Path Mapping", "AddRootFolder": "Add Root Folder", + "AddToDownloadQueue": "Add to download queue", "Added": "Added", "AddedArtistSettings": "Added Artist Settings", + "AddedToDownloadQueue": "Added to download queue", "AddingTag": "Adding tag", "AfterManualRefresh": "After Manual Refresh", "Age": "Age", @@ -512,7 +514,7 @@ "Grab": "Grab", "GrabId": "Grab ID", "GrabRelease": "Grab Release", - "GrabReleaseMessageText": "{appName} was unable to determine which artist and album this release was for. {appName} may be unable to automatically import this release. Do you want to grab '{0}'?", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} was unable to determine which artist and album this release was for. {appName} may be unable to automatically import this release. Do you want to grab '{title}'?", "GrabSelected": "Grab Selected", "Grabbed": "Grabbed", "Group": "Group", From 8035d4202f4f05bb62c30d57aa34c51c0c75393c Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 9 Mar 2024 09:05:24 +0000 Subject: [PATCH 071/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Weblate Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ar.json | 1 - src/NzbDrone.Core/Localization/Core/bg.json | 1 - src/NzbDrone.Core/Localization/Core/ca.json | 1 - src/NzbDrone.Core/Localization/Core/cs.json | 1 - src/NzbDrone.Core/Localization/Core/da.json | 1 - src/NzbDrone.Core/Localization/Core/de.json | 1 - src/NzbDrone.Core/Localization/Core/el.json | 1 - src/NzbDrone.Core/Localization/Core/es.json | 1 - src/NzbDrone.Core/Localization/Core/fi.json | 1 - src/NzbDrone.Core/Localization/Core/fr.json | 1 - src/NzbDrone.Core/Localization/Core/he.json | 1 - src/NzbDrone.Core/Localization/Core/hi.json | 1 - src/NzbDrone.Core/Localization/Core/hu.json | 1 - src/NzbDrone.Core/Localization/Core/is.json | 1 - src/NzbDrone.Core/Localization/Core/it.json | 1 - src/NzbDrone.Core/Localization/Core/ja.json | 1 - src/NzbDrone.Core/Localization/Core/ko.json | 1 - src/NzbDrone.Core/Localization/Core/nl.json | 1 - src/NzbDrone.Core/Localization/Core/pl.json | 1 - src/NzbDrone.Core/Localization/Core/pt.json | 1 - src/NzbDrone.Core/Localization/Core/pt_BR.json | 1 - src/NzbDrone.Core/Localization/Core/ro.json | 1 - src/NzbDrone.Core/Localization/Core/ru.json | 1 - src/NzbDrone.Core/Localization/Core/sv.json | 1 - src/NzbDrone.Core/Localization/Core/th.json | 1 - src/NzbDrone.Core/Localization/Core/tr.json | 1 - src/NzbDrone.Core/Localization/Core/vi.json | 1 - src/NzbDrone.Core/Localization/Core/zh_CN.json | 1 - 28 files changed, 28 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index b2830e5ee..0bcbc4c0c 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -287,7 +287,6 @@ "GoToInterp": "انتقل إلى {0}", "Grab": "إختطاف", "GrabRelease": "انتزاع الإصدار", - "GrabReleaseMessageText": "لم يتمكن {appName} من تحديد الفيلم الذي كان هذا الإصدار من أجله. قد يتعذر على {appName} استيراد هذا الإصدار تلقائيًا. هل تريد انتزاع \"{0}\"؟", "GrabSelected": "انتزاع المحدد", "Group": "مجموعة", "HasPendingChangesNoChanges": "لا تغيرات", diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index 257340859..e41cf1e21 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -211,7 +211,6 @@ "GoToInterp": "Отидете на {0}", "Grab": "Грабнете", "GrabRelease": "Grab Release", - "GrabReleaseMessageText": "{appName} не успя да определи за кой филм е предназначено това издание. {appName} може да не може автоматично да импортира тази версия. Искате ли да вземете „{0}“?", "GrabSelected": "Grab Selected", "Group": "Група", "HasPendingChangesNoChanges": "Без промени", diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 1cf17f05c..49c9f978c 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -300,7 +300,6 @@ "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Per obtenir més informació sobre els indexadors individuals, feu clic als botons d'informació.", "Grab": "Captura", "GrabRelease": "Captura novetat", - "GrabReleaseMessageText": "{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}\"?", "GrabSelected": "Captura sel·leccionada", "Group": "Grup", "History": "Història", diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index a5336acc1..15e525bec 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -158,7 +158,6 @@ "DownloadFailedCheckDownloadClientForMoreDetails": "Stahování se nezdařilo: pro více podrobností zkontrolujte stahovacího klienta", "DownloadPropersAndRepacksHelpTexts1": "Zda se má automaticky upgradovat na Propers / Repacks", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Další informace o jednotlivých seznamech importů získáte kliknutím na informační tlačítka.", - "GrabReleaseMessageText": "{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}“?", "HasPendingChangesSaveChanges": "Uložit změny", "IgnoredHelpText": "Vydání bude odmítnuto, pokud obsahuje jeden nebo více výrazů (nerozlišují se malá a velká písmena)", "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} podporuje jakýkoli indexer, který používá standard Newznab, stejně jako další indexery uvedené níže.", diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index e9790d36c..62c5cf81f 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -341,7 +341,6 @@ "GeneralSettings": "Generelle indstillinger", "Global": "Global", "GoToInterp": "Gå til {0}", - "GrabReleaseMessageText": "{appName} var ikke i stand til at bestemme, hvilken film denne udgivelse var til. {appName} kan muligvis ikke automatisk importere denne udgivelse. Vil du hente '{0}'?", "GrabSelected": "Greb Valgt", "Group": "Gruppe", "HasPendingChangesNoChanges": "Ingen ændringer", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index ddcf65067..79c763629 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -203,7 +203,6 @@ "SSLPort": "SSL Port", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Der Indexer unterstützt keine Suchen", "GrabRelease": "Release erfassen", - "GrabReleaseMessageText": "Das Release konnte keinem Film zugeordnet werden. Ein automatischer Import wird nicht möglich sein. Trotzdem '{0}' erfassen?", "GrabSelected": "Auswahl erfassen", "Group": "Gruppe", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Wird für automatische Suchen genutzt die vom Benutzer oder von {appName} gestartet werden", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 3cce5ecb1..6a0c30bcb 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -274,7 +274,6 @@ "GoToInterp": "Μετάβαση στο {0}", "Grab": "Αρπάζω", "GrabRelease": "Πιάσε την απελευθέρωση", - "GrabReleaseMessageText": "Ο {appName} δεν μπόρεσε να προσδιορίσει ποια ταινία ήταν αυτή η κυκλοφορία. Το {appName} ενδέχεται να μην μπορεί να εισαγάγει αυτόματα αυτήν την κυκλοφορία. Θέλετε να τραβήξετε το \"{0}\";", "GrabSelected": "Επιλογή αρπαγής", "Group": "Ομάδα", "HasPendingChangesNoChanges": "Χωρίς αλλαγές", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 9727a716b..129e6cb23 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -365,7 +365,6 @@ "GoToInterp": "Ir a {0}", "Grab": "Capturar", "GrabRelease": "Capturar lanzamiento", - "GrabReleaseMessageText": "{appName} no pudo determinar para qué película es este lanzamiento. {appName} no podrá importar este lanzamiento automáticamente. Quieres descargar {0}?", "GrabSelected": "Capturar seleccionado", "Group": "Grupo", "HasPendingChangesNoChanges": "Sin Cambios", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index fa21925d9..2bc491f52 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -46,7 +46,6 @@ "EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset lataustyökalusta automaattisesti.", "Indexer": "Tietolähde", "UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.", - "GrabReleaseMessageText": "{appName} ei tunnista mille esittäjälle ja albumille julkaisu kuuluu, eikä sen automaattinen tuonti onnistu. Haluatko kaapata julkaisun \"{0}\"?", "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", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 3a49e07af..206a82a91 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -144,7 +144,6 @@ "GoToInterp": "Aller à {0}", "Grab": "Saisir", "GrabRelease": "Saisir Release", - "GrabReleaseMessageText": "{appName} n'a pas été en mesure de déterminer à quel film cette version était destinée. {appName} peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?", "GrabSelected": "Saisir la sélection", "Group": "Groupe", "HasPendingChangesNoChanges": "Aucune modification", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 2a8ef8aa1..8d34eccbc 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -65,7 +65,6 @@ "GoToInterp": "עבור אל {0}", "Grab": "לִתְפּוֹס", "GrabRelease": "שחרור תפוס", - "GrabReleaseMessageText": "רדאר לא הצליח לקבוע לאיזה סרט הסרט הזה נועד. ייתכן ש- {appName} לא תוכל לייבא גרסה זו באופן אוטומטי. האם אתה רוצה לתפוס את '{0}'?", "Group": "קְבוּצָה", "HasPendingChangesNoChanges": "אין שינויים", "HasPendingChangesSaveChanges": "שמור שינויים", diff --git a/src/NzbDrone.Core/Localization/Core/hi.json b/src/NzbDrone.Core/Localization/Core/hi.json index 2201b5c9f..985a103cb 100644 --- a/src/NzbDrone.Core/Localization/Core/hi.json +++ b/src/NzbDrone.Core/Localization/Core/hi.json @@ -76,7 +76,6 @@ "Filename": "फ़ाइल का नाम", "FileNames": "फ़ाइल नाम", "Files": "फ़ाइलें", - "GrabReleaseMessageText": "रेडर यह निर्धारित करने में असमर्थ था कि यह फिल्म किस फिल्म के लिए है। {appName} इस रिलीज़ को स्वचालित रूप से आयात करने में असमर्थ हो सकता है। क्या आप '{0}' को हथियाना चाहते हैं?", "Group": "समूह", "HasPendingChangesNoChanges": "कोई बदलाव नहीं", "HasPendingChangesSaveChanges": "परिवर्तनों को सुरक्षित करें", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index da6c1d01d..9b0100c2e 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -291,7 +291,6 @@ "WriteAudioTagsHelpTextWarning": "Az „Összes fájl” kiválasztása megváltoztatja a meglévő fájlokat az importáláskor.", "DetailedProgressBarHelpText": "Szöveg megjelenítése a folyamatjelző sávon", "GoToArtistListing": "Ugrás az előadók listájára", - "GrabReleaseMessageText": "{appName} nem tudta meghatározni, hogy melyik filmhez készült ez a kiadás. Lehet, hogy a {appName} nem tudja automatikusan importálni ezt a kiadást. Meg szeretnéd ragadni a (z) „{0}”-t?", "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Ha nem ad hozzá importlista-kizárást, és az előadó metaadat-profilja a „Nincs”-től eltérő, akkor az albumot a következő előadói frissítés során újra hozzáadhatja.", "ImportListSettings": "Általános importálási lista beállításai", "IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnArtistOrImportList": "Előadóhoz vagy importáló listához csatolt metaadatprofil nem törölhető", diff --git a/src/NzbDrone.Core/Localization/Core/is.json b/src/NzbDrone.Core/Localization/Core/is.json index 08fd011f4..c7eba0106 100644 --- a/src/NzbDrone.Core/Localization/Core/is.json +++ b/src/NzbDrone.Core/Localization/Core/is.json @@ -118,7 +118,6 @@ "Global": "Alheimslegt", "GoToInterp": "Farðu í {0}", "Grab": "Grípa", - "GrabReleaseMessageText": "{appName} gat ekki ákvarðað fyrir hvaða kvikmynd þessi útgáfa var gerð. {appName} gæti hugsanlega ekki flutt þessa útgáfu sjálfkrafa inn. Viltu grípa '{0}'?", "GrabSelected": "Grípa valið", "Group": "Hópur", "HasPendingChangesNoChanges": "Engar breytingar", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 5116bc12a..bd66da699 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -153,7 +153,6 @@ "GoToInterp": "Vai a {0}", "Grab": "Preleva", "GrabRelease": "Preleva Release", - "GrabReleaseMessageText": "{appName} non è stato in grado di determinare a quale film si riferisce questa release. {appName} potrebbe non essere in grado di importarla automaticamente. Vuoi catturare '{0}'?", "GrabSelected": "Recupera selezione", "Group": "Gruppo", "HasPendingChangesNoChanges": "Nessuna Modifica", diff --git a/src/NzbDrone.Core/Localization/Core/ja.json b/src/NzbDrone.Core/Localization/Core/ja.json index 1078d8664..59a022882 100644 --- a/src/NzbDrone.Core/Localization/Core/ja.json +++ b/src/NzbDrone.Core/Localization/Core/ja.json @@ -306,7 +306,6 @@ "GoToInterp": "{0}に移動", "Grab": "つかむ", "GrabRelease": "グラブリリース", - "GrabReleaseMessageText": "Radarrは、このリリースの対象となる映画を特定できませんでした。 Radarrは、このリリースを自動的にインポートできない場合があります。 '{0}'を取得しますか?", "GrabSelected": "選択したグラブ", "Group": "グループ", "HasPendingChangesNoChanges": "変更なし", diff --git a/src/NzbDrone.Core/Localization/Core/ko.json b/src/NzbDrone.Core/Localization/Core/ko.json index 482725a79..92101ec25 100644 --- a/src/NzbDrone.Core/Localization/Core/ko.json +++ b/src/NzbDrone.Core/Localization/Core/ko.json @@ -126,7 +126,6 @@ "GoToInterp": "{0}로 이동", "Grab": "붙잡다", "GrabRelease": "그랩 릴리스", - "GrabReleaseMessageText": "Radarr는이 릴리스의 영화를 확인할 수 없습니다. Radarr는이 릴리스를 자동으로 가져 오지 못할 수 있습니다. '{0}'을 (를) 잡으시겠습니까?", "GrabSelected": "선택한 항목 잡아", "Group": "그룹", "HasPendingChangesNoChanges": "변경 사항 없음", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index b2d6c72cf..2f8fc4916 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -95,7 +95,6 @@ "GoToInterp": "Ga naar {0}", "Grab": "Ophalen", "GrabRelease": "Uitgave Ophalen", - "GrabReleaseMessageText": "{appName} was niet in staat om deze uitgave aan een film te koppelen. {appName} zal waarschijnlijk deze uitgave niet automatisch kunnen importeren. Wilt u '{0}' ophalen?", "Group": "Groep", "HasPendingChangesNoChanges": "Geen Wijzigingen", "HasPendingChangesSaveChanges": "Wijzigingen Opslaan", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index d4b0c86aa..0366db4a0 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -309,7 +309,6 @@ "GoToInterp": "Idź do {0}", "Grab": "Chwycić", "GrabRelease": "Grab Release", - "GrabReleaseMessageText": "{appName} nie był w stanie określić, dla którego filmu jest to wydanie. {appName} może nie być w stanie automatycznie zaimportować tej wersji. Czy chcesz złapać „{0}”?", "GrabSelected": "Wybierz wybrane", "Group": "Grupa", "HasPendingChangesNoChanges": "Bez zmian", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 3c0a93adf..f5d9b100d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -452,7 +452,6 @@ "GoToInterp": "Ir para {0}", "Grab": "Capturar", "GrabRelease": "Capturar versão", - "GrabReleaseMessageText": "O {appName} não pode determinar a que autor e livro pertence esta versão. O {appName} pode ser incapaz de importar automaticamente esta versão. Deseja capturar \"{0}\"?", "GrabSelected": "Capturar seleção", "Group": "Grupo", "HasPendingChangesNoChanges": "Sem mudanças", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index f46330c83..c8c29a199 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -266,7 +266,6 @@ "GoToInterp": "Ir para {0}", "Grab": "Obter", "GrabRelease": "Obter lançamento", - "GrabReleaseMessageText": "O {appName} não conseguiu determinar para qual artista e álbum é este lançamento. O {appName} pode não conseguir importar automaticamente este lançamento. Deseja obter \"{0}\"?", "GrabSelected": "Baixar Selecionado", "Group": "Grupo", "HasPendingChangesNoChanges": "Sem alterações", diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index fc7a255c1..790a9f3e5 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -279,7 +279,6 @@ "GoToInterp": "Accesați {0}", "Grab": "Apuca", "GrabRelease": "Grab Release", - "GrabReleaseMessageText": "{appName} nu a putut stabili pentru ce film a fost lansată această lansare. Este posibil ca {appName} să nu poată importa automat această versiune. Doriți să luați „{0}”?", "GrabSelected": "Prinderea selectată", "IgnoredPlaceHolder": "Adăugați o restricție nouă", "ImportedTo": "Importat în", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 2f5a65319..c4321fae1 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -324,7 +324,6 @@ "GoToInterp": "Перейти {0}", "Grab": "Захватить", "GrabRelease": "Захватить релиз", - "GrabReleaseMessageText": "{appName} не смог определить для какого фильма был релиз. {appName} не сможет автоматически его импортировать. Хотите захватить '{0}'?", "GrabSelected": "Захватить выбранные", "Group": "Группа", "HasPendingChangesNoChanges": "Нет изменений", diff --git a/src/NzbDrone.Core/Localization/Core/sv.json b/src/NzbDrone.Core/Localization/Core/sv.json index 096cbaaad..f7239c620 100644 --- a/src/NzbDrone.Core/Localization/Core/sv.json +++ b/src/NzbDrone.Core/Localization/Core/sv.json @@ -19,7 +19,6 @@ "ExistingAlbums": "Existerande Albums", "ExpandItemsByDefault": "Expandera Saker som Standard", "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "För mer information om individuella nedladdningsklienter, klicka på informationsknappen.", - "GrabReleaseMessageText": "{appName} kunde inte avgöra vilken artist och album denna utgåva tillhör. {appName} kanske inte kan importera den här utgåvan automatiskt. Vill du ta hämta \"{0}\"?", "Global": "Global", "GoToArtistListing": "Gå till artistlista", "GoToInterp": "Gå till {0}", diff --git a/src/NzbDrone.Core/Localization/Core/th.json b/src/NzbDrone.Core/Localization/Core/th.json index 5c1ed7068..b8b4dd15e 100644 --- a/src/NzbDrone.Core/Localization/Core/th.json +++ b/src/NzbDrone.Core/Localization/Core/th.json @@ -353,7 +353,6 @@ "GoToInterp": "ไปที่ {0}", "Grab": "คว้า", "GrabRelease": "คว้ารีลีส", - "GrabReleaseMessageText": "{appName} ไม่สามารถระบุได้ว่าภาพยนตร์เรื่องนี้เป็นภาพยนตร์เรื่องใด {appName} อาจไม่สามารถนำเข้ารุ่นนี้โดยอัตโนมัติได้ คุณต้องการคว้า \"{0}\" ไหม", "GrabSelected": "Grab Selected", "Group": "กลุ่ม", "HasPendingChangesNoChanges": "ไม่มีการเปลี่ยนแปลง", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 3dae16bf3..ec5d35da7 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -185,7 +185,6 @@ "GoToInterp": "{0} adresine gidin", "Grab": "Kapmak", "GrabRelease": "Bırakma", - "GrabReleaseMessageText": "{appName}, bu sürümün hangi film için olduğunu belirleyemedi. {appName} bu sürümü otomatik olarak içe aktaramayabilir. '{0}' almak istiyor musunuz?", "GrabSelected": "Seçilenleri Kap", "Group": "Grup", "HasPendingChangesNoChanges": "Değişiklikler yok", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index e7c7f662e..03811d75c 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -361,7 +361,6 @@ "GoToInterp": "Đi tới {0}", "Grab": "Vồ lấy", "GrabRelease": "Lấy bản phát hành", - "GrabReleaseMessageText": "{appName} không thể xác định bộ phim này được phát hành. {appName} có thể không tự động nhập bản phát hành này. Bạn có muốn lấy '{0}' không?", "GrabSelected": "Lấy đã chọn", "Group": "Nhóm", "HasPendingChangesNoChanges": "Không thay đổi", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 9b10d8089..9894c25df 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -410,7 +410,6 @@ "GoToInterp": "跳转到 {0}", "Grab": "抓取", "GrabRelease": "抓取版本", - "GrabReleaseMessageText": "{appName}无法确定这个发布版本是哪部电影,{appName}可能无法自动导入此版本,你想要获取“{0}”吗?", "Group": "组", "HasPendingChangesNoChanges": "无修改", "HasPendingChangesSaveChanges": "保存更改", From 3754d611c78b20cbf34ca1485ee3b19d0f4169e0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Mar 2024 09:05:47 +0200 Subject: [PATCH 072/491] Bump version to 2.2.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 98d9d1513..110edc8a9 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.2.2' + majorVersion: '2.2.3' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 967b58017aee4bc2292f5a83e089005834df0530 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 10 Mar 2024 13:11:15 +0200 Subject: [PATCH 073/491] Bump ImageSharp, Polly --- src/NzbDrone.Core/Lidarr.Core.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index 436a2404f..80aaaf203 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -5,7 +5,7 @@ - + @@ -26,7 +26,7 @@ - + From 1db0eb1029153207ab2ceefba23fc5e338c9ea0f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 21 Feb 2024 06:12:45 +0200 Subject: [PATCH 074/491] New: Indexer flags (cherry picked from commit 7a768b5d0faf9aa57e78aee19cefee8fb19a42d5) --- frontend/src/Album/Details/TrackRow.css | 6 + frontend/src/Album/Details/TrackRow.css.d.ts | 1 + frontend/src/Album/Details/TrackRow.js | 31 ++++- .../src/Album/Details/TrackRowConnector.js | 3 +- frontend/src/Album/IndexerFlags.tsx | 26 +++++ frontend/src/App/State/SettingsAppState.ts | 3 + .../src/Components/Form/FormInputGroup.js | 5 + .../Form/IndexerFlagsSelectInput.tsx | 62 ++++++++++ frontend/src/Components/Page/PageConnector.js | 22 +++- frontend/src/Helpers/Props/icons.js | 2 + frontend/src/Helpers/Props/inputTypes.js | 1 + .../IndexerFlags/SelectIndexerFlagsModal.js | 37 ++++++ .../SelectIndexerFlagsModalContent.css | 7 ++ .../SelectIndexerFlagsModalContent.css.d.ts | 7 ++ .../SelectIndexerFlagsModalContent.js | 106 ++++++++++++++++++ ...SelectIndexerFlagsModalContentConnector.js | 54 +++++++++ .../InteractiveImportModalContent.js | 42 ++++++- .../InteractiveImportModalContentConnector.js | 2 + .../Interactive/InteractiveImportRow.js | 53 ++++++++- .../InteractiveSearch/InteractiveSearch.js | 9 ++ .../InteractiveSearchRow.css | 1 + .../InteractiveSearchRow.css.d.ts | 1 + .../InteractiveSearch/InteractiveSearchRow.js | 17 ++- .../Store/Actions/Settings/indexerFlags.js | 48 ++++++++ .../Store/Actions/interactiveImportActions.js | 1 + frontend/src/Store/Actions/settingsActions.js | 5 + frontend/src/Store/Actions/trackActions.js | 9 ++ .../Selectors/createIndexerFlagsSelector.ts | 9 ++ frontend/src/TrackFile/TrackFile.ts | 1 + frontend/src/typings/IndexerFlag.ts | 6 + .../Indexers/IndexerFlagController.cs | 23 ++++ .../Indexers/IndexerFlagResource.cs | 13 +++ src/Lidarr.Api.V1/Indexers/ReleaseResource.cs | 3 + .../ManualImport/ManualImportController.cs | 1 + .../ManualImport/ManualImportResource.cs | 3 + .../ManualImportUpdateResource.cs | 1 + .../TrackFiles/TrackFileResource.cs | 4 +- .../TrackImport/ImportDecisionMakerFixture.cs | 5 + src/NzbDrone.Core/Blocklisting/Blocklist.cs | 2 + .../Blocklisting/BlocklistService.cs | 5 + .../CustomFormatCalculationService.cs | 15 ++- .../CustomFormats/CustomFormatInput.cs | 1 + .../IndexerFlagSpecification.cs | 44 ++++++++ .../Migration/078_add_indexer_flags.cs | 15 +++ .../TrackedDownloadService.cs | 13 ++- .../History/EntityHistoryService.cs | 6 + .../Indexers/FileList/FileListParser.cs | 23 +++- .../Indexers/FileList/FileListTorrent.cs | 1 + .../Indexers/Gazelle/GazelleApi.cs | 1 + .../Indexers/Gazelle/GazelleParser.cs | 21 +++- .../Indexers/Redacted/RedactedParser.cs | 19 +++- .../Indexers/Torznab/TorznabRssParser.cs | 66 +++++++++++ src/NzbDrone.Core/Localization/Core/en.json | 6 + src/NzbDrone.Core/MediaFiles/TrackFile.cs | 1 + .../TrackImport/ImportApprovedTracks.cs | 20 ++++ .../TrackImport/Manual/ManualImportFile.cs | 1 + .../TrackImport/Manual/ManualImportItem.cs | 1 + .../TrackImport/Manual/ManualImportService.cs | 2 + .../CustomScript/CustomScript.cs | 1 + src/NzbDrone.Core/Parser/Model/LocalTrack.cs | 1 + src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs | 17 ++- 61 files changed, 886 insertions(+), 26 deletions(-) create mode 100644 frontend/src/Album/IndexerFlags.tsx create mode 100644 frontend/src/Components/Form/IndexerFlagsSelectInput.tsx create mode 100644 frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModal.js create mode 100644 frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css create mode 100644 frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts create mode 100644 frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.js create mode 100644 frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContentConnector.js create mode 100644 frontend/src/Store/Actions/Settings/indexerFlags.js create mode 100644 frontend/src/Store/Selectors/createIndexerFlagsSelector.ts create mode 100644 frontend/src/typings/IndexerFlag.ts create mode 100644 src/Lidarr.Api.V1/Indexers/IndexerFlagController.cs create mode 100644 src/Lidarr.Api.V1/Indexers/IndexerFlagResource.cs create mode 100644 src/NzbDrone.Core/CustomFormats/Specifications/IndexerFlagSpecification.cs create mode 100644 src/NzbDrone.Core/Datastore/Migration/078_add_indexer_flags.cs diff --git a/frontend/src/Album/Details/TrackRow.css b/frontend/src/Album/Details/TrackRow.css index 11ebb64fa..912c00101 100644 --- a/frontend/src/Album/Details/TrackRow.css +++ b/frontend/src/Album/Details/TrackRow.css @@ -35,3 +35,9 @@ width: 55px; } + +.indexerFlags { + composes: cell from '~Components/Table/Cells/TableRowCell.css'; + + width: 50px; +} diff --git a/frontend/src/Album/Details/TrackRow.css.d.ts b/frontend/src/Album/Details/TrackRow.css.d.ts index c5644a2d4..79bbdaf43 100644 --- a/frontend/src/Album/Details/TrackRow.css.d.ts +++ b/frontend/src/Album/Details/TrackRow.css.d.ts @@ -4,6 +4,7 @@ interface CssExports { 'audio': string; 'customFormatScore': string; 'duration': string; + 'indexerFlags': string; 'monitored': string; 'size': string; 'status': string; diff --git a/frontend/src/Album/Details/TrackRow.js b/frontend/src/Album/Details/TrackRow.js index 5f60df882..db128d493 100644 --- a/frontend/src/Album/Details/TrackRow.js +++ b/frontend/src/Album/Details/TrackRow.js @@ -2,15 +2,19 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import AlbumFormats from 'Album/AlbumFormats'; import EpisodeStatusConnector from 'Album/EpisodeStatusConnector'; +import IndexerFlags from 'Album/IndexerFlags'; +import Icon from 'Components/Icon'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; +import Popover from 'Components/Tooltip/Popover'; import Tooltip from 'Components/Tooltip/Tooltip'; -import { tooltipPositions } from 'Helpers/Props'; +import { icons, kinds, tooltipPositions } from 'Helpers/Props'; import MediaInfoConnector from 'TrackFile/MediaInfoConnector'; import * as mediaInfoTypes from 'TrackFile/mediaInfoTypes'; import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; import formatBytes from 'Utilities/Number/formatBytes'; import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore'; +import translate from 'Utilities/String/translate'; import TrackActionsCell from './TrackActionsCell'; import styles from './TrackRow.css'; @@ -32,6 +36,7 @@ class TrackRow extends Component { trackFileSize, customFormats, customFormatScore, + indexerFlags, columns, deleteTrackFile } = this.props; @@ -141,12 +146,30 @@ class TrackRow extends Component { customFormats.length )} tooltip={} - position={tooltipPositions.BOTTOM} + position={tooltipPositions.LEFT} /> ); } + if (name === 'indexerFlags') { + return ( + + {indexerFlags ? ( + } + title={translate('IndexerFlags')} + body={} + position={tooltipPositions.LEFT} + /> + ) : null} + + ); + } + if (name === 'size') { return ( (indexerFlags & item.id) === item.id + ); + + return flags.length ? ( +
    + {flags.map((flag, index) => { + return
  • {flag.name}
  • ; + })} +
+ ) : null; +} + +export default IndexerFlags; diff --git a/frontend/src/App/State/SettingsAppState.ts b/frontend/src/App/State/SettingsAppState.ts index 8511b5e2b..a84f09b53 100644 --- a/frontend/src/App/State/SettingsAppState.ts +++ b/frontend/src/App/State/SettingsAppState.ts @@ -6,6 +6,7 @@ import AppSectionState, { import DownloadClient from 'typings/DownloadClient'; import ImportList from 'typings/ImportList'; import Indexer from 'typings/Indexer'; +import IndexerFlag from 'typings/IndexerFlag'; import MetadataProfile from 'typings/MetadataProfile'; import Notification from 'typings/Notification'; import QualityProfile from 'typings/QualityProfile'; @@ -44,11 +45,13 @@ export interface RootFolderAppState AppSectionDeleteState, AppSectionSaveState {} +export type IndexerFlagSettingsAppState = AppSectionState; export type UiSettingsAppState = AppSectionState; interface SettingsAppState { downloadClients: DownloadClientAppState; importLists: ImportListAppState; + indexerFlags: IndexerFlagSettingsAppState; indexers: IndexerAppState; metadataProfiles: MetadataProfilesAppState; notifications: NotificationAppState; diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index c0f0bf5dd..04e68d608 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -12,6 +12,7 @@ import DownloadClientSelectInputConnector from './DownloadClientSelectInputConne import EnhancedSelectInput from './EnhancedSelectInput'; import EnhancedSelectInputConnector from './EnhancedSelectInputConnector'; import FormInputHelpText from './FormInputHelpText'; +import IndexerFlagsSelectInput from './IndexerFlagsSelectInput'; import IndexerSelectInputConnector from './IndexerSelectInputConnector'; import KeyValueListInput from './KeyValueListInput'; import MetadataProfileSelectInputConnector from './MetadataProfileSelectInputConnector'; @@ -83,6 +84,9 @@ function getComponent(type) { case inputTypes.INDEXER_SELECT: return IndexerSelectInputConnector; + case inputTypes.INDEXER_FLAGS_SELECT: + return IndexerFlagsSelectInput; + case inputTypes.DOWNLOAD_CLIENT_SELECT: return DownloadClientSelectInputConnector; @@ -292,6 +296,7 @@ FormInputGroup.propTypes = { includeNoChangeDisabled: PropTypes.bool, includeNone: PropTypes.bool, selectedValueOptions: PropTypes.object, + indexerFlags: PropTypes.number, pending: PropTypes.bool, errors: PropTypes.arrayOf(PropTypes.object), warnings: PropTypes.arrayOf(PropTypes.object), diff --git a/frontend/src/Components/Form/IndexerFlagsSelectInput.tsx b/frontend/src/Components/Form/IndexerFlagsSelectInput.tsx new file mode 100644 index 000000000..8dbd27a70 --- /dev/null +++ b/frontend/src/Components/Form/IndexerFlagsSelectInput.tsx @@ -0,0 +1,62 @@ +import React, { useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import EnhancedSelectInput from './EnhancedSelectInput'; + +const selectIndexerFlagsValues = (selectedFlags: number) => + createSelector( + (state: AppState) => state.settings.indexerFlags, + (indexerFlags) => { + const value = indexerFlags.items.reduce((acc: number[], { id }) => { + // eslint-disable-next-line no-bitwise + if ((selectedFlags & id) === id) { + acc.push(id); + } + + return acc; + }, []); + + const values = indexerFlags.items.map(({ id, name }) => ({ + key: id, + value: name, + })); + + return { + value, + values, + }; + } + ); + +interface IndexerFlagsSelectInputProps { + name: string; + indexerFlags: number; + onChange(payload: object): void; +} + +function IndexerFlagsSelectInput(props: IndexerFlagsSelectInputProps) { + const { indexerFlags, onChange } = props; + + const { value, values } = useSelector(selectIndexerFlagsValues(indexerFlags)); + + const onChangeWrapper = useCallback( + ({ name, value }: { name: string; value: number[] }) => { + const indexerFlags = value.reduce((acc, flagId) => acc + flagId, 0); + + onChange({ name, value: indexerFlags }); + }, + [onChange] + ); + + return ( + + ); +} + +export default IndexerFlagsSelectInput; diff --git a/frontend/src/Components/Page/PageConnector.js b/frontend/src/Components/Page/PageConnector.js index 070be9b42..0c1d37fdb 100644 --- a/frontend/src/Components/Page/PageConnector.js +++ b/frontend/src/Components/Page/PageConnector.js @@ -6,7 +6,14 @@ import { createSelector } from 'reselect'; import { fetchTranslations, saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions'; import { fetchArtist } from 'Store/Actions/artistActions'; import { fetchCustomFilters } from 'Store/Actions/customFilterActions'; -import { fetchImportLists, fetchLanguages, fetchMetadataProfiles, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions'; +import { + fetchImportLists, + fetchIndexerFlags, + fetchLanguages, + fetchMetadataProfiles, + fetchQualityProfiles, + fetchUISettings +} from 'Store/Actions/settingsActions'; import { fetchStatus } from 'Store/Actions/systemActions'; import { fetchTags } from 'Store/Actions/tagActions'; import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector'; @@ -51,6 +58,7 @@ const selectIsPopulated = createSelector( (state) => state.settings.qualityProfiles.isPopulated, (state) => state.settings.metadataProfiles.isPopulated, (state) => state.settings.importLists.isPopulated, + (state) => state.settings.indexerFlags.isPopulated, (state) => state.system.status.isPopulated, (state) => state.app.translations.isPopulated, ( @@ -61,6 +69,7 @@ const selectIsPopulated = createSelector( qualityProfilesIsPopulated, metadataProfilesIsPopulated, importListsIsPopulated, + indexerFlagsIsPopulated, systemStatusIsPopulated, translationsIsPopulated ) => { @@ -72,6 +81,7 @@ const selectIsPopulated = createSelector( qualityProfilesIsPopulated && metadataProfilesIsPopulated && importListsIsPopulated && + indexerFlagsIsPopulated && systemStatusIsPopulated && translationsIsPopulated ); @@ -86,6 +96,7 @@ const selectErrors = createSelector( (state) => state.settings.qualityProfiles.error, (state) => state.settings.metadataProfiles.error, (state) => state.settings.importLists.error, + (state) => state.settings.indexerFlags.error, (state) => state.system.status.error, (state) => state.app.translations.error, ( @@ -96,6 +107,7 @@ const selectErrors = createSelector( qualityProfilesError, metadataProfilesError, importListsError, + indexerFlagsError, systemStatusError, translationsError ) => { @@ -107,6 +119,7 @@ const selectErrors = createSelector( qualityProfilesError || metadataProfilesError || importListsError || + indexerFlagsError || systemStatusError || translationsError ); @@ -120,6 +133,7 @@ const selectErrors = createSelector( qualityProfilesError, metadataProfilesError, importListsError, + indexerFlagsError, systemStatusError, translationsError }; @@ -177,6 +191,9 @@ function createMapDispatchToProps(dispatch, props) { dispatchFetchImportLists() { dispatch(fetchImportLists()); }, + dispatchFetchIndexerFlags() { + dispatch(fetchIndexerFlags()); + }, dispatchFetchUISettings() { dispatch(fetchUISettings()); }, @@ -217,6 +234,7 @@ class PageConnector extends Component { this.props.dispatchFetchQualityProfiles(); this.props.dispatchFetchMetadataProfiles(); this.props.dispatchFetchImportLists(); + this.props.dispatchFetchIndexerFlags(); this.props.dispatchFetchUISettings(); this.props.dispatchFetchStatus(); this.props.dispatchFetchTranslations(); @@ -243,6 +261,7 @@ class PageConnector extends Component { dispatchFetchQualityProfiles, dispatchFetchMetadataProfiles, dispatchFetchImportLists, + dispatchFetchIndexerFlags, dispatchFetchUISettings, dispatchFetchStatus, dispatchFetchTranslations, @@ -284,6 +303,7 @@ PageConnector.propTypes = { dispatchFetchQualityProfiles: PropTypes.func.isRequired, dispatchFetchMetadataProfiles: PropTypes.func.isRequired, dispatchFetchImportLists: PropTypes.func.isRequired, + dispatchFetchIndexerFlags: PropTypes.func.isRequired, dispatchFetchUISettings: PropTypes.func.isRequired, dispatchFetchStatus: PropTypes.func.isRequired, dispatchFetchTranslations: PropTypes.func.isRequired, diff --git a/frontend/src/Helpers/Props/icons.js b/frontend/src/Helpers/Props/icons.js index 77803e56e..ccb8b90e9 100644 --- a/frontend/src/Helpers/Props/icons.js +++ b/frontend/src/Helpers/Props/icons.js @@ -60,6 +60,7 @@ import { faFileImport as fasFileImport, faFileInvoice as farFileInvoice, faFilter as fasFilter, + faFlag as fasFlag, faFolderOpen as fasFolderOpen, faForward as fasForward, faHeart as fasHeart, @@ -158,6 +159,7 @@ export const FILE = farFile; export const FILE_IMPORT = fasFileImport; export const FILE_MISSING = fasFileCircleQuestion; export const FILTER = fasFilter; +export const FLAG = fasFlag; export const FOLDER = farFolder; export const FOLDER_OPEN = fasFolderOpen; export const GROUP = farObjectGroup; diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index 8ebbd540b..9ec6e65df 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -15,6 +15,7 @@ export const QUALITY_PROFILE_SELECT = 'qualityProfileSelect'; export const METADATA_PROFILE_SELECT = 'metadataProfileSelect'; export const ALBUM_RELEASE_SELECT = 'albumReleaseSelect'; export const INDEXER_SELECT = 'indexerSelect'; +export const INDEXER_FLAGS_SELECT = 'indexerFlagsSelect'; export const DOWNLOAD_CLIENT_SELECT = 'downloadClientSelect'; export const ROOT_FOLDER_SELECT = 'rootFolderSelect'; export const SELECT = 'select'; diff --git a/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModal.js b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModal.js new file mode 100644 index 000000000..04359b96a --- /dev/null +++ b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModal.js @@ -0,0 +1,37 @@ +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import Modal from 'Components/Modal/Modal'; +import SelectIndexerFlagsModalContentConnector from './SelectIndexerFlagsModalContentConnector'; + +class SelectIndexerFlagsModal extends Component { + + // + // Render + + render() { + const { + isOpen, + onModalClose, + ...otherProps + } = this.props; + + return ( + + + + ); + } +} + +SelectIndexerFlagsModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + onModalClose: PropTypes.func.isRequired +}; + +export default SelectIndexerFlagsModal; diff --git a/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css new file mode 100644 index 000000000..72dfb1cb6 --- /dev/null +++ b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css @@ -0,0 +1,7 @@ +.modalBody { + composes: modalBody from '~Components/Modal/ModalBody.css'; + + display: flex; + flex: 1 1 auto; + flex-direction: column; +} diff --git a/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts new file mode 100644 index 000000000..3fc49a060 --- /dev/null +++ b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.css.d.ts @@ -0,0 +1,7 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'modalBody': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.js b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.js new file mode 100644 index 000000000..b30f76775 --- /dev/null +++ b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContent.js @@ -0,0 +1,106 @@ +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import Form from 'Components/Form/Form'; +import FormGroup from 'Components/Form/FormGroup'; +import FormInputGroup from 'Components/Form/FormInputGroup'; +import FormLabel from 'Components/Form/FormLabel'; +import Button from 'Components/Link/Button'; +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 { inputTypes, kinds, scrollDirections } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; +import styles from './SelectIndexerFlagsModalContent.css'; + +class SelectIndexerFlagsModalContent extends Component { + + // + // Lifecycle + + constructor(props, context) { + super(props, context); + + const { + indexerFlags + } = props; + + this.state = { + indexerFlags + }; + } + + // + // Listeners + + onIndexerFlagsChange = ({ value }) => { + this.setState({ indexerFlags: value }); + }; + + onIndexerFlagsSelect = () => { + this.props.onIndexerFlagsSelect(this.state); + }; + + // + // Render + + render() { + const { + onModalClose + } = this.props; + + const { + indexerFlags + } = this.state; + + return ( + + + Manual Import - Set indexer Flags + + + +
+ + + {translate('IndexerFlags')} + + + + +
+
+ + + + + + +
+ ); + } +} + +SelectIndexerFlagsModalContent.propTypes = { + indexerFlags: PropTypes.number.isRequired, + onIndexerFlagsSelect: PropTypes.func.isRequired, + onModalClose: PropTypes.func.isRequired +}; + +export default SelectIndexerFlagsModalContent; diff --git a/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContentConnector.js b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContentConnector.js new file mode 100644 index 000000000..7a9af7353 --- /dev/null +++ b/frontend/src/InteractiveImport/IndexerFlags/SelectIndexerFlagsModalContentConnector.js @@ -0,0 +1,54 @@ +import PropTypes from 'prop-types'; +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { saveInteractiveImportItem, updateInteractiveImportItems } from 'Store/Actions/interactiveImportActions'; +import SelectIndexerFlagsModalContent from './SelectIndexerFlagsModalContent'; + +const mapDispatchToProps = { + dispatchUpdateInteractiveImportItems: updateInteractiveImportItems, + dispatchSaveInteractiveImportItems: saveInteractiveImportItem +}; + +class SelectIndexerFlagsModalContentConnector extends Component { + + // + // Listeners + + onIndexerFlagsSelect = ({ indexerFlags }) => { + const { + ids, + dispatchUpdateInteractiveImportItems, + dispatchSaveInteractiveImportItems + } = this.props; + + dispatchUpdateInteractiveImportItems({ + ids, + indexerFlags + }); + + dispatchSaveInteractiveImportItems({ ids }); + + this.props.onModalClose(true); + }; + + // + // Render + + render() { + return ( + + ); + } +} + +SelectIndexerFlagsModalContentConnector.propTypes = { + ids: PropTypes.arrayOf(PropTypes.number).isRequired, + dispatchUpdateInteractiveImportItems: PropTypes.func.isRequired, + dispatchSaveInteractiveImportItems: PropTypes.func.isRequired, + onModalClose: PropTypes.func.isRequired +}; + +export default connect(null, mapDispatchToProps)(SelectIndexerFlagsModalContentConnector); diff --git a/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js b/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js index d1361a785..d980e77ce 100644 --- a/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js +++ b/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js @@ -20,6 +20,7 @@ import SelectAlbumModal from 'InteractiveImport/Album/SelectAlbumModal'; import SelectAlbumReleaseModal from 'InteractiveImport/AlbumRelease/SelectAlbumReleaseModal'; import SelectArtistModal from 'InteractiveImport/Artist/SelectArtistModal'; import ConfirmImportModal from 'InteractiveImport/Confirmation/ConfirmImportModal'; +import SelectIndexerFlagsModal from 'InteractiveImport/IndexerFlags/SelectIndexerFlagsModal'; import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal'; import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; @@ -30,7 +31,7 @@ import toggleSelected from 'Utilities/Table/toggleSelected'; import InteractiveImportRow from './InteractiveImportRow'; import styles from './InteractiveImportModalContent.css'; -const columns = [ +const COLUMNS = [ { name: 'path', label: () => translate('Path'), @@ -79,11 +80,21 @@ const columns = [ isSortable: true, isVisible: true }, + { + name: 'indexerFlags', + label: React.createElement(Icon, { + name: icons.FLAG, + title: () => translate('IndexerFlags') + }), + isSortable: true, + isVisible: true + }, { name: 'rejections', label: React.createElement(Icon, { name: icons.DANGER, - kind: kinds.DANGER + kind: kinds.DANGER, + title: () => translate('Rejections') }), isSortable: true, isVisible: true @@ -107,6 +118,7 @@ const ALBUM = 'album'; const ALBUM_RELEASE = 'albumRelease'; const RELEASE_GROUP = 'releaseGroup'; const QUALITY = 'quality'; +const INDEXER_FLAGS = 'indexerFlags'; const replaceExistingFilesOptions = { COMBINE: 'combine', @@ -301,6 +313,21 @@ class InteractiveImportModalContent extends Component { inconsistentAlbumReleases } = this.state; + const allColumns = _.cloneDeep(COLUMNS); + const columns = allColumns.map((column) => { + const showIndexerFlags = items.some((item) => item.indexerFlags); + + if (!showIndexerFlags) { + const indexerFlagsColumn = allColumns.find((c) => c.name === 'indexerFlags'); + + if (indexerFlagsColumn) { + indexerFlagsColumn.isVisible = false; + } + } + + return column; + }); + const selectedIds = this.getSelectedIds(); const selectedItem = selectedIds.length ? _.find(items, { id: selectedIds[0] }) : null; const errorMessage = getErrorMessage(error, 'Unable to load manual import items'); @@ -310,7 +337,8 @@ class InteractiveImportModalContent extends Component { { key: ALBUM, value: translate('SelectAlbum') }, { key: ALBUM_RELEASE, value: translate('SelectAlbumRelease') }, { key: QUALITY, value: translate('SelectQuality') }, - { key: RELEASE_GROUP, value: translate('SelectReleaseGroup') } + { key: RELEASE_GROUP, value: translate('SelectReleaseGroup') }, + { key: INDEXER_FLAGS, value: translate('SelectIndexerFlags') } ]; if (allowArtistChange) { @@ -433,6 +461,7 @@ class InteractiveImportModalContent extends Component { isSaving={isSaving} {...item} allowArtistChange={allowArtistChange} + columns={columns} onSelectedChange={this.onSelectedChange} onValidRowChange={this.onValidRowChange} /> @@ -547,6 +576,13 @@ class InteractiveImportModalContent extends Component { onModalClose={this.onSelectModalClose} /> + + { + this.setState({ isSelectIndexerFlagsModalOpen: true }); + }; + onSelectArtistModalClose = (changed) => { this.setState({ isSelectArtistModalOpen: false }); this.selectRowAfterChange(changed); @@ -155,6 +162,11 @@ class InteractiveImportRow extends Component { this.selectRowAfterChange(changed); }; + onSelectIndexerFlagsModalClose = (changed) => { + this.setState({ isSelectIndexerFlagsModalOpen: false }); + this.selectRowAfterChange(changed); + }; + // // Render @@ -171,7 +183,9 @@ class InteractiveImportRow extends Component { releaseGroup, size, customFormats, + indexerFlags, rejections, + columns, isReprocessing, audioTags, additionalFile, @@ -184,7 +198,8 @@ class InteractiveImportRow extends Component { isSelectAlbumModalOpen, isSelectTrackModalOpen, isSelectReleaseGroupModalOpen, - isSelectQualityModalOpen + isSelectQualityModalOpen, + isSelectIndexerFlagsModalOpen } = this.state; const artistName = artist ? artist.artistName : ''; @@ -204,6 +219,7 @@ class InteractiveImportRow extends Component { const showTrackNumbersLoading = isReprocessing && !tracks.length; const showReleaseGroupPlaceholder = isSelected && !releaseGroup; const showQualityPlaceholder = isSelected && !quality; + const showIndexerFlagsPlaceholder = isSelected && !indexerFlags; const pathCellContents = (
@@ -219,6 +235,8 @@ class InteractiveImportRow extends Component { /> ) : pathCellContents; + const isIndexerFlagsColumnVisible = columns.find((c) => c.name === 'indexerFlags')?.isVisible ?? false; + return ( + {isIndexerFlagsColumnVisible ? ( + + {showIndexerFlagsPlaceholder ? ( + + ) : ( + <> + {indexerFlags ? ( + } + title={translate('IndexerFlags')} + body={} + position={tooltipPositions.LEFT} + /> + ) : null} + + )} + + ) : null} + { rejections.length ? @@ -395,6 +435,13 @@ class InteractiveImportRow extends Component { real={quality ? quality.revision.real > 0 : false} onModalClose={this.onSelectQualityModalClose} /> + + ); } @@ -413,7 +460,9 @@ InteractiveImportRow.propTypes = { quality: PropTypes.object, size: PropTypes.number.isRequired, customFormats: PropTypes.arrayOf(PropTypes.object), + indexerFlags: PropTypes.number.isRequired, rejections: PropTypes.arrayOf(PropTypes.object).isRequired, + columns: PropTypes.arrayOf(PropTypes.object).isRequired, audioTags: PropTypes.object.isRequired, additionalFile: PropTypes.bool.isRequired, isReprocessing: PropTypes.bool, diff --git a/frontend/src/InteractiveSearch/InteractiveSearch.js b/frontend/src/InteractiveSearch/InteractiveSearch.js index 6e74695b0..64d1ce730 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearch.js +++ b/frontend/src/InteractiveSearch/InteractiveSearch.js @@ -65,6 +65,15 @@ const columns = [ isSortable: true, isVisible: true }, + { + name: 'indexerFlags', + label: React.createElement(Icon, { + name: icons.FLAG, + title: () => translate('IndexerFlags') + }), + isSortable: true, + isVisible: true + }, { name: 'rejections', label: React.createElement(Icon, { diff --git a/frontend/src/InteractiveSearch/InteractiveSearchRow.css b/frontend/src/InteractiveSearch/InteractiveSearchRow.css index ffea82600..dad7242c8 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearchRow.css +++ b/frontend/src/InteractiveSearch/InteractiveSearchRow.css @@ -35,6 +35,7 @@ } .rejected, +.indexerFlags, .download { composes: cell from '~Components/Table/Cells/TableRowCell.css'; diff --git a/frontend/src/InteractiveSearch/InteractiveSearchRow.css.d.ts b/frontend/src/InteractiveSearch/InteractiveSearchRow.css.d.ts index ca01c5ee6..bec6dcf78 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearchRow.css.d.ts +++ b/frontend/src/InteractiveSearch/InteractiveSearchRow.css.d.ts @@ -5,6 +5,7 @@ interface CssExports { 'customFormatScore': string; 'download': string; 'indexer': string; + 'indexerFlags': string; 'peers': string; 'protocol': string; 'quality': string; diff --git a/frontend/src/InteractiveSearch/InteractiveSearchRow.js b/frontend/src/InteractiveSearch/InteractiveSearchRow.js index db65ae575..a139f8085 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearchRow.js +++ b/frontend/src/InteractiveSearch/InteractiveSearchRow.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import ProtocolLabel from 'Activity/Queue/ProtocolLabel'; import AlbumFormats from 'Album/AlbumFormats'; +import IndexerFlags from 'Album/IndexerFlags'; import TrackQuality from 'Album/TrackQuality'; import Icon from 'Components/Icon'; import Link from 'Components/Link/Link'; @@ -129,6 +130,7 @@ class InteractiveSearchRow extends Component { quality, customFormatScore, customFormats, + indexerFlags = 0, rejections, downloadAllowed, isGrabbing, @@ -187,10 +189,21 @@ class InteractiveSearchRow extends Component { formatCustomFormatScore(customFormatScore, customFormats.length) } tooltip={} - position={tooltipPositions.BOTTOM} + position={tooltipPositions.LEFT} /> + + {indexerFlags ? ( + } + title={translate('IndexerFlags')} + body={} + position={tooltipPositions.LEFT} + /> + ) : null} + + { !!rejections.length && @@ -265,6 +278,7 @@ InteractiveSearchRow.propTypes = { quality: PropTypes.object.isRequired, customFormats: PropTypes.arrayOf(PropTypes.object), customFormatScore: PropTypes.number.isRequired, + indexerFlags: PropTypes.number.isRequired, rejections: PropTypes.arrayOf(PropTypes.string).isRequired, downloadAllowed: PropTypes.bool.isRequired, isGrabbing: PropTypes.bool.isRequired, @@ -277,6 +291,7 @@ InteractiveSearchRow.propTypes = { }; InteractiveSearchRow.defaultProps = { + indexerFlags: 0, rejections: [], isGrabbing: false, isGrabbed: false diff --git a/frontend/src/Store/Actions/Settings/indexerFlags.js b/frontend/src/Store/Actions/Settings/indexerFlags.js new file mode 100644 index 000000000..a53fe1c61 --- /dev/null +++ b/frontend/src/Store/Actions/Settings/indexerFlags.js @@ -0,0 +1,48 @@ +import createFetchHandler from 'Store/Actions/Creators/createFetchHandler'; +import { createThunk } from 'Store/thunks'; + +// +// Variables + +const section = 'settings.indexerFlags'; + +// +// Actions Types + +export const FETCH_INDEXER_FLAGS = 'settings/indexerFlags/fetchIndexerFlags'; + +// +// Action Creators + +export const fetchIndexerFlags = createThunk(FETCH_INDEXER_FLAGS); + +// +// Details + +export default { + + // + // State + + defaultState: { + isFetching: false, + isPopulated: false, + error: null, + items: [] + }, + + // + // Action Handlers + + actionHandlers: { + [FETCH_INDEXER_FLAGS]: createFetchHandler(section, '/indexerFlag') + }, + + // + // Reducers + + reducers: { + + } + +}; diff --git a/frontend/src/Store/Actions/interactiveImportActions.js b/frontend/src/Store/Actions/interactiveImportActions.js index e0e295568..d174f443b 100644 --- a/frontend/src/Store/Actions/interactiveImportActions.js +++ b/frontend/src/Store/Actions/interactiveImportActions.js @@ -208,6 +208,7 @@ export const actionHandlers = handleThunks({ trackIds: (item.tracks || []).map((e) => e.id), quality: item.quality, releaseGroup: item.releaseGroup, + indexerFlags: item.indexerFlags, downloadId: item.downloadId, additionalFile: item.additionalFile, replaceExistingFiles: item.replaceExistingFiles, diff --git a/frontend/src/Store/Actions/settingsActions.js b/frontend/src/Store/Actions/settingsActions.js index b787110c1..54b059083 100644 --- a/frontend/src/Store/Actions/settingsActions.js +++ b/frontend/src/Store/Actions/settingsActions.js @@ -11,6 +11,7 @@ import downloadClients from './Settings/downloadClients'; import general from './Settings/general'; import importListExclusions from './Settings/importListExclusions'; import importLists from './Settings/importLists'; +import indexerFlags from './Settings/indexerFlags'; import indexerOptions from './Settings/indexerOptions'; import indexers from './Settings/indexers'; import languages from './Settings/languages'; @@ -38,6 +39,7 @@ export * from './Settings/downloadClientOptions'; export * from './Settings/general'; export * from './Settings/importLists'; export * from './Settings/importListExclusions'; +export * from './Settings/indexerFlags'; export * from './Settings/indexerOptions'; export * from './Settings/indexers'; export * from './Settings/languages'; @@ -73,6 +75,7 @@ export const defaultState = { downloadClients: downloadClients.defaultState, downloadClientOptions: downloadClientOptions.defaultState, general: general.defaultState, + indexerFlags: indexerFlags.defaultState, indexerOptions: indexerOptions.defaultState, indexers: indexers.defaultState, importLists: importLists.defaultState, @@ -119,6 +122,7 @@ export const actionHandlers = handleThunks({ ...downloadClients.actionHandlers, ...downloadClientOptions.actionHandlers, ...general.actionHandlers, + ...indexerFlags.actionHandlers, ...indexerOptions.actionHandlers, ...indexers.actionHandlers, ...importLists.actionHandlers, @@ -156,6 +160,7 @@ export const reducers = createHandleActions({ ...downloadClients.reducers, ...downloadClientOptions.reducers, ...general.reducers, + ...indexerFlags.reducers, ...indexerOptions.reducers, ...indexers.reducers, ...importLists.reducers, diff --git a/frontend/src/Store/Actions/trackActions.js b/frontend/src/Store/Actions/trackActions.js index bd1f472c3..a71388c88 100644 --- a/frontend/src/Store/Actions/trackActions.js +++ b/frontend/src/Store/Actions/trackActions.js @@ -77,6 +77,15 @@ export const defaultState = { }), isVisible: false }, + { + name: 'indexerFlags', + columnLabel: () => translate('IndexerFlags'), + label: React.createElement(Icon, { + name: icons.FLAG, + title: () => translate('IndexerFlags') + }), + isVisible: false + }, { name: 'status', label: () => translate('Status'), diff --git a/frontend/src/Store/Selectors/createIndexerFlagsSelector.ts b/frontend/src/Store/Selectors/createIndexerFlagsSelector.ts new file mode 100644 index 000000000..90587639c --- /dev/null +++ b/frontend/src/Store/Selectors/createIndexerFlagsSelector.ts @@ -0,0 +1,9 @@ +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; + +const createIndexerFlagsSelector = createSelector( + (state: AppState) => state.settings.indexerFlags, + (indexerFlags) => indexerFlags +); + +export default createIndexerFlagsSelector; diff --git a/frontend/src/TrackFile/TrackFile.ts b/frontend/src/TrackFile/TrackFile.ts index ce9379816..ef4dc65f3 100644 --- a/frontend/src/TrackFile/TrackFile.ts +++ b/frontend/src/TrackFile/TrackFile.ts @@ -13,6 +13,7 @@ export interface TrackFile extends ModelBase { releaseGroup: string; quality: QualityModel; customFormats: CustomFormat[]; + indexerFlags: number; mediaInfo: MediaInfo; qualityCutoffNotMet: boolean; } diff --git a/frontend/src/typings/IndexerFlag.ts b/frontend/src/typings/IndexerFlag.ts new file mode 100644 index 000000000..2c7d97a73 --- /dev/null +++ b/frontend/src/typings/IndexerFlag.ts @@ -0,0 +1,6 @@ +interface IndexerFlag { + id: number; + name: string; +} + +export default IndexerFlag; diff --git a/src/Lidarr.Api.V1/Indexers/IndexerFlagController.cs b/src/Lidarr.Api.V1/Indexers/IndexerFlagController.cs new file mode 100644 index 000000000..f41700d83 --- /dev/null +++ b/src/Lidarr.Api.V1/Indexers/IndexerFlagController.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Lidarr.Http; +using Microsoft.AspNetCore.Mvc; +using NzbDrone.Core.Parser.Model; + +namespace Lidarr.Api.V1.Indexers +{ + [V1ApiController] + public class IndexerFlagController : Controller + { + [HttpGet] + public List GetAll() + { + return Enum.GetValues(typeof(IndexerFlags)).Cast().Select(f => new IndexerFlagResource + { + Id = (int)f, + Name = f.ToString() + }).ToList(); + } + } +} diff --git a/src/Lidarr.Api.V1/Indexers/IndexerFlagResource.cs b/src/Lidarr.Api.V1/Indexers/IndexerFlagResource.cs new file mode 100644 index 000000000..385f0a50c --- /dev/null +++ b/src/Lidarr.Api.V1/Indexers/IndexerFlagResource.cs @@ -0,0 +1,13 @@ +using Lidarr.Http.REST; +using Newtonsoft.Json; + +namespace Lidarr.Api.V1.Indexers +{ + public class IndexerFlagResource : RestResource + { + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] + public new int Id { get; set; } + public string Name { get; set; } + public string NameLower => Name.ToLowerInvariant(); + } +} diff --git a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs index 5ad2b70d0..e8fc6f891 100644 --- a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs +++ b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs @@ -49,6 +49,7 @@ namespace Lidarr.Api.V1.Indexers public int? Seeders { get; set; } public int? Leechers { get; set; } public DownloadProtocol Protocol { get; set; } + public int IndexerFlags { get; set; } // Sent when queuing an unknown release [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] @@ -76,6 +77,7 @@ namespace Lidarr.Api.V1.Indexers var parsedAlbumInfo = model.RemoteAlbum.ParsedAlbumInfo; var remoteAlbum = model.RemoteAlbum; var torrentInfo = (model.RemoteAlbum.Release as TorrentInfo) ?? new TorrentInfo(); + var indexerFlags = torrentInfo.IndexerFlags; // TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead? (Got a huge Deja Vu, didn't we talk about this already once?) return new ReleaseResource @@ -115,6 +117,7 @@ namespace Lidarr.Api.V1.Indexers Seeders = torrentInfo.Seeders, Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null, Protocol = releaseInfo.DownloadProtocol, + IndexerFlags = (int)indexerFlags, }; } diff --git a/src/Lidarr.Api.V1/ManualImport/ManualImportController.cs b/src/Lidarr.Api.V1/ManualImport/ManualImportController.cs index b11c36a91..fa4c95187 100644 --- a/src/Lidarr.Api.V1/ManualImport/ManualImportController.cs +++ b/src/Lidarr.Api.V1/ManualImport/ManualImportController.cs @@ -80,6 +80,7 @@ namespace Lidarr.Api.V1.ManualImport Release = resource.AlbumReleaseId.HasValue ? _releaseService.GetRelease(resource.AlbumReleaseId.Value) : null, Quality = resource.Quality, ReleaseGroup = resource.ReleaseGroup, + IndexerFlags = resource.IndexerFlags, DownloadId = resource.DownloadId, AdditionalFile = resource.AdditionalFile, ReplaceExistingFiles = resource.ReplaceExistingFiles, diff --git a/src/Lidarr.Api.V1/ManualImport/ManualImportResource.cs b/src/Lidarr.Api.V1/ManualImport/ManualImportResource.cs index 4b38b4f7c..b2f70eb3f 100644 --- a/src/Lidarr.Api.V1/ManualImport/ManualImportResource.cs +++ b/src/Lidarr.Api.V1/ManualImport/ManualImportResource.cs @@ -24,6 +24,7 @@ namespace Lidarr.Api.V1.ManualImport public string ReleaseGroup { get; set; } public int QualityWeight { get; set; } public string DownloadId { get; set; } + public int IndexerFlags { get; set; } public IEnumerable Rejections { get; set; } public ParsedTrackInfo AudioTags { get; set; } public bool AdditionalFile { get; set; } @@ -55,7 +56,9 @@ namespace Lidarr.Api.V1.ManualImport // QualityWeight DownloadId = model.DownloadId, + IndexerFlags = model.IndexerFlags, Rejections = model.Rejections, + AudioTags = model.Tags, AdditionalFile = model.AdditionalFile, ReplaceExistingFiles = model.ReplaceExistingFiles, diff --git a/src/Lidarr.Api.V1/ManualImport/ManualImportUpdateResource.cs b/src/Lidarr.Api.V1/ManualImport/ManualImportUpdateResource.cs index 84a513807..3a4bbc6f4 100644 --- a/src/Lidarr.Api.V1/ManualImport/ManualImportUpdateResource.cs +++ b/src/Lidarr.Api.V1/ManualImport/ManualImportUpdateResource.cs @@ -17,6 +17,7 @@ namespace Lidarr.Api.V1.ManualImport public List TrackIds { get; set; } public QualityModel Quality { get; set; } public string ReleaseGroup { get; set; } + public int IndexerFlags { get; set; } public string DownloadId { get; set; } public bool AdditionalFile { get; set; } public bool ReplaceExistingFiles { get; set; } diff --git a/src/Lidarr.Api.V1/TrackFiles/TrackFileResource.cs b/src/Lidarr.Api.V1/TrackFiles/TrackFileResource.cs index 5c6695875..d09fbff97 100644 --- a/src/Lidarr.Api.V1/TrackFiles/TrackFileResource.cs +++ b/src/Lidarr.Api.V1/TrackFiles/TrackFileResource.cs @@ -24,6 +24,7 @@ namespace Lidarr.Api.V1.TrackFiles public int QualityWeight { get; set; } public List CustomFormats { get; set; } public int CustomFormatScore { get; set; } + public int? IndexerFlags { get; set; } public MediaInfoResource MediaInfo { get; set; } public bool QualityCutoffNotMet { get; set; } @@ -94,7 +95,8 @@ namespace Lidarr.Api.V1.TrackFiles MediaInfo = model.MediaInfo.ToResource(), QualityCutoffNotMet = upgradableSpecification.QualityCutoffNotMet(artist.QualityProfile.Value, model.Quality), CustomFormats = customFormats.ToResource(false), - CustomFormatScore = customFormatScore + CustomFormatScore = customFormatScore, + IndexerFlags = (int)model.IndexerFlags }; } } diff --git a/src/NzbDrone.Core.Test/MediaFiles/TrackImport/ImportDecisionMakerFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/TrackImport/ImportDecisionMakerFixture.cs index a2ece8263..826d7c129 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/TrackImport/ImportDecisionMakerFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/TrackImport/ImportDecisionMakerFixture.cs @@ -8,6 +8,7 @@ using Moq; using NUnit.Framework; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download; +using NzbDrone.Core.History; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles.TrackImport; using NzbDrone.Core.MediaFiles.TrackImport.Aggregation; @@ -130,6 +131,10 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport .Setup(c => c.FilterUnchangedFiles(It.IsAny>(), It.IsAny())) .Returns((List files, FilterFilesType filter) => files); + Mocker.GetMock() + .Setup(x => x.FindByDownloadId(It.IsAny())) + .Returns(new List()); + GivenSpecifications(_albumpass1); } diff --git a/src/NzbDrone.Core/Blocklisting/Blocklist.cs b/src/NzbDrone.Core/Blocklisting/Blocklist.cs index c01077a9e..17c092924 100644 --- a/src/NzbDrone.Core/Blocklisting/Blocklist.cs +++ b/src/NzbDrone.Core/Blocklisting/Blocklist.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using NzbDrone.Core.Datastore; using NzbDrone.Core.Indexers; using NzbDrone.Core.Music; +using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; namespace NzbDrone.Core.Blocklisting @@ -19,6 +20,7 @@ namespace NzbDrone.Core.Blocklisting public long? Size { get; set; } public DownloadProtocol Protocol { get; set; } public string Indexer { get; set; } + public IndexerFlags IndexerFlags { get; set; } public string Message { get; set; } public string TorrentInfoHash { get; set; } } diff --git a/src/NzbDrone.Core/Blocklisting/BlocklistService.cs b/src/NzbDrone.Core/Blocklisting/BlocklistService.cs index 6734a3318..18c4503f1 100644 --- a/src/NzbDrone.Core/Blocklisting/BlocklistService.cs +++ b/src/NzbDrone.Core/Blocklisting/BlocklistService.cs @@ -188,6 +188,11 @@ namespace NzbDrone.Core.Blocklisting TorrentInfoHash = message.Data.GetValueOrDefault("torrentInfoHash") }; + if (Enum.TryParse(message.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags)) + { + blocklist.IndexerFlags = flags; + } + _blocklistRepository.Insert(blocklist); } diff --git a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs index 33f85050b..0eb14fef0 100644 --- a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs +++ b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -38,7 +39,8 @@ namespace NzbDrone.Core.CustomFormats { AlbumInfo = remoteAlbum.ParsedAlbumInfo, Artist = remoteAlbum.Artist, - Size = size + Size = size, + IndexerFlags = remoteAlbum.Release?.IndexerFlags ?? 0 }; return ParseCustomFormat(input); @@ -70,7 +72,8 @@ namespace NzbDrone.Core.CustomFormats { AlbumInfo = albumInfo, Artist = artist, - Size = blocklist.Size ?? 0 + Size = blocklist.Size ?? 0, + IndexerFlags = blocklist.IndexerFlags }; return ParseCustomFormat(input); @@ -81,6 +84,7 @@ namespace NzbDrone.Core.CustomFormats var parsed = Parser.Parser.ParseAlbumTitle(history.SourceTitle); long.TryParse(history.Data.GetValueOrDefault("size"), out var size); + Enum.TryParse(history.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags indexerFlags); var albumInfo = new ParsedAlbumInfo { @@ -94,7 +98,8 @@ namespace NzbDrone.Core.CustomFormats { AlbumInfo = albumInfo, Artist = artist, - Size = size + Size = size, + IndexerFlags = indexerFlags }; return ParseCustomFormat(input); @@ -115,7 +120,8 @@ namespace NzbDrone.Core.CustomFormats AlbumInfo = albumInfo, Artist = localTrack.Artist, Size = localTrack.Size, - Filename = Path.GetFileName(localTrack.Path) + Filename = Path.GetFileName(localTrack.Path), + IndexerFlags = localTrack.IndexerFlags, }; return ParseCustomFormat(input); @@ -182,6 +188,7 @@ namespace NzbDrone.Core.CustomFormats AlbumInfo = albumInfo, Artist = artist, Size = trackFile.Size, + IndexerFlags = trackFile.IndexerFlags, Filename = Path.GetFileName(trackFile.Path) }; diff --git a/src/NzbDrone.Core/CustomFormats/CustomFormatInput.cs b/src/NzbDrone.Core/CustomFormats/CustomFormatInput.cs index 83efff8bb..f43003b47 100644 --- a/src/NzbDrone.Core/CustomFormats/CustomFormatInput.cs +++ b/src/NzbDrone.Core/CustomFormats/CustomFormatInput.cs @@ -8,6 +8,7 @@ namespace NzbDrone.Core.CustomFormats public ParsedAlbumInfo AlbumInfo { get; set; } public Artist Artist { get; set; } public long Size { get; set; } + public IndexerFlags IndexerFlags { get; set; } public string Filename { get; set; } // public CustomFormatInput(ParsedEpisodeInfo episodeInfo, Series series) diff --git a/src/NzbDrone.Core/CustomFormats/Specifications/IndexerFlagSpecification.cs b/src/NzbDrone.Core/CustomFormats/Specifications/IndexerFlagSpecification.cs new file mode 100644 index 000000000..3eaeeb5f6 --- /dev/null +++ b/src/NzbDrone.Core/CustomFormats/Specifications/IndexerFlagSpecification.cs @@ -0,0 +1,44 @@ +using System; +using FluentValidation; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.CustomFormats +{ + public class IndexerFlagSpecificationValidator : AbstractValidator + { + public IndexerFlagSpecificationValidator() + { + RuleFor(c => c.Value).NotEmpty(); + RuleFor(c => c.Value).Custom((flag, context) => + { + if (!Enum.IsDefined(typeof(IndexerFlags), flag)) + { + context.AddFailure($"Invalid indexer flag condition value: {flag}"); + } + }); + } + } + + public class IndexerFlagSpecification : CustomFormatSpecificationBase + { + private static readonly IndexerFlagSpecificationValidator Validator = new (); + + public override int Order => 4; + public override string ImplementationName => "Indexer Flag"; + + [FieldDefinition(1, Label = "CustomFormatsSpecificationFlag", Type = FieldType.Select, SelectOptions = typeof(IndexerFlags))] + public int Value { get; set; } + + protected override bool IsSatisfiedByWithoutNegate(CustomFormatInput input) + { + return input.IndexerFlags.HasFlag((IndexerFlags)Value); + } + + public override NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } + } +} diff --git a/src/NzbDrone.Core/Datastore/Migration/078_add_indexer_flags.cs b/src/NzbDrone.Core/Datastore/Migration/078_add_indexer_flags.cs new file mode 100644 index 000000000..46ff2d20b --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/078_add_indexer_flags.cs @@ -0,0 +1,15 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(078)] + public class add_indexer_flags : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("Blocklist").AddColumn("IndexerFlags").AsInt32().WithDefaultValue(0); + Alter.Table("TrackFiles").AddColumn("IndexerFlags").AsInt32().WithDefaultValue(0); + } + } +} diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs index eed5d5405..efe1d2fd4 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs @@ -12,6 +12,7 @@ using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Music; using NzbDrone.Core.Music.Events; using NzbDrone.Core.Parser; +using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download.TrackedDownloads { @@ -144,12 +145,11 @@ namespace NzbDrone.Core.Download.TrackedDownloads var firstHistoryItem = historyItems.First(); var grabbedEvent = historyItems.FirstOrDefault(v => v.EventType == EntityHistoryEventType.Grabbed); - trackedDownload.Indexer = grabbedEvent?.Data["indexer"]; + trackedDownload.Indexer = grabbedEvent?.Data?.GetValueOrDefault("indexer"); trackedDownload.Added = grabbedEvent?.Date; if (parsedAlbumInfo == null || - trackedDownload.RemoteAlbum == null || - trackedDownload.RemoteAlbum.Artist == null || + trackedDownload.RemoteAlbum?.Artist == null || trackedDownload.RemoteAlbum.Albums.Empty()) { // Try parsing the original source title and if that fails, try parsing it as a special @@ -181,6 +181,13 @@ namespace NzbDrone.Core.Download.TrackedDownloads } } } + + if (trackedDownload.RemoteAlbum != null && + Enum.TryParse(grabbedEvent?.Data?.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags)) + { + trackedDownload.RemoteAlbum.Release ??= new ReleaseInfo(); + trackedDownload.RemoteAlbum.Release.IndexerFlags = flags; + } } // Calculate custom formats diff --git a/src/NzbDrone.Core/History/EntityHistoryService.cs b/src/NzbDrone.Core/History/EntityHistoryService.cs index d3e33f9b0..d94d0cf9e 100644 --- a/src/NzbDrone.Core/History/EntityHistoryService.cs +++ b/src/NzbDrone.Core/History/EntityHistoryService.cs @@ -166,6 +166,7 @@ namespace NzbDrone.Core.History history.Data.Add("DownloadForced", (!message.Album.DownloadAllowed).ToString()); history.Data.Add("CustomFormatScore", message.Album.CustomFormatScore.ToString()); history.Data.Add("ReleaseSource", message.Album.ReleaseSource.ToString()); + history.Data.Add("IndexerFlags", message.Album.Release.IndexerFlags.ToString()); if (!message.Album.ParsedAlbumInfo.ReleaseHash.IsNullOrWhiteSpace()) { @@ -203,6 +204,8 @@ namespace NzbDrone.Core.History history.Data.Add("StatusMessages", message.TrackedDownload.StatusMessages.ToJson()); history.Data.Add("ReleaseGroup", message.TrackedDownload?.RemoteAlbum?.ParsedAlbumInfo?.ReleaseGroup); + history.Data.Add("IndexerFlags", message.TrackedDownload?.RemoteAlbum?.Release?.IndexerFlags.ToString()); + _historyRepository.Insert(history); } } @@ -241,6 +244,7 @@ namespace NzbDrone.Core.History history.Data.Add("DownloadClient", message.DownloadClientInfo?.Name); history.Data.Add("ReleaseGroup", message.TrackInfo.ReleaseGroup); history.Data.Add("Size", message.TrackInfo.Size.ToString()); + history.Data.Add("IndexerFlags", message.ImportedTrack.IndexerFlags.ToString()); _historyRepository.Insert(history); } @@ -324,6 +328,7 @@ namespace NzbDrone.Core.History history.Data.Add("Reason", message.Reason.ToString()); history.Data.Add("ReleaseGroup", message.TrackFile.ReleaseGroup); history.Data.Add("Size", message.TrackFile.Size.ToString()); + history.Data.Add("IndexerFlags", message.TrackFile.IndexerFlags.ToString()); _historyRepository.Insert(history); } @@ -351,6 +356,7 @@ namespace NzbDrone.Core.History history.Data.Add("Path", path); history.Data.Add("ReleaseGroup", message.TrackFile.ReleaseGroup); history.Data.Add("Size", message.TrackFile.Size.ToString()); + history.Data.Add("IndexerFlags", message.TrackFile.IndexerFlags.ToString()); _historyRepository.Insert(history); } diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs b/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs index 6fb1ef477..f29f22354 100644 --- a/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs +++ b/src/NzbDrone.Core/Indexers/FileList/FileListParser.cs @@ -38,8 +38,7 @@ namespace NzbDrone.Core.Indexers.FileList { var id = result.Id; - // if (result.FreeLeech) - torrentInfos.Add(new TorrentInfo() + torrentInfos.Add(new TorrentInfo { Guid = $"FileList-{id}", Title = result.Name, @@ -48,13 +47,31 @@ namespace NzbDrone.Core.Indexers.FileList InfoUrl = GetInfoUrl(id), Seeders = result.Seeders, Peers = result.Leechers + result.Seeders, - PublishDate = result.UploadDate.ToUniversalTime() + PublishDate = result.UploadDate.ToUniversalTime(), + IndexerFlags = GetIndexerFlags(result) }); } return torrentInfos.ToArray(); } + private static IndexerFlags GetIndexerFlags(FileListTorrent item) + { + IndexerFlags flags = 0; + + if (item.FreeLeech) + { + flags |= IndexerFlags.Freeleech; + } + + if (item.Internal) + { + flags |= IndexerFlags.Internal; + } + + return flags; + } + private string GetDownloadUrl(string torrentId) { var url = new HttpUri(_settings.BaseUrl) diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListTorrent.cs b/src/NzbDrone.Core/Indexers/FileList/FileListTorrent.cs index 01ea834ed..a22fc1c9b 100644 --- a/src/NzbDrone.Core/Indexers/FileList/FileListTorrent.cs +++ b/src/NzbDrone.Core/Indexers/FileList/FileListTorrent.cs @@ -16,6 +16,7 @@ namespace NzbDrone.Core.Indexers.FileList public uint Files { get; set; } [JsonProperty(PropertyName = "imdb")] public string ImdbId { get; set; } + public bool Internal { get; set; } [JsonProperty(PropertyName = "freeleech")] public bool FreeLeech { get; set; } [JsonProperty(PropertyName = "upload_date")] diff --git a/src/NzbDrone.Core/Indexers/Gazelle/GazelleApi.cs b/src/NzbDrone.Core/Indexers/Gazelle/GazelleApi.cs index cadd8cf02..23e57df0c 100644 --- a/src/NzbDrone.Core/Indexers/Gazelle/GazelleApi.cs +++ b/src/NzbDrone.Core/Indexers/Gazelle/GazelleApi.cs @@ -34,6 +34,7 @@ namespace NzbDrone.Core.Indexers.Gazelle public string Leechers { get; set; } public bool IsFreeLeech { get; set; } public bool IsNeutralLeech { get; set; } + public bool IsFreeload { get; set; } public bool IsPersonalFreeLeech { get; set; } public bool CanUseToken { get; set; } } diff --git a/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs b/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs index 7952dc92a..616b48872 100644 --- a/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs +++ b/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Core.Indexers.Gazelle title += " [Cue]"; } - torrentInfos.Add(new GazelleInfo() + torrentInfos.Add(new GazelleInfo { Guid = string.Format("Gazelle-{0}", id), Artist = artist, @@ -79,7 +79,7 @@ namespace NzbDrone.Core.Indexers.Gazelle Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = torrent.Time.ToUniversalTime(), - Scene = torrent.Scene, + IndexerFlags = GetIndexerFlags(torrent) }); } } @@ -92,6 +92,23 @@ namespace NzbDrone.Core.Indexers.Gazelle .ToArray(); } + private static IndexerFlags GetIndexerFlags(GazelleTorrent torrent) + { + IndexerFlags flags = 0; + + if (torrent.IsFreeLeech || torrent.IsNeutralLeech || torrent.IsFreeload || torrent.IsPersonalFreeLeech) + { + flags |= IndexerFlags.Freeleech; + } + + if (torrent.Scene) + { + flags |= IndexerFlags.Scene; + } + + return flags; + } + private string GetDownloadUrl(int torrentId) { var url = new HttpUri(_settings.BaseUrl) diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs index bb536e07c..871cbe20c 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs @@ -65,7 +65,7 @@ namespace NzbDrone.Core.Indexers.Redacted Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = torrent.Time.ToUniversalTime(), - Scene = torrent.Scene + IndexerFlags = GetIndexerFlags(torrent) }); } } @@ -111,6 +111,23 @@ namespace NzbDrone.Core.Indexers.Redacted return $"{title} [{string.Join(" / ", flags)}]"; } + private static IndexerFlags GetIndexerFlags(GazelleTorrent torrent) + { + IndexerFlags flags = 0; + + if (torrent.IsFreeLeech || torrent.IsNeutralLeech || torrent.IsFreeload || torrent.IsPersonalFreeLeech) + { + flags |= IndexerFlags.Freeleech; + } + + if (torrent.Scene) + { + flags |= IndexerFlags.Scene; + } + + return flags; + } + private string GetDownloadUrl(int torrentId, bool canUseToken) { var url = new HttpUri(_settings.BaseUrl) diff --git a/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs b/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs index 7e8285883..f4d210a84 100644 --- a/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs +++ b/src/NzbDrone.Core/Indexers/Torznab/TorznabRssParser.cs @@ -74,6 +74,18 @@ namespace NzbDrone.Core.Indexers.Torznab return true; } + protected override ReleaseInfo ProcessItem(XElement item, ReleaseInfo releaseInfo) + { + var torrentInfo = base.ProcessItem(item, releaseInfo) as TorrentInfo; + + if (torrentInfo != null) + { + torrentInfo.IndexerFlags = GetFlags(item); + } + + return torrentInfo; + } + protected override string GetInfoUrl(XElement item) { return ParseUrl(item.TryGetValue("comments").TrimEnd("#comments")); @@ -180,6 +192,53 @@ namespace NzbDrone.Core.Indexers.Torznab return base.GetPeers(item); } + protected IndexerFlags GetFlags(XElement item) + { + IndexerFlags flags = 0; + + var downloadFactor = TryGetFloatTorznabAttribute(item, "downloadvolumefactor", 1); + var uploadFactor = TryGetFloatTorznabAttribute(item, "uploadvolumefactor", 1); + + if (downloadFactor == 0.5) + { + flags |= IndexerFlags.Halfleech; + } + + if (downloadFactor == 0.75) + { + flags |= IndexerFlags.Freeleech25; + } + + if (downloadFactor == 0.25) + { + flags |= IndexerFlags.Freeleech75; + } + + if (downloadFactor == 0.0) + { + flags |= IndexerFlags.Freeleech; + } + + if (uploadFactor == 2.0) + { + flags |= IndexerFlags.DoubleUpload; + } + + var tags = TryGetMultipleTorznabAttributes(item, "tag"); + + if (tags.Any(t => t.EqualsIgnoreCase("internal"))) + { + flags |= IndexerFlags.Internal; + } + + if (tags.Any(t => t.EqualsIgnoreCase("scene"))) + { + flags |= IndexerFlags.Scene; + } + + return flags; + } + protected string TryGetTorznabAttribute(XElement item, string key, string defaultValue = "") { var attrElement = item.Elements(ns + "attr").FirstOrDefault(e => e.Attribute("name").Value.Equals(key, StringComparison.OrdinalIgnoreCase)); @@ -195,6 +254,13 @@ namespace NzbDrone.Core.Indexers.Torznab return defaultValue; } + protected float TryGetFloatTorznabAttribute(XElement item, string key, float defaultValue = 0) + { + var attr = TryGetTorznabAttribute(item, key, defaultValue.ToString()); + + return float.TryParse(attr, out var result) ? result : defaultValue; + } + protected List TryGetMultipleTorznabAttributes(XElement item, string key) { var attrElements = item.Elements(ns + "attr").Where(e => e.Attribute("name").Value.Equals(key, StringComparison.OrdinalIgnoreCase)); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 55fdd57f2..fd1161836 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -201,6 +201,7 @@ "Clear": "Clear", "ClearBlocklist": "Clear blocklist", "ClearBlocklistMessageText": "Are you sure you want to clear all items from the blocklist?", + "ClickToChangeIndexerFlags": "Click to change indexer flags", "ClickToChangeQuality": "Click to change quality", "ClickToChangeReleaseGroup": "Click to change release group", "ClientPriority": "Client Priority", @@ -257,6 +258,7 @@ "CustomFormats": "Custom Formats", "CustomFormatsSettings": "Custom Formats Settings", "CustomFormatsSettingsSummary": "Custom Formats and Settings", + "CustomFormatsSpecificationFlag": "Flag", "CustomFormatsSpecificationRegularExpression": "Regular Expression", "CustomFormatsSpecificationRegularExpressionHelpText": "Custom Format RegEx is Case Insensitive", "Customformat": "Custom Format", @@ -574,6 +576,7 @@ "Indexer": "Indexer", "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", "IndexerDownloadClientHelpText": "Specify which download client is used for grabs from this indexer", + "IndexerFlags": "Indexer Flags", "IndexerIdHelpText": "Specify what indexer the profile applies to", "IndexerIdHelpTextWarning": "Using a specific indexer with preferred words can lead to duplicate releases being grabbed", "IndexerJackettAll": "Indexers using the unsupported Jackett 'all' endpoint: {0}", @@ -901,6 +904,7 @@ "RegularExpressionsCanBeTested": "Regular expressions can be tested [here](http://regexstorm.net/tester).", "RegularExpressionsTutorialLink": "More details on regular expressions can be found [here](https://www.regular-expressions.info/tutorial.html).", "RejectionCount": "Rejection Count", + "Rejections": "Rejections", "Release": " Release", "ReleaseDate": "Release Date", "ReleaseGroup": "Release Group", @@ -1043,12 +1047,14 @@ "SelectAlbumRelease": "Select Album Release", "SelectArtist": "Select Artist", "SelectFolder": "Select Folder", + "SelectIndexerFlags": "Select Indexer Flags", "SelectQuality": "Select Quality", "SelectReleaseGroup": "Select Release Group", "SelectTracks": "Select Tracks", "SelectedCountArtistsSelectedInterp": "{selectedCount} Artist(s) Selected", "SendAnonymousUsageData": "Send Anonymous Usage Data", "SetAppTags": "Set {appName} Tags", + "SetIndexerFlags": "Set Indexer Flags", "SetPermissions": "Set Permissions", "SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?", "SetPermissionsLinuxHelpTextWarning": "If you're unsure what these settings do, do not alter them.", diff --git a/src/NzbDrone.Core/MediaFiles/TrackFile.cs b/src/NzbDrone.Core/MediaFiles/TrackFile.cs index de5d8a805..62273ec10 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackFile.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackFile.cs @@ -19,6 +19,7 @@ namespace NzbDrone.Core.MediaFiles public string SceneName { get; set; } public string ReleaseGroup { get; set; } public QualityModel Quality { get; set; } + public IndexerFlags IndexerFlags { get; set; } public MediaInfoModel MediaInfo { get; set; } public int AlbumId { get; set; } diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportApprovedTracks.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportApprovedTracks.cs index ba54e10c8..6c15d475e 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/ImportApprovedTracks.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/ImportApprovedTracks.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download; using NzbDrone.Core.Extras; +using NzbDrone.Core.History; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; @@ -40,6 +41,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport private readonly IRecycleBinProvider _recycleBinProvider; private readonly IExtraService _extraService; private readonly IDiskProvider _diskProvider; + private readonly IHistoryService _historyService; private readonly IReleaseService _releaseService; private readonly IEventAggregator _eventAggregator; private readonly IManageCommandQueue _commandQueueManager; @@ -57,6 +59,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport IRecycleBinProvider recycleBinProvider, IExtraService extraService, IDiskProvider diskProvider, + IHistoryService historyService, IReleaseService releaseService, IEventAggregator eventAggregator, IManageCommandQueue commandQueueManager, @@ -74,6 +77,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport _recycleBinProvider = recycleBinProvider; _extraService = extraService; _diskProvider = diskProvider; + _historyService = historyService; _releaseService = releaseService; _eventAggregator = eventAggregator; _commandQueueManager = commandQueueManager; @@ -197,6 +201,22 @@ namespace NzbDrone.Core.MediaFiles.TrackImport Tracks = localTrack.Tracks }; + if (downloadClientItem?.DownloadId.IsNotNullOrWhiteSpace() == true) + { + var grabHistory = _historyService.FindByDownloadId(downloadClientItem.DownloadId) + .OrderByDescending(h => h.Date) + .FirstOrDefault(h => h.EventType == EntityHistoryEventType.Grabbed); + + if (Enum.TryParse(grabHistory?.Data.GetValueOrDefault("indexerFlags"), true, out IndexerFlags flags)) + { + trackFile.IndexerFlags = flags; + } + } + else + { + trackFile.IndexerFlags = localTrack.IndexerFlags; + } + bool copyOnly; switch (importMode) { diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportFile.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportFile.cs index 9faec9a65..9d1195cff 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportFile.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportFile.cs @@ -13,6 +13,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual public int AlbumReleaseId { get; set; } public List TrackIds { get; set; } public QualityModel Quality { get; set; } + public int IndexerFlags { get; set; } public string DownloadId { get; set; } public bool DisableReleaseSwitching { get; set; } diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportItem.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportItem.cs index b96fbc045..43a15e9a8 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportItem.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportItem.cs @@ -27,6 +27,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual public string ReleaseGroup { get; set; } public string DownloadId { get; set; } public List CustomFormats { get; set; } + public int IndexerFlags { get; set; } public IEnumerable Rejections { get; set; } public ParsedTrackInfo Tags { get; set; } public bool AdditionalFile { get; set; } diff --git a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs index 0b8a18f6c..7cf6b7c85 100644 --- a/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/TrackImport/Manual/ManualImportService.cs @@ -293,6 +293,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual } item.Quality = decision.Item.Quality; + item.IndexerFlags = (int)decision.Item.IndexerFlags; item.Size = _diskProvider.GetFileSize(decision.Item.Path); item.Rejections = decision.Rejections; item.Tags = decision.Item.FileTrackInfo; @@ -344,6 +345,7 @@ namespace NzbDrone.Core.MediaFiles.TrackImport.Manual Size = fileInfo.Length, Modified = fileInfo.LastWriteTimeUtc, Quality = file.Quality, + IndexerFlags = (IndexerFlags)file.IndexerFlags, Artist = artist, Album = album, Release = release diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 4749a30f6..824f6b9fc 100644 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -75,6 +75,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Lidarr_Release_Quality", remoteAlbum.ParsedAlbumInfo.Quality.Quality.Name); environmentVariables.Add("Lidarr_Release_QualityVersion", remoteAlbum.ParsedAlbumInfo.Quality.Revision.Version.ToString()); environmentVariables.Add("Lidarr_Release_ReleaseGroup", releaseGroup ?? string.Empty); + environmentVariables.Add("Lidarr_Release_IndexerFlags", remoteAlbum.Release.IndexerFlags.ToString()); environmentVariables.Add("Lidarr_Download_Client", message.DownloadClientName ?? string.Empty); environmentVariables.Add("Lidarr_Download_Client_Type", message.DownloadClientType ?? string.Empty); environmentVariables.Add("Lidarr_Download_Id", message.DownloadId ?? string.Empty); diff --git a/src/NzbDrone.Core/Parser/Model/LocalTrack.cs b/src/NzbDrone.Core/Parser/Model/LocalTrack.cs index 1fc38c6ef..45bf44f31 100644 --- a/src/NzbDrone.Core/Parser/Model/LocalTrack.cs +++ b/src/NzbDrone.Core/Parser/Model/LocalTrack.cs @@ -26,6 +26,7 @@ namespace NzbDrone.Core.Parser.Model public List Tracks { get; set; } public Distance Distance { get; set; } public QualityModel Quality { get; set; } + public IndexerFlags IndexerFlags { get; set; } public bool ExistingFile { get; set; } public bool AdditionalFile { get; set; } public bool SceneSource { get; set; } diff --git a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs index 08ee9284c..f0dad6c66 100644 --- a/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs +++ b/src/NzbDrone.Core/Parser/Model/ReleaseInfo.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Text; -using Newtonsoft.Json; +using System.Text.Json.Serialization; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Indexers; using NzbDrone.Core.Languages; @@ -37,6 +37,9 @@ namespace NzbDrone.Core.Parser.Model public List Languages { get; set; } + [JsonIgnore] + public IndexerFlags IndexerFlags { get; set; } + // Used to track pending releases that are being reprocessed [JsonIgnore] public PendingReleaseReason? PendingReleaseReason { get; set; } @@ -85,4 +88,16 @@ namespace NzbDrone.Core.Parser.Model } } } + + [Flags] + public enum IndexerFlags + { + Freeleech = 1, // General + Halfleech = 2, // General, only 1/2 of download counted + DoubleUpload = 4, // General + Internal = 8, // General, uploader is an internal release group + Scene = 16, // General, the torrent comes from a "scene" group + Freeleech75 = 32, // Signifies a torrent counts towards 75 percent of your download quota. + Freeleech25 = 64, // Signifies a torrent counts towards 25 percent of your download quota. + } } From ebfa68087d702bc4a91664e06a594285d40b2f0a Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 13 Mar 2024 21:15:36 -0700 Subject: [PATCH 075/491] Fixed: Release push with only Magnet URL (cherry picked from commit 9f705e4161af3f4dd55b399d56b0b9c5a36e181b) --- src/Lidarr.Api.V1/Indexers/ReleasePushController.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Lidarr.Api.V1/Indexers/ReleasePushController.cs b/src/Lidarr.Api.V1/Indexers/ReleasePushController.cs index 741439503..38ae6cb1d 100644 --- a/src/Lidarr.Api.V1/Indexers/ReleasePushController.cs +++ b/src/Lidarr.Api.V1/Indexers/ReleasePushController.cs @@ -41,7 +41,8 @@ namespace Lidarr.Api.V1.Indexers _logger = logger; PostValidator.RuleFor(s => s.Title).NotEmpty(); - PostValidator.RuleFor(s => s.DownloadUrl).NotEmpty(); + PostValidator.RuleFor(s => s.DownloadUrl).NotEmpty().When(s => s.MagnetUrl.IsNullOrWhiteSpace()); + PostValidator.RuleFor(s => s.MagnetUrl).NotEmpty().When(s => s.DownloadUrl.IsNullOrWhiteSpace()); PostValidator.RuleFor(s => s.Protocol).NotEmpty(); PostValidator.RuleFor(s => s.PublishDate).NotEmpty(); } @@ -50,7 +51,7 @@ namespace Lidarr.Api.V1.Indexers [Consumes("application/json")] public ActionResult Create(ReleaseResource release) { - _logger.Info("Release pushed: {0} - {1}", release.Title, release.DownloadUrl); + _logger.Info("Release pushed: {0} - {1}", release.Title, release.DownloadUrl ?? release.MagnetUrl); ValidateResource(release); From 5ffde4032058347e11909874525545980677b819 Mon Sep 17 00:00:00 2001 From: Servarr Date: Thu, 14 Mar 2024 05:21:32 +0000 Subject: [PATCH 076/491] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 74 ++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index c798949f3..7d9305f67 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -3869,6 +3869,44 @@ } } }, + "/api/v1/indexerflag": { + "get": { + "tags": [ + "IndexerFlag" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "text/plain": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndexerFlagResource" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndexerFlagResource" + } + } + }, + "text/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IndexerFlagResource" + } + } + } + } + } + } + } + }, "/api/v1/language/{id}": { "get": { "tags": [ @@ -10143,6 +10181,25 @@ }, "additionalProperties": false }, + "IndexerFlagResource": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string", + "nullable": true + }, + "nameLower": { + "type": "string", + "nullable": true, + "readOnly": true + } + }, + "additionalProperties": false + }, "IndexerResource": { "type": "object", "properties": { @@ -10437,6 +10494,10 @@ "type": "string", "nullable": true }, + "indexerFlags": { + "type": "integer", + "format": "int32" + }, "rejections": { "type": "array", "items": { @@ -10511,6 +10572,10 @@ "type": "string", "nullable": true }, + "indexerFlags": { + "type": "integer", + "format": "int32" + }, "downloadId": { "type": "string", "nullable": true @@ -11972,6 +12037,10 @@ "protocol": { "$ref": "#/components/schemas/DownloadProtocol" }, + "indexerFlags": { + "type": "integer", + "format": "int32" + }, "artistId": { "type": "integer", "format": "int32", @@ -12640,6 +12709,11 @@ "type": "integer", "format": "int32" }, + "indexerFlags": { + "type": "integer", + "format": "int32", + "nullable": true + }, "mediaInfo": { "$ref": "#/components/schemas/MediaInfoResource" }, From b81170d9117daff1125932be70ffc677ff66b52e Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Wed, 7 Feb 2024 04:58:09 +0100 Subject: [PATCH 077/491] Fixed: Wrapping of naming tokens with alternate separators (cherry picked from commit 80630bf97f5bb3b49d4824dc039d2edfc74e4797) Closes #4561 Closes #4677 --- .../Settings/MediaManagement/Naming/NamingOption.css | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/Settings/MediaManagement/Naming/NamingOption.css b/frontend/src/Settings/MediaManagement/Naming/NamingOption.css index b692362fb..204c93d0e 100644 --- a/frontend/src/Settings/MediaManagement/Naming/NamingOption.css +++ b/frontend/src/Settings/MediaManagement/Naming/NamingOption.css @@ -1,6 +1,6 @@ .option { display: flex; - align-items: center; + align-items: stretch; flex-wrap: wrap; margin: 3px; border: 1px solid var(--borderColor); @@ -17,7 +17,7 @@ } .small { - width: 460px; + width: 490px; } .large { @@ -26,7 +26,7 @@ .token { flex: 0 0 50%; - padding: 6px 16px; + padding: 6px; background-color: var(--popoverTitleBackgroundColor); font-family: $monoSpaceFontFamily; } @@ -34,9 +34,9 @@ .example { display: flex; align-items: center; - align-self: stretch; + justify-content: space-between; flex: 0 0 50%; - padding: 6px 16px; + padding: 6px; background-color: var(--popoverBodyBackgroundColor); .footNote { diff --git a/package.json b/package.json index 024b301a2..371864287 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "eslint --config frontend/.eslintrc.js --ignore-path frontend/.eslintignore frontend/", "lint-fix": "yarn lint --fix", "stylelint-linux": "stylelint $(find frontend -name '*.css') --config frontend/.stylelintrc", - "stylelint-windows": "stylelint frontend/**/*.css --config frontend/.stylelintrc" + "stylelint-windows": "stylelint \"frontend/**/*.css\" --config frontend/.stylelintrc" }, "repository": { "type": "git", From 873a225f0c76406bedda4a30e9c70067d5ea8340 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 12 Mar 2024 22:34:47 -0700 Subject: [PATCH 078/491] New: Show artist names after task name when applicable (cherry picked from commit 6d552f2a60f44052079b5e8944f5e1bbabac56e0) Closes #4678 --- frontend/src/App/State/AppState.ts | 2 + frontend/src/App/State/CommandAppState.ts | 6 + frontend/src/Commands/Command.ts | 1 + .../src/Helpers/Hooks/useModalOpenState.ts | 17 ++ .../Selectors/createMultiArtistsSelector.ts | 14 + .../src/System/Tasks/Queued/QueuedTaskRow.css | 9 - .../Tasks/Queued/QueuedTaskRow.css.d.ts | 2 - .../src/System/Tasks/Queued/QueuedTaskRow.js | 279 ------------------ .../src/System/Tasks/Queued/QueuedTaskRow.tsx | 238 +++++++++++++++ .../Tasks/Queued/QueuedTaskRowConnector.js | 31 -- .../Tasks/Queued/QueuedTaskRowNameCell.css | 8 + .../Queued/QueuedTaskRowNameCell.css.d.ts | 8 + .../Tasks/Queued/QueuedTaskRowNameCell.tsx | 49 +++ .../src/System/Tasks/Queued/QueuedTasks.js | 90 ------ .../src/System/Tasks/Queued/QueuedTasks.tsx | 74 +++++ .../Tasks/Queued/QueuedTasksConnector.js | 46 --- frontend/src/System/Tasks/Tasks.js | 4 +- 17 files changed, 419 insertions(+), 459 deletions(-) create mode 100644 frontend/src/App/State/CommandAppState.ts create mode 100644 frontend/src/Helpers/Hooks/useModalOpenState.ts create mode 100644 frontend/src/Store/Selectors/createMultiArtistsSelector.ts delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRow.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts create mode 100644 frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTasks.js create mode 100644 frontend/src/System/Tasks/Queued/QueuedTasks.tsx delete mode 100644 frontend/src/System/Tasks/Queued/QueuedTasksConnector.js diff --git a/frontend/src/App/State/AppState.ts b/frontend/src/App/State/AppState.ts index a8850b16f..7dc6bc331 100644 --- a/frontend/src/App/State/AppState.ts +++ b/frontend/src/App/State/AppState.ts @@ -1,6 +1,7 @@ import AlbumAppState from './AlbumAppState'; import ArtistAppState, { ArtistIndexAppState } from './ArtistAppState'; import CalendarAppState from './CalendarAppState'; +import CommandAppState from './CommandAppState'; import HistoryAppState from './HistoryAppState'; import QueueAppState from './QueueAppState'; import SettingsAppState from './SettingsAppState'; @@ -54,6 +55,7 @@ interface AppState { artist: ArtistAppState; artistIndex: ArtistIndexAppState; calendar: CalendarAppState; + commands: CommandAppState; history: HistoryAppState; queue: QueueAppState; settings: SettingsAppState; diff --git a/frontend/src/App/State/CommandAppState.ts b/frontend/src/App/State/CommandAppState.ts new file mode 100644 index 000000000..1bde37371 --- /dev/null +++ b/frontend/src/App/State/CommandAppState.ts @@ -0,0 +1,6 @@ +import AppSectionState from 'App/State/AppSectionState'; +import Command from 'Commands/Command'; + +export type CommandAppState = AppSectionState; + +export default CommandAppState; diff --git a/frontend/src/Commands/Command.ts b/frontend/src/Commands/Command.ts index 8b781355f..09a03865d 100644 --- a/frontend/src/Commands/Command.ts +++ b/frontend/src/Commands/Command.ts @@ -13,6 +13,7 @@ export interface CommandBody { trigger: string; suppressMessages: boolean; artistId?: number; + artistIds?: number[]; } interface Command extends ModelBase { diff --git a/frontend/src/Helpers/Hooks/useModalOpenState.ts b/frontend/src/Helpers/Hooks/useModalOpenState.ts new file mode 100644 index 000000000..f5b5a96f0 --- /dev/null +++ b/frontend/src/Helpers/Hooks/useModalOpenState.ts @@ -0,0 +1,17 @@ +import { useCallback, useState } from 'react'; + +export default function useModalOpenState( + initialState: boolean +): [boolean, () => void, () => void] { + const [isOpen, setOpen] = useState(initialState); + + const setModalOpen = useCallback(() => { + setOpen(true); + }, [setOpen]); + + const setModalClosed = useCallback(() => { + setOpen(false); + }, [setOpen]); + + return [isOpen, setModalOpen, setModalClosed]; +} diff --git a/frontend/src/Store/Selectors/createMultiArtistsSelector.ts b/frontend/src/Store/Selectors/createMultiArtistsSelector.ts new file mode 100644 index 000000000..7595189ee --- /dev/null +++ b/frontend/src/Store/Selectors/createMultiArtistsSelector.ts @@ -0,0 +1,14 @@ +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; + +function createMultiArtistsSelector(artistIds: number[]) { + return createSelector( + (state: AppState) => state.artist.itemMap, + (state: AppState) => state.artist.items, + (itemMap, allArtists) => { + return artistIds.map((artistId) => allArtists[itemMap[artistId]]); + } + ); +} + +export default createMultiArtistsSelector; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css index 034804711..6e38929c9 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css @@ -10,15 +10,6 @@ width: 100%; } -.commandName { - display: inline-block; - min-width: 220px; -} - -.userAgent { - color: #b0b0b0; -} - .queued, .started, .ended { diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts index 3bc00b738..2c6010533 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.css.d.ts @@ -2,14 +2,12 @@ // Please do not change this file! interface CssExports { 'actions': string; - 'commandName': string; 'duration': string; 'ended': string; 'queued': string; 'started': string; 'trigger': string; 'triggerContent': string; - 'userAgent': string; } export const cssExports: CssExports; export default cssExports; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js b/frontend/src/System/Tasks/Queued/QueuedTaskRow.js deleted file mode 100644 index 6f4da3828..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js +++ /dev/null @@ -1,279 +0,0 @@ -import moment from 'moment'; -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Icon from 'Components/Icon'; -import IconButton from 'Components/Link/IconButton'; -import ConfirmModal from 'Components/Modal/ConfirmModal'; -import TableRowCell from 'Components/Table/Cells/TableRowCell'; -import TableRow from 'Components/Table/TableRow'; -import { icons, kinds } from 'Helpers/Props'; -import formatDate from 'Utilities/Date/formatDate'; -import formatDateTime from 'Utilities/Date/formatDateTime'; -import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; -import titleCase from 'Utilities/String/titleCase'; -import translate from 'Utilities/String/translate'; -import styles from './QueuedTaskRow.css'; - -function getStatusIconProps(status, message) { - const title = titleCase(status); - - switch (status) { - case 'queued': - return { - name: icons.PENDING, - title - }; - - case 'started': - return { - name: icons.REFRESH, - isSpinning: true, - title - }; - - case 'completed': - return { - name: icons.CHECK, - kind: kinds.SUCCESS, - title: message === 'Completed' ? title : `${title}: ${message}` - }; - - case 'failed': - return { - name: icons.FATAL, - kind: kinds.DANGER, - title: `${title}: ${message}` - }; - - default: - return { - name: icons.UNKNOWN, - title - }; - } -} - -function getFormattedDates(props) { - const { - queued, - started, - ended, - showRelativeDates, - shortDateFormat - } = props; - - if (showRelativeDates) { - return { - queuedAt: moment(queued).fromNow(), - startedAt: started ? moment(started).fromNow() : '-', - endedAt: ended ? moment(ended).fromNow() : '-' - }; - } - - return { - queuedAt: formatDate(queued, shortDateFormat), - startedAt: started ? formatDate(started, shortDateFormat) : '-', - endedAt: ended ? formatDate(ended, shortDateFormat) : '-' - }; -} - -class QueuedTaskRow extends Component { - - // - // Lifecycle - - constructor(props, context) { - super(props, context); - - this.state = { - ...getFormattedDates(props), - isCancelConfirmModalOpen: false - }; - - this._updateTimeoutId = null; - } - - componentDidMount() { - this.setUpdateTimer(); - } - - componentDidUpdate(prevProps) { - const { - queued, - started, - ended - } = this.props; - - if ( - queued !== prevProps.queued || - started !== prevProps.started || - ended !== prevProps.ended - ) { - this.setState(getFormattedDates(this.props)); - } - } - - componentWillUnmount() { - if (this._updateTimeoutId) { - this._updateTimeoutId = clearTimeout(this._updateTimeoutId); - } - } - - // - // Control - - setUpdateTimer() { - this._updateTimeoutId = setTimeout(() => { - this.setState(getFormattedDates(this.props)); - this.setUpdateTimer(); - }, 30000); - } - - // - // Listeners - - onCancelPress = () => { - this.setState({ - isCancelConfirmModalOpen: true - }); - }; - - onAbortCancel = () => { - this.setState({ - isCancelConfirmModalOpen: false - }); - }; - - // - // Render - - render() { - const { - trigger, - commandName, - queued, - started, - ended, - status, - duration, - message, - clientUserAgent, - longDateFormat, - timeFormat, - onCancelPress - } = this.props; - - const { - queuedAt, - startedAt, - endedAt, - isCancelConfirmModalOpen - } = this.state; - - let triggerIcon = icons.QUICK; - - if (trigger === 'manual') { - triggerIcon = icons.INTERACTIVE; - } else if (trigger === 'scheduled') { - triggerIcon = icons.SCHEDULED; - } - - return ( - - - - - - - - - - - - {commandName} - - { - clientUserAgent ? - - from: {clientUserAgent} - : - null - } - - - - {queuedAt} - - - - {startedAt} - - - - {endedAt} - - - - {formatTimeSpan(duration)} - - - - { - status === 'queued' && - - } - - - - - ); - } -} - -QueuedTaskRow.propTypes = { - trigger: PropTypes.string.isRequired, - commandName: PropTypes.string.isRequired, - queued: PropTypes.string.isRequired, - started: PropTypes.string, - ended: PropTypes.string, - status: PropTypes.string.isRequired, - duration: PropTypes.string, - message: PropTypes.string, - clientUserAgent: PropTypes.string, - showRelativeDates: PropTypes.bool.isRequired, - shortDateFormat: PropTypes.string.isRequired, - longDateFormat: PropTypes.string.isRequired, - timeFormat: PropTypes.string.isRequired, - onCancelPress: PropTypes.func.isRequired -}; - -export default QueuedTaskRow; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx b/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx new file mode 100644 index 000000000..4511bcbf4 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx @@ -0,0 +1,238 @@ +import moment from 'moment'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { CommandBody } from 'Commands/Command'; +import Icon from 'Components/Icon'; +import IconButton from 'Components/Link/IconButton'; +import ConfirmModal from 'Components/Modal/ConfirmModal'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import TableRow from 'Components/Table/TableRow'; +import useModalOpenState from 'Helpers/Hooks/useModalOpenState'; +import { icons, kinds } from 'Helpers/Props'; +import { cancelCommand } from 'Store/Actions/commandActions'; +import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; +import formatDate from 'Utilities/Date/formatDate'; +import formatDateTime from 'Utilities/Date/formatDateTime'; +import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; +import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; +import QueuedTaskRowNameCell from './QueuedTaskRowNameCell'; +import styles from './QueuedTaskRow.css'; + +function getStatusIconProps(status: string, message: string | undefined) { + const title = titleCase(status); + + switch (status) { + case 'queued': + return { + name: icons.PENDING, + title, + }; + + case 'started': + return { + name: icons.REFRESH, + isSpinning: true, + title, + }; + + case 'completed': + return { + name: icons.CHECK, + kind: kinds.SUCCESS, + title: message === 'Completed' ? title : `${title}: ${message}`, + }; + + case 'failed': + return { + name: icons.FATAL, + kind: kinds.DANGER, + title: `${title}: ${message}`, + }; + + default: + return { + name: icons.UNKNOWN, + title, + }; + } +} + +function getFormattedDates( + queued: string, + started: string | undefined, + ended: string | undefined, + showRelativeDates: boolean, + shortDateFormat: string +) { + if (showRelativeDates) { + return { + queuedAt: moment(queued).fromNow(), + startedAt: started ? moment(started).fromNow() : '-', + endedAt: ended ? moment(ended).fromNow() : '-', + }; + } + + return { + queuedAt: formatDate(queued, shortDateFormat), + startedAt: started ? formatDate(started, shortDateFormat) : '-', + endedAt: ended ? formatDate(ended, shortDateFormat) : '-', + }; +} + +interface QueuedTimes { + queuedAt: string; + startedAt: string; + endedAt: string; +} + +export interface QueuedTaskRowProps { + id: number; + trigger: string; + commandName: string; + queued: string; + started?: string; + ended?: string; + status: string; + duration?: string; + message?: string; + body: CommandBody; + clientUserAgent?: string; +} + +export default function QueuedTaskRow(props: QueuedTaskRowProps) { + const { + id, + trigger, + commandName, + queued, + started, + ended, + status, + duration, + message, + body, + clientUserAgent, + } = props; + + const dispatch = useDispatch(); + const { longDateFormat, shortDateFormat, showRelativeDates, timeFormat } = + useSelector(createUISettingsSelector()); + + const updateTimeTimeoutId = useRef | null>( + null + ); + const [times, setTimes] = useState( + getFormattedDates( + queued, + started, + ended, + showRelativeDates, + shortDateFormat + ) + ); + + const [ + isCancelConfirmModalOpen, + openCancelConfirmModal, + closeCancelConfirmModal, + ] = useModalOpenState(false); + + const handleCancelPress = useCallback(() => { + dispatch(cancelCommand({ id })); + }, [id, dispatch]); + + useEffect(() => { + updateTimeTimeoutId.current = setTimeout(() => { + setTimes( + getFormattedDates( + queued, + started, + ended, + showRelativeDates, + shortDateFormat + ) + ); + }, 30000); + + return () => { + if (updateTimeTimeoutId.current) { + clearTimeout(updateTimeTimeoutId.current); + } + }; + }, [queued, started, ended, showRelativeDates, shortDateFormat, setTimes]); + + const { queuedAt, startedAt, endedAt } = times; + + let triggerIcon = icons.QUICK; + + if (trigger === 'manual') { + triggerIcon = icons.INTERACTIVE; + } else if (trigger === 'scheduled') { + triggerIcon = icons.SCHEDULED; + } + + return ( + + + + + + + + + + + + + {queuedAt} + + + + {startedAt} + + + + {endedAt} + + + + {formatTimeSpan(duration)} + + + + {status === 'queued' && ( + + )} + + + + + ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js b/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js deleted file mode 100644 index f55ab985a..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRowConnector.js +++ /dev/null @@ -1,31 +0,0 @@ -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { cancelCommand } from 'Store/Actions/commandActions'; -import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; -import QueuedTaskRow from './QueuedTaskRow'; - -function createMapStateToProps() { - return createSelector( - createUISettingsSelector(), - (uiSettings) => { - return { - showRelativeDates: uiSettings.showRelativeDates, - shortDateFormat: uiSettings.shortDateFormat, - longDateFormat: uiSettings.longDateFormat, - timeFormat: uiSettings.timeFormat - }; - } - ); -} - -function createMapDispatchToProps(dispatch, props) { - return { - onCancelPress() { - dispatch(cancelCommand({ - id: props.id - })); - } - }; -} - -export default connect(createMapStateToProps, createMapDispatchToProps)(QueuedTaskRow); diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css new file mode 100644 index 000000000..41acb33f8 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css @@ -0,0 +1,8 @@ +.commandName { + display: inline-block; + min-width: 220px; +} + +.userAgent { + color: #b0b0b0; +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts new file mode 100644 index 000000000..fc9081492 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts @@ -0,0 +1,8 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'commandName': string; + 'userAgent': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx new file mode 100644 index 000000000..9fc4f9e21 --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; +import { CommandBody } from 'Commands/Command'; +import TableRowCell from 'Components/Table/Cells/TableRowCell'; +import createMultiArtistsSelector from 'Store/Selectors/createMultiArtistsSelector'; +import translate from 'Utilities/String/translate'; +import styles from './QueuedTaskRowNameCell.css'; + +export interface QueuedTaskRowNameCellProps { + commandName: string; + body: CommandBody; + clientUserAgent?: string; +} + +export default function QueuedTaskRowNameCell( + props: QueuedTaskRowNameCellProps +) { + const { commandName, body, clientUserAgent } = props; + const movieIds = [...(body.artistIds ?? [])]; + + if (body.artistId) { + movieIds.push(body.artistId); + } + + const artists = useSelector(createMultiArtistsSelector(movieIds)); + const sortedArtists = artists.sort((a, b) => + a.sortName.localeCompare(b.sortName) + ); + + return ( + + + {commandName} + {sortedArtists.length ? ( + - {sortedArtists.map((a) => a.artistName).join(', ')} + ) : null} + + + {clientUserAgent ? ( + + {translate('From')}: {clientUserAgent} + + ) : null} + + ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.js b/frontend/src/System/Tasks/Queued/QueuedTasks.js deleted file mode 100644 index dac38f1d4..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTasks.js +++ /dev/null @@ -1,90 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import FieldSet from 'Components/FieldSet'; -import LoadingIndicator from 'Components/Loading/LoadingIndicator'; -import Table from 'Components/Table/Table'; -import TableBody from 'Components/Table/TableBody'; -import translate from 'Utilities/String/translate'; -import QueuedTaskRowConnector from './QueuedTaskRowConnector'; - -const columns = [ - { - name: 'trigger', - label: '', - isVisible: true - }, - { - name: 'commandName', - label: () => translate('Name'), - isVisible: true - }, - { - name: 'queued', - label: () => translate('Queued'), - isVisible: true - }, - { - name: 'started', - label: () => translate('Started'), - isVisible: true - }, - { - name: 'ended', - label: () => translate('Ended'), - isVisible: true - }, - { - name: 'duration', - label: () => translate('Duration'), - isVisible: true - }, - { - name: 'actions', - isVisible: true - } -]; - -function QueuedTasks(props) { - const { - isFetching, - isPopulated, - items - } = props; - - return ( -
- { - isFetching && !isPopulated && - - } - - { - isPopulated && - - - { - items.map((item) => { - return ( - - ); - }) - } - -
- } -
- ); -} - -QueuedTasks.propTypes = { - isFetching: PropTypes.bool.isRequired, - isPopulated: PropTypes.bool.isRequired, - items: PropTypes.array.isRequired -}; - -export default QueuedTasks; diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.tsx b/frontend/src/System/Tasks/Queued/QueuedTasks.tsx new file mode 100644 index 000000000..e79deed7c --- /dev/null +++ b/frontend/src/System/Tasks/Queued/QueuedTasks.tsx @@ -0,0 +1,74 @@ +import React, { useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import AppState from 'App/State/AppState'; +import FieldSet from 'Components/FieldSet'; +import LoadingIndicator from 'Components/Loading/LoadingIndicator'; +import Table from 'Components/Table/Table'; +import TableBody from 'Components/Table/TableBody'; +import { fetchCommands } from 'Store/Actions/commandActions'; +import translate from 'Utilities/String/translate'; +import QueuedTaskRow from './QueuedTaskRow'; + +const columns = [ + { + name: 'trigger', + label: '', + isVisible: true, + }, + { + name: 'commandName', + label: () => translate('Name'), + isVisible: true, + }, + { + name: 'queued', + label: () => translate('Queued'), + isVisible: true, + }, + { + name: 'started', + label: () => translate('Started'), + isVisible: true, + }, + { + name: 'ended', + label: () => translate('Ended'), + isVisible: true, + }, + { + name: 'duration', + label: () => translate('Duration'), + isVisible: true, + }, + { + name: 'actions', + isVisible: true, + }, +]; + +export default function QueuedTasks() { + const dispatch = useDispatch(); + const { isFetching, isPopulated, items } = useSelector( + (state: AppState) => state.commands + ); + + useEffect(() => { + dispatch(fetchCommands()); + }, [dispatch]); + + return ( +
+ {isFetching && !isPopulated && } + + {isPopulated && ( + + + {items.map((item) => { + return ; + })} + +
+ )} +
+ ); +} diff --git a/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js b/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js deleted file mode 100644 index 5fa4d9ead..000000000 --- a/frontend/src/System/Tasks/Queued/QueuedTasksConnector.js +++ /dev/null @@ -1,46 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { fetchCommands } from 'Store/Actions/commandActions'; -import QueuedTasks from './QueuedTasks'; - -function createMapStateToProps() { - return createSelector( - (state) => state.commands, - (commands) => { - return commands; - } - ); -} - -const mapDispatchToProps = { - dispatchFetchCommands: fetchCommands -}; - -class QueuedTasksConnector extends Component { - - // - // Lifecycle - - componentDidMount() { - this.props.dispatchFetchCommands(); - } - - // - // Render - - render() { - return ( - - ); - } -} - -QueuedTasksConnector.propTypes = { - dispatchFetchCommands: PropTypes.func.isRequired -}; - -export default connect(createMapStateToProps, mapDispatchToProps)(QueuedTasksConnector); diff --git a/frontend/src/System/Tasks/Tasks.js b/frontend/src/System/Tasks/Tasks.js index 032dbede8..03a3b6ce4 100644 --- a/frontend/src/System/Tasks/Tasks.js +++ b/frontend/src/System/Tasks/Tasks.js @@ -2,7 +2,7 @@ import React from 'react'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import translate from 'Utilities/String/translate'; -import QueuedTasksConnector from './Queued/QueuedTasksConnector'; +import QueuedTasks from './Queued/QueuedTasks'; import ScheduledTasksConnector from './Scheduled/ScheduledTasksConnector'; function Tasks() { @@ -10,7 +10,7 @@ function Tasks() { - + ); From 89e184e768d5376821954e389db9383561bbba76 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 15:37:06 +0200 Subject: [PATCH 079/491] Ensure artists are populated in PageConnector --- frontend/src/Components/Page/PageConnector.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/Components/Page/PageConnector.js b/frontend/src/Components/Page/PageConnector.js index 0c1d37fdb..c84099a5e 100644 --- a/frontend/src/Components/Page/PageConnector.js +++ b/frontend/src/Components/Page/PageConnector.js @@ -51,6 +51,7 @@ const selectAppProps = createSelector( ); const selectIsPopulated = createSelector( + (state) => state.artist.isPopulated, (state) => state.customFilters.isPopulated, (state) => state.tags.isPopulated, (state) => state.settings.ui.isPopulated, @@ -62,6 +63,7 @@ const selectIsPopulated = createSelector( (state) => state.system.status.isPopulated, (state) => state.app.translations.isPopulated, ( + artistsIsPopulated, customFiltersIsPopulated, tagsIsPopulated, uiSettingsIsPopulated, @@ -74,6 +76,7 @@ const selectIsPopulated = createSelector( translationsIsPopulated ) => { return ( + artistsIsPopulated && customFiltersIsPopulated && tagsIsPopulated && uiSettingsIsPopulated && @@ -89,6 +92,7 @@ const selectIsPopulated = createSelector( ); const selectErrors = createSelector( + (state) => state.artist.error, (state) => state.customFilters.error, (state) => state.tags.error, (state) => state.settings.ui.error, @@ -100,6 +104,7 @@ const selectErrors = createSelector( (state) => state.system.status.error, (state) => state.app.translations.error, ( + artistsError, customFiltersError, tagsError, uiSettingsError, @@ -112,6 +117,7 @@ const selectErrors = createSelector( translationsError ) => { const hasError = !!( + artistsError || customFiltersError || tagsError || uiSettingsError || From 63e36f71d2fe14f23cb8f05551a792a6379fecf6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 14 Mar 2024 14:31:09 +0200 Subject: [PATCH 080/491] Ensure not allowed cursor is shown for disabled select inputs --- frontend/src/Components/Form/EnhancedSelectInput.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Components/Form/EnhancedSelectInput.css b/frontend/src/Components/Form/EnhancedSelectInput.css index 56f5564b9..defefb18e 100644 --- a/frontend/src/Components/Form/EnhancedSelectInput.css +++ b/frontend/src/Components/Form/EnhancedSelectInput.css @@ -19,7 +19,7 @@ .isDisabled { opacity: 0.7; - cursor: not-allowed; + cursor: not-allowed !important; } .dropdownArrowContainer { From 55eaecb3c8af6c6d36b90f31c5860880dd101097 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 13 Mar 2024 21:05:15 -0700 Subject: [PATCH 081/491] Fixed: Disabled select option still selectable (cherry picked from commit 063dba22a803295adee4fdcbe42718af3e85ca78) Closes #4679 --- .../src/Artist/Index/Select/Edit/EditArtistModalContent.tsx | 2 +- .../Components/Form/MetadataProfileSelectInputConnector.js | 4 ++-- frontend/src/Components/Form/MonitorAlbumsSelectInput.js | 4 ++-- frontend/src/Components/Form/MonitorNewItemsSelectInput.js | 4 ++-- .../src/Components/Form/QualityProfileSelectInputConnector.js | 4 ++-- frontend/src/Components/Form/SeriesTypeSelectInput.js | 4 ++-- .../Manage/Edit/ManageDownloadClientsEditModalContent.tsx | 2 +- .../Manage/Edit/ManageImportListsEditModalContent.tsx | 2 +- .../Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx | 2 +- frontend/src/TrackFile/Editor/TrackFileEditorModalContent.js | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx b/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx index f6f733f5f..993be8ce5 100644 --- a/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx +++ b/frontend/src/Artist/Index/Select/Edit/EditArtistModalContent.tsx @@ -35,7 +35,7 @@ const monitoredOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'monitored', diff --git a/frontend/src/Components/Form/MetadataProfileSelectInputConnector.js b/frontend/src/Components/Form/MetadataProfileSelectInputConnector.js index 3d763e713..2cb7a39c1 100644 --- a/frontend/src/Components/Form/MetadataProfileSelectInputConnector.js +++ b/frontend/src/Components/Form/MetadataProfileSelectInputConnector.js @@ -38,7 +38,7 @@ function createMapStateToProps() { values.unshift({ key: 'noChange', value: translate('NoChange'), - disabled: includeNoChangeDisabled + isDisabled: includeNoChangeDisabled }); } @@ -46,7 +46,7 @@ function createMapStateToProps() { values.unshift({ key: 'mixed', value: '(Mixed)', - disabled: true + isDisabled: true }); } diff --git a/frontend/src/Components/Form/MonitorAlbumsSelectInput.js b/frontend/src/Components/Form/MonitorAlbumsSelectInput.js index a10bbb776..f3cefd29e 100644 --- a/frontend/src/Components/Form/MonitorAlbumsSelectInput.js +++ b/frontend/src/Components/Form/MonitorAlbumsSelectInput.js @@ -18,7 +18,7 @@ function MonitorAlbumsSelectInput(props) { values.unshift({ key: 'noChange', value: translate('NoChange'), - disabled: includeNoChangeDisabled + isDisabled: includeNoChangeDisabled }); } @@ -26,7 +26,7 @@ function MonitorAlbumsSelectInput(props) { values.unshift({ key: 'mixed', value: '(Mixed)', - disabled: true + isDisabled: true }); } diff --git a/frontend/src/Components/Form/MonitorNewItemsSelectInput.js b/frontend/src/Components/Form/MonitorNewItemsSelectInput.js index f9cc07d7d..0dccc44a4 100644 --- a/frontend/src/Components/Form/MonitorNewItemsSelectInput.js +++ b/frontend/src/Components/Form/MonitorNewItemsSelectInput.js @@ -18,7 +18,7 @@ function MonitorNewItemsSelectInput(props) { values.unshift({ key: 'noChange', value: translate('NoChange'), - disabled: includeNoChangeDisabled + isDisabled: includeNoChangeDisabled }); } @@ -26,7 +26,7 @@ function MonitorNewItemsSelectInput(props) { values.unshift({ key: 'mixed', value: '(Mixed)', - disabled: true + isDisabled: true }); } diff --git a/frontend/src/Components/Form/QualityProfileSelectInputConnector.js b/frontend/src/Components/Form/QualityProfileSelectInputConnector.js index a898de4a2..41ec0e0c7 100644 --- a/frontend/src/Components/Form/QualityProfileSelectInputConnector.js +++ b/frontend/src/Components/Form/QualityProfileSelectInputConnector.js @@ -26,7 +26,7 @@ function createMapStateToProps() { values.unshift({ key: 'noChange', value: translate('NoChange'), - disabled: includeNoChangeDisabled + isDisabled: includeNoChangeDisabled }); } @@ -34,7 +34,7 @@ function createMapStateToProps() { values.unshift({ key: 'mixed', value: '(Mixed)', - disabled: true + isDisabled: true }); } diff --git a/frontend/src/Components/Form/SeriesTypeSelectInput.js b/frontend/src/Components/Form/SeriesTypeSelectInput.js index e456178ff..822ae9931 100644 --- a/frontend/src/Components/Form/SeriesTypeSelectInput.js +++ b/frontend/src/Components/Form/SeriesTypeSelectInput.js @@ -22,7 +22,7 @@ function SeriesTypeSelectInput(props) { values.unshift({ key: 'noChange', value: translate('NoChange'), - disabled: includeNoChangeDisabled + isDisabled: includeNoChangeDisabled }); } @@ -30,7 +30,7 @@ function SeriesTypeSelectInput(props) { values.unshift({ key: 'mixed', value: '(Mixed)', - disabled: true + isDisabled: true }); } diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx index 18ae5170a..7599cb9b0 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx +++ b/frontend/src/Settings/DownloadClients/DownloadClients/Manage/Edit/ManageDownloadClientsEditModalContent.tsx @@ -32,7 +32,7 @@ const enableOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'enabled', diff --git a/frontend/src/Settings/ImportLists/ImportLists/Manage/Edit/ManageImportListsEditModalContent.tsx b/frontend/src/Settings/ImportLists/ImportLists/Manage/Edit/ManageImportListsEditModalContent.tsx index 5a651ba28..82f7d309c 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/Manage/Edit/ManageImportListsEditModalContent.tsx +++ b/frontend/src/Settings/ImportLists/ImportLists/Manage/Edit/ManageImportListsEditModalContent.tsx @@ -31,7 +31,7 @@ const autoAddOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'enabled', diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx b/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx index f9b051986..69ad5a988 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx +++ b/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx @@ -32,7 +32,7 @@ const enableOptions = [ get value() { return translate('NoChange'); }, - disabled: true, + isDisabled: true, }, { key: 'enabled', diff --git a/frontend/src/TrackFile/Editor/TrackFileEditorModalContent.js b/frontend/src/TrackFile/Editor/TrackFileEditorModalContent.js index aa59e866f..0e387f39f 100644 --- a/frontend/src/TrackFile/Editor/TrackFileEditorModalContent.js +++ b/frontend/src/TrackFile/Editor/TrackFileEditorModalContent.js @@ -146,7 +146,7 @@ class TrackFileEditorModalContent extends Component { }); return acc; - }, [{ key: 'selectQuality', value: 'Select Quality', disabled: true }]); + }, [{ key: 'selectQuality', value: translate('SelectQuality'), isDisabled: true }]); const hasSelectedFiles = this.getSelectedIds().length > 0; From ce6e4555ecc234cf143ee9ba4359a2ab87f7b277 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 16 Mar 2024 16:13:07 +0000 Subject: [PATCH 082/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Dennis Langthjem Co-authored-by: Gianmarco Novelli Co-authored-by: Havok Dan Co-authored-by: Ihor Mudryi Co-authored-by: MadaxDeLuXe Co-authored-by: Weblate Co-authored-by: infoaitek24 Co-authored-by: reloxx Co-authored-by: vfaergestad 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/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/nb_NO/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/pt_BR/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/da.json | 20 +++++++++++------- src/NzbDrone.Core/Localization/Core/de.json | 21 +++++++++++++++---- src/NzbDrone.Core/Localization/Core/fr.json | 2 +- src/NzbDrone.Core/Localization/Core/it.json | 3 ++- .../Localization/Core/nb_NO.json | 5 ++++- .../Localization/Core/pt_BR.json | 11 +++++++++- src/NzbDrone.Core/Localization/Core/uk.json | 18 ++++++++++++++-- 7 files changed, 62 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 62c5cf81f..7b9f0e1a1 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -135,10 +135,10 @@ "TagIsNotUsedAndCanBeDeleted": "Tag bruges ikke og kan slettes", "Tags": "Mærker", "Tasks": "Opgaver", - "TestAll": "Test alle", - "TestAllClients": "Test alle klienter", - "TestAllIndexers": "Test alle indeksører", - "TestAllLists": "Test alle lister", + "TestAll": "Afprøv alle", + "TestAllClients": "Afprøv alle klienter", + "TestAllIndexers": "Afprøv alle indeks", + "TestAllLists": "Afprøv alle lister", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Dette gælder for alle indeksører. Følg de regler, der er angivet af dem", "Time": "Tid", "TimeFormat": "Tidsformat", @@ -453,7 +453,7 @@ "Add": "Tilføj", "AddDelayProfile": "Tilføj forsinkelsesprofil", "Added": "Tilføjet", - "AddIndexer": "Tilføj indeksør", + "AddIndexer": "Tilføj indekser", "AddRemotePathMapping": "Tilføj kortlægning af fjernsti", "AddRootFolder": "Tilføj rodmappe", "AfterManualRefresh": "Efter manuel opdatering", @@ -507,7 +507,7 @@ "ShowAdvanced": "Vis avanceret", "SourceTitle": "Kildetitel", "System": "System", - "Test": "Prøve", + "Test": "Afprøv", "TimeLeft": "Tid tilbage", "Title": "Titel", "TotalSpace": "Samlet plads", @@ -683,7 +683,7 @@ "Overview": "Oversigt", "OverviewOptions": "Oversigtsmuligheder", "PosterOptions": "Postermuligheder", - "Table": "Bord", + "Table": "Tabel", "AuthBasic": "Grundlæggende (pop op-browser)", "AuthForm": "Formularer (login-side)", "AddAutoTagError": "Kan ikke tilføje en ny liste, prøv igen.", @@ -739,5 +739,9 @@ "DownloadClientsSettingsSummary": "Download klienter, download håndtering og remote path mappings", "GeneralSettingsSummary": "Port, SSL, brugernavn/adgangskode, proxy, analyser og opdateringer", "ArtistIndexFooterDownloading": "Downloader", - "AutomaticSearch": "Automatisk søgning" + "AutomaticSearch": "Automatisk søgning", + "ApplyChanges": "Anvend ændringer", + "AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}", + "AddImportList": "Tilføj importliste", + "AddImportListImplementation": "Tilføj importliste - {implementationName}" } diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 79c763629..4372a5982 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -4,7 +4,7 @@ "About": "Über", "AgeWhenGrabbed": "Alter (beim erfassen)", "AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.", - "AppDataDirectory": "AppData Ordner", + "AppDataDirectory": "AppData-Verzeichnis", "AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich", "Automatic": "Automatisch", "AutoRedownloadFailedHelpText": "Automatisch nach einem anderen Release suchen", @@ -745,7 +745,7 @@ "UnmappedFilesOnly": "Nur nicht zugeordnete Dateien", "UnmonitoredOnly": "Nur beobachtete", "UpgradesAllowed": "Upgrades erlaubt", - "Wanted": "› Gesucht", + "Wanted": "Gesucht", "Warn": "Warnung", "WouldYouLikeToRestoreBackup": "Willst du das Backup {0} wiederherstellen?", "Age": "Alter", @@ -953,7 +953,7 @@ "AddConditionError": "Neue Bedingung konnte nicht hinzugefügt werden, bitte erneut versuchen.", "AddCondition": "Bedingung hinzufügen", "AddAutoTag": "Automatischen Tag hinzufügen", - "AddAutoTagError": "Der neue automatische Tag konnte nicht hinzugefügt werden, bitte versuche es erneut.", + "AddAutoTagError": "Auto-Tag konnte nicht hinzugefügt werden. Bitte erneut versuchen.", "AddAlbumWithTitle": "{albumTitle} hinzufügen", "AddNewAlbumSearchForNewAlbum": "Suche nach neuem Album starten", "AddArtistWithName": "{artistName} hinzufügen", @@ -963,5 +963,18 @@ "UpdateSelected": "Auswahl aktualisieren", "RemoveFailedDownloads": "Fehlgeschlagene Downloads entfernen", "CloneAutoTag": "Automatische Tags kopieren", - "ClearBlocklist": "Sperrliste leeren" + "ClearBlocklist": "Sperrliste leeren", + "CustomFormatsSettings": "Einstellungen für eigene Formate", + "CustomFormatsSettingsSummary": "Eigene Formate und Einstellungen", + "ClickToChangeIndexerFlags": "Klicken, um Indexer-Flags zu ändern", + "BlocklistAndSearch": "Sperrliste und Suche", + "BlocklistAndSearchHint": "Starte Suche nach einer Alternative, falls es der Sperrliste hinzugefügt wurde", + "BlocklistAndSearchMultipleHint": "Starte Suchen nach einer Alternative, falls es der Sperrliste hinzugefügt wurde", + "BlocklistMultipleOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternativen zu suchen", + "BlocklistOnly": "Nur der Sperrliste hinzufügen", + "BlocklistOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternative zu suchen", + "ChangeCategory": "Kategorie wechseln", + "AutoTaggingNegateHelpText": "Falls aktiviert wird das eigene Format nicht angewendet solange diese {0} Bedingung zutrifft.", + "Clone": "Klonen", + "AutoTaggingRequiredHelpText": "Diese {0} Bedingungen müssen erfüllt sein, damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 206a82a91..9e925e6f1 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -4,7 +4,7 @@ "AppDataDirectory": "Dossier AppData", "AddingTag": "Ajout d'une étiquette", "Analytics": "Statistiques", - "About": "À propos", + "About": "Tagalog", "ApplyTags": "Appliquer les étiquettes", "Authentication": "Authentification", "Automatic": "Automatique", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index bd66da699..32f17ddd8 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -882,5 +882,6 @@ "AutomaticSearch": "Ricerca Automatica", "ArtistIndexFooterDownloading": "Scaricando", "KeyboardShortcuts": "Scorciatoie Tastiera", - "Links": "Collegamenti" + "Links": "Collegamenti", + "RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate [qui](http://regexstorm.net/tester)." } diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index 13da7c46d..33de8f218 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -246,5 +246,8 @@ "AddImportListExclusionArtistHelpText": "Forhindre at filmen legges til i {appName} av lister", "AuthBasic": "Grunnleggende (nettleser -popup)", "DeleteArtistFolderCountConfirmation": "Er du sikker på at du vil slette formattaggen {0}?", - "DeleteAutoTagHelpText": "Er du sikker på at du vil slette formattaggen {0}?" + "DeleteAutoTagHelpText": "Er du sikker på at du vil slette formattaggen {0}?", + "AddConditionImplementation": "Legg til betingelse - {implementationName}", + "AddAutoTagError": "Ikke mulig å legge til ny automatisk tagg, vennligst prøv igjen", + "AddConditionError": "Ikke mulig å legge til ny betingelse, vennligst prøv igjen" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index c8c29a199..891811441 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1269,5 +1269,14 @@ "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?", "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 {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')", + "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}'?", + "ClickToChangeIndexerFlags": "Clique para alterar sinalizadores do indexador", + "CustomFormatsSpecificationFlag": "Sinalizador", + "IndexerFlags": "Sinalizadores do Indexador", + "Rejections": "Rejeições", + "SelectIndexerFlags": "Selecionar Sinalizadores do Indexador", + "SetIndexerFlags": "Definir Sinalizadores de Indexador" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 779c87d26..ef02ca448 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -15,7 +15,7 @@ "Analytics": "Аналітика", "AppDataDirectory": "Каталог AppData", "ApplyTags": "Застосувати теги", - "Authentication": "Аутентифікація", + "Authentication": "Автентифікація", "Automatic": "Автоматичний", "BackupNow": "Зробити резервну копію", "Backups": "Резервні копії", @@ -479,5 +479,19 @@ "AddDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}", "AddImportListImplementation": "Додати список імпорту - {implementationName}", "AddIndexerImplementation": "Додати індексер - {implementationName}", - "AddImportList": "Додати список імпорту" + "AddImportList": "Додати список імпорту", + "ApplyTagsHelpTextAdd": "Додати: додати теги до наявного списку тегів", + "ApplyTagsHelpTextRemove": "Видалити: видалити введені теги", + "ApplyTagsHelpTextReplace": "Замінити: Змінити наявні теги на введені теги (залишіть порожнім, щоб очистити всі теги)", + "AppUpdated": "{appName} Оновлено", + "AppDataLocationHealthCheckMessage": "Оновлення буде неможливим, щоб запобігти видаленню AppData під час оновлення", + "ApplyTagsHelpTextHowToApplyIndexers": "Як застосувати теги до вибраних індексаторів", + "ApplyChanges": "Застосувати зміни", + "AddReleaseProfile": "Додати профіль релізу", + "AllResultsAreHiddenByTheAppliedFilter": "Всі результати приховані фільтром", + "AuthenticationMethodHelpTextWarning": "Виберіть дійсний метод автентифікації", + "ApplyTagsHelpTextHowToApplyDownloadClients": "Як застосувати теги до вибраних клієнтів завантаження", + "ApplyTagsHelpTextHowToApplyImportLists": "Як застосувати теги до вибраних списків імпорту", + "AuthForm": "Форми (сторінка входу)", + "AuthenticationMethod": "Метод автентифікації" } From 9f4d821a2d8abc11afd49f9c1f20a2f978c7452e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 17 Mar 2024 13:48:47 +0200 Subject: [PATCH 083/491] Bump version to 2.2.4 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 110edc8a9..b5fe676e7 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.2.3' + majorVersion: '2.2.4' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From e730cf6307f5c50c36c38f537d970ee3b7df96aa Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 18 Mar 2024 16:48:35 -0700 Subject: [PATCH 084/491] Fixed: Task progress messages in the UI (cherry picked from commit c6417337812f3578a27f9dc1e44fdad80f557271) Closes #4689 --- .../IndexerSearch/ReleaseSearchService.cs | 2 +- src/NzbDrone.Core/Indexers/RssSyncCommand.cs | 1 - src/NzbDrone.Core/Messaging/Commands/Command.cs | 2 +- .../Music/Commands/RefreshAlbumCommand.cs | 2 ++ .../Music/Commands/RefreshArtistCommand.cs | 2 ++ .../ProgressMessaging/ProgressMessageContext.cs | 16 +++++++++++++--- .../Update/Commands/ApplicationUpdateCommand.cs | 2 -- 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 89b71f62e..f8da27d52 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -137,7 +137,7 @@ namespace NzbDrone.Core.IndexerSearch var reports = batch.SelectMany(x => x).ToList(); - _logger.Debug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count); + _logger.ProgressDebug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count); // Update the last search time for all albums if at least 1 indexer was searched. if (indexers.Any()) diff --git a/src/NzbDrone.Core/Indexers/RssSyncCommand.cs b/src/NzbDrone.Core/Indexers/RssSyncCommand.cs index 519e61f01..8f3ed36ac 100644 --- a/src/NzbDrone.Core/Indexers/RssSyncCommand.cs +++ b/src/NzbDrone.Core/Indexers/RssSyncCommand.cs @@ -5,7 +5,6 @@ namespace NzbDrone.Core.Indexers public class RssSyncCommand : Command { public override bool SendUpdatesToClient => true; - public override bool IsLongRunning => true; } } diff --git a/src/NzbDrone.Core/Messaging/Commands/Command.cs b/src/NzbDrone.Core/Messaging/Commands/Command.cs index 057c8d4c4..972b6df7f 100644 --- a/src/NzbDrone.Core/Messaging/Commands/Command.cs +++ b/src/NzbDrone.Core/Messaging/Commands/Command.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Core.Messaging.Commands } public virtual bool UpdateScheduledTask => true; - public virtual string CompletionMessage => "Completed"; + public virtual string CompletionMessage => null; public virtual bool RequiresDiskAccess => false; public virtual bool IsExclusive => false; public virtual bool IsTypeExclusive => false; diff --git a/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs b/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs index 58004c3b6..6d8fc5b0a 100644 --- a/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs +++ b/src/NzbDrone.Core/Music/Commands/RefreshAlbumCommand.cs @@ -20,5 +20,7 @@ namespace NzbDrone.Core.Music.Commands public override bool SendUpdatesToClient => true; public override bool UpdateScheduledTask => !AlbumId.HasValue; + + public override string CompletionMessage => "Completed"; } } diff --git a/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs b/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs index 56eb1debf..0cbdcfeb4 100644 --- a/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs +++ b/src/NzbDrone.Core/Music/Commands/RefreshArtistCommand.cs @@ -39,5 +39,7 @@ namespace NzbDrone.Core.Music.Commands public override bool UpdateScheduledTask => ArtistIds.Empty(); public override bool IsLongRunning => true; + + public override string CompletionMessage => "Completed"; } } diff --git a/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs b/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs index fba9ca3f3..09fecee2c 100644 --- a/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs +++ b/src/NzbDrone.Core/ProgressMessaging/ProgressMessageContext.cs @@ -1,10 +1,13 @@ -using System; +using System; +using System.Threading; using NzbDrone.Core.Messaging.Commands; namespace NzbDrone.Core.ProgressMessaging { public static class ProgressMessageContext { + private static AsyncLocal _commandModelAsync = new AsyncLocal(); + [ThreadStatic] private static CommandModel _commandModel; @@ -13,8 +16,15 @@ namespace NzbDrone.Core.ProgressMessaging public static CommandModel CommandModel { - get { return _commandModel; } - set { _commandModel = value; } + get + { + return _commandModel ?? _commandModelAsync.Value; + } + set + { + _commandModel = value; + _commandModelAsync.Value = value; + } } public static bool LockReentrancy() diff --git a/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs index 0ca1d8074..59a827a0b 100644 --- a/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs +++ b/src/NzbDrone.Core/Update/Commands/ApplicationUpdateCommand.cs @@ -6,7 +6,5 @@ namespace NzbDrone.Core.Update.Commands { public override bool SendUpdatesToClient => true; public override bool IsExclusive => true; - - public override string CompletionMessage => null; } } From f890a8c18fcca0616123a5a1d7b4cc5d6e87543a Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 28 Mar 2024 07:30:45 +0200 Subject: [PATCH 085/491] New: Allow HEAD requests to ping endpoint (cherry picked from commit 7353fe479dbb8d0dab76993ebed92d48e1b05524) --- src/Lidarr.Http/Ping/PingController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Lidarr.Http/Ping/PingController.cs b/src/Lidarr.Http/Ping/PingController.cs index 7f4a23939..2f25d14e2 100644 --- a/src/Lidarr.Http/Ping/PingController.cs +++ b/src/Lidarr.Http/Ping/PingController.cs @@ -21,6 +21,7 @@ namespace Lidarr.Http.Ping [AllowAnonymous] [HttpGet("/ping")] + [HttpHead("/ping")] [Produces("application/json")] public ActionResult GetStatus() { From a8648fdb71046f188b75dc18f2b638ad0ab88d2a Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Thu, 28 Mar 2024 06:29:15 +0100 Subject: [PATCH 086/491] Fixed: Handling torrents with relative path in rTorrent (cherry picked from commit 35d0e6a6f806c68756450a7d199600d7fb49d6c5) --- src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs index de5e3044a..a7e207f7f 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs @@ -134,12 +134,14 @@ namespace NzbDrone.Core.Download.Clients.RTorrent // Ignore torrents with an empty path if (torrent.Path.IsNullOrWhiteSpace()) { + _logger.Warn("Torrent '{0}' has an empty download path and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name); continue; } if (torrent.Path.StartsWith(".")) { - throw new DownloadClientException("Download paths must be absolute. Please specify variable \"directory\" in rTorrent."); + _logger.Warn("Torrent '{0}' has a download path starting with '.' and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name); + continue; } var item = new DownloadClientItem(); From 1d0de5191782e756486b223d6220f479a6fa7185 Mon Sep 17 00:00:00 2001 From: Carlos Gustavo Sarmiento Date: Thu, 28 Mar 2024 06:28:41 +0100 Subject: [PATCH 087/491] Fixed: qBittorrent not correctly handling retention during testing (cherry picked from commit 588372fd950fc85f5e9a4275fbcb423b247ed0ee) --- .../Download/Clients/QBittorrent/QBittorrent.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 23f2564df..4a0edeccd 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -386,16 +386,20 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent } } - var minimumRetention = 60 * 24 * 14; - return new DownloadClientInfo { IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost", OutputRootFolders = new List { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) }, - RemovesCompletedDownloads = (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles) + RemovesCompletedDownloads = RemovesCompletedDownloads(config) }; } + private bool RemovesCompletedDownloads(QBittorrentPreferences config) + { + var minimumRetention = 60 * 24 * 14; // 14 days in minutes + return (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles); + } + protected override void Test(List failures) { failures.AddIfNotNull(TestConnection()); @@ -445,7 +449,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent // Complain if qBittorrent is configured to remove torrents on max ratio var config = Proxy.GetConfig(Settings); - if ((config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)) + if (RemovesCompletedDownloads(config)) { return new NzbDroneValidationFailure(string.Empty, "qBittorrent is configured to remove torrents when they reach their Share Ratio Limit") { From 52b5ff6fddbe0ae19172786fa8cf4af9a7a2cd4a Mon Sep 17 00:00:00 2001 From: Louis R Date: Thu, 28 Mar 2024 06:31:28 +0100 Subject: [PATCH 088/491] Fixed: Exceptions when checking for routable IPv4 addresses (cherry picked from commit 060b789bc6f10f667795697eb536d4bd3851da49) --- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 36 +++++++++++++------ src/NzbDrone.Core.Test/Framework/CoreTest.cs | 2 +- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index 756e3f08e..8ca01f6ec 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -9,6 +9,7 @@ using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; +using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http.Proxy; @@ -30,11 +31,14 @@ namespace NzbDrone.Common.Http.Dispatchers private readonly ICached _httpClientCache; private readonly ICached _credentialCache; + private readonly Logger _logger; + public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider, ICreateManagedWebProxy createManagedWebProxy, ICertificateValidationService certificateValidationService, IUserAgentBuilder userAgentBuilder, - ICacheManager cacheManager) + ICacheManager cacheManager, + Logger logger) { _proxySettingsProvider = proxySettingsProvider; _createManagedWebProxy = createManagedWebProxy; @@ -43,6 +47,8 @@ namespace NzbDrone.Common.Http.Dispatchers _httpClientCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher)); _credentialCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher), "credentialcache"); + + _logger = logger; } public async Task GetResponseAsync(HttpRequest request, CookieContainer cookies) @@ -251,19 +257,27 @@ namespace NzbDrone.Common.Http.Dispatchers return _credentialCache.Get("credentialCache", () => new CredentialCache()); } - private static bool HasRoutableIPv4Address() + private bool HasRoutableIPv4Address() { // Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses - var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + try + { + var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); - return networkInterfaces.Any(ni => - ni.OperationalStatus == OperationalStatus.Up && - ni.GetIPProperties().UnicastAddresses.Any(ip => - ip.Address.AddressFamily == AddressFamily.InterNetwork && - !IPAddress.IsLoopback(ip.Address))); + return networkInterfaces.Any(ni => + ni.OperationalStatus == OperationalStatus.Up && + ni.GetIPProperties().UnicastAddresses.Any(ip => + ip.Address.AddressFamily == AddressFamily.InterNetwork && + !IPAddress.IsLoopback(ip.Address))); + } + catch (Exception e) + { + _logger.Debug(e, "Caught exception while GetAllNetworkInterfaces assuming IPv4 connectivity: {0}", e.Message); + return true; + } } - private static async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) + private async ValueTask onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken) { // Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way. // This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6. @@ -287,7 +301,9 @@ namespace NzbDrone.Common.Http.Dispatchers catch { // Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections. - useIPv6 = !HasRoutableIPv4Address(); + var routableIPv4 = HasRoutableIPv4Address(); + _logger.Info("IPv4 is available: {0}, IPv6 will be {1}", routableIPv4, routableIPv4 ? "disabled" : "left enabled"); + useIPv6 = !routableIPv4; } finally { diff --git a/src/NzbDrone.Core.Test/Framework/CoreTest.cs b/src/NzbDrone.Core.Test/Framework/CoreTest.cs index b43854c95..b1213cb6e 100644 --- a/src/NzbDrone.Core.Test/Framework/CoreTest.cs +++ b/src/NzbDrone.Core.Test/Framework/CoreTest.cs @@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Framework Mocker.SetConstant(new HttpProxySettingsProvider(Mocker.Resolve())); Mocker.SetConstant(new ManagedWebProxyFactory(Mocker.Resolve())); Mocker.SetConstant(new X509CertificateValidationService(Mocker.Resolve(), TestLogger)); - Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve())); + Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); Mocker.SetConstant(new HttpClient(Array.Empty(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); Mocker.SetConstant(new LidarrCloudRequestBuilder()); Mocker.SetConstant(Mocker.Resolve()); From 0e840086691de70c9f97ec1583f8d52963163542 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 26 Mar 2024 19:24:49 +0200 Subject: [PATCH 089/491] New: Advanced settings toggle in import list, notification and download client modals (cherry picked from commit 13c925b3418d1d48ec041e3d97ab51aaf2b8977a) --- .../EditDownloadClientModalContent.js | 9 +++++++++ .../EditDownloadClientModalContentConnector.js | 17 +++++++++++++++-- .../ImportLists/EditImportListModalContent.js | 9 +++++++++ .../EditImportListModalContentConnector.js | 17 +++++++++++++++-- .../EditNotificationModalContent.js | 9 +++++++++ .../EditNotificationModalContentConnector.js | 17 +++++++++++++++-- 6 files changed, 72 insertions(+), 6 deletions(-) diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js index d3d51c7fc..8d7d994f7 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js @@ -15,6 +15,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds, sizes } from 'Helpers/Props'; +import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import translate from 'Utilities/String/translate'; import styles from './EditDownloadClientModalContent.css'; @@ -37,6 +38,7 @@ class EditDownloadClientModalContent extends Component { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteDownloadClientPress, ...otherProps } = this.props; @@ -206,6 +208,12 @@ class EditDownloadClientModalContent extends Component { } + + { + this.props.toggleAdvancedSettings(); + }; + // // Render @@ -65,6 +76,7 @@ class EditDownloadClientModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} /> @@ -82,6 +94,7 @@ EditDownloadClientModalContentConnector.propTypes = { setDownloadClientFieldValue: PropTypes.func.isRequired, saveDownloadClient: PropTypes.func.isRequired, testDownloadClient: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js index ed9582e91..2799af7d8 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js @@ -20,6 +20,7 @@ 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 AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import formatShortTimeSpan from 'Utilities/Date/formatShortTimeSpan'; import translate from 'Utilities/String/translate'; import styles from './EditImportListModalContent.css'; @@ -66,6 +67,7 @@ function EditImportListModalContent(props) { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteImportListPress, showMetadataProfile, ...otherProps @@ -333,6 +335,12 @@ function EditImportListModalContent(props) { } + + { + this.props.toggleAdvancedSettings(); + }; + // // Render @@ -67,6 +78,7 @@ class EditImportListModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} /> @@ -84,6 +96,7 @@ EditImportListModalContentConnector.propTypes = { setImportListFieldValue: PropTypes.func.isRequired, saveImportList: PropTypes.func.isRequired, testImportList: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js index cf42e4c2a..383cf057b 100644 --- a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js +++ b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js @@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; +import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton'; import translate from 'Utilities/String/translate'; import NotificationEventItems from './NotificationEventItems'; import styles from './EditNotificationModalContent.css'; @@ -32,6 +33,7 @@ function EditNotificationModalContent(props) { onModalClose, onSavePress, onTestPress, + onAdvancedSettingsPress, onDeleteNotificationPress, ...otherProps } = props; @@ -140,6 +142,12 @@ function EditNotificationModalContent(props) { } + + { + this.props.toggleAdvancedSettings(); + }; + // // Render @@ -65,6 +76,7 @@ class EditNotificationModalContentConnector extends Component { {...this.props} onSavePress={this.onSavePress} onTestPress={this.onTestPress} + onAdvancedSettingsPress={this.onAdvancedSettingsPress} onInputChange={this.onInputChange} onFieldChange={this.onFieldChange} /> @@ -82,6 +94,7 @@ EditNotificationModalContentConnector.propTypes = { setNotificationFieldValue: PropTypes.func.isRequired, saveNotification: PropTypes.func.isRequired, testNotification: PropTypes.func.isRequired, + toggleAdvancedSettings: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; From f477f9b287733fcda58174d05505fcc84a4dca6b Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 26 Mar 2024 06:58:50 +0000 Subject: [PATCH 090/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Altair Co-authored-by: Casselluu Co-authored-by: Dani Talens Co-authored-by: Jason54 Co-authored-by: Stanislav Co-authored-by: Weblate Co-authored-by: shimmyx 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/sk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/ca.json | 36 ++++++-- src/NzbDrone.Core/Localization/Core/fr.json | 14 ++- src/NzbDrone.Core/Localization/Core/sk.json | 89 +++++++++++++++++-- src/NzbDrone.Core/Localization/Core/tr.json | 2 +- .../Localization/Core/zh_CN.json | 2 +- 5 files changed, 125 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 49c9f978c..4b8424ff2 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -363,7 +363,7 @@ "Restore": "Restaura", "RestoreBackup": "Restaura còpia de seguretat", "Retention": "Retenció", - "RetryingDownloadOn": "S'està tornant a provar de baixar {0} a {1}", + "RetryingDownloadOn": "S'està retardant la baixada fins al {date} a les {time}", "RootFolder": "Carpeta arrel", "RootFolders": "Carpetes arrel", "RSSSync": "Sincronització RSS", @@ -725,7 +725,7 @@ "Enabled": "Habilitat", "AddNewArtistRootFolderHelpText": "La subcarpeta '{0}' es crearà automàticament", "Priority": "Prioritat", - "DeleteSpecification": "Suprimeix la notificació", + "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", "DisabledForLocalAddresses": "Desactivat per a adreces locals", "Table": "Taula", @@ -743,7 +743,7 @@ "AddAutoTagError": "No es pot afegir una etiqueta automàtica nova, torneu-ho a provar.", "AddConditionError": "No es pot afegir una condició nova, torneu-ho a provar.", "AlbumsLoadError": "No es poden carregar còpies de seguretat", - "DeleteSpecificationHelpText": "Esteu segur que voleu suprimir la llista '{0}'?", + "DeleteSpecificationHelpText": "Esteu segur que voleu suprimir l'especificació '{name}'?", "AutoTaggingNegateHelpText": "Si està marcat, el format personalitzat no s'aplicarà si la condició {implementationName} coincideix.", "ConditionUsingRegularExpressions": "Aquesta condició coincideix amb expressions regulars. Tingueu en compte que els caràcters `\\^$.|?*+()[{` tenen significats especials i cal escapar amb un `\\`", "Connection": "Connexió", @@ -818,7 +818,7 @@ "ClearBlocklistMessageText": "Esteu segur que voleu esborrar tots els elements de la llista de bloqueig?", "CloneAutoTag": "Clona l'etiquetatge automàtic", "AutoTaggingLoadError": "No es pot carregar l'etiquetatge automàtic", - "AutoTaggingRequiredHelpText": "Aquesta condició {implementationName} ha de coincidir perquè s'apliqui la regla d'etiquetatge automàtic. En cas contrari, una única coincidència {implementationName} és suficient.", + "AutoTaggingRequiredHelpText": "La condició {implementationName} ha de coincidir perquè s'apliqui el format personalitzat. En cas contrari, n'hi ha prou amb una única coincidència de {implementationName}.", "ExpandAlbumByDefaultHelpText": "àlbum", "ImportList": "llista d'importació", "Loading": "Carregant", @@ -887,9 +887,33 @@ "QualitySettingsSummary": "Mides i denominació de qualitat", "TagsSettingsSummary": "Consulta totes les etiquetes i com s'utilitzen. Les etiquetes no utilitzades es poden eliminar", "GeneralSettingsSummary": "Port, SSL, nom d'usuari/contrasenya, servidor intermediari, analítiques i actualitzacions", - "ImportListsSettingsSummary": "Importa llistes, exclusions de llista", + "ImportListsSettingsSummary": "Importa des d'una altra instància {appName} o llistes de Trakt i gestiona les exclusions de llistes", "UiSettingsSummary": "Opcions de calendari, data i color alternats", "Links": "Enllaços", "ArtistIndexFooterDownloading": "S'està baixant", - "AutomaticSearch": "Cerca automàtica" + "AutomaticSearch": "Cerca automàtica", + "BlocklistAndSearchHint": "Comença una cerca per reemplaçar després d'haver bloquejat", + "BlocklistAndSearch": "Llista de bloqueig i cerca", + "ClickToChangeIndexerFlags": "Feu clic per canviar els indicadors de l'indexador", + "CustomFormatsSpecificationFlag": "Bandera", + "CustomFormatsSpecificationRegularExpressionHelpText": "El format personalitzat RegEx no distingeix entre majúscules i minúscules", + "DoNotBlocklist": "No afegiu a la llista de bloqueig", + "DownloadClientAriaSettingsDirectoryHelpText": "Ubicació opcional per a les baixades, deixeu-lo en blanc per utilitzar la ubicació predeterminada d'Aria2", + "CustomFilter": "Filtres personalitzats", + "Donate": "Dona", + "DoNotBlocklistHint": "Elimina sense afegir a la llista de bloqueig", + "BlocklistAndSearchMultipleHint": "Comença una cerca per reemplaçar després d'haver bloquejat", + "BlocklistOnlyHint": "Afegir a la llista de bloqueig sense cercar substituts", + "ChangeCategory": "Canvia categoria", + "ChangeCategoryHint": "Canvia la baixada a la \"Categoria post-importació\" des del client de descàrrega", + "ChangeCategoryMultipleHint": "Canvia les baixades a la \"Categoria post-importació\" des del client de descàrrega", + "RegularExpressionsCanBeTested": "Les expressions regulars es poden provar [aquí](http://regexstorm.net/tester).", + "CustomFormatsSpecificationRegularExpression": "Expressió regular", + "BlocklistMultipleOnlyHint": "Afegeix a la llista de bloqueig sense cercar substituts", + "BlocklistOnly": "Sols afegir a la llista de bloqueig", + "ConnectionSettingsUrlBaseHelpText": "Afegeix un prefix a l'URL {connectionName}, com ara {url}", + "DownloadClientDelugeSettingsDirectory": "Directori de baixada", + "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" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 9e925e6f1..099824b98 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -4,7 +4,7 @@ "AppDataDirectory": "Dossier AppData", "AddingTag": "Ajout d'une étiquette", "Analytics": "Statistiques", - "About": "Tagalog", + "About": "À propos", "ApplyTags": "Appliquer les étiquettes", "Authentication": "Authentification", "Automatic": "Automatique", @@ -1184,7 +1184,7 @@ "RemoveQueueItemRemovalMethod": "Méthode de suppression", "RemoveQueueItemsRemovalMethodHelpTextWarning": "Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement.", "AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer.", - "Donate": "Faire un don", + "Donate": "Donation", "CustomFilter": "Filtre personnalisé", "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Destination pour les téléchargements terminés (facultative), laissez ce champ vide pour utiliser le répertoire par défaut de Deluge", "DownloadClientDelugeSettingsDirectoryHelpText": "Emplacement dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement Deluge par défaut", @@ -1202,5 +1202,13 @@ "AutomaticSearch": "Recherche automatique", "NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')", "Period": "Période", - "NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')" + "NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')", + "DefaultCase": "Case par défaut", + "ClickToChangeIndexerFlags": "Cliquez pour changer les drapeaux de l'indexeur", + "CustomFormatsSpecificationFlag": "Drapeau", + "CustomFormatsSettings": "Paramètre des formats personnalisés", + "CustomFormatsSettingsSummary": "Formats et paramètres personnalisés", + "DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins d'accès à distance", + "AddToDownloadQueue": "Ajouter à la file d'attente de téléchargement", + "AddedToDownloadQueue": "Ajouté à la file d'attente de téléchargement" } diff --git a/src/NzbDrone.Core/Localization/Core/sk.json b/src/NzbDrone.Core/Localization/Core/sk.json index f3ded4721..50dbfbf16 100644 --- a/src/NzbDrone.Core/Localization/Core/sk.json +++ b/src/NzbDrone.Core/Localization/Core/sk.json @@ -30,7 +30,7 @@ "DeleteReleaseProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?", "DeleteRootFolderMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "DeleteTagMessageText": "Naozaj chcete zmazať značku formátu {0} ?", - "APIKey": "Kľúč API", + "APIKey": "Kľúč rozhrania API", "About": "O", "AddListExclusion": "Pridať vylúčenie zoznamu", "AddingTag": "Pridávanie značky", @@ -38,7 +38,7 @@ "AlreadyInYourLibrary": "Už vo vašej knižnici", "AlternateTitles": "Alternatívny názov", "Analytics": "Analytika", - "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery Readarru. To zahŕňa informácie o vašom prehliadači, ktoré stránky {appName} WebUI používate, hlásenia chýb a taktiež verziu operačného systému a spúšťacieho prostredia. Tieto informácie použijeme k uprednostňovaniu funkcií a oprav chýb.", + "AnalyticsEnabledHelpText": "Odosielajte anonymné informácie o používaní a chybách na servery aplikácie {appName}. Zahŕňa to informácie o vašom prehliadači, ktoré stránky webového používateľského rozhrania {appName} používate, hlásenia chýb, ako aj verziu operačného systému a spustenia. Tieto informácie použijeme na stanovenie priorít funkcií a opráv chýb.", "Automatic": "Automatický", "AppDataDirectory": "Priečinok AppData", "BindAddressHelpText": "Platná adresa IP4 alebo '*' pre všetky rozhrania", @@ -64,14 +64,14 @@ "Added": "Pridané", "AddIndexer": "Pridať indexer", "AddNew": "Pridať nový", - "AddRemotePathMapping": "Pridajte vzdialené mapovanie ciest", + "AddRemotePathMapping": "Pridať vzdialené mapovanie ciest", "AddRootFolder": "Pridať koreňový priečinok", "AfterManualRefresh": "Po ručnom obnovení", "Age": "Vek", "All": "Všetko", "AllFiles": "Všetky súbory", "AlternateTitleslength1Title": "Názov", - "AlternateTitleslength1Titles": "Názov", + "AlternateTitleslength1Titles": "Názvy", "Always": "Vždy", "ApplicationURL": "URL aplikácie", "ApplicationUrlHelpText": "Externá URL tejto aplikácie vrátane http(s)://, portu a URL základu", @@ -148,8 +148,8 @@ "Grab": "Grab", "Port": "Port", "Usenet": "Usenet", - "AddQualityProfile": "Pridajte profil kvality", - "AddMetadataProfile": "profil metadát", + "AddQualityProfile": "Pridať profil kvality", + "AddMetadataProfile": "Pridať profil metadát", "Events": "Udalosť", "Info": "Info", "EditMetadataProfile": "profil metadát", @@ -169,5 +169,80 @@ "DeleteCustomFormat": "Klonovať vlastný formát", "DeleteCustomFormatMessageText": "Naozaj chcete zmazať značku formátu {0} ?", "DeleteFormatMessageText": "Naozaj chcete zmazať značku formátu {0} ?", - "ExportCustomFormat": "Pridať vlastný formát" + "ExportCustomFormat": "Pridať vlastný formát", + "UrlBaseHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "SslCertPathHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "SslCertPasswordHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "SslPortHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "AddedArtistSettings": "Pridané nastavenia interpreta", + "EnableSslHelpText": " Vyžaduje sa reštart s oprávnením správcu, aby sa zmeny prejavili", + "AddConditionImplementation": "Pridať podmienku - {implementationName}", + "AddImportListImplementation": "Pridať zoznam importov - {implementationName}", + "AddIndexerImplementation": "Pridať Indexer - {implementationName}", + "AddImportListExclusionArtistHelpText": "Zabrániť pridaniu interpreta do aplikácie {appName} pomocou importovaných zoznamov", + "AllowFingerprintingHelpTextWarning": "To vyžaduje, aby aplikácia {appName} čítala časti súboru, čo spomalí skenovanie a môže spôsobiť vysokú aktivitu na disku alebo v sieti.", + "AnalyticsEnabledHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "AnchorTooltip": "Tento súbor sa už nachádza vo vašej knižnici pre vydanie, ktoré práve importujete", + "RestartRequiredHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "AddNewAlbum": "Pridať nový album", + "AlbumCount": "Počet albumov", + "AlbumRelease": "Vydanie albumu", + "20MinutesTwenty": "20 Minút: {0}", + "45MinutesFourtyFive": "45 Minút: {0}", + "60MinutesSixty": "60 Minút: {0}", + "Absolute": "Celkom", + "AllowArtistChangeClickToChangeArtist": "Kliknutím zmeníte interpreta", + "ApiKeyHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "AddListExclusionHelpText": "Zabrániť pridávaniu umelcov do aplikácie {appName} zoznamami", + "AddMissing": "Pridať chýbajúce", + "AddNewArtist": "Pridať nového interpreta", + "AddNewArtistRootFolderHelpText": "'{folder}' podpriečinok sa vytvorí automaticky", + "AddReleaseProfile": "Pridať profil vydania", + "AlbumIsDownloadingInterp": "Album sa sťahuje - {0}% {1}", + "AlbumIsNotMonitored": "Album nie je monitorovaný", + "RequiresRestartToTakeEffect": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "AddAlbumWithTitle": "Pridať {albumTitle}", + "AddArtistWithName": "Pridať {artistName}", + "AddAutoTagError": "Nie je možné pridať novú automatickú značku, skúste to znova.", + "AddCondition": "Pridať podmienku", + "AddAutoTag": "Pridať automatickú značku", + "AddConditionError": "Nie je možné pridať novú podmienku, skúste to znova.", + "AddConnection": "Pridať podmienku", + "AddConnectionImplementation": "Pridať pripojenie - {implementationName}", + "AddDownloadClientImplementation": "Pridať klienta pre sťahovanie - {implementationName}", + "AddImportList": "Pridať zoznam importov", + "AddImportListExclusion": "Pridať vylúčenie zoznamu importov", + "AddImportListExclusionAlbumHelpText": "Zabrániť pridaniu albumu do aplikácie {appName} pomocou importovaných zoznamov", + "AddNewAlbumSearchForNewAlbum": "Spustiť hľadanie pre nový album", + "AddNewArtistSearchForMissingAlbums": "Spustiť hľadanie pre chýbajúce albumy", + "AddNewItem": "Pridať novú položku", + "AnyReleaseOkHelpText": "{appName} sa automaticky prepne na vydanie, ktoré najlepšie zodpovedá stiahnutým skladbám", + "AddToDownloadQueue": "Pridať do fronty sťahovania", + "AddedToDownloadQueue": "Pridané do fronty sťahovania", + "Album": "Album", + "AlbumDetails": "Podrobnosti o albume", + "AlbumHasNotAired": "Album nebol odvysielaný", + "AlbumIsDownloading": "Album sa sťahuje", + "AlbumReleaseDate": "Dátum vydania albumu", + "AlbumStatus": "Stav albumu", + "AlbumStudio": "Štúdiový Album", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} stiahnuté skladby", + "AlbumStudioTruncated": "Zobrazuje sa iba posledných 20 albumov, prejdite na podrobnosti a pozrite si všetky albumy", + "AlbumTitle": "Názov albumu", + "AlbumType": "Typ albumu", + "Albums": "Albumy", + "AlbumsLoadError": "Nie je možné načítať albumy", + "AllAlbums": "Všetky albumy", + "AllAlbumsData": "Sledovať všetky albumy okrem špeciálnych", + "AllArtistAlbums": "Všetky albumy interpreta", + "AllExpandedCollapseAll": "Zbaliť všetko", + "AllExpandedExpandAll": "Rozbaliť všetko", + "AllMonitoringOptionHelpText": "Monitorovať interpretov a všetky albumy pre každého interpreta v zozname importu", + "AllResultsAreHiddenByTheAppliedFilter": "Použitý filter skryje všetky výsledky", + "AllowFingerprinting": "Povoliť odtlačky", + "AllowFingerprintingHelpText": "Použiť odtlačky na zlepšenie presnosti priraďovania stôp", + "BindAddressHelpTextWarning": "Vyžaduje sa reštart, aby sa zmeny prejavili", + "ApplyTagsHelpTextAdd": "Pridať: Pridať značky do existujúceho zoznamu značiek", + "ApplyTagsHelpTextHowToApplyArtists": "Ako použiť značky na vybraných umelcov", + "ApplyTagsHelpTextHowToApplyDownloadClients": "Ako použiť značky na vybratých klientov na sťahovanie" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index ec5d35da7..390057149 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -708,7 +708,7 @@ "EditIndexerImplementation": "Koşul Ekle - {implementationName}", "DeleteArtistFoldersHelpText": "Film klasörünü ve içeriğini silin", "AddNewArtistSearchForMissingAlbums": "Kayıp filmi aramaya başlayın", - "AddConnectionImplementation": "Koşul Ekle - {implementationName}", + "AddConnectionImplementation": "Bağlantı Ekle - {implementationName}", "AddImportListExclusionAlbumHelpText": "Listelerle filmin {appName}'a eklenmesini önleyin", "ExtraFileExtensionsHelpText": "İçe aktarılacak ekstra dosyaların virgülle ayrılmış listesi (.nfo, .nfo-orig olarak içe aktarılacaktır)", "ExtraFileExtensionsHelpTextsExamples": "Örnekler: \".sub, .nfo\" veya \"sub, nfo\"", diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 9894c25df..fc8cf9cce 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1152,7 +1152,7 @@ "AutoRedownloadFailed": "重新下载失败", "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} 首曲目已下载", "ArtistProgressBarText": "{trackFileCount} / {trackCount} (共: {totalTrackCount}, 正在下载: {downloadingCount})", - "ChangeCategory": "改变分类", + "ChangeCategory": "修改分类", "ArtistMonitoring": "监控中的艺术家", "ArtistIndexFooterDownloading": "正在下载", "AutomaticSearch": "自动搜索", From 13ce040e4d0e9a12be58dcf55df0d6c7c643a009 Mon Sep 17 00:00:00 2001 From: Servarr Date: Thu, 28 Mar 2024 09:24:17 +0000 Subject: [PATCH 091/491] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index 7d9305f67..434996580 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -5620,6 +5620,23 @@ } } } + }, + "head": { + "tags": [ + "Ping" + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PingResource" + } + } + } + } + } } }, "/api/v1/qualitydefinition/{id}": { From 28f2eb974d72148e79b388e11be0edc78d95a870 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 23 Mar 2024 21:42:54 -0700 Subject: [PATCH 092/491] Fixed: Task with removed artists causing error (cherry picked from commit fc6494c569324c839debdb1d08dde23b8f1b8d76) Closes #4696 --- .../src/Store/Selectors/createMultiArtistsSelector.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/Store/Selectors/createMultiArtistsSelector.ts b/frontend/src/Store/Selectors/createMultiArtistsSelector.ts index 7595189ee..d8f7ea92b 100644 --- a/frontend/src/Store/Selectors/createMultiArtistsSelector.ts +++ b/frontend/src/Store/Selectors/createMultiArtistsSelector.ts @@ -1,12 +1,21 @@ import { createSelector } from 'reselect'; import AppState from 'App/State/AppState'; +import Artist from 'Artist/Artist'; function createMultiArtistsSelector(artistIds: number[]) { return createSelector( (state: AppState) => state.artist.itemMap, (state: AppState) => state.artist.items, (itemMap, allArtists) => { - return artistIds.map((artistId) => allArtists[itemMap[artistId]]); + return artistIds.reduce((acc: Artist[], artistId) => { + const artist = allArtists[itemMap[artistId]]; + + if (artist) { + acc.push(artist); + } + + return acc; + }, []); } ); } From 2a10505dff0ec398e9052fc82404f8e76e4246e6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 28 Mar 2024 13:00:49 +0200 Subject: [PATCH 093/491] Bump skipping spotify tests --- .../ImportListTests/Spotify/SpotifyMappingFixture.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs index f6da386f3..c38b20055 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - [Ignore("Pending mapping fixes", Until = "2024-03-20 00:00:00Z")] + [Ignore("Pending mapping fixes", Until = "2024-04-20 00:00:00Z")] public void map_artist_should_work() { UseRealHttp(); @@ -159,7 +159,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - [Ignore("Pending mapping fixes", Until = "2024-03-20 00:00:00Z")] + [Ignore("Pending mapping fixes", Until = "2024-04-20 00:00:00Z")] public void map_album_should_work() { UseRealHttp(); From e847828191bcc57444cd20fb432264742328bfbf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 31 Mar 2024 21:08:44 +0300 Subject: [PATCH 094/491] Fixed: Album release selection in manual import --- .../InteractiveImport/AlbumRelease/SelectAlbumReleaseRow.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseRow.js b/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseRow.js index d9301cdfa..26fa7282a 100644 --- a/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseRow.js +++ b/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseRow.js @@ -1,10 +1,9 @@ import _ from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; -import FormInputGroup from 'Components/Form/FormInputGroup'; +import SelectInput from 'Components/Form/SelectInput'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; -import { inputTypes } from 'Helpers/Props'; import shortenList from 'Utilities/String/shortenList'; import titleCase from 'Utilities/String/titleCase'; @@ -56,8 +55,7 @@ class SelectAlbumReleaseRow extends Component { if (name === 'release') { return ( - ({ key: r.id, From 72f1b2075b8472628707035e30bf5e83161ad716 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 4 Apr 2024 11:59:03 +0000 Subject: [PATCH 095/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Fixer Co-authored-by: Michael5564445 Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ro/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/es.json | 5 +- src/NzbDrone.Core/Localization/Core/ro.json | 3 +- src/NzbDrone.Core/Localization/Core/uk.json | 46 ++++++++++++++++++- .../Localization/Core/zh_CN.json | 2 +- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 129e6cb23..47209f3cb 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -663,7 +663,7 @@ "AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar", "DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible", "DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.", - "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}", + "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {0}", "MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ", "RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero {appName} no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.", "RemotePathMappingCheckFilesLocalWrongOSPath": "El cliente de descarga local {0} informó de la existencia de archivos en {1}, pero no es una ruta válida {2}. Revise la configuración de su cliente de descarga.", @@ -1054,5 +1054,6 @@ "NotificationsEmbySettingsSendNotificationsHelpText": "Hacer que MediaBrowser envíe notificaciones a los proveedores configurados", "NotificationsKodiSettingsUpdateLibraryHelpText": "¿Actualiza la biblioteca durante Importar y renombrar?", "NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", - "NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')" + "NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", + "Menu": "Menú" } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 790a9f3e5..e02e1cdf4 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -672,5 +672,6 @@ "AddConnectionImplementation": "Adăugați conexiune - {implementationName}", "Album": "Album", "AddConnection": "Adăugați conexiune", - "AppUpdated": "{appName} actualizat" + "AppUpdated": "{appName} actualizat", + "CustomFilter": "Filtru personalizat" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index ef02ca448..590d68e65 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -493,5 +493,49 @@ "ApplyTagsHelpTextHowToApplyDownloadClients": "Як застосувати теги до вибраних клієнтів завантаження", "ApplyTagsHelpTextHowToApplyImportLists": "Як застосувати теги до вибраних списків імпорту", "AuthForm": "Форми (сторінка входу)", - "AuthenticationMethod": "Метод автентифікації" + "AuthenticationMethod": "Метод автентифікації", + "WhatsNew": "Що нового ?", + "AppUpdatedVersion": "{appName} оновлено до версії `{version}`. Щоб отримати останні зміни, потрібно перезавантажити {appName}", + "AlternateTitleslength1Title": "Назва", + "AlternateTitleslength1Titles": "Назви", + "Artists": "Виконавців", + "TrackNumber": "Номер треку", + "TrackFilesCountMessage": "Немає файлів треків", + "UnableToLoadHistory": "Не вдалося завантажити історію.", + "Yes": "Так", + "AutomaticUpdatesDisabledDocker": "Автоматичні оновлення не підтримуються безпосередньо під час використання механізму оновлення Docker. Вам потрібно буде оновити зображення контейнера за межами {appName} або скористатися сценарієм", + "BindAddressHelpTextWarning": "Щоб набуло чинності, потрібно перезапустити", + "TrackTitle": "Назва Треку", + "UrlBaseHelpTextWarning": "Щоб набуло чинності, потрібно перезапустити", + "BackupIntervalHelpText": "Інтервал резервного копіювання БД {appName} і налаштувань", + "AddMissing": "Додати відсутні", + "Artist": "Виконавець", + "AllAlbums": "Всі Альбоми", + "AllAlbumsData": "Відстежує всі альбоми, крім спеціальних", + "Auto": "Авто", + "AlbumType": "Тип Альбому", + "AlbumsLoadError": "Неможливо завантажити альбоми", + "AuthenticationRequired": "Потрібна Автентифікація", + "Yesterday": "Вчора", + "ArtistType": "Тип Виконавця", + "UpdateAvailable": "Доступне нове оновлення", + "AddArtistWithName": "Додати {artistName}", + "AddNewArtist": "Додати Нового Виконавця", + "AddNewArtistSearchForMissingAlbums": "Почніть пошук відсутніх альбомів", + "AddNewItem": "Додати Новий Елемент", + "Album": "Альбом", + "AlbumTitle": "Назва Альбому", + "AddedToDownloadQueue": "Додано в чергу на завантаження", + "AlbumIsDownloading": "Альбом завантажується", + "AlbumIsDownloadingInterp": "Альбом завантажується - {0}% {1}", + "AlbumReleaseDate": "Дата Виходу Альбому", + "AlbumStatus": "Статус Альбому", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} треків завантажено", + "AlbumStudioTruncated": "Показано лише останні 20 альбомів, перейдіть до деталей, щоб переглянути всі альбоми", + "ArtistMonitoring": "Виконавець Відстежується", + "ArtistName": "Ім'я Виконавця", + "AuthenticationRequiredPasswordHelpTextWarning": "Введіть новий пароль", + "AuthenticationRequiredUsernameHelpTextWarning": "Введіть нове ім'я користувача", + "AuthenticationRequiredWarning": "Щоб запобігти віддаленому доступу без автентифікації, {appName} тепер вимагає ввімкнення автентифікації. За бажанням можна вимкнути автентифікацію з локальних адрес.", + "UpdateAll": "Оновити все" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index fc8cf9cce..723ff4009 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1103,7 +1103,7 @@ "RenameFiles": "重命名文件", "AutoTagging": "自动标记", "AutoTaggingLoadError": "无法加载自动标记", - "AutoTaggingNegateHelpText": "如果选中,当 {0} 条件匹配时,自动标记不会应用。", + "AutoTaggingNegateHelpText": "如果选中,当 {implementationName} 条件匹配时,自动标记不会应用。", "AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。", "CloneAutoTag": "复制自动标签", "Connection": "连接", From ca0b900d928ccb4c1e5d256fc7f8dab0d259901f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 6 Apr 2024 01:01:01 +0300 Subject: [PATCH 096/491] Fixed: (Gazelle) Ignore ineligible releases with Use Freeleech Token --- .../Indexers/Gazelle/GazelleParser.cs | 23 +++++++++++-------- .../Indexers/Redacted/RedactedParser.cs | 19 +++++++++------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs b/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs index 616b48872..00595f70d 100644 --- a/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs +++ b/src/NzbDrone.Core/Indexers/Gazelle/GazelleParser.cs @@ -53,9 +53,14 @@ namespace NzbDrone.Core.Indexers.Gazelle { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + var id = torrent.TorrentId; - var artist = WebUtility.HtmlDecode(result.Artist); - var album = WebUtility.HtmlDecode(result.GroupName); + var infoUrl = GetInfoUrl(result.GroupId, id); var title = $"{result.Artist} - {result.GroupName} ({result.GroupYear}) [{torrent.Format} {torrent.Encoding}] [{torrent.Media}]"; if (torrent.HasCue) @@ -65,17 +70,17 @@ namespace NzbDrone.Core.Indexers.Gazelle torrentInfos.Add(new GazelleInfo { - Guid = string.Format("Gazelle-{0}", id), - Artist = artist, + Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !torrent.IsFreeLeech && !torrent.IsNeutralLeech && !torrent.IsFreeload && !torrent.IsPersonalFreeLeech), // Splice Title from info to avoid calling API again for every torrent. Title = WebUtility.HtmlDecode(title), - Album = album, + Artist = WebUtility.HtmlDecode(result.Artist), + Album = WebUtility.HtmlDecode(result.GroupName), Container = torrent.Encoding, Codec = torrent.Format, Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id), - InfoUrl = GetInfoUrl(result.GroupId, id), Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), PublishDate = torrent.Time.ToUniversalTime(), @@ -109,7 +114,7 @@ namespace NzbDrone.Core.Indexers.Gazelle return flags; } - private string GetDownloadUrl(int torrentId) + private string GetDownloadUrl(int torrentId, bool canUseToken) { var url = new HttpUri(_settings.BaseUrl) .CombinePath("/torrents.php") @@ -119,7 +124,7 @@ namespace NzbDrone.Core.Indexers.Gazelle .AddQueryParam("torrent_pass", _settings.PassKey); // Orpheus fails to download if usetoken=0 so we need to only add if we will use one - if (_settings.UseFreeleechToken) + if (_settings.UseFreeleechToken && canUseToken) { url = url.AddQueryParam("usetoken", "1"); } diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs index 871cbe20c..c3f09baa3 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs @@ -46,19 +46,24 @@ namespace NzbDrone.Core.Indexers.Redacted { foreach (var torrent in result.Torrents) { + // skip releases that cannot be used with freeleech tokens when the option is enabled + if (_settings.UseFreeleechToken && !torrent.CanUseToken) + { + continue; + } + var id = torrent.TorrentId; var title = WebUtility.HtmlDecode(GetTitle(result, torrent)); - var artist = WebUtility.HtmlDecode(result.Artist); - var album = WebUtility.HtmlDecode(result.GroupName); + var infoUrl = GetInfoUrl(result.GroupId, id); torrentInfos.Add(new GazelleInfo { - Guid = $"Redacted-{id}", - InfoUrl = GetInfoUrl(result.GroupId, id), - DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), + Guid = infoUrl, + InfoUrl = infoUrl, + DownloadUrl = GetDownloadUrl(id, !torrent.IsFreeLeech && !torrent.IsNeutralLeech && !torrent.IsFreeload && !torrent.IsPersonalFreeLeech), Title = title, - Artist = artist, - Album = album, + Artist = WebUtility.HtmlDecode(result.Artist), + Album = WebUtility.HtmlDecode(result.GroupName), Container = torrent.Encoding, Codec = torrent.Format, Size = long.Parse(torrent.Size), From 2941e0c4b7fdbe50bc1464744d9dc2a047b766d1 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 5 Apr 2024 23:11:03 -0700 Subject: [PATCH 097/491] Fixed: Sending ntfy.sh notifications with unicode characters (cherry picked from commit a169ebff2adda5c8585c6aae6249b1c1f7c12264) --- src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs b/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs index ac0a1b22c..fa8d6421f 100644 --- a/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs +++ b/src/NzbDrone.Core/Notifications/Ntfy/NtfyProxy.cs @@ -111,18 +111,18 @@ namespace NzbDrone.Core.Notifications.Ntfy { try { - requestBuilder.Headers.Add("X-Title", title); - requestBuilder.Headers.Add("X-Message", message); - requestBuilder.Headers.Add("X-Priority", settings.Priority.ToString()); + requestBuilder.AddQueryParam("title", title); + requestBuilder.AddQueryParam("message", message); + requestBuilder.AddQueryParam("priority", settings.Priority.ToString()); if (settings.Tags.Any()) { - requestBuilder.Headers.Add("X-Tags", settings.Tags.Join(",")); + requestBuilder.AddQueryParam("tags", settings.Tags.Join(",")); } if (!settings.ClickUrl.IsNullOrWhiteSpace()) { - requestBuilder.Headers.Add("X-Click", settings.ClickUrl); + requestBuilder.AddQueryParam("click", settings.ClickUrl); } if (!settings.AccessToken.IsNullOrWhiteSpace()) From a82c9190936d05416a56b9757a1d90f3d2ce7b7d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 5 Apr 2024 23:06:35 -0700 Subject: [PATCH 098/491] Fixed: Cleanse BHD RSS key in log files (cherry picked from commit 60ee7cc716d344fc904fa6fb28f7be0386ae710d) --- .../InstrumentationTests/CleanseLogMessageFixture.cs | 2 ++ src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs index 0a646670e..8f9db6b06 100644 --- a/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs +++ b/src/NzbDrone.Common.Test/InstrumentationTests/CleanseLogMessageFixture.cs @@ -19,6 +19,8 @@ namespace NzbDrone.Common.Test.InstrumentationTests [TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")] [TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")] [TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")] + [TestCase(@"https://b-hd.me/torrent/download/auto.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")] + [TestCase(@"https://b-hd.me/torrent/download/a-slug-in-the-url.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")] // Indexer Responses [TestCase(@"""download"":""https:\/\/avistaz.to\/rss\/download\/2b51db35e1910123321025a12b9933d2\/tb51db35e1910123321025a12b9933d2.torrent"",")] diff --git a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs index 10cc8b5a3..afa9154ce 100644 --- a/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs +++ b/src/NzbDrone.Common/Instrumentation/CleanseLogMessage.cs @@ -18,6 +18,7 @@ namespace NzbDrone.Common.Instrumentation new (@"/fetch/[a-z0-9]{32}/(?[a-z0-9]{32})", RegexOptions.Compiled), new (@"getnzb.*?(?<=\?|&)(r)=(?[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new (@"\b(\w*)?(_?(?[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase), + new (@"-hd.me/torrent/[a-z0-9-]\.[0-9]+\.(?[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase), // Trackers Announce Keys; Designed for Qbit Json; should work for all in theory new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?[a-z0-9]{16,})|(?[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase), From ca6beea62bc11afd8b1b1aee2d11b12c44de09cb Mon Sep 17 00:00:00 2001 From: Cuki <2996147+cuki@users.noreply.github.com> Date: Sat, 6 Apr 2024 08:08:08 +0200 Subject: [PATCH 099/491] Fixed: Use widely supported display mode for PWA (cherry picked from commit 1562d3bae3002947f9e428321d2b162ad69c3309) --- frontend/src/Content/Images/Icons/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/Content/Images/Icons/manifest.json b/frontend/src/Content/Images/Icons/manifest.json index a7ffa6777..cff971235 100644 --- a/frontend/src/Content/Images/Icons/manifest.json +++ b/frontend/src/Content/Images/Icons/manifest.json @@ -15,5 +15,5 @@ "start_url": "../../../../", "theme_color": "#3a3f51", "background_color": "#3a3f51", - "display": "minimal-ui" + "display": "standalone" } From 5d537689fba07d8252b49c92189bc745971daa87 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sat, 6 Apr 2024 08:08:57 +0200 Subject: [PATCH 100/491] New: Informational text on Custom Formats modal (cherry picked from commit 238ba85f0a2639608d9890292dfe0b96c0212f10) Closes #4729 --- .../CustomFormats/EditCustomFormatModalContent.js | 6 ++++++ src/NzbDrone.Core/Localization/Core/en.json | 1 + 2 files changed, 7 insertions(+) diff --git a/frontend/src/Settings/CustomFormats/CustomFormats/EditCustomFormatModalContent.js b/frontend/src/Settings/CustomFormats/CustomFormats/EditCustomFormatModalContent.js index 4d8f0fd4b..8b06deb4b 100644 --- a/frontend/src/Settings/CustomFormats/CustomFormats/EditCustomFormatModalContent.js +++ b/frontend/src/Settings/CustomFormats/CustomFormats/EditCustomFormatModalContent.js @@ -1,5 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import Alert from 'Components/Alert'; import Card from 'Components/Card'; import FieldSet from 'Components/FieldSet'; import Form from 'Components/Form/Form'; @@ -150,6 +151,11 @@ class EditCustomFormatModalContent extends Component {
+ +
+ {translate('CustomFormatsSettingsTriggerInfo')} +
+
{ specifications.map((tag) => { diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index fd1161836..d7ec31b5f 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -257,6 +257,7 @@ "CustomFormatSettings": "Custom Format Settings", "CustomFormats": "Custom Formats", "CustomFormatsSettings": "Custom Formats Settings", + "CustomFormatsSettingsTriggerInfo": "A Custom Format will be applied to a release or file when it matches at least one of each of the different condition types chosen.", "CustomFormatsSettingsSummary": "Custom Formats and Settings", "CustomFormatsSpecificationFlag": "Flag", "CustomFormatsSpecificationRegularExpression": "Regular Expression", From 1d2af2aab4474d05501dd7cf3044a96e64561300 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 7 Apr 2024 02:48:33 +0300 Subject: [PATCH 101/491] Fix translation for indexer priority help text --- .../src/Settings/Indexers/Indexers/EditIndexerModalContent.js | 2 +- src/NzbDrone.Core/Localization/Core/en.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js b/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js index 55235c9da..bda52ac42 100644 --- a/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js +++ b/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js @@ -160,7 +160,7 @@ function EditIndexerModalContent(props) { Date: Sun, 7 Apr 2024 07:57:46 +0300 Subject: [PATCH 102/491] Bump version to 2.2.5 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index b5fe676e7..22bd2cf1e 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.2.4' + majorVersion: '2.2.5' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From daf8b94c8e95a53823640532cb6050855881114c Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 10 Aug 2023 21:07:27 -0500 Subject: [PATCH 103/491] Added table identifier to OrderBy to avoid column ambiguity on joins Co-Authored-By: Richard <1252123+kharenis@users.noreply.github.com> (cherry picked from commit c57ceac4debf7419be84096f997ba7b75c906586) Closes #3993 --- .../Datastore/BasicRepository.cs | 2 +- src/NzbDrone.Core/Datastore/TableMapper.cs | 21 +++++++------------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/BasicRepository.cs b/src/NzbDrone.Core/Datastore/BasicRepository.cs index 49013dd8a..75cc9510b 100644 --- a/src/NzbDrone.Core/Datastore/BasicRepository.cs +++ b/src/NzbDrone.Core/Datastore/BasicRepository.cs @@ -429,7 +429,7 @@ namespace NzbDrone.Core.Datastore var sortKey = TableMapping.Mapper.GetSortKey(pagingSpec.SortKey); var sortDirection = pagingSpec.SortDirection == SortDirection.Descending ? "DESC" : "ASC"; var pagingOffset = Math.Max(pagingSpec.Page - 1, 0) * pagingSpec.PageSize; - builder.OrderBy($"\"{sortKey}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}"); + builder.OrderBy($"\"{sortKey.Table ?? _table}\".\"{sortKey.Column}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}"); return queryFunc(builder).ToList(); } diff --git a/src/NzbDrone.Core/Datastore/TableMapper.cs b/src/NzbDrone.Core/Datastore/TableMapper.cs index 21e64f0c8..db006098b 100644 --- a/src/NzbDrone.Core/Datastore/TableMapper.cs +++ b/src/NzbDrone.Core/Datastore/TableMapper.cs @@ -92,33 +92,28 @@ namespace NzbDrone.Core.Datastore return true; } - public string GetSortKey(string sortKey) + public (string Table, string Column) GetSortKey(string sortKey) { string table = null; if (sortKey.Contains('.')) { var split = sortKey.Split('.'); - if (split.Length != 2) + if (split.Length == 2) { - return sortKey.FirstCharToUpper(); + table = split[0]; + sortKey = split[1]; } - - table = split[0]; - sortKey = split[1]; } - if (table != null && !TableMap.Values.Contains(table, StringComparer.OrdinalIgnoreCase)) + if (table != null) { - return sortKey.FirstCharToUpper(); + table = TableMap.Values.FirstOrDefault(x => x.Equals(table, StringComparison.OrdinalIgnoreCase)) ?? table; } - if (!_allowedOrderBy.Contains(sortKey)) - { - return sortKey.FirstCharToUpper(); - } + sortKey = _allowedOrderBy.FirstOrDefault(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase)) ?? sortKey; - return _allowedOrderBy.First(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase)); + return (table, sortKey.FirstCharToUpper()); } } From adcec90ef81c48a596d6fcb21c9aeecd1b0ce5be Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Apr 2024 18:14:14 +0300 Subject: [PATCH 104/491] Fixed: Sorting by Artist Name in Missing/Cutoff Unmet under Postgres Fixes #4736 Fixes #3392 Closes #4374 --- src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs b/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs index 3eb594175..9d8602f2c 100644 --- a/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs +++ b/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs @@ -102,7 +102,8 @@ namespace NzbDrone.Core.Music .Where(f => f.Id == null) .Where(r => r.Monitored == true) .Where(a => a.ReleaseDate <= currentTime) - .GroupBy(x => x.Id); + .GroupBy(x => x.Id) + .GroupBy(x => x.SortName); } #pragma warning restore CS0472 @@ -125,7 +126,8 @@ namespace NzbDrone.Core.Music .LeftJoin((t, f) => t.TrackFileId == f.Id) .Where(r => r.Monitored == true) .Where(BuildQualityCutoffWhereClause(qualitiesBelowCutoff)) - .GroupBy(x => x.Id); + .GroupBy(x => x.Id) + .GroupBy(x => x.SortName); } private string BuildQualityCutoffWhereClause(List qualitiesBelowCutoff) From 74ac263b7435325c0e2329e5026ef1d7ab4a0751 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 8 Apr 2024 21:44:07 +0300 Subject: [PATCH 105/491] New: Detect shfs mounts in disk space (cherry picked from commit 1aef91041e404f76f278f430e4e53140fb125792) --- src/NzbDrone.Mono/Disk/FindDriveType.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/NzbDrone.Mono/Disk/FindDriveType.cs b/src/NzbDrone.Mono/Disk/FindDriveType.cs index d0481c3d4..08cc611de 100644 --- a/src/NzbDrone.Mono/Disk/FindDriveType.cs +++ b/src/NzbDrone.Mono/Disk/FindDriveType.cs @@ -6,15 +6,16 @@ namespace NzbDrone.Mono.Disk { public static class FindDriveType { - private static readonly Dictionary DriveTypeMap = new Dictionary - { - { "afpfs", DriveType.Network }, - { "apfs", DriveType.Fixed }, - { "fuse.mergerfs", DriveType.Fixed }, - { "fuse.glusterfs", DriveType.Network }, - { "nullfs", DriveType.Fixed }, - { "zfs", DriveType.Fixed } - }; + private static readonly Dictionary DriveTypeMap = new () + { + { "afpfs", DriveType.Network }, + { "apfs", DriveType.Fixed }, + { "fuse.mergerfs", DriveType.Fixed }, + { "fuse.shfs", DriveType.Fixed }, + { "fuse.glusterfs", DriveType.Network }, + { "nullfs", DriveType.Fixed }, + { "zfs", DriveType.Fixed } + }; public static DriveType Find(string driveFormat) { From 8cebb21c2d4eb2100e2ce7dd315ad18656b772da Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 8 Apr 2024 10:59:04 +0000 Subject: [PATCH 106/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Anonymous Co-authored-by: Havok Dan Co-authored-by: Weblate Co-authored-by: fordas Co-authored-by: myrad2267 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/el/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ 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/tr/ 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 | 14 ++++++++++- src/NzbDrone.Core/Localization/Core/bg.json | 12 +++++++++- src/NzbDrone.Core/Localization/Core/ca.json | 24 ++++++++++++++++++- src/NzbDrone.Core/Localization/Core/cs.json | 17 ++++++++++++- src/NzbDrone.Core/Localization/Core/da.json | 20 +++++++++++++++- src/NzbDrone.Core/Localization/Core/el.json | 19 ++++++++++++++- src/NzbDrone.Core/Localization/Core/es.json | 3 ++- src/NzbDrone.Core/Localization/Core/fr.json | 4 +++- src/NzbDrone.Core/Localization/Core/pl.json | 14 ++++++++++- src/NzbDrone.Core/Localization/Core/pt.json | 15 +++++++++++- .../Localization/Core/pt_BR.json | 6 +++-- src/NzbDrone.Core/Localization/Core/tr.json | 24 ++++++++++++++++++- src/NzbDrone.Core/Localization/Core/vi.json | 13 +++++++++- .../Localization/Core/zh_CN.json | 22 ++++++++++++++++- 14 files changed, 192 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/ar.json b/src/NzbDrone.Core/Localization/Core/ar.json index 0bcbc4c0c..26ed9e7b0 100644 --- a/src/NzbDrone.Core/Localization/Core/ar.json +++ b/src/NzbDrone.Core/Localization/Core/ar.json @@ -724,5 +724,17 @@ "ImportLists": "القوائم", "ArtistIndexFooterDownloading": "جارى التحميل", "ImportList": "القوائم", - "AutomaticSearch": "البحث التلقائي" + "AutomaticSearch": "البحث التلقائي", + "FormatAgeMinutes": "الدقائق", + "IndexerFlags": "أعلام المفهرس", + "CustomFilter": "مرشحات مخصصة", + "FormatAgeMinute": "الدقائق", + "MonitorNoAlbums": "لا شيء", + "Yesterday": "في الامس", + "FormatAgeHours": "ساعات", + "FormatAgeHour": "ساعات", + "Tomorrow": "غدا", + "GrabReleaseUnknownArtistOrAlbumMessageText": "لم يتمكن Radarr من تحديد الفيلم الذي كان هذا الإصدار من أجله. قد يتعذر على Radarr استيراد هذا الإصدار تلقائيًا. هل تريد انتزاع \"{0}\"؟", + "AddToDownloadQueue": "إضافة إلى قائمة انتظار التنزيل", + "AddedToDownloadQueue": "تمت الإضافة إلى قائمة انتظار التنزيلات" } diff --git a/src/NzbDrone.Core/Localization/Core/bg.json b/src/NzbDrone.Core/Localization/Core/bg.json index e41cf1e21..3e2643765 100644 --- a/src/NzbDrone.Core/Localization/Core/bg.json +++ b/src/NzbDrone.Core/Localization/Core/bg.json @@ -726,5 +726,15 @@ "MonitoredStatus": "Наблюдавано / Състояние", "ArtistIndexFooterDownloading": "Изтегляне", "ImportList": "Списъци", - "AutomaticSearch": "Автоматично търсене" + "AutomaticSearch": "Автоматично търсене", + "GrabReleaseUnknownArtistOrAlbumMessageText": "Radarr не успя да определи за кой филм е предназначено това издание. Radarr може да не може автоматично да импортира тази версия. Искате ли да вземете „{0}“?", + "CustomFilter": "Персонализирани филтри", + "FormatAgeHour": "Часа", + "FormatAgeHours": "Часа", + "FormatAgeMinute": "Минути", + "FormatAgeMinutes": "Минути", + "MonitorNoAlbums": "Нито един", + "Tomorrow": "Утре", + "Yesterday": "Вчера", + "IndexerFlags": "Индексиращи знамена" } diff --git a/src/NzbDrone.Core/Localization/Core/ca.json b/src/NzbDrone.Core/Localization/Core/ca.json index 4b8424ff2..018b72a61 100644 --- a/src/NzbDrone.Core/Localization/Core/ca.json +++ b/src/NzbDrone.Core/Localization/Core/ca.json @@ -915,5 +915,27 @@ "DownloadClientDelugeSettingsDirectory": "Directori de baixada", "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" + "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}\"?", + "IndexerFlags": "Indicadors de l'indexador", + "MonitorNoAlbums": "Cap", + "Rejections": "Rebutjats", + "Yesterday": "Ahir", + "FormatAgeDay": "dia", + "FormatAgeDays": "dies", + "FormatAgeHour": "hora", + "FormatAgeHours": "hores", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}h", + "FormatRuntimeMinutes": "{minutes}m", + "FormatShortTimeSpanHours": "{hours} hora(es)", + "FormatShortTimeSpanMinutes": "{minutes} minut(s)", + "FormatShortTimeSpanSeconds": "{seconds} segon(s)", + "FormatTimeSpanDays": "{days}d {time}", + "Tomorrow": "Demà", + "AddToDownloadQueue": "Afegeix a la cua de baixades", + "AddedToDownloadQueue": "Afegit a la cua de baixades", + "FormatAgeMinute": "minut", + "FormatAgeMinutes": "Minuts" } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index 15e525bec..f76dc2dc3 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -842,5 +842,20 @@ "UiSettingsSummary": "Možnosti kalendáře, data a barev", "CustomFormatsSettingsSummary": "Vlastní formáty a nastavení", "ArtistIndexFooterDownloading": "Stahování", - "AutomaticSearch": "Vyhledat automaticky" + "AutomaticSearch": "Vyhledat automaticky", + "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", + "FormatAgeHour": "hodina", + "FormatAgeHours": "hodin", + "FormatAgeMinute": "minuta", + "FormatAgeMinutes": "minut", + "MonitorNoAlbums": "Žádný", + "Tomorrow": "Zítra", + "FormatAgeDay": "den", + "FormatAgeDays": "dnů", + "FormatDateTime": "{formattedDate} {formattedTime}", + "Yesterday": "Včera", + "AddToDownloadQueue": "Přidat stahování do fronty", + "AddedToDownloadQueue": "Stahování přidáno do fronty" } diff --git a/src/NzbDrone.Core/Localization/Core/da.json b/src/NzbDrone.Core/Localization/Core/da.json index 7b9f0e1a1..956bfe42e 100644 --- a/src/NzbDrone.Core/Localization/Core/da.json +++ b/src/NzbDrone.Core/Localization/Core/da.json @@ -743,5 +743,23 @@ "ApplyChanges": "Anvend ændringer", "AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}", "AddImportList": "Tilføj importliste", - "AddImportListImplementation": "Tilføj importliste - {implementationName}" + "AddImportListImplementation": "Tilføj importliste - {implementationName}", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} var ikke i stand til at bestemme, hvilken film denne udgivelse var til. {appName} kan muligvis ikke automatisk importere denne udgivelse. Vil du hente '{0}'?", + "Album": "album", + "EditImportListImplementation": "Tilføj importliste - {implementationName}", + "CatalogNumber": "katalognummer", + "CustomFilter": "Bruger Tilpassede Filtere", + "FormatAgeMinutes": "Protokoller", + "PreferredProtocol": "Foretrukken protokol", + "Theme": "Tema", + "EditDownloadClientImplementation": "Tilføj downloadklient - {implementationName}", + "Discography": "diskografi", + "ExpandAlbumByDefaultHelpText": "album", + "FormatAgeHours": "Timer", + "FormatAgeMinute": "Protokoller", + "MonitorNoAlbums": "Ingen", + "Tomorrow": "I morgen", + "Yesterday": "I går", + "Albums": "album", + "IndexerFlags": "Indexer Flag" } diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 6a0c30bcb..b3ad4559f 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1084,5 +1084,22 @@ "UiSettingsSummary": "Ημερολόγιο, ημερομηνία και επιλογές με προβλήματα χρώματος", "ArtistIndexFooterDownloading": "Λήψη", "AutomaticSearch": "Αυτόματη αναζήτηση", - "KeyboardShortcuts": "Συντομεύσεις πληκτρολογίου" + "KeyboardShortcuts": "Συντομεύσεις πληκτρολογίου", + "GrabReleaseUnknownArtistOrAlbumMessageText": "Ο {appName} δεν μπόρεσε να προσδιορίσει ποια ταινία ήταν αυτή η κυκλοφορία. Το {appName} ενδέχεται να μην μπορεί να εισαγάγει αυτόματα αυτήν την κυκλοφορία. Θέλετε να τραβήξετε το \"{0}\";", + "IndexerFlags": "Σημαίες ευρετηρίου", + "CustomFilter": "Custom Φιλτρα", + "Tomorrow": "Αύριο", + "Yesterday": "Εχθές", + "FormatAgeHours": "Ωρες", + "FormatAgeMinute": "Λεπτά", + "FormatAgeMinutes": "Λεπτά", + "MonitorAllAlbums": "Όλα Τα Άλμπουμ", + "MonitorFirstAlbum": "Πρώτο άλμπουμ", + "MonitorFutureAlbums": "Μελλοντικά άλμπουμ", + "MonitorLastestAlbum": "Τελευταίο άλμπουμ", + "MonitorMissingAlbums": "Λείπουν άλμπουμ", + "MonitorNoAlbums": "Κανένας", + "AddToDownloadQueue": "Προστέθηκε για λήψη ουράς", + "AddedToDownloadQueue": "Προστέθηκε στην ουρά λήψης", + "UseSsl": "Χρησιμοποιήστε SSL" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index 47209f3cb..e15248ddc 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -1055,5 +1055,6 @@ "NotificationsKodiSettingsUpdateLibraryHelpText": "¿Actualiza la biblioteca durante Importar y renombrar?", "NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", "NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", - "Menu": "Menú" + "Menu": "Menú", + "CustomFormatsSettingsTriggerInfo": "Un formato personalizado será aplicado al lanzamiento o archivo cuando coincida con al menos uno de los diferentes tipos de condición elegidos." } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 099824b98..e3d4f5f81 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -1210,5 +1210,7 @@ "CustomFormatsSettingsSummary": "Formats et paramètres personnalisés", "DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins d'accès à distance", "AddToDownloadQueue": "Ajouter à la file d'attente de téléchargement", - "AddedToDownloadQueue": "Ajouté à la file d'attente de téléchargement" + "AddedToDownloadQueue": "Ajouté à la file d'attente de téléchargement", + "IncludeHealthWarnings": "Inclure les avertissements de santé", + "CustomFormatsSettingsTriggerInfo": "Un format personnalisé sera appliqué à une version ou à un fichier lorsqu'il correspond à au moins un de chacun des différents types de conditions choisis." } diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 0366db4a0..4e4c85ad0 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -786,5 +786,17 @@ "UiSettingsSummary": "Opcje z osłabionym kalendarzem, datą i kolorem", "ArtistIndexFooterDownloading": "Ściąganie", "ImportLists": "Listy", - "AutomaticSearch": "Automatyczne wyszukiwanie" + "AutomaticSearch": "Automatyczne wyszukiwanie", + "IndexerFlags": "Flagi indeksujące", + "CustomFilter": "Filtry niestandardowe", + "FormatAgeHour": "godziny", + "FormatAgeHours": "godziny", + "MonitorNoAlbums": "Żaden", + "Yesterday": "Wczoraj", + "AddToDownloadQueue": "Dodaj do kolejki pobierania", + "AddedToDownloadQueue": "Dodano do kolejki pobierania", + "GrabReleaseUnknownArtistOrAlbumMessageText": "Radarr nie był w stanie określić, dla którego filmu jest to wydanie. Radarr może nie być w stanie automatycznie zaimportować tej wersji. Czy chcesz złapać „{0}”?", + "Tomorrow": "Jutro", + "FormatAgeMinute": "Minuty", + "FormatAgeMinutes": "Minuty" } diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index f5d9b100d..f3b3a133d 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -939,5 +939,18 @@ "AnchorTooltip": "Este arquivo já está na sua biblioteca para uma versão que você está importando no momento", "ArtistFolderFormat": "Formato da pasta do artista", "AlbumIsDownloading": "O álbum está sendo baixado", - "AlbumStudioTruncated": "Apenas os últimos 20 álbuns são mostrados, acesse os detalhes para ver todos os álbuns" + "AlbumStudioTruncated": "Apenas os últimos 20 álbuns são mostrados, acesse os detalhes para ver todos os álbuns", + "GrabReleaseUnknownArtistOrAlbumMessageText": "O {appName} não pode determinar a que filme pertence esta versão. O {appName} pode ser incapaz de importar automaticamente esta versão. Deseja capturar \"{0}\"?", + "IndexerFlags": "Sinalizadores do indexador", + "CustomFilter": "Filtros personalizados", + "FormatAgeHours": "Horas", + "FormatAgeMinute": "Minutos", + "FormatAgeMinutes": "Minutos", + "MonitorAllAlbums": "Todos os Álbuns", + "Tomorrow": "Amanhã", + "Yesterday": "Ontem", + "AddToDownloadQueue": "Adicionar à fila de download", + "AddedToDownloadQueue": "Adicionado à fila de download", + "UseSsl": "Usar SSL", + "MonitorNoAlbums": "Nenhum" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index 891811441..ebb491e97 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1185,7 +1185,7 @@ "RemoveQueueItemRemovalMethod": "Método de Remoção", "RemoveQueueItemRemovalMethodHelpTextWarning": "'Remover do cliente de download' removerá o download e os arquivos do cliente de download.", "ArtistIndexFooterDownloading": "Baixando", - "IncludeHealthWarnings": "Incluir Advertências de Saúde", + "IncludeHealthWarnings": "Incluir Alertas de Saúde", "OnArtistAdd": "Ao Adicionar Artista", "Donate": "Doar", "Menu": "Menu", @@ -1278,5 +1278,7 @@ "IndexerFlags": "Sinalizadores do Indexador", "Rejections": "Rejeições", "SelectIndexerFlags": "Selecionar Sinalizadores do Indexador", - "SetIndexerFlags": "Definir Sinalizadores de Indexador" + "SetIndexerFlags": "Definir Sinalizadores de Indexador", + "CustomFormatsSettingsTriggerInfo": "Um formato personalizado será aplicado a um lançamento ou arquivo quando corresponder a pelo menos um de cada um dos diferentes tipos de condição escolhidos.", + "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25. Usado ao capturar lançamentos como desempate para lançamentos iguais, {appName} ainda usará todos os indexadores habilitados para sincronização e pesquisa de RSS" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index 390057149..d19c404b2 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -786,5 +786,27 @@ "ClickToChangeReleaseGroup": "Sürüm grubunu değiştirmek için tıklayın", "Clone": "Klon", "CloneAutoTag": "Otomatik Etiketi Klonla", - "CloneCondition": "Klon Durumu" + "CloneCondition": "Klon Durumu", + "ClickToChangeIndexerFlags": "Dizin oluşturucu bayraklarını değiştirmek için tıklayın", + "IndexerFlags": "Dizin Oluşturucu 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", + "MinimumCustomFormatScoreHelpText": "Tercih edilen protokolde gecikmeyi atlamak için gereken Minimum Özel Format Puanı", + "CountDownloadClientsSelected": "{count} indirme istemcisi seçildi", + "FormatAgeMinute": "Dakika", + "FormatAgeMinutes": "Dakika", + "MonitorNoAlbums": "Yok", + "Tomorrow": "Yarın", + "CountArtistsSelected": "{count} içe aktarma listesi seçildi", + "AddToDownloadQueue": "İndirme kuyruğuna ekleyin", + "AddedToDownloadQueue": "İndirme sırasına eklendi", + "BypassIfAboveCustomFormatScore": "Özel Format Koşullarının Üstündeyse Baypas Et", + "BypassIfAboveCustomFormatScoreHelpText": "Sürümün puanı, yapılandırılan minimum özel format puanından yüksek olduğunda bypass'ı etkinleştirin", + "BypassIfHighestQuality": "En Yüksek Kalitedeyse Atla", + "BypassIfHighestQualityHelpText": "Tercih edilen protokolle kalite profilinde en yüksek etkin kaliteye sahip sürüm olduğunda gecikmeyi atlayın", + "CustomFormatsSpecificationFlag": "Bayrak", + "FormatAgeHours": "Saatler", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName}, bu sürümün hangi film için olduğunu belirleyemedi. {appName} bu sürümü otomatik olarak içe aktaramayabilir. '{0}' almak istiyor musunuz?", + "Yesterday": "Dün" } diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 03811d75c..a774bdfc6 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -726,5 +726,16 @@ "TagsSettingsSummary": "Xem tất cả các thẻ và cách chúng được sử dụng. Các thẻ không sử dụng có thể bị xóa", "UiSettingsSummary": "Lịch, ngày tháng và các tùy chọn bị suy giảm màu sắc", "ArtistIndexFooterDownloading": "Đang tải xuống", - "AutomaticSearch": "Tìm kiếm tự động" + "AutomaticSearch": "Tìm kiếm tự động", + "IndexerFlags": "Cờ chỉ mục", + "CustomFilter": "Bộ lọc tùy chỉnh", + "FormatAgeHours": "Giờ", + "FormatAgeMinute": "Phút", + "MonitorNoAlbums": "không ai", + "Tomorrow": "Ngày mai", + "Yesterday": "Hôm qua", + "AddToDownloadQueue": "Thêm vào hàng đợi tải xuống", + "AddedToDownloadQueue": "Đã thêm vào hàng đợi tải xuống", + "FormatAgeMinutes": "Phút", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} không thể xác định bộ phim này được phát hành. {appName} có thể không tự động nhập bản phát hành này. Bạn có muốn lấy '{0}' không?" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 723ff4009..6849c0a12 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1242,5 +1242,25 @@ "BlocklistAndSearchMultipleHint": "列入黑名单后开始搜索替代版本", "BlocklistMultipleOnlyHint": "无需搜索替换的黑名单", "BlocklistOnly": "仅限黑名单", - "BlocklistOnlyHint": "无需寻找替代版本的黑名单" + "BlocklistOnlyHint": "无需寻找替代版本的黑名单", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName}无法确定这个发布版本是哪部剧集的哪一集,{appName}可能无法自动导入此版本,你想要获取“{title}”吗?", + "NotificationsKodiSettingAlwaysUpdate": "总是更新", + "NotificationsKodiSettingsCleanLibraryHelpText": "更新后清理资源库", + "NotificationsKodiSettingsDisplayTime": "显示时间", + "NotificationsKodiSettingsGuiNotification": "图形界面通知", + "NotificationsPlexSettingsAuthToken": "验证令牌", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "使用 Plex.tv 验证身份", + "Rejections": "拒绝", + "CustomFilter": "自定义过滤器", + "AddToDownloadQueue": "添加到下载队列", + "AddedToDownloadQueue": "已加入下载队列", + "IndexerFlags": "搜刮器标记", + "NotificationsEmbySettingsSendNotifications": "发送通知", + "NotificationsKodiSettingAlwaysUpdateHelpText": "即使有视频正在播放也更新资源库?", + "NotificationsKodiSettingsCleanLibrary": "清理资源库", + "NotificationsKodiSettingsDisplayTimeHelpText": "通知显示时长(秒)", + "NotificationsKodiSettingsUpdateLibraryHelpText": "导入和重命名时更新资源库?", + "ConnectionSettingsUrlBaseHelpText": "向 {clientName} url 添加前缀,例如 {url}", + "DownloadClientDelugeSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", + "UseSsl": "使用 SSL" } From 8c09c0cb5c8801bb9dac699315d9a2ffa4e177e6 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 9 Apr 2024 16:12:20 -0700 Subject: [PATCH 107/491] New: Option to prefix app name on Telegram notification titles (cherry picked from commit 37863a8deb339ef730b2dd5be61e1da1311fdd23) Closes #4739 --- src/NzbDrone.Core/Localization/Core/en.json | 2 + .../Notifications/Telegram/Telegram.cs | 40 ++++++++++++++----- .../Notifications/Telegram/TelegramService.cs | 3 +- .../Telegram/TelegramSettings.cs | 3 ++ 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index b7b6227d9..503e96643 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -798,6 +798,8 @@ "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", + "NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications", "Ok": "Ok", "OnAlbumDelete": "On Album Delete", "OnApplicationUpdate": "On Application Update", diff --git a/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs b/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs index 96b0d4bb6..012694520 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/Telegram.cs @@ -18,52 +18,72 @@ namespace NzbDrone.Core.Notifications.Telegram public override void OnGrab(GrabMessage grabMessage) { - _proxy.SendNotification(ALBUM_GRABBED_TITLE, grabMessage.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? ALBUM_GRABBED_TITLE_BRANDED : ALBUM_GRABBED_TITLE; + + _proxy.SendNotification(title, grabMessage.Message, Settings); } public override void OnReleaseImport(AlbumDownloadMessage message) { - _proxy.SendNotification(ALBUM_DOWNLOADED_TITLE, message.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? ALBUM_DOWNLOADED_TITLE_BRANDED : ALBUM_DOWNLOADED_TITLE; + + _proxy.SendNotification(title, message.Message, Settings); } public override void OnArtistAdd(ArtistAddMessage message) { - _proxy.SendNotification(ARTIST_ADDED_TITLE, message.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? ARTIST_ADDED_TITLE_BRANDED : ARTIST_ADDED_TITLE; + + _proxy.SendNotification(title, message.Message, Settings); } public override void OnArtistDelete(ArtistDeleteMessage deleteMessage) { - _proxy.SendNotification(ARTIST_DELETED_TITLE, deleteMessage.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? ARTIST_DELETED_TITLE_BRANDED : ARTIST_DELETED_TITLE; + + _proxy.SendNotification(title, deleteMessage.Message, Settings); } public override void OnAlbumDelete(AlbumDeleteMessage deleteMessage) { - _proxy.SendNotification(ALBUM_DELETED_TITLE, deleteMessage.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? ALBUM_DELETED_TITLE_BRANDED : ALBUM_DELETED_TITLE; + + _proxy.SendNotification(title, deleteMessage.Message, Settings); } public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck) { - _proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? HEALTH_ISSUE_TITLE_BRANDED : HEALTH_ISSUE_TITLE; + + _proxy.SendNotification(title, healthCheck.Message, Settings); } public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck) { - _proxy.SendNotification(HEALTH_RESTORED_TITLE, $"The following issue is now resolved: {previousCheck.Message}", Settings); + var title = Settings.IncludeAppNameInTitle ? HEALTH_RESTORED_TITLE_BRANDED : HEALTH_RESTORED_TITLE; + + _proxy.SendNotification(title, $"The following issue is now resolved: {previousCheck.Message}", Settings); } public override void OnDownloadFailure(DownloadFailedMessage message) { - _proxy.SendNotification(DOWNLOAD_FAILURE_TITLE, message.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? DOWNLOAD_FAILURE_TITLE_BRANDED : DOWNLOAD_FAILURE_TITLE; + + _proxy.SendNotification(title, message.Message, Settings); } public override void OnImportFailure(AlbumDownloadMessage message) { - _proxy.SendNotification(IMPORT_FAILURE_TITLE, message.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? IMPORT_FAILURE_TITLE_BRANDED : IMPORT_FAILURE_TITLE; + + _proxy.SendNotification(title, message.Message, Settings); } public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage) { - _proxy.SendNotification(APPLICATION_UPDATE_TITLE, updateMessage.Message, Settings); + var title = Settings.IncludeAppNameInTitle ? APPLICATION_UPDATE_TITLE_BRANDED : APPLICATION_UPDATE_TITLE; + + _proxy.SendNotification(title, updateMessage.Message, Settings); } public override ValidationResult Test() diff --git a/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs b/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs index 9bd2fd7d7..d261a77ad 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/TelegramService.cs @@ -49,10 +49,11 @@ namespace NzbDrone.Core.Notifications.Telegram { try { + const string brandedTitle = "Lidarr - Test Notification"; const string title = "Test Notification"; const string body = "This is a test message from Lidarr"; - SendNotification(title, body, settings); + SendNotification(settings.IncludeAppNameInTitle ? brandedTitle : title, body, settings); } catch (Exception ex) { diff --git a/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs b/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs index 774fd4ca0..4ff40ae93 100644 --- a/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs +++ b/src/NzbDrone.Core/Notifications/Telegram/TelegramSettings.cs @@ -32,6 +32,9 @@ namespace NzbDrone.Core.Notifications.Telegram [FieldDefinition(3, Label = "Send Silently", Type = FieldType.Checkbox, HelpText = "Sends the message silently. Users will receive a notification with no sound")] public bool SendSilently { get; set; } + [FieldDefinition(4, Label = "NotificationsTelegramSettingsIncludeAppName", Type = FieldType.Checkbox, HelpText = "NotificationsTelegramSettingsIncludeAppNameHelpText")] + public bool IncludeAppNameInTitle { get; set; } + public NzbDroneValidationResult Validate() { return new NzbDroneValidationResult(Validator.Validate(this)); From b14e2bb6180c22c60fb795fc455708d5a470d5a0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 7 Apr 2024 16:22:21 -0700 Subject: [PATCH 108/491] New: Auto tag artists based on tags present/absent on artists (cherry picked from commit f4c19a384bd9bb4e35c9fa0ca5d9a448c04e409e) Closes #4742 --- .../src/Components/Form/ArtistTagInput.tsx | 53 +++++++++++++++++++ .../src/Components/Form/FormInputGroup.js | 4 ++ .../Components/Form/ProviderFieldFormGroup.js | 2 + frontend/src/Helpers/Props/inputTypes.js | 2 + frontend/src/Settings/Tags/TagInUse.js | 2 +- .../Housekeepers/CleanupUnusedTagsFixture.cs | 33 ++++++++++++ .../Annotations/FieldDefinitionAttribute.cs | 3 +- .../Specifications/TagSpecification.cs | 36 +++++++++++++ .../Housekeepers/CleanupUnusedTags.cs | 36 +++++++++++-- src/NzbDrone.Core/Localization/Core/en.json | 1 + src/NzbDrone.Core/Tags/TagService.cs | 23 +++++++- 11 files changed, 188 insertions(+), 7 deletions(-) create mode 100644 frontend/src/Components/Form/ArtistTagInput.tsx create mode 100644 src/NzbDrone.Core/AutoTagging/Specifications/TagSpecification.cs diff --git a/frontend/src/Components/Form/ArtistTagInput.tsx b/frontend/src/Components/Form/ArtistTagInput.tsx new file mode 100644 index 000000000..3edb46ec4 --- /dev/null +++ b/frontend/src/Components/Form/ArtistTagInput.tsx @@ -0,0 +1,53 @@ +import React, { useCallback } from 'react'; +import TagInputConnector from './TagInputConnector'; + +interface ArtistTagInputProps { + name: string; + value: number | number[]; + onChange: ({ + name, + value, + }: { + name: string; + value: number | number[]; + }) => void; +} + +export default function ArtistTagInput(props: ArtistTagInputProps) { + const { value, onChange, ...otherProps } = props; + const isArray = Array.isArray(value); + + const handleChange = useCallback( + ({ name, value: newValue }: { name: string; value: number[] }) => { + if (isArray) { + onChange({ name, value: newValue }); + } else { + onChange({ + name, + value: newValue.length ? newValue[newValue.length - 1] : 0, + }); + } + }, + [isArray, onChange] + ); + + let finalValue: number[] = []; + + if (isArray) { + finalValue = value; + } else if (value === 0) { + finalValue = []; + } else { + finalValue = [value]; + } + + return ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore 2786 'TagInputConnector' isn't typed yet + + ); +} diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index 04e68d608..79f5aaf0e 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -4,6 +4,7 @@ import Link from 'Components/Link/Link'; import { inputTypes, kinds } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import AlbumReleaseSelectInputConnector from './AlbumReleaseSelectInputConnector'; +import ArtistTagInput from './ArtistTagInput'; import AutoCompleteInput from './AutoCompleteInput'; import CaptchaInputConnector from './CaptchaInputConnector'; import CheckInput from './CheckInput'; @@ -99,6 +100,9 @@ function getComponent(type) { case inputTypes.DYNAMIC_SELECT: return EnhancedSelectInputConnector; + case inputTypes.ARTIST_TAG: + return ArtistTagInput; + case inputTypes.SERIES_TYPE_SELECT: return SeriesTypeSelectInput; diff --git a/frontend/src/Components/Form/ProviderFieldFormGroup.js b/frontend/src/Components/Form/ProviderFieldFormGroup.js index 9c2d124d7..fcdd4f2bc 100644 --- a/frontend/src/Components/Form/ProviderFieldFormGroup.js +++ b/frontend/src/Components/Form/ProviderFieldFormGroup.js @@ -29,6 +29,8 @@ function getType({ type, selectOptionsProviderAction }) { return inputTypes.DYNAMIC_SELECT; } return inputTypes.SELECT; + case 'artistTag': + return inputTypes.ARTIST_TAG; case 'tag': return inputTypes.TEXT_TAG; case 'tagSelect': diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index 9ec6e65df..1d08c762f 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -20,6 +20,7 @@ export const DOWNLOAD_CLIENT_SELECT = 'downloadClientSelect'; export const ROOT_FOLDER_SELECT = 'rootFolderSelect'; export const SELECT = 'select'; export const SERIES_TYPE_SELECT = 'artistTypeSelect'; +export const ARTIST_TAG = 'artistTag'; export const DYNAMIC_SELECT = 'dynamicSelect'; export const TAG = 'tag'; export const TAG_SELECT = 'tagSelect'; @@ -49,6 +50,7 @@ export const all = [ DOWNLOAD_CLIENT_SELECT, ROOT_FOLDER_SELECT, SELECT, + ARTIST_TAG, DYNAMIC_SELECT, SERIES_TYPE_SELECT, TAG, diff --git a/frontend/src/Settings/Tags/TagInUse.js b/frontend/src/Settings/Tags/TagInUse.js index 9fb57d230..27228fa2e 100644 --- a/frontend/src/Settings/Tags/TagInUse.js +++ b/frontend/src/Settings/Tags/TagInUse.js @@ -12,7 +12,7 @@ export default function TagInUse(props) { return null; } - if (count > 1 && labelPlural ) { + if (count > 1 && labelPlural) { return (
{count} {labelPlural.toLowerCase()} diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs index 24a49157a..0a2399dd7 100644 --- a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupUnusedTagsFixture.cs @@ -1,6 +1,9 @@ +using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; +using NzbDrone.Core.AutoTagging; +using NzbDrone.Core.AutoTagging.Specifications; using NzbDrone.Core.Housekeeping.Housekeepers; using NzbDrone.Core.Profiles.Releases; using NzbDrone.Core.Tags; @@ -46,5 +49,35 @@ namespace NzbDrone.Core.Test.Housekeeping.Housekeepers Subject.Clean(); AllStoredModels.Should().HaveCount(1); } + + [Test] + public void should_not_delete_used_auto_tagging_tag_specification_tags() + { + var tags = Builder + .CreateListOfSize(2) + .All() + .With(x => x.Id = 0) + .BuildList(); + Db.InsertMany(tags); + + var autoTags = Builder.CreateListOfSize(1) + .All() + .With(x => x.Id = 0) + .With(x => x.Specifications = new List + { + new TagSpecification + { + Name = "Test", + Value = tags[0].Id + } + }) + .BuildList(); + + Mocker.GetMock().Setup(s => s.All()) + .Returns(autoTags); + + Subject.Clean(); + AllStoredModels.Should().HaveCount(1); + } } } diff --git a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs index 4a56117c3..ed5879e5e 100644 --- a/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs +++ b/src/NzbDrone.Core/Annotations/FieldDefinitionAttribute.cs @@ -86,7 +86,8 @@ namespace NzbDrone.Core.Annotations TagSelect, RootFolder, QualityProfile, - MetadataProfile + MetadataProfile, + ArtistTag } public enum HiddenType diff --git a/src/NzbDrone.Core/AutoTagging/Specifications/TagSpecification.cs b/src/NzbDrone.Core/AutoTagging/Specifications/TagSpecification.cs new file mode 100644 index 000000000..4e32671d9 --- /dev/null +++ b/src/NzbDrone.Core/AutoTagging/Specifications/TagSpecification.cs @@ -0,0 +1,36 @@ +using FluentValidation; +using NzbDrone.Core.Annotations; +using NzbDrone.Core.Music; +using NzbDrone.Core.Validation; + +namespace NzbDrone.Core.AutoTagging.Specifications +{ + public class TagSpecificationValidator : AbstractValidator + { + public TagSpecificationValidator() + { + RuleFor(c => c.Value).GreaterThan(0); + } + } + + public class TagSpecification : AutoTaggingSpecificationBase + { + private static readonly TagSpecificationValidator Validator = new (); + + public override int Order => 1; + public override string ImplementationName => "Tag"; + + [FieldDefinition(1, Label = "AutoTaggingSpecificationTag", Type = FieldType.ArtistTag)] + public int Value { get; set; } + + protected override bool IsSatisfiedByWithoutNegate(Artist artist) + { + return artist.Tags.Contains(Value); + } + + public override NzbDroneValidationResult Validate() + { + return new NzbDroneValidationResult(Validator.Validate(this)); + } + } +} diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs index 43e46111c..f7ee3b3da 100644 --- a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupUnusedTags.cs @@ -3,6 +3,8 @@ using System.Data; using System.Linq; using Dapper; using NzbDrone.Common.Extensions; +using NzbDrone.Core.AutoTagging; +using NzbDrone.Core.AutoTagging.Specifications; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.Housekeeping.Housekeepers @@ -10,17 +12,24 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers public class CleanupUnusedTags : IHousekeepingTask { private readonly IMainDatabase _database; + private readonly IAutoTaggingRepository _autoTaggingRepository; - public CleanupUnusedTags(IMainDatabase database) + public CleanupUnusedTags(IMainDatabase database, IAutoTaggingRepository autoTaggingRepository) { _database = database; + _autoTaggingRepository = autoTaggingRepository; } public void Clean() { using var mapper = _database.OpenConnection(); - var usedTags = new[] { "Artists", "Notifications", "DelayProfiles", "ReleaseProfiles", "ImportLists", "Indexers", "AutoTagging", "DownloadClients" } + var usedTags = new[] + { + "Artists", "Notifications", "DelayProfiles", "ReleaseProfiles", "ImportLists", "Indexers", + "AutoTagging", "DownloadClients" + } .SelectMany(v => GetUsedTags(v, mapper)) + .Concat(GetAutoTaggingTagSpecificationTags(mapper)) .Distinct() .ToArray(); @@ -45,10 +54,31 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers private int[] GetUsedTags(string table, IDbConnection mapper) { - return mapper.Query>($"SELECT DISTINCT \"Tags\" FROM \"{table}\" WHERE NOT \"Tags\" = '[]' AND NOT \"Tags\" IS NULL") + return mapper + .Query>( + $"SELECT DISTINCT \"Tags\" FROM \"{table}\" WHERE NOT \"Tags\" = '[]' AND NOT \"Tags\" IS NULL") .SelectMany(x => x) .Distinct() .ToArray(); } + + private List GetAutoTaggingTagSpecificationTags(IDbConnection mapper) + { + var tags = new List(); + var autoTags = _autoTaggingRepository.All(); + + foreach (var autoTag in autoTags) + { + foreach (var specification in autoTag.Specifications) + { + if (specification is TagSpecification tagSpec) + { + tags.Add(tagSpec.Value); + } + } + } + + return tags; + } } } diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 503e96643..c8d813d70 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -146,6 +146,7 @@ "AutoTaggingLoadError": "Unable to load auto tagging", "AutoTaggingNegateHelpText": "If checked, the auto tagging rule will not apply if this {implementationName} condition matches.", "AutoTaggingRequiredHelpText": "This {implementationName} condition must match for the auto tagging rule to apply. Otherwise a single {implementationName} match is sufficient.", + "AutoTaggingSpecificationTag": "Tag", "Automatic": "Automatic", "AutomaticAdd": "Automatic Add", "AutomaticSearch": "Automatic Search", diff --git a/src/NzbDrone.Core/Tags/TagService.cs b/src/NzbDrone.Core/Tags/TagService.cs index f97881a29..78137a125 100644 --- a/src/NzbDrone.Core/Tags/TagService.cs +++ b/src/NzbDrone.Core/Tags/TagService.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using NzbDrone.Core.AutoTagging; +using NzbDrone.Core.AutoTagging.Specifications; using NzbDrone.Core.Datastore; using NzbDrone.Core.Download; using NzbDrone.Core.ImportLists; @@ -121,7 +122,7 @@ namespace NzbDrone.Core.Tags var artists = _artistService.GetAllArtistsTags(); var rootFolders = _rootFolderService.All(); var indexers = _indexerService.All(); - var autotags = _autoTaggingService.All(); + var autoTags = _autoTaggingService.All(); var downloadClients = _downloadClientFactory.All(); var details = new List(); @@ -139,7 +140,7 @@ namespace NzbDrone.Core.Tags ArtistIds = artists.Where(c => c.Value.Contains(tag.Id)).Select(c => c.Key).ToList(), RootFolderIds = rootFolders.Where(c => c.DefaultTags.Contains(tag.Id)).Select(c => c.Id).ToList(), IndexerIds = indexers.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), - AutoTagIds = autotags.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), + AutoTagIds = GetAutoTagIds(tag, autoTags), DownloadClientIds = downloadClients.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), }); } @@ -190,5 +191,23 @@ namespace NzbDrone.Core.Tags _repo.Delete(tagId); _eventAggregator.PublishEvent(new TagsUpdatedEvent()); } + + private List GetAutoTagIds(Tag tag, List autoTags) + { + var autoTagIds = autoTags.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(); + + foreach (var autoTag in autoTags) + { + foreach (var specification in autoTag.Specifications) + { + if (specification is TagSpecification) + { + autoTagIds.Add(autoTag.Id); + } + } + } + + return autoTagIds.Distinct().ToList(); + } } } From 3071977284bf0a158b0fd0ca74c24fccd7f15214 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Tue, 9 Apr 2024 16:12:58 -0700 Subject: [PATCH 109/491] Add DevContainer, VSCode config and extensions.json (cherry picked from commit 5061dc4b5e5ea9925740496a5939a1762788b793) Closes #4740 --- .devcontainer/devcontainer.json | 19 ++++++++++++++ .github/dependabot.yml | 12 +++++++++ .gitignore | 1 + .vscode/extensions.json | 7 ++++++ .vscode/launch.json | 26 +++++++++++++++++++ .vscode/tasks.json | 44 +++++++++++++++++++++++++++++++++ src/Directory.Build.props | 34 +++++++++++++++++++++++-- 7 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/dependabot.yml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..6f027453c --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet +{ + "name": "Lidarr", + "image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "nodeGypDependencies": true, + "version": "16", + "nvmVersion": "latest" + } + }, + "forwardPorts": [8686], + "customizations": { + "vscode": { + "extensions": ["esbenp.prettier-vscode"] + } + } +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..f33a02cd1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/.gitignore b/.gitignore index d2dc01467..05531517e 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,7 @@ coverage*.xml coverage*.json setup/Output/ *.~is +.mono # VS outout folders bin diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..7a36fefe1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-dotnettools.csdevkit", + "ms-vscode-remote.remote-containers" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..74b8d418b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md + "name": "Run Lidarr", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build dotnet", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/_output/net6.0/Lidarr", + "args": [], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "integratedTerminal", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..4b3b00b89 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,44 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build dotnet", + "command": "dotnet", + "type": "process", + "args": [ + "msbuild", + "-restore", + "${workspaceFolder}/src/Lidarr.sln", + "-p:GenerateFullPaths=true", + "-p:Configuration=Debug", + "-p:Platform=Posix", + "-consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/src/Lidarr.sln", + "-property:GenerateFullPaths=true", + "-consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/src/Lidarr.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 7e92ec6ac..f08a78b98 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -147,16 +147,46 @@ + + + + + x64 + + + + + x86 + + + + + arm64 + + + + + arm + + + + + + + + + <_UsingDefaultRuntimeIdentifier>true - win-x64 + win-$(Architecture) <_UsingDefaultRuntimeIdentifier>true - linux-x64 + linux-$(Architecture) 0 ? _providerFactory.Find(providerResource.Id) : null; - var providerDefinition = GetDefinition(providerResource, existingDefinition, true, true, true); + var providerDefinition = GetDefinition(providerResource, existingDefinition, true, !forceTest, true); Test(providerDefinition, true); From 431ad0a028720461b351fe46054568b0437d86b1 Mon Sep 17 00:00:00 2001 From: Servarr Date: Tue, 16 Apr 2024 08:00:15 +0000 Subject: [PATCH 113/491] Automated API Docs update --- src/Lidarr.Api.V1/openapi.json | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Lidarr.Api.V1/openapi.json b/src/Lidarr.Api.V1/openapi.json index 434996580..9586dab9e 100644 --- a/src/Lidarr.Api.V1/openapi.json +++ b/src/Lidarr.Api.V1/openapi.json @@ -2302,6 +2302,16 @@ "tags": [ "DownloadClient" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -3208,6 +3218,16 @@ "tags": [ "ImportList" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -3705,6 +3725,16 @@ "tags": [ "Indexer" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -4584,6 +4614,16 @@ "tags": [ "Metadata" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { @@ -5516,6 +5556,16 @@ "tags": [ "Notification" ], + "parameters": [ + { + "name": "forceTest", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "application/json": { From 7820bcf91f65992cd1e4e1f81c00091d2dbf3cc8 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 19 Apr 2024 08:00:59 +0300 Subject: [PATCH 114/491] Bump SixLabors.ImageSharp to 3.1.4 --- 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 80aaaf203..e8290ad84 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -26,7 +26,7 @@ - + From c1926f8758cdb222fd7861ff591a2943c36e729b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 Apr 2024 17:56:04 +0300 Subject: [PATCH 115/491] Fixed: Skip move when source and destination are the same Co-authored-by: Qstick --- src/NzbDrone.Core/Music/Services/MoveArtistService.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/NzbDrone.Core/Music/Services/MoveArtistService.cs b/src/NzbDrone.Core/Music/Services/MoveArtistService.cs index e0b847f4b..1b2c3e60c 100644 --- a/src/NzbDrone.Core/Music/Services/MoveArtistService.cs +++ b/src/NzbDrone.Core/Music/Services/MoveArtistService.cs @@ -1,6 +1,7 @@ using System.IO; using NLog; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Messaging.Commands; @@ -56,6 +57,12 @@ namespace NzbDrone.Core.Music { _logger.ProgressInfo("Moving {0} from '{1}' to '{2}'", artist.Name, sourcePath, destinationPath); } + + if (sourcePath.PathEquals(destinationPath)) + { + _logger.ProgressInfo("{0} is already in the specified location '{1}'.", artist, destinationPath); + return; + } } try From 4a8d6c367d979ed3ade634682035e8671ee9b672 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 20 Apr 2024 18:37:21 +0300 Subject: [PATCH 116/491] Bump skipping spotify tests --- .../ImportListTests/Spotify/SpotifyMappingFixture.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs index c38b20055..dc671ff2d 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Spotify/SpotifyMappingFixture.cs @@ -80,7 +80,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - [Ignore("Pending mapping fixes", Until = "2024-04-20 00:00:00Z")] + [Ignore("Pending mapping fixes", Until = "2024-06-20 00:00:00Z")] public void map_artist_should_work() { UseRealHttp(); @@ -159,7 +159,7 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - [Ignore("Pending mapping fixes", Until = "2024-04-20 00:00:00Z")] + [Ignore("Pending mapping fixes", Until = "2024-06-20 00:00:00Z")] public void map_album_should_work() { UseRealHttp(); From 86dad72c494ffd82150cea3dd260c3f7aa378cc3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 09:15:31 +0300 Subject: [PATCH 117/491] Bump version to 2.3.1 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5e3d76f1b..fd06c3f09 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.3.0' + majorVersion: '2.3.1' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From bc69fa48420edf45da27aac2e7ce6d13496098b4 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 10:17:50 +0300 Subject: [PATCH 118/491] Bump frontend dependencies --- package.json | 42 +- yarn.lock | 3242 +++++++++++++++++++++++++++----------------------- 2 files changed, 1796 insertions(+), 1488 deletions(-) diff --git a/package.json b/package.json index 371864287..27a6ae279 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,9 @@ "@microsoft/signalr": "6.0.25", "@sentry/browser": "7.51.2", "@sentry/integrations": "7.51.2", - "@types/node": "18.16.14", - "@types/react": "18.2.6", - "@types/react-dom": "18.2.4", + "@types/node": "18.19.31", + "@types/react": "18.2.79", + "@types/react-dom": "18.2.25", "ansi-colors": "4.1.3", "classnames": "2.3.2", "clipboard": "2.0.11", @@ -87,47 +87,47 @@ "redux-thunk": "2.3.0", "reselect": "4.1.8", "stacktrace-js": "2.0.2", - "typescript": "4.9.5" + "typescript": "5.1.6" }, "devDependencies": { - "@babel/core": "7.22.11", - "@babel/eslint-parser": "7.22.11", - "@babel/plugin-proposal-export-default-from": "7.22.5", + "@babel/core": "7.24.4", + "@babel/eslint-parser": "7.24.1", + "@babel/plugin-proposal-export-default-from": "7.24.1", "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/preset-env": "7.22.14", - "@babel/preset-react": "7.22.5", - "@babel/preset-typescript": "7.22.11", - "@types/lodash": "4.14.197", + "@babel/preset-env": "7.24.4", + "@babel/preset-react": "7.24.1", + "@babel/preset-typescript": "7.24.1", + "@types/lodash": "4.14.195", "@types/react-lazyload": "3.2.0", "@types/react-router-dom": "5.3.3", "@types/react-text-truncate": "0.14.1", "@types/react-window": "1.8.5", "@types/redux-actions": "2.6.2", - "@typescript-eslint/eslint-plugin": "5.59.7", - "@typescript-eslint/parser": "5.59.7", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", "autoprefixer": "10.4.14", "babel-loader": "9.1.3", "babel-plugin-inline-classnames": "2.0.1", "babel-plugin-transform-react-remove-prop-types": "0.4.24", - "core-js": "3.32.1", + "core-js": "3.37.0", "css-loader": "6.7.3", "css-modules-typescript-loader": "4.0.1", - "eslint": "8.45.0", - "eslint-config-prettier": "8.8.0", + "eslint": "8.57.0", + "eslint-config-prettier": "8.10.0", "eslint-plugin-filenames": "1.3.2", - "eslint-plugin-import": "2.27.5", + "eslint-plugin-import": "2.29.1", "eslint-plugin-json": "3.1.0", "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-react": "7.32.2", + "eslint-plugin-react": "7.34.1", "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-simple-import-sort": "12.1.0", "file-loader": "6.2.0", "filemanager-webpack-plugin": "8.0.0", "fork-ts-checker-webpack-plugin": "8.0.0", "html-webpack-plugin": "5.5.1", "loader-utils": "^3.2.1", - "mini-css-extract-plugin": "2.7.5", - "postcss": "8.4.23", + "mini-css-extract-plugin": "2.7.6", + "postcss": "8.4.38", "postcss-color-function": "4.1.0", "postcss-loader": "7.3.0", "postcss-mixins": "9.0.4", diff --git a/yarn.lock b/yarn.lock index abfd571f7..85d00c5f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,69 +8,69 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.0.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" - integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== + version "4.3.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== +"@babel/core@7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" + integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.4" + "@babel/parser" "^7.24.4" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.11.tgz#cceb8c7989c241a16dd14e12a6cd725618f3f58b" - integrity sha512-YjOYZ3j7TjV8OhLW6NCtyg8G04uStATEUe5eiLuCZaXz2VSDQ3dsAtm2D+TuQyAqNMUK2WacGo0/uma9Pein1w== +"@babel/eslint-parser@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" + integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.24.1", "@babel/generator@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.22.5": @@ -80,52 +80,52 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== +"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" + integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -133,18 +133,18 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" @@ -153,30 +153,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.0" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -185,27 +185,27 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -229,76 +229,93 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +"@babel/helpers@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" + integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" -"@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== +"@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" + integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" -"@babel/plugin-proposal-export-default-from@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" - integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-proposal-export-default-from@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" + integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-default-from" "^7.24.1" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -333,12 +350,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" - integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== +"@babel/plugin-syntax-export-default-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" + integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -347,19 +364,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -375,12 +392,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -438,12 +455,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== +"@babel/plugin-syntax-typescript@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -453,212 +470,212 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== +"@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-async-generator-functions@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz#dbe3b1ff5a52e2e5edc4b19a60d325a675ed2649" - integrity sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== +"@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== +"@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== +"@babel/plugin-transform-block-scoping@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" + integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== +"@babel/plugin-transform-classes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== +"@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== +"@babel/plugin-transform-destructuring@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== +"@babel/plugin-transform-dotall-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== +"@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== +"@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== +"@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== +"@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== +"@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== +"@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== +"@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-commonjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz#d7991d3abad199c03b68ee66a64f216c47ffdfae" - integrity sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g== +"@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" - integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== +"@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== +"@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" @@ -668,103 +685,102 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== +"@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz#dbbb06ce783cd994a8f430d8cefa553e9b42ca62" - integrity sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw== +"@babel/plugin-transform-object-rest-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" + integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.24.1" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.12", "@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz#d7ebf6a88cd2f4d307b0e000ab630acd8124b333" - integrity sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw== +"@babel/plugin-transform-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== +"@babel/plugin-transform-parameters@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-private-property-in-object@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" + integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== +"@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== +"@babel/plugin-transform-react-display-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" + integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" @@ -773,136 +789,138 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== +"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== +"@babel/plugin-transform-react-pure-annotations@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" + integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/plugin-transform-typeof-symbol@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typescript@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.11.tgz#9f27fb5e51585729374bb767ab6a6d9005a23329" - integrity sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA== +"@babel/plugin-transform-typescript@^7.24.1": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15" + integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.4" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-typescript" "^7.24.1" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== +"@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/preset-env@7.22.14": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.14.tgz#1cbb468d899f64fa71c53446f13b7ff8c0005cc1" - integrity sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig== +"@babel/preset-env@7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" + integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/compat-data" "^7.24.4" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -914,59 +932,58 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.11" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.10" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.6" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.10" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.5" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.11" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" - "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.4" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.11" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.12" - "@babel/plugin-transform-parameters" "^7.22.5" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.11" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" core-js-compat "^3.31.0" semver "^6.3.1" @@ -979,28 +996,28 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" - integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== +"@babel/preset-react@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" + integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-transform-react-display-name" "^7.24.1" + "@babel/plugin-transform-react-jsx" "^7.23.4" "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.24.1" -"@babel/preset-typescript@7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz#f218cd0345524ac888aa3dc32f029de5b064b575" - integrity sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg== +"@babel/preset-typescript@7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" + integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.11" - "@babel/plugin-transform-typescript" "^7.22.11" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-syntax-jsx" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-typescript" "^7.24.1" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1008,60 +1025,60 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" - debug "^4.1.0" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@csstools/css-parser-algorithms@^2.1.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz#ec4fc764ba45d2bb7ee2774667e056aa95003f3a" - integrity sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz#c45440d1efa2954006748a01697072dae5881bcd" + integrity sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA== "@csstools/css-tokenizer@^2.1.1": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz#9d70e6dcbe94e44c7400a2929928db35c4de32b5" - integrity sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA== + version "2.2.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz#a4b8718ed7fcd2dcd555de16b31ca59ad4b96a06" + integrity sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw== "@csstools/media-query-list-parser@^2.0.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz#0017f99945f6c16dd81a7aacf6821770933c3a5c" - integrity sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw== + version "2.1.9" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" + integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1080,15 +1097,15 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1100,10 +1117,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@fortawesome/fontawesome-common-types@6.4.0": version "6.4.0" @@ -1143,13 +1160,13 @@ dependencies: prop-types "^15.8.1" -"@humanwhocodes/config-array@^0.11.10": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -1157,47 +1174,47 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1325,32 +1342,32 @@ tslib "^1.9.3" "@types/archiver@^5.3.1": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc" - integrity sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw== + version "5.3.4" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.4.tgz#32172d5a56f165b5b4ac902e366248bf03d3ae84" + integrity sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw== dependencies: "@types/readdir-glob" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.56.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" + integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/history@^4.7.11": version "4.7.11" @@ -1358,9 +1375,9 @@ integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== dependencies: "@types/react" "*" hoist-non-react-statics "^3.3.0" @@ -1371,68 +1388,72 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@4.14.197": - version "4.14.197" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" - integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== +"@types/lodash@4.14.195": + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "20.5.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" - integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" -"@types/node@18.16.14": - version "18.16.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.14.tgz#ab67bb907f1146afc6fedb9ce60ae8a99c989631" - integrity sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg== +"@types/node@18.19.31": + version "18.19.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" + integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/postcss-modules-local-by-default@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#5c141c9bd3a994ae1ebe23d2ae094b24d19538f5" - integrity sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.2.tgz#8fee7513dd1558d74713d817c183a33a6dc583f9" + integrity sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ== dependencies: postcss "^8.0.0" "@types/postcss-modules-scope@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz#f0ad443c2f31f90feacb83bb357692d581388afd" - integrity sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.4.tgz#f82d15ec9023c924b531a49e8087b32646233f41" + integrity sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ== dependencies: postcss "^8.0.0" "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" - integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== +"@types/react-dom@18.2.25": + version "18.2.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" + integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== dependencies: "@types/react" "*" @@ -1444,9 +1465,9 @@ "@types/react" "*" "@types/react-redux@^7.1.16": - version "7.1.26" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" - integrity sha512-UKPo7Cm7rswYU6PH6CmTNCRv5NYF3HrgKuHEYTK8g/3czYLrUux50gQ2pkxc9c7ZpQZi+PNhgmI8oNIRoiVIxg== + version "7.1.33" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15" + integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg== dependencies: "@types/hoist-non-react-statics" "^3.3.0" "@types/react" "*" @@ -1484,28 +1505,18 @@ dependencies: "@types/react" "*" -"@types/react@*": - version "18.2.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" - integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== +"@types/react@*", "@types/react@18.2.79": + version "18.2.79" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" + integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@18.2.6": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/readdir-glob@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1" - integrity sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ== + version "1.1.5" + resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.5.tgz#21a4a98898fc606cb568ad815f2a0eedc24d412a" + integrity sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg== dependencies: "@types/node" "*" @@ -1514,104 +1525,104 @@ resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.6.2.tgz#5956d9e7b9a644358e2c0610f47b1fa3060edc21" integrity sha512-TvcINy8rWFANcpc3EiEQX9Yv3owM3d3KIrqr2ryUIOhYIYzXA/bhDZeGSSSuai62iVR2qMZUgz9tQ5kr0Kl+Tg== -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - "@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@typescript-eslint/eslint-plugin@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz#e470af414f05ecfdc05a23e9ce6ec8f91db56fe2" - integrity sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA== +"@typescript-eslint/eslint-plugin@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.7" - "@typescript-eslint/type-utils" "5.59.7" - "@typescript-eslint/utils" "5.59.7" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.7.tgz#02682554d7c1028b89aa44a48bf598db33048caa" - integrity sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ== +"@typescript-eslint/parser@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.59.7" - "@typescript-eslint/types" "5.59.7" - "@typescript-eslint/typescript-estree" "5.59.7" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz#0243f41f9066f3339d2f06d7f72d6c16a16769e2" - integrity sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.7" - "@typescript-eslint/visitor-keys" "5.59.7" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz#89c97291371b59eb18a68039857c829776f1426d" - integrity sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.59.7" - "@typescript-eslint/utils" "5.59.7" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.7.tgz#6f4857203fceee91d0034ccc30512d2939000742" - integrity sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz#b887acbd4b58e654829c94860dbff4ac55c5cff8" - integrity sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.7" - "@typescript-eslint/visitor-keys" "5.59.7" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.7.tgz#7adf068b136deae54abd9a66ba5a8780d2d0f898" - integrity sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.7" - "@typescript-eslint/types" "5.59.7" - "@typescript-eslint/typescript-estree" "5.59.7" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.7": - version "5.59.7" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz#09c36eaf268086b4fbb5eb9dc5199391b6485fc5" - integrity sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -1626,10 +1637,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -1645,15 +1656,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -1675,58 +1686,58 @@ integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^2.1.1": @@ -1772,9 +1783,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== add-px-to-style@1.0.0: version "1.0.0" @@ -1808,7 +1819,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1964,23 +1975,24 @@ arr-union@^2.0.1: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" -array-includes@^3.1.6: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-slice@^0.2.3: @@ -1993,47 +2005,83 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -2054,9 +2102,9 @@ async@^2.6.4: lodash "^4.17.14" async@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== autoprefixer@10.4.14: version "10.4.14" @@ -2070,10 +2118,12 @@ autoprefixer@10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" babel-loader@9.1.3: version "9.1.3" @@ -2088,29 +2138,29 @@ babel-plugin-inline-classnames@2.0.1: resolved "https://registry.yarnpkg.com/babel-plugin-inline-classnames/-/babel-plugin-inline-classnames-2.0.1.tgz#d871490af06781a42f231a1e090bc4133594f168" integrity sha512-Pq/jJ6hTiGiqcMmy2d4CyJcfBDeUHOdQl1t1MDWNaSKR2RxDmShSAx4Zqz6NDmFaiinaRqF8eQoTVgSRGU+McQ== -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.1" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== +babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.6.1" babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" @@ -2151,9 +2201,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.0.3: version "4.1.0" @@ -2201,15 +2251,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +browserslist@^4.14.5, browserslist@^4.21.5, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2234,13 +2284,16 @@ bytes@1: resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" integrity sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -2274,10 +2327,10 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001591" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz" - integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001587: + version "1.0.30001611" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz#4dbe78935b65851c2d2df1868af39f709a93a96e" + integrity sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q== chalk@^1.1.3: version "1.1.3" @@ -2308,9 +2361,9 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: supports-color "^7.1.0" "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2333,9 +2386,9 @@ classnames@2.3.2, classnames@^2.2.6: integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" @@ -2478,10 +2531,10 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== copy-anything@^2.0.1: version "2.0.6" @@ -2490,17 +2543,17 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: - browserslist "^4.21.10" + browserslist "^4.23.0" -core-js@3.32.1: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.1.tgz#a7d8736a3ed9dd05940c3c4ff32c591bb735be77" - integrity sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ== +core-js@3.37.0: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" + integrity sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug== core-js@^2.4.0: version "2.6.12" @@ -2524,9 +2577,9 @@ cosmiconfig@^7.0.1: yaml "^1.10.0" cosmiconfig@^8.1.3: - version "8.3.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.3.tgz#45985f9f39f3c9330288ef642b1dcb7342bd76d7" - integrity sha512-/VY+0IvFoE47hwgKHu8feeBFIb1Z1mcJFiLrNwaJpLoLa9qwLVquMGMr2OUwQmhpJDtsSQSasg/TMv1imec9xA== + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" js-yaml "^4.1.0" @@ -2574,9 +2627,9 @@ css-color-function@~1.3.3: rgb "~0.1.0" css-functions-list@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.0.tgz#8290b7d064bf483f48d6559c10e98dc4d1ad19ee" - integrity sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" + integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== css-loader@6.7.3: version "6.7.3" @@ -2630,28 +2683,55 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2672,16 +2752,16 @@ decamelize@^1.1.0, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== deep-equal@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761" + integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" + is-arguments "^1.1.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + object-is "^1.1.5" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + regexp.prototype.flags "^1.5.1" deep-is@^0.1.3: version "0.1.4" @@ -2693,11 +2773,21 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2822,14 +2912,14 @@ dot-case@^3.0.4: tslib "^2.0.3" dotenv@^16.0.3: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-to-chromium@^1.4.668: + version "1.4.745" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz#9c202ce9cbf18a5b5e0ca47145fd127cc4dd2290" + integrity sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA== element-class@0.2.2: version "0.2.2" @@ -2854,9 +2944,9 @@ end-of-stream@^1.4.1: once "^1.4.0" enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2867,9 +2957,9 @@ entities@^2.0.0: integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + version "7.12.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" + integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== errno@^0.1.1: version "0.1.8" @@ -2899,71 +2989,117 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: +es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: - has "^1.0.3" + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2980,9 +3116,9 @@ es6-promise@^4.2.8: integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -2994,12 +3130,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== +eslint-config-prettier@8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -3008,10 +3144,10 @@ eslint-import-resolver-node@^0.3.7: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" @@ -3025,26 +3161,28 @@ eslint-plugin-filenames@1.3.2: lodash.snakecase "4.1.1" lodash.upperfirst "4.3.1" -eslint-plugin-import@2.27.5: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== +eslint-plugin-import@2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" eslint-plugin-json@3.1.0: version "3.1.0" @@ -3066,31 +3204,34 @@ eslint-plugin-react-hooks@4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@7.32.2: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== +eslint-plugin-react@7.34.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" -eslint-plugin-simple-import-sort@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" - integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== +eslint-plugin-simple-import-sort@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz#8186ad55474d2f5c986a2f1bf70625a981e30d05" + integrity sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig== eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -3100,7 +3241,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: +eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== @@ -3113,32 +3254,33 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.45.0: - version "8.45.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== +eslint@8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.1.0" - "@eslint/js" "8.44.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -3161,7 +3303,7 @@ eslint@8.45.0: strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0: +espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -3242,9 +3384,9 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3268,9 +3410,9 @@ fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -3362,18 +3504,23 @@ find-up@^6.3.0: path-exists "^5.0.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== focus-lock@^0.8.1: version "0.8.1" @@ -3408,9 +3555,9 @@ fork-ts-checker-webpack-plugin@8.0.0: tapable "^2.2.1" fraction.js@^4.2.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" @@ -3427,9 +3574,9 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: universalify "^2.0.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -3441,12 +3588,12 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -3471,28 +3618,30 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-node-dimensions@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz#fb7b4bb57060fb4247dd51c9d690dfbec56b0823" integrity sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -3557,9 +3706,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -3606,11 +3755,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -3648,36 +3792,36 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" he@^1.2.0: version "1.2.0" @@ -3777,9 +3921,9 @@ ieee754@^1.1.13: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== image-size@~0.5.0: version "0.5.5" @@ -3792,9 +3936,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== "immutable@^3.8.1 || ^4.0.0", immutable@^4.0.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" - integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" @@ -3845,13 +3989,13 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^3.1.1: @@ -3866,7 +4010,7 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -is-arguments@^1.0.4: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -3874,20 +4018,26 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -3915,14 +4065,21 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" -is-date-object@^1.0.1: +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -3934,11 +4091,25 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3946,10 +4117,15 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -3990,7 +4166,7 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -3998,12 +4174,17 @@ is-regex@^1.0.4, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -4019,12 +4200,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -4033,6 +4219,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -4073,6 +4267,17 @@ isstream@^0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jdu@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jdu/-/jdu-1.0.0.tgz#28f1e388501785ae0a1d93e93ed0b14dd41e51ce" @@ -4088,9 +4293,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== jquery@3.7.0: version "3.7.0" @@ -4157,9 +4362,9 @@ json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== jsonfile@^6.0.1: version "6.1.0" @@ -4186,9 +4391,9 @@ just-curry-it@^3.1.0: integrity sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg== keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4423,6 +4628,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4437,11 +4647,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -4560,10 +4765,10 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-css-extract-plugin@2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== +mini-css-extract-plugin@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -4615,9 +4820,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== mkdirp@^0.5.6: version "0.5.6" @@ -4651,10 +4856,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare-lite@^1.4.0: version "1.4.0" @@ -4667,11 +4872,10 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" - integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== dependencies: - debug "^3.2.6" iconv-lite "^0.6.3" sax "^1.2.4" @@ -4700,10 +4904,10 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-package-data@^2.5.0: version "2.5.0" @@ -4757,68 +4961,79 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -object.values@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" once@^1.3.0, once@^1.4.0: version "1.4.0" @@ -4957,11 +5172,11 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.6.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@^1.7.0: @@ -5035,6 +5250,11 @@ portfinder@^1.0.17: debug "^3.2.7" mkdirp "^0.5.6" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-color-function@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.1.0.tgz#b6f9355e07b12fcc5c34dab957834769b03d8f57" @@ -5091,23 +5311,23 @@ postcss-mixins@9.0.4: sugarss "^4.0.1" postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" @@ -5136,9 +5356,9 @@ postcss-safe-parser@^6.0.0: integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.12, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5173,14 +5393,14 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.23: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +postcss@8.4.38, postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" - source-map-js "^1.0.2" + source-map-js "^1.2.0" postcss@^6.0.23: version "6.0.23" @@ -5191,15 +5411,6 @@ postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23: - version "8.4.29" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" - integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prefix-style@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" @@ -5255,9 +5466,9 @@ psl@^1.1.33: integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@6.11.1: version "6.11.1" @@ -5267,11 +5478,11 @@ qs@6.11.1: side-channel "^1.0.4" qs@^6.4.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" querystringify@^2.1.1: version "2.2.0" @@ -5704,10 +5915,23 @@ redux@^4.0.0, redux@^4.1.1: dependencies: "@babel/runtime" "^7.9.2" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -5722,9 +5946,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" @@ -5733,14 +5957,15 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.3.1: version "5.3.2" @@ -5829,21 +6054,21 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5887,13 +6112,13 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -5912,13 +6137,13 @@ safe-json-parse@~1.0.1: resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" integrity sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" "safer-buffer@>= 2.1.2 < 3.0.0": @@ -5927,15 +6152,20 @@ safe-regex-test@^1.0.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass@^1.58.3: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== + version "1.75.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c" + integrity sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -5987,25 +6217,47 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -6035,14 +6287,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^4.0.1: version "4.1.0" @@ -6063,10 +6316,10 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@~0.5.20: version "0.5.21" @@ -6100,9 +6353,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -6113,9 +6366,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== stack-generator@^2.0.5: version "2.0.10" @@ -6168,46 +6421,51 @@ string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.8: - version "4.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz#148779de0f75d36b13b15885fec5cadde994520d" - integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@0.10: version "0.10.31" @@ -6386,9 +6644,9 @@ svg-tags@^1.0.0: integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -6412,7 +6670,7 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@5.3.9: version "5.3.9" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== @@ -6423,10 +6681,21 @@ terser-webpack-plugin@5.3.9, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@^5.10.0, terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== +terser-webpack-plugin@^5.3.7: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.10.0, terser@^5.16.8, terser@^5.26.0: + version "5.30.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" + integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6449,9 +6718,9 @@ tiny-emitter@^2.0.0: integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tiny-lr@^1.1.1: version "1.1.1" @@ -6531,10 +6800,10 @@ ts-loader@9.4.2: micromatch "^4.0.0" semver "^7.3.4" -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -6594,44 +6863,49 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typed-styles@^0.0.7: version "0.0.7" @@ -6660,10 +6934,10 @@ typescript-plugin-css-modules@5.0.1: stylus "^0.59.0" tsconfig-paths "^4.1.2" -typescript@4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== unbox-primitive@^1.0.2: version "1.0.2" @@ -6675,6 +6949,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6712,14 +6991,14 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -6749,9 +7028,9 @@ url-parse@^1.5.3: requires-port "^1.0.0" use-callback-ref@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: tslib "^2.0.0" @@ -6808,14 +7087,14 @@ vscode-json-languageservice@^4.1.6: vscode-uri "^3.0.3" vscode-languageserver-textdocument@^1.0.3: - version "1.0.8" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" - integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== vscode-languageserver-types@^3.16.0: - version "3.17.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" - integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== vscode-nls@^5.0.0: version "5.2.0" @@ -6823,9 +7102,9 @@ vscode-nls@^5.0.0: integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== vscode-uri@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.7.tgz#6d19fef387ee6b46c479e5fb00870e15e58c1eb8" - integrity sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA== + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== warning@^4.0.2, warning@^4.0.3: version "4.0.3" @@ -6835,9 +7114,9 @@ warning@^4.0.2, warning@^4.0.3: loose-envify "^1.0.0" watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -6877,11 +7156,12 @@ webpack-livereload-plugin@3.0.2: tiny-lr "^1.1.1" webpack-merge@^5.7.3: - version "5.9.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" webpack-sources@^3.2.3: @@ -6952,16 +7232,44 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.3.1: version "1.3.1" From db9e62f79d4374755764ca2a248dd8a466f01c76 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 30 Jul 2023 16:23:41 +0300 Subject: [PATCH 119/491] Convert store selectors to Typescript Closes #3937 --- frontend/.eslintrc.js | 3 +- frontend/src/App/State/AppState.ts | 2 ++ frontend/src/App/State/SettingsAppState.ts | 5 +-- frontend/src/App/State/SystemAppState.ts | 10 ++++++ frontend/src/App/State/TagsAppState.ts | 22 ++++++++++++- ...Selector.js => createAllArtistSelector.ts} | 3 +- ...lector.js => createArtistCountSelector.ts} | 9 +++--- ...r.js => createCommandExecutingSelector.ts} | 11 +++---- .../Store/Selectors/createCommandSelector.js | 14 --------- .../Store/Selectors/createCommandSelector.ts | 11 +++++++ ...sSelector.js => createCommandsSelector.ts} | 3 +- .../Selectors/createDeepEqualSelector.js | 9 ------ .../Selectors/createDeepEqualSelector.ts | 6 ++++ ....js => createExecutingCommandsSelector.ts} | 3 +- ...tor.js => createExistingArtistSelector.ts} | 8 +++-- .../createMetadataProfileSelector.js | 15 --------- .../createMetadataProfileSelector.ts | 17 ++++++++++ .../Selectors/createProfileInUseSelector.js | 24 -------------- .../Selectors/createProfileInUseSelector.ts | 25 +++++++++++++++ .../Selectors/createQualityProfileSelector.js | 26 ---------------- .../Selectors/createQualityProfileSelector.ts | 24 ++++++++++++++ ...Selector.js => createQueueItemSelector.ts} | 13 +++----- ...ector.js => createSystemStatusSelector.ts} | 3 +- ...elector.js => createTagDetailsSelector.ts} | 5 +-- ...eTagsSelector.js => createTagsSelector.ts} | 3 +- ...Selector.js => createTrackFileSelector.ts} | 5 +-- ...elector.js => createUISettingsSelector.ts} | 3 +- frontend/src/typings/SystemStatus.ts | 31 +++++++++++++++++++ 28 files changed, 188 insertions(+), 125 deletions(-) create mode 100644 frontend/src/App/State/SystemAppState.ts rename frontend/src/Store/Selectors/{createAllArtistSelector.js => createAllArtistSelector.ts} (71%) rename frontend/src/Store/Selectors/{createArtistCountSelector.js => createArtistCountSelector.ts} (65%) rename frontend/src/Store/Selectors/{createCommandExecutingSelector.js => createCommandExecutingSelector.ts} (50%) delete mode 100644 frontend/src/Store/Selectors/createCommandSelector.js create mode 100644 frontend/src/Store/Selectors/createCommandSelector.ts rename frontend/src/Store/Selectors/{createCommandsSelector.js => createCommandsSelector.ts} (71%) delete mode 100644 frontend/src/Store/Selectors/createDeepEqualSelector.js create mode 100644 frontend/src/Store/Selectors/createDeepEqualSelector.ts rename frontend/src/Store/Selectors/{createExecutingCommandsSelector.js => createExecutingCommandsSelector.ts} (78%) rename frontend/src/Store/Selectors/{createExistingArtistSelector.js => createExistingArtistSelector.ts} (58%) delete mode 100644 frontend/src/Store/Selectors/createMetadataProfileSelector.js create mode 100644 frontend/src/Store/Selectors/createMetadataProfileSelector.ts delete mode 100644 frontend/src/Store/Selectors/createProfileInUseSelector.js create mode 100644 frontend/src/Store/Selectors/createProfileInUseSelector.ts delete mode 100644 frontend/src/Store/Selectors/createQualityProfileSelector.js create mode 100644 frontend/src/Store/Selectors/createQualityProfileSelector.ts rename frontend/src/Store/Selectors/{createQueueItemSelector.js => createQueueItemSelector.ts} (52%) rename frontend/src/Store/Selectors/{createSystemStatusSelector.js => createSystemStatusSelector.ts} (70%) rename frontend/src/Store/Selectors/{createTagDetailsSelector.js => createTagDetailsSelector.ts} (62%) rename frontend/src/Store/Selectors/{createTagsSelector.js => createTagsSelector.ts} (68%) rename frontend/src/Store/Selectors/{createTrackFileSelector.js => createTrackFileSelector.ts} (66%) rename frontend/src/Store/Selectors/{createUISettingsSelector.js => createUISettingsSelector.ts} (69%) create mode 100644 frontend/src/typings/SystemStatus.ts diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 603b20a48..cc26a2633 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -28,7 +28,8 @@ module.exports = { globals: { expect: false, chai: false, - sinon: false + sinon: false, + JSX: true }, parserOptions: { diff --git a/frontend/src/App/State/AppState.ts b/frontend/src/App/State/AppState.ts index 7dc6bc331..979785f3a 100644 --- a/frontend/src/App/State/AppState.ts +++ b/frontend/src/App/State/AppState.ts @@ -5,6 +5,7 @@ import CommandAppState from './CommandAppState'; import HistoryAppState from './HistoryAppState'; import QueueAppState from './QueueAppState'; import SettingsAppState from './SettingsAppState'; +import SystemAppState from './SystemAppState'; import TagsAppState from './TagsAppState'; import TrackFilesAppState from './TrackFilesAppState'; import TracksAppState from './TracksAppState'; @@ -62,6 +63,7 @@ interface AppState { tags: TagsAppState; trackFiles: TrackFilesAppState; tracksSelection: TracksAppState; + system: SystemAppState; } export default AppState; diff --git a/frontend/src/App/State/SettingsAppState.ts b/frontend/src/App/State/SettingsAppState.ts index a84f09b53..547f353cd 100644 --- a/frontend/src/App/State/SettingsAppState.ts +++ b/frontend/src/App/State/SettingsAppState.ts @@ -1,5 +1,6 @@ import AppSectionState, { AppSectionDeleteState, + AppSectionItemState, AppSectionSaveState, AppSectionSchemaState, } from 'App/State/AppSectionState'; @@ -46,7 +47,7 @@ export interface RootFolderAppState AppSectionSaveState {} export type IndexerFlagSettingsAppState = AppSectionState; -export type UiSettingsAppState = AppSectionState; +export type UiSettingsAppState = AppSectionItemState; interface SettingsAppState { downloadClients: DownloadClientAppState; @@ -57,7 +58,7 @@ interface SettingsAppState { notifications: NotificationAppState; qualityProfiles: QualityProfilesAppState; rootFolders: RootFolderAppState; - uiSettings: UiSettingsAppState; + ui: UiSettingsAppState; } export default SettingsAppState; diff --git a/frontend/src/App/State/SystemAppState.ts b/frontend/src/App/State/SystemAppState.ts new file mode 100644 index 000000000..d43c1d0ee --- /dev/null +++ b/frontend/src/App/State/SystemAppState.ts @@ -0,0 +1,10 @@ +import SystemStatus from 'typings/SystemStatus'; +import { AppSectionItemState } from './AppSectionState'; + +export type SystemStatusAppState = AppSectionItemState; + +interface SystemAppState { + status: SystemStatusAppState; +} + +export default SystemAppState; diff --git a/frontend/src/App/State/TagsAppState.ts b/frontend/src/App/State/TagsAppState.ts index d1f1d5a2f..edaf3a158 100644 --- a/frontend/src/App/State/TagsAppState.ts +++ b/frontend/src/App/State/TagsAppState.ts @@ -1,12 +1,32 @@ import ModelBase from 'App/ModelBase'; import AppSectionState, { AppSectionDeleteState, + AppSectionSaveState, } from 'App/State/AppSectionState'; export interface Tag extends ModelBase { label: string; } -interface TagsAppState extends AppSectionState, AppSectionDeleteState {} +export interface TagDetail extends ModelBase { + label: string; + autoTagIds: number[]; + delayProfileIds: number[]; + downloadClientIds: []; + importListIds: number[]; + indexerIds: number[]; + notificationIds: number[]; + restrictionIds: number[]; + artistIds: number[]; +} + +export interface TagDetailAppState + extends AppSectionState, + AppSectionDeleteState, + AppSectionSaveState {} + +interface TagsAppState extends AppSectionState, AppSectionDeleteState { + details: TagDetailAppState; +} export default TagsAppState; diff --git a/frontend/src/Store/Selectors/createAllArtistSelector.js b/frontend/src/Store/Selectors/createAllArtistSelector.ts similarity index 71% rename from frontend/src/Store/Selectors/createAllArtistSelector.js rename to frontend/src/Store/Selectors/createAllArtistSelector.ts index 38b1bcef1..6b6010429 100644 --- a/frontend/src/Store/Selectors/createAllArtistSelector.js +++ b/frontend/src/Store/Selectors/createAllArtistSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createAllArtistSelector() { return createSelector( - (state) => state.artist, + (state: AppState) => state.artist, (artist) => { return artist.items; } diff --git a/frontend/src/Store/Selectors/createArtistCountSelector.js b/frontend/src/Store/Selectors/createArtistCountSelector.ts similarity index 65% rename from frontend/src/Store/Selectors/createArtistCountSelector.js rename to frontend/src/Store/Selectors/createArtistCountSelector.ts index 31e0a39fc..b432d64a7 100644 --- a/frontend/src/Store/Selectors/createArtistCountSelector.js +++ b/frontend/src/Store/Selectors/createArtistCountSelector.ts @@ -1,18 +1,19 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; import createAllArtistSelector from './createAllArtistSelector'; function createArtistCountSelector() { return createSelector( createAllArtistSelector(), - (state) => state.artist.error, - (state) => state.artist.isFetching, - (state) => state.artist.isPopulated, + (state: AppState) => state.artist.error, + (state: AppState) => state.artist.isFetching, + (state: AppState) => state.artist.isPopulated, (artists, error, isFetching, isPopulated) => { return { count: artists.length, error, isFetching, - isPopulated + isPopulated, }; } ); diff --git a/frontend/src/Store/Selectors/createCommandExecutingSelector.js b/frontend/src/Store/Selectors/createCommandExecutingSelector.ts similarity index 50% rename from frontend/src/Store/Selectors/createCommandExecutingSelector.js rename to frontend/src/Store/Selectors/createCommandExecutingSelector.ts index 6037d5820..6a80e172b 100644 --- a/frontend/src/Store/Selectors/createCommandExecutingSelector.js +++ b/frontend/src/Store/Selectors/createCommandExecutingSelector.ts @@ -2,13 +2,10 @@ import { createSelector } from 'reselect'; import { isCommandExecuting } from 'Utilities/Command'; import createCommandSelector from './createCommandSelector'; -function createCommandExecutingSelector(name, contraints = {}) { - return createSelector( - createCommandSelector(name, contraints), - (command) => { - return isCommandExecuting(command); - } - ); +function createCommandExecutingSelector(name: string, contraints = {}) { + return createSelector(createCommandSelector(name, contraints), (command) => { + return isCommandExecuting(command); + }); } export default createCommandExecutingSelector; diff --git a/frontend/src/Store/Selectors/createCommandSelector.js b/frontend/src/Store/Selectors/createCommandSelector.js deleted file mode 100644 index 709dfebaf..000000000 --- a/frontend/src/Store/Selectors/createCommandSelector.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createSelector } from 'reselect'; -import { findCommand } from 'Utilities/Command'; -import createCommandsSelector from './createCommandsSelector'; - -function createCommandSelector(name, contraints = {}) { - return createSelector( - createCommandsSelector(), - (commands) => { - return findCommand(commands, { name, ...contraints }); - } - ); -} - -export default createCommandSelector; diff --git a/frontend/src/Store/Selectors/createCommandSelector.ts b/frontend/src/Store/Selectors/createCommandSelector.ts new file mode 100644 index 000000000..cced7b186 --- /dev/null +++ b/frontend/src/Store/Selectors/createCommandSelector.ts @@ -0,0 +1,11 @@ +import { createSelector } from 'reselect'; +import { findCommand } from 'Utilities/Command'; +import createCommandsSelector from './createCommandsSelector'; + +function createCommandSelector(name: string, contraints = {}) { + return createSelector(createCommandsSelector(), (commands) => { + return findCommand(commands, { name, ...contraints }); + }); +} + +export default createCommandSelector; diff --git a/frontend/src/Store/Selectors/createCommandsSelector.js b/frontend/src/Store/Selectors/createCommandsSelector.ts similarity index 71% rename from frontend/src/Store/Selectors/createCommandsSelector.js rename to frontend/src/Store/Selectors/createCommandsSelector.ts index 7b9edffd9..2dd5d24a2 100644 --- a/frontend/src/Store/Selectors/createCommandsSelector.js +++ b/frontend/src/Store/Selectors/createCommandsSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createCommandsSelector() { return createSelector( - (state) => state.commands, + (state: AppState) => state.commands, (commands) => { return commands.items; } diff --git a/frontend/src/Store/Selectors/createDeepEqualSelector.js b/frontend/src/Store/Selectors/createDeepEqualSelector.js deleted file mode 100644 index 85562f28b..000000000 --- a/frontend/src/Store/Selectors/createDeepEqualSelector.js +++ /dev/null @@ -1,9 +0,0 @@ -import _ from 'lodash'; -import { createSelectorCreator, defaultMemoize } from 'reselect'; - -const createDeepEqualSelector = createSelectorCreator( - defaultMemoize, - _.isEqual -); - -export default createDeepEqualSelector; diff --git a/frontend/src/Store/Selectors/createDeepEqualSelector.ts b/frontend/src/Store/Selectors/createDeepEqualSelector.ts new file mode 100644 index 000000000..9d4a63d2e --- /dev/null +++ b/frontend/src/Store/Selectors/createDeepEqualSelector.ts @@ -0,0 +1,6 @@ +import { isEqual } from 'lodash'; +import { createSelectorCreator, defaultMemoize } from 'reselect'; + +const createDeepEqualSelector = createSelectorCreator(defaultMemoize, isEqual); + +export default createDeepEqualSelector; diff --git a/frontend/src/Store/Selectors/createExecutingCommandsSelector.js b/frontend/src/Store/Selectors/createExecutingCommandsSelector.ts similarity index 78% rename from frontend/src/Store/Selectors/createExecutingCommandsSelector.js rename to frontend/src/Store/Selectors/createExecutingCommandsSelector.ts index 266865a8a..dd16571fc 100644 --- a/frontend/src/Store/Selectors/createExecutingCommandsSelector.js +++ b/frontend/src/Store/Selectors/createExecutingCommandsSelector.ts @@ -1,9 +1,10 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; import { isCommandExecuting } from 'Utilities/Command'; function createExecutingCommandsSelector() { return createSelector( - (state) => state.commands.items, + (state: AppState) => state.commands.items, (commands) => { return commands.filter((command) => isCommandExecuting(command)); } diff --git a/frontend/src/Store/Selectors/createExistingArtistSelector.js b/frontend/src/Store/Selectors/createExistingArtistSelector.ts similarity index 58% rename from frontend/src/Store/Selectors/createExistingArtistSelector.js rename to frontend/src/Store/Selectors/createExistingArtistSelector.ts index 4811f2034..91b5bc4d6 100644 --- a/frontend/src/Store/Selectors/createExistingArtistSelector.js +++ b/frontend/src/Store/Selectors/createExistingArtistSelector.ts @@ -1,13 +1,15 @@ -import _ from 'lodash'; +import { some } from 'lodash'; import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; import createAllArtistSelector from './createAllArtistSelector'; function createExistingArtistSelector() { return createSelector( - (state, { foreignArtistId }) => foreignArtistId, + (_: AppState, { foreignArtistId }: { foreignArtistId: string }) => + foreignArtistId, createAllArtistSelector(), (foreignArtistId, artist) => { - return _.some(artist, { foreignArtistId }); + return some(artist, { foreignArtistId }); } ); } diff --git a/frontend/src/Store/Selectors/createMetadataProfileSelector.js b/frontend/src/Store/Selectors/createMetadataProfileSelector.js deleted file mode 100644 index bdd0d0636..000000000 --- a/frontend/src/Store/Selectors/createMetadataProfileSelector.js +++ /dev/null @@ -1,15 +0,0 @@ -import { createSelector } from 'reselect'; - -function createMetadataProfileSelector() { - return createSelector( - (state, { metadataProfileId }) => metadataProfileId, - (state) => state.settings.metadataProfiles.items, - (metadataProfileId, metadataProfiles) => { - return metadataProfiles.find((profile) => { - return profile.id === metadataProfileId; - }); - } - ); -} - -export default createMetadataProfileSelector; diff --git a/frontend/src/Store/Selectors/createMetadataProfileSelector.ts b/frontend/src/Store/Selectors/createMetadataProfileSelector.ts new file mode 100644 index 000000000..ae4c061db --- /dev/null +++ b/frontend/src/Store/Selectors/createMetadataProfileSelector.ts @@ -0,0 +1,17 @@ +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; + +function createMetadataProfileSelector() { + return createSelector( + (_: AppState, { metadataProfileId }: { metadataProfileId: number }) => + metadataProfileId, + (state: AppState) => state.settings.metadataProfiles.items, + (metadataProfileId, metadataProfiles) => { + return metadataProfiles.find( + (profile) => profile.id === metadataProfileId + ); + } + ); +} + +export default createMetadataProfileSelector; diff --git a/frontend/src/Store/Selectors/createProfileInUseSelector.js b/frontend/src/Store/Selectors/createProfileInUseSelector.js deleted file mode 100644 index 84fefb83e..000000000 --- a/frontend/src/Store/Selectors/createProfileInUseSelector.js +++ /dev/null @@ -1,24 +0,0 @@ -import _ from 'lodash'; -import { createSelector } from 'reselect'; -import createAllArtistSelector from './createAllArtistSelector'; - -function createProfileInUseSelector(profileProp) { - return createSelector( - (state, { id }) => id, - createAllArtistSelector(), - (state) => state.settings.importLists.items, - (id, artist, lists) => { - if (!id) { - return false; - } - - if (_.some(artist, { [profileProp]: id }) || _.some(lists, { [profileProp]: id })) { - return true; - } - - return false; - } - ); -} - -export default createProfileInUseSelector; diff --git a/frontend/src/Store/Selectors/createProfileInUseSelector.ts b/frontend/src/Store/Selectors/createProfileInUseSelector.ts new file mode 100644 index 000000000..85f0c3211 --- /dev/null +++ b/frontend/src/Store/Selectors/createProfileInUseSelector.ts @@ -0,0 +1,25 @@ +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; +import Artist from 'Artist/Artist'; +import ImportList from 'typings/ImportList'; +import createAllArtistSelector from './createAllArtistSelector'; + +function createProfileInUseSelector(profileProp: string) { + return createSelector( + (_: AppState, { id }: { id: number }) => id, + createAllArtistSelector(), + (state: AppState) => state.settings.importLists.items, + (id, artists, lists) => { + if (!id) { + return false; + } + + return ( + artists.some((a) => a[profileProp as keyof Artist] === id) || + lists.some((list) => list[profileProp as keyof ImportList] === id) + ); + } + ); +} + +export default createProfileInUseSelector; diff --git a/frontend/src/Store/Selectors/createQualityProfileSelector.js b/frontend/src/Store/Selectors/createQualityProfileSelector.js deleted file mode 100644 index 611dfc903..000000000 --- a/frontend/src/Store/Selectors/createQualityProfileSelector.js +++ /dev/null @@ -1,26 +0,0 @@ -import { createSelector } from 'reselect'; - -export function createQualityProfileSelectorForHook(qualityProfileId) { - return createSelector( - (state) => state.settings.qualityProfiles.items, - (qualityProfiles) => { - return qualityProfiles.find((profile) => { - return profile.id === qualityProfileId; - }); - } - ); -} - -function createQualityProfileSelector() { - return createSelector( - (state, { qualityProfileId }) => qualityProfileId, - (state) => state.settings.qualityProfiles.items, - (qualityProfileId, qualityProfiles) => { - return qualityProfiles.find((profile) => { - return profile.id === qualityProfileId; - }); - } - ); -} - -export default createQualityProfileSelector; diff --git a/frontend/src/Store/Selectors/createQualityProfileSelector.ts b/frontend/src/Store/Selectors/createQualityProfileSelector.ts new file mode 100644 index 000000000..b913e0c46 --- /dev/null +++ b/frontend/src/Store/Selectors/createQualityProfileSelector.ts @@ -0,0 +1,24 @@ +import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; + +export function createQualityProfileSelectorForHook(qualityProfileId: number) { + return createSelector( + (state: AppState) => state.settings.qualityProfiles.items, + (qualityProfiles) => { + return qualityProfiles.find((profile) => profile.id === qualityProfileId); + } + ); +} + +function createQualityProfileSelector() { + return createSelector( + (_: AppState, { qualityProfileId }: { qualityProfileId: number }) => + qualityProfileId, + (state: AppState) => state.settings.qualityProfiles.items, + (qualityProfileId, qualityProfiles) => { + return qualityProfiles.find((profile) => profile.id === qualityProfileId); + } + ); +} + +export default createQualityProfileSelector; diff --git a/frontend/src/Store/Selectors/createQueueItemSelector.js b/frontend/src/Store/Selectors/createQueueItemSelector.ts similarity index 52% rename from frontend/src/Store/Selectors/createQueueItemSelector.js rename to frontend/src/Store/Selectors/createQueueItemSelector.ts index c85d7ed82..54951a724 100644 --- a/frontend/src/Store/Selectors/createQueueItemSelector.js +++ b/frontend/src/Store/Selectors/createQueueItemSelector.ts @@ -1,21 +1,16 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createQueueItemSelector() { return createSelector( - (state, { albumId }) => albumId, - (state) => state.queue.details.items, + (_: AppState, { albumId }: { albumId: number }) => albumId, + (state: AppState) => state.queue.details.items, (albumId, details) => { if (!albumId || !details) { return null; } - return details.find((item) => { - if (item.album) { - return item.album.id === albumId; - } - - return false; - }); + return details.find((item) => item.albumId === albumId); } ); } diff --git a/frontend/src/Store/Selectors/createSystemStatusSelector.js b/frontend/src/Store/Selectors/createSystemStatusSelector.ts similarity index 70% rename from frontend/src/Store/Selectors/createSystemStatusSelector.js rename to frontend/src/Store/Selectors/createSystemStatusSelector.ts index df586bbb9..f5e276069 100644 --- a/frontend/src/Store/Selectors/createSystemStatusSelector.js +++ b/frontend/src/Store/Selectors/createSystemStatusSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createSystemStatusSelector() { return createSelector( - (state) => state.system.status, + (state: AppState) => state.system.status, (status) => { return status.item; } diff --git a/frontend/src/Store/Selectors/createTagDetailsSelector.js b/frontend/src/Store/Selectors/createTagDetailsSelector.ts similarity index 62% rename from frontend/src/Store/Selectors/createTagDetailsSelector.js rename to frontend/src/Store/Selectors/createTagDetailsSelector.ts index dd178944c..2a271cafe 100644 --- a/frontend/src/Store/Selectors/createTagDetailsSelector.js +++ b/frontend/src/Store/Selectors/createTagDetailsSelector.ts @@ -1,9 +1,10 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createTagDetailsSelector() { return createSelector( - (state, { id }) => id, - (state) => state.tags.details.items, + (_: AppState, { id }: { id: number }) => id, + (state: AppState) => state.tags.details.items, (id, tagDetails) => { return tagDetails.find((t) => t.id === id); } diff --git a/frontend/src/Store/Selectors/createTagsSelector.js b/frontend/src/Store/Selectors/createTagsSelector.ts similarity index 68% rename from frontend/src/Store/Selectors/createTagsSelector.js rename to frontend/src/Store/Selectors/createTagsSelector.ts index fbfd91cdb..f653ff6e3 100644 --- a/frontend/src/Store/Selectors/createTagsSelector.js +++ b/frontend/src/Store/Selectors/createTagsSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createTagsSelector() { return createSelector( - (state) => state.tags.items, + (state: AppState) => state.tags.items, (tags) => { return tags; } diff --git a/frontend/src/Store/Selectors/createTrackFileSelector.js b/frontend/src/Store/Selectors/createTrackFileSelector.ts similarity index 66% rename from frontend/src/Store/Selectors/createTrackFileSelector.js rename to frontend/src/Store/Selectors/createTrackFileSelector.ts index bcfc5cb0b..a162df1fa 100644 --- a/frontend/src/Store/Selectors/createTrackFileSelector.js +++ b/frontend/src/Store/Selectors/createTrackFileSelector.ts @@ -1,9 +1,10 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createTrackFileSelector() { return createSelector( - (state, { trackFileId }) => trackFileId, - (state) => state.trackFiles, + (_: AppState, { trackFileId }: { trackFileId: number }) => trackFileId, + (state: AppState) => state.trackFiles, (trackFileId, trackFiles) => { if (!trackFileId) { return; diff --git a/frontend/src/Store/Selectors/createUISettingsSelector.js b/frontend/src/Store/Selectors/createUISettingsSelector.ts similarity index 69% rename from frontend/src/Store/Selectors/createUISettingsSelector.js rename to frontend/src/Store/Selectors/createUISettingsSelector.ts index b256d0e98..ff539679b 100644 --- a/frontend/src/Store/Selectors/createUISettingsSelector.js +++ b/frontend/src/Store/Selectors/createUISettingsSelector.ts @@ -1,8 +1,9 @@ import { createSelector } from 'reselect'; +import AppState from 'App/State/AppState'; function createUISettingsSelector() { return createSelector( - (state) => state.settings.ui, + (state: AppState) => state.settings.ui, (ui) => { return ui.item; } diff --git a/frontend/src/typings/SystemStatus.ts b/frontend/src/typings/SystemStatus.ts new file mode 100644 index 000000000..e72be2c5c --- /dev/null +++ b/frontend/src/typings/SystemStatus.ts @@ -0,0 +1,31 @@ +interface SystemStatus { + appData: string; + appName: string; + authentication: string; + branch: string; + buildTime: string; + instanceName: string; + isAdmin: boolean; + isDebug: boolean; + isDocker: boolean; + isLinux: boolean; + isNetCore: boolean; + isOsx: boolean; + isProduction: boolean; + isUserInteractive: boolean; + isWindows: boolean; + migrationVersion: number; + mode: string; + osName: string; + osVersion: string; + packageUpdateMechanism: string; + runtimeName: string; + runtimeVersion: string; + sqliteVersion: string; + startTime: string; + startupPath: string; + urlBase: string; + version: string; +} + +export default SystemStatus; From e42e0a72ebab124b6fab8db2039ae76420d434a4 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Fri, 12 Apr 2024 08:16:43 +0000 Subject: [PATCH 120/491] Add dev container workspace Allows the linting and style settings for the frontend to be applied even when you load the main repo as a workspace (cherry picked from commit d6278fced49b26be975c3a6039b38a94f700864b) Closes #4756 --- .devcontainer/Lidarr.code-workspace | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .devcontainer/Lidarr.code-workspace diff --git a/.devcontainer/Lidarr.code-workspace b/.devcontainer/Lidarr.code-workspace new file mode 100644 index 000000000..a46158e44 --- /dev/null +++ b/.devcontainer/Lidarr.code-workspace @@ -0,0 +1,13 @@ +// This file is used to open the backend and frontend in the same workspace, which is necessary as +// the frontend has vscode settings that are distinct from the backend +{ + "folders": [ + { + "path": ".." + }, + { + "path": "../frontend" + } + ], + "settings": {} +} From 4816f3525628c977f488a9d5f969be5e353f2350 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 21 Apr 2024 12:40:23 +0300 Subject: [PATCH 121/491] Bump typescript eslint plugin and parser --- package.json | 4 +- yarn.lock | 171 +++++++++++++++++++++++++++------------------------ 2 files changed, 91 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index 27a6ae279..48e8e843a 100644 --- a/package.json +++ b/package.json @@ -103,8 +103,8 @@ "@types/react-text-truncate": "0.14.1", "@types/react-window": "1.8.5", "@types/redux-actions": "2.6.2", - "@typescript-eslint/eslint-plugin": "5.62.0", - "@typescript-eslint/parser": "5.62.0", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "autoprefixer": "10.4.14", "babel-loader": "9.1.3", "babel-plugin-inline-classnames": "2.0.1", diff --git a/yarn.lock b/yarn.lock index 85d00c5f2..fda5bca42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1090,14 +1090,14 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -1387,7 +1387,7 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -1525,94 +1525,96 @@ resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.6.2.tgz#5956d9e7b9a644358e2c0610f47b1fa3060edc21" integrity sha512-TvcINy8rWFANcpc3EiEQX9Yv3owM3d3KIrqr2ryUIOhYIYzXA/bhDZeGSSSuai62iVR2qMZUgz9tQ5kr0Kl+Tg== -"@types/semver@^7.3.12": +"@types/semver@^7.5.0": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== -"@typescript-eslint/eslint-plugin@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== +"@typescript-eslint/eslint-plugin@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== +"@typescript-eslint/parser@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -2380,11 +2382,16 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -classnames@2.3.2, classnames@^2.2.6: +classnames@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +classnames@^2.2.6: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-css@^5.2.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" @@ -3233,7 +3240,7 @@ eslint-plugin-simple-import-sort@12.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.0.tgz#8186ad55474d2f5c986a2f1bf70625a981e30d05" integrity sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4772,6 +4779,13 @@ mini-css-extract-plugin@2.7.6: dependencies: schema-utils "^4.0.0" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4861,11 +4875,6 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6222,7 +6231,7 @@ semver@^6.0.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -6790,6 +6799,11 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-loader@9.4.2: version "9.4.2" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" @@ -6819,7 +6833,7 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -6829,13 +6843,6 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" From 416d50531636f23a1243e24b89891d4858b432c7 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 19 Mar 2024 19:53:59 +0200 Subject: [PATCH 122/491] Bump dotnet to 6.0.29 --- azure-pipelines.yml | 2 +- src/Directory.Build.props | 4 ++-- src/NzbDrone.Core/Lidarr.Core.csproj | 5 ++--- src/NzbDrone.Integration.Test/Lidarr.Integration.Test.csproj | 2 +- src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fd06c3f09..39ce8a20a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,7 +15,7 @@ variables: buildName: '$(Build.SourceBranchName).$(lidarrVersion)' sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' - dotnetVersion: '6.0.417' + dotnetVersion: '6.0.421' nodeVersion: '20.X' innoVersion: '6.2.0' windowsImage: 'windows-2022' diff --git a/src/Directory.Build.props b/src/Directory.Build.props index f08a78b98..cac505323 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -101,8 +101,8 @@ - - + + diff --git a/src/NzbDrone.Core/Lidarr.Core.csproj b/src/NzbDrone.Core/Lidarr.Core.csproj index e8290ad84..698cd92b0 100644 --- a/src/NzbDrone.Core/Lidarr.Core.csproj +++ b/src/NzbDrone.Core/Lidarr.Core.csproj @@ -3,13 +3,13 @@ net6.0 - + - + @@ -23,7 +23,6 @@ - diff --git a/src/NzbDrone.Integration.Test/Lidarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Lidarr.Integration.Test.csproj index de71c3bb0..d08cd99b1 100644 --- a/src/NzbDrone.Integration.Test/Lidarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Lidarr.Integration.Test.csproj @@ -4,7 +4,7 @@ Library - + diff --git a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj index 4d2832ec8..4a0de4fad 100644 --- a/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Lidarr.Test.Common.csproj @@ -7,7 +7,7 @@ - + From 2e242aeb7baad9b5229c9eaa64eb2cddc6d6930f Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 11:18:33 +0300 Subject: [PATCH 123/491] Database corruption message linking to wiki --- src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs b/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs index f6ddb2a66..cc1773a63 100644 --- a/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs +++ b/src/NzbDrone.Core/Datastore/CorruptDatabaseException.cs @@ -16,12 +16,12 @@ namespace NzbDrone.Core.Datastore } public CorruptDatabaseException(string message, Exception innerException, params object[] args) - : base(message, innerException, args) + : base(innerException, message, args) { } public CorruptDatabaseException(string message, Exception innerException) - : base(message, innerException) + : base(innerException, message) { } } From b0038dd1437e779ce49481e414251ef31247e6ae Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 14:38:31 +0300 Subject: [PATCH 124/491] Fixed: Retrying download on not suppressed HTTP errors --- src/NzbDrone.Core/Download/DownloadClientBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs index 314e8e500..63ccf629e 100644 --- a/src/NzbDrone.Core/Download/DownloadClientBase.cs +++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs @@ -32,6 +32,7 @@ namespace NzbDrone.Core.Download { { Result.HasHttpServerError: true } => PredicateResult.True(), { Result.StatusCode: HttpStatusCode.RequestTimeout } => PredicateResult.True(), + { Exception: HttpException { Response.HasHttpServerError: true } } => PredicateResult.True(), _ => PredicateResult.False() }, Delay = TimeSpan.FromSeconds(3), From d11ed42830a8ec2e926b4cd5936ea04a69396cc3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 27 Apr 2024 18:09:31 +0000 Subject: [PATCH 125/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: Altair Co-authored-by: Ano10 Co-authored-by: Fara Co-authored-by: Fonkio Co-authored-by: Gandrushka Co-authored-by: GkhnGRBZ Co-authored-by: Havok Dan Co-authored-by: Jacopo Luca Maria Latrofa Co-authored-by: Mailme Dashite Co-authored-by: Oskari Lavinto Co-authored-by: Weblate Co-authored-by: YSLG <1451164040@qq.com> Co-authored-by: fordas Co-authored-by: maodun96 <435795439@qq.com> Co-authored-by: toeiazarothis Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/ 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/fi/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/fr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/id/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/it/ 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/uk/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/zh_CN/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/de.json | 94 +++-- src/NzbDrone.Core/Localization/Core/es.json | 393 ++++++++++++++---- src/NzbDrone.Core/Localization/Core/fi.json | 16 +- src/NzbDrone.Core/Localization/Core/fr.json | 106 ++++- src/NzbDrone.Core/Localization/Core/id.json | 3 +- src/NzbDrone.Core/Localization/Core/it.json | 3 +- .../Localization/Core/pt_BR.json | 5 +- src/NzbDrone.Core/Localization/Core/tr.json | 164 ++++++-- src/NzbDrone.Core/Localization/Core/uk.json | 6 +- .../Localization/Core/zh_CN.json | 6 +- 10 files changed, 607 insertions(+), 189 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 4372a5982..080dcfb0d 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -18,16 +18,16 @@ "ClickToChangeQuality": "Hier klicken um die Qualität zu ändern", "CloneIndexer": "Indexer kopieren", "CompletedDownloadHandling": "Verarbeitung abgeschlossener Downloads", - "CopyUsingHardlinksHelpText": "Hardlinks erstellen wenn Torrents die noch geseeded werden kopiert werden sollen", + "CopyUsingHardlinksHelpText": "Hardlinks ermöglichen es {appName}, geseedete Torrents in den Interpretenordner zu importieren, ohne zusätzlichen Speicherplatz zu belegen oder den gesamten Inhalt der Datei zu kopieren. Hardlinks funktionieren nur, wenn sich Quelle und Ziel auf demselben Volume befinden", "CopyUsingHardlinksHelpTextWarning": "Dateisperren Gelegentlich kann es vorkommen, dass Dateisperren das Umbenennen von Dateien verhindern, die gerade geseeded werden. Sie können das Seeding vorübergehend deaktivieren und die Umbenennungsfunktion von {appName} als Workaround verwenden.", "CreateGroup": "Gruppe erstellen", "DatabaseMigration": "DB Migration", "DelayProfile": "Verzögerungsprofil", "DeleteBackup": "Backup löschen", - "DeleteBackupMessageText": "Backup '{0}' wirkich löschen?", - "DeleteDownloadClientMessageText": "Downloader '{0}' wirklich löschen?", + "DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?", + "DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?", "DeleteIndexer": "Indexer löschen", - "DeleteNotificationMessageText": "Benachrichtigung '{0}' wirklich löschen?", + "DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?", "DiskSpace": "Speicherplatz", "DownloadClientSettings": "Downloader Einstellungen", "DownloadWarningCheckDownloadClientForMoreDetails": "Download Warnung: Prüfe den Downloader für mehr Details", @@ -52,7 +52,7 @@ "Connections": "Verbindungen", "ConnectSettings": "Eintellungen für Verbindungen", "Dates": "Termine", - "CutoffHelpText": "Sobald diese Qualität erreicht wird, werden keine neuen Releases erfasst", + "CutoffHelpText": "Sobald diese Qualität erreicht wird, wird {appName} keine neuen Releases mehr abrufen.", "DelayProfiles": "Verzögerungsprofile", "Delete": "Löschen", "DeleteDelayProfile": "Verzögerungsprofil löschen", @@ -61,11 +61,11 @@ "DeleteEmptyFoldersHelpText": "Lösche leere Künstler- und Albumordner während des Scans oder wenn Musikdateien gelöscht werden", "DeleteFilesHelpText": "Lösche Musikdateien und Künstlerordner", "DeleteImportListExclusion": "Importlisten Ausschluss löschen", - "DeleteIndexerMessageText": "Indexer '{0}' wirklich löschen?", + "DeleteIndexerMessageText": "Bist du sicher, dass du den Indexer '{name}' wirklich löschen willst?", "DeleteNotification": "Benachrichtigung löschen", "DeleteQualityProfile": "Qualitätsdefinition löschen", "DeleteTag": "Tag löschen", - "DeleteTagMessageText": "Tag '{0}' wirklich löschen?", + "DeleteTagMessageText": "Bist du sicher, dass du den Tag '{label}' wirklich löschen willst?", "DestinationPath": "Zielpfad", "DetailedProgressBar": "Erweiterter Fortschrittsbalken", "DetailedProgressBarHelpText": "Text auf Fortschrittsbalken anzeigen", @@ -104,7 +104,7 @@ "CreateEmptyArtistFolders": "Leeren Künstlerordner erstellen", "DeleteDelayProfileMessageText": "Bist du sicher, dass du dieses Verzögerung-Profil löschen willst?", "DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?", - "DeleteImportListMessageText": "Liste '{0}' wirklich löschen?", + "DeleteImportListMessageText": "Bist du sicher, dass du die Liste '{name}' wirklich löschen willst?", "Fixed": "Behoben", "Indexer": "Indexer", "ReleaseGroup": "Release-Gruppe", @@ -115,11 +115,11 @@ "ChownGroupHelpText": "Gruppenname oder gid. Verwenden Sie gid für entfernte Dateisysteme.", "ChownGroupHelpTextWarning": "Dies funktioniert nur, wenn der Benutzer, der {appName} ausführt, der Eigentümer der Datei ist. Es ist besser, sicherzustellen, dass der Download-Client die gleiche Gruppe wie {appName} verwendet.", "CreateEmptyArtistFoldersHelpText": "Leere Filmordner für fehlende Filme beim Scan erstellen", - "DeleteMetadataProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", - "DeleteQualityProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?", - "DeleteReleaseProfile": "Verzögerungsprofil löschen", - "DeleteReleaseProfileMessageText": "Bist du sicher, dass du dieses Verzögerungs-Profil löschen willst?", - "DeleteRootFolderMessageText": "Indexer '{0}' wirklich löschen?", + "DeleteMetadataProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?", + "DeleteQualityProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?", + "DeleteReleaseProfile": "Release-Profil löschen", + "DeleteReleaseProfileMessageText": "Bist du sicher, dass du dieses Release-Profil löschen willst?", + "DeleteRootFolderMessageText": "Bist du sicher, dass du den Root-Ordner '{name}' wirklich löschen willst?", "DeleteSelectedTrackFiles": "Ausgewählte Filmdateien löschen", "DeleteSelectedTrackFilesMessageText": "Ausgewählte Filme wirklich löschen?", "DeleteTrackFileMessageText": "Möchten Sie {0} wirklich löschen?", @@ -140,13 +140,13 @@ "IsCutoffCutoff": "Schwelle", "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Solange bis die Qualität erreicht oder übertroffen wird verbessern", "IsTagUsedCannotBeDeletedWhileInUse": "Kann während der Benutzung nicht gelöscht werden", - "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Jeder Indexer der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.", + "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} unterstützt jeden Indexer, der den Newznab-Standard verwendet, sowie andere unten aufgeführte Indexer.", "LidarrTags": "{appName} Tags", "LocalPath": "Lokaler Pfad", "LocalPathHelpText": "Pfad, den {appName} verwenden sollte, um lokal auf den Entfernten-Pfad zuzugreifen", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Trace logging sollte nur kurzzeitig aktiviert werden", "Logs": "Protokolle", - "MaintenanceRelease": "Wartungsupdate", + "MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details", "ManualImport": "Manueller Import", "MarkAsFailed": "Als fehlgeschlagen markieren", "MarkAsFailedMessageText": "'{0}' wirklich als fehlgeschlagen markieren?", @@ -178,13 +178,13 @@ "PublishedDate": "Veröffentlichungsdatum", "Quality": "Qualität", "RemoveFromBlocklist": "Aus der Sperrliste entfernen", - "RemoveFromDownloadClient": "Aus dem Downloader entfernen", + "RemoveFromDownloadClient": "Aus dem Download Client entfernen", "RemoveFromQueue": "Aus der Warteschlage entfernen", "RemoveTagRemovingTag": "Tag entfernen", - "RenameTracksHelpText": "Wenn das umbennen deaktiviert ist, wird der vorhandene Dateiname benutzt", + "RenameTracksHelpText": "{appName} verwendet den vorhandenen Dateinamen, wenn die Umbenennung deaktiviert ist", "Reorder": "Neu sortieren", "ReplaceIllegalCharacters": "Sonderzeichen ersetzen", - "ReplaceIllegalCharactersHelpText": "Wenn nicht aktiviert, werden Sonderzeichen ganz entfernt", + "ReplaceIllegalCharactersHelpText": "Ersetze illegale Zeichen. Wenn nicht ausgewählt, werden sie stattdessen von {appName} entfernt", "RequiredHelpText": "Das Release mus mindesten eines der Begriffe beinhalten ( Groß-/Kleinschreibung wird nicht beachtet )", "RescanArtistFolderAfterRefresh": "Nach dem aktualisieren den Filmordner neu scannen", "ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?", @@ -205,7 +205,7 @@ "GrabRelease": "Release erfassen", "GrabSelected": "Auswahl erfassen", "Group": "Gruppe", - "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Wird für automatische Suchen genutzt die vom Benutzer oder von {appName} gestartet werden", + "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Wird verwendet, wenn die automatische Suche über die Benutzeroberfläche oder durch {appName} durchgeführt wird", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Wird für die manuelle Suche benutzt", "RssSyncIntervalHelpText": "Intervall in Minuten. Zum deaktivieren auf 0 setzen ( Dies wird das automatische Release erfassen deaktivieren )", "SSLCertPath": "Pfad zum SSL Zertifikat", @@ -280,7 +280,7 @@ "SuccessMyWorkIsDoneNoFilesToRetag": "Fertig! Keine weiteren Dateien zum umbennenen.", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "Der Indexer unterstützt kein RSS", "BindAddressHelpTextWarning": "Erfordert einen Neustart", - "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Verwendeter Git-Branch für Aktualisierungen", + "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Verwendeter Git-Branch, um {appName} zu aktualisieren", "SearchForMissing": "Suche fehlende", "SearchSelected": "Auswahl suchen", "Season": "Staffel", @@ -394,11 +394,11 @@ "RequiredPlaceHolder": "Neue Beschränkung hinzufügen", "RequiresRestartToTakeEffect": "Erfordert einen Neustart", "RescanAfterRefreshHelpText": "Nach dem aktualisieren des Films, den Filmordner neu scannen", - "RescanAfterRefreshHelpTextWarning": "Wenn nicht \"Immer (Always)\" ausgewählt wird, werden Dateiänderungen nicht automatisch erkannt", + "RescanAfterRefreshHelpTextWarning": "{appName} erkennt Änderungen an Dateien nicht automatisch, wenn sie nicht auf 'Immer' eingestellt sind", "Reset": "Zurücksetzen", "ResetAPIKey": "API-Schlüssel zurücksetzen", "Restart": "Neustarten", - "RestartLidarr": "{appName} Neustarten", + "RestartLidarr": "{appName} neu starten", "RestoreBackup": "Backup einspielen", "Result": "Ergebnis", "RetentionHelpText": "Nur Usenet: Für eine umbegrenzte Aufbewahrung auf 0 setzen", @@ -520,7 +520,7 @@ "SearchMonitored": "Suche beobachtete", "SecondaryAlbumTypes": "Sekundäre Albentypen", "SecondaryTypes": "Sekundärtypen", - "SelectedCountArtistsSelectedInterp": "{0} Künstler ausgewählt", + "SelectedCountArtistsSelectedInterp": "{selectedCount} Künstler ausgewählt", "AlbumIsNotMonitored": "Album wird nicht beobachtet", "UnableToLoadMetadataProviderSettings": "Einstellungen für Metadata Provider konnten nicht geladen werden", "UnmappedFiles": "Nicht zugewiesene Dateien", @@ -529,7 +529,7 @@ "AllowFingerprintingHelpText": "Benutze Fingerabdrücke um die Genauigkeit der Titel Übereinstimmungen zu verbessern", "AllowFingerprintingHelpTextWarning": "Dies erfordert, dass {appName} Teile der Datei ließt, was dazu führt, dass Scans verlangsamt werden und eventuell hohe Schreib-/Netzwerkaktivitäten entstehen.", "AnchorTooltip": "Diese Datei befindet sich bereits in der Bibliothek für eine Version die gerade importiert wird", - "Artist": "Künstler", + "Artist": "Interpret", "ArtistClickToChangeAlbum": "Klicken um das Album zu ändern", "Artists": "Künstler", "AutomaticallySwitchRelease": "Automatischer Wechsel der Version", @@ -598,7 +598,7 @@ "MusicBrainzTrackID": "MusicBrainz Titel Id", "OnDownloadFailure": "Bei fehlgeschlagenem Download", "OnReleaseImport": "Bei Veröffentlichungsimport", - "OnRename": "Bei Umbenennen", + "OnRename": "Bei Umbenennung", "OnTrackRetag": "Bei Titel Retag", "OnUpgrade": "Bei Aktualisierung", "Other": "Andere", @@ -747,7 +747,7 @@ "UpgradesAllowed": "Upgrades erlaubt", "Wanted": "Gesucht", "Warn": "Warnung", - "WouldYouLikeToRestoreBackup": "Willst du das Backup {0} wiederherstellen?", + "WouldYouLikeToRestoreBackup": "Willst du das Backup '{name}' wiederherstellen?", "Age": "Alter", "LastExecution": "Letzte Ausführung", "Manual": "Manuell", @@ -757,7 +757,7 @@ "Custom": "Benutzerdefiniert", "Error": "Fehler", "Location": "Speicherort", - "MediaManagement": "Medien", + "MediaManagement": "Medienverwaltung", "Ok": "OK", "RestoreBackupAdditionalInfo": "Hinweis: Während der wiederherstellung wird {appName} automatisch neugestartet und die Oberfläche neugelade.", "SelectFolder": "Ordner auswählen", @@ -803,7 +803,7 @@ "Playlist": "Playlist", "QualitiesHelpText": "Qualitätsprofile oben sind mehr bevorzugt, auch wenn diese nicht angehakt sind. Profile in einer Gruppe sind gleichgestellt. Nur ausgewählte werden gesucht", "SearchForAllCutoffUnmetAlbums": "Suche nach allen abgeschnittenen unerfüllten Büchern", - "ShouldMonitorExistingHelpText": "Bücher in dieser Liste welche bereits in {appName} sind überwachen", + "ShouldMonitorExistingHelpText": "Automatisches Beobachten von Alben auf dieser Liste, die sich bereits in {appName} befinden", "ShouldSearch": "Suche nach neuen Einträgen", "Theme": "Design", "ThemeHelpText": "Anwendungsdesign ändern, das 'Auto' Design passt sich an den Light/Dark-Mode deines Systems an. Inspiriert von Theme.Park", @@ -823,8 +823,8 @@ "CustomFormatRequiredHelpText": "Diese {0} Bedingungen müsen zutreffen damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.", "CustomFormatSettings": "Einstellungen für eigene Formate", "DeleteCustomFormat": "Eigenes Format löschen", - "DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?", - "DeleteFormatMessageText": "Bist du sicher, dass du das Formatierungstag {0} löschen willst?", + "DeleteCustomFormatMessageText": "Bist du sicher, dass du das benutzerdefinierte Format '{name}' wirklich löschen willst?", + "DeleteFormatMessageText": "Bist du sicher, dass du das Formatierungstag '{name}' wirklich löschen willst?", "DownloadPropersAndRepacksHelpTextWarning": "Benutze eigene Formate um automatisch auf Proper oder Repack releases zu upgraden", "DownloadedUnableToImportCheckLogsForDetails": "Heruntergeladen - Aber Import nicht möglich: Schaue in die Logs für mehr Details", "ExportCustomFormat": "Eigenes Format exportieren", @@ -847,7 +847,7 @@ "SpecificMonitoringOptionHelpText": "Autoren überwachen aber nur Bücher überwachen, welche explizit in der Liste miteinbezogen wurden", "CustomFormats": "Eigene Formate", "Customformat": "Eigenes Format", - "CutoffFormatScoreHelpText": "Sobald diese eigener Format Bewertung erreicht wird, werden keine neuen Releases erfasst", + "CutoffFormatScoreHelpText": "Sobald dieser Wert für das benutzerdefinierte Format erreicht wird, werden keine neuen Releases mehr abgerufen", "IncludeCustomFormatWhenRenamingHelpText": "In {Custom Formats} umbennenungs Format", "HiddenClickToShow": "Versteckt, klicken zum anzeigen", "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.", @@ -872,7 +872,7 @@ "ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}", "ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}", "ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}", - "RecycleBinUnableToWriteHealthCheck": "Schreiben in konfigurierten Papierkorbordner nicht möglich: {0}. Stelle sicher, dass dieser Pfad existiert und von dem Benutzer, der {appName} ausführt, beschreibbar ist", + "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.", "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.", @@ -916,7 +916,7 @@ "ListWillRefreshEveryInterp": "Liste wird alle [0] aktualisiert", "ApplyChanges": "Änderungen anwenden", "AutomaticAdd": "Automatisch hinzufügen", - "DeleteSelectedDownloadClients": "Lösche Download Client(s)", + "DeleteSelectedDownloadClients": "Lösche ausgewählte(n) Download Client(s)", "DeleteSelectedIndexers": "Lösche Indexer", "DeleteSelectedImportLists": "Lösche Einspiel Liste", "EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten", @@ -974,7 +974,31 @@ "BlocklistOnly": "Nur der Sperrliste hinzufügen", "BlocklistOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternative zu suchen", "ChangeCategory": "Kategorie wechseln", - "AutoTaggingNegateHelpText": "Falls aktiviert wird das eigene Format nicht angewendet solange diese {0} Bedingung zutrifft.", + "AutoTaggingNegateHelpText": "Falls aktiviert wird die Auto Tagging Regel nicht angewendet, solange diese Bedingung {implementationName} zutrifft.", "Clone": "Klonen", - "AutoTaggingRequiredHelpText": "Diese {0} Bedingungen müssen erfüllt sein, damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer." + "AutoTaggingRequiredHelpText": "Diese {0} Bedingungen müssen erfüllt sein, damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.", + "AddImportListExclusionAlbumHelpText": "Verhindert, dass ein Album über Importlisten zu {appName} hinzugefügt wird", + "ApplyTagsHelpTextAdd": "Hinzufügen: Füge Tags zu den bestehenden Tags hinzu", + "ApplyTagsHelpTextRemove": "Entfernen: Entferne die hinterlegten Tags", + "ApplyTagsHelpTextReplace": "Ersetzen: Ersetze die Tags mit den eingegebenen Tags (keine Tags eingeben um alle Tags zu löschen)", + "ArtistMonitoring": "Künstler beobachten", + "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total: {totalTrackCount}, Lädt herunter: {downloadingCount})", + "ApplyTagsHelpTextHowToApplyDownloadClients": "Wie Tags zu den selektierten Downloadclients hinzugefügt werden können", + "ApplyTagsHelpTextHowToApplyArtists": "Wie Tags zu den selektierten Künstlern hinzugefügt werden können", + "AllResultsAreHiddenByTheAppliedFilter": "Alle Resultate werden wegen des angewandten Filters nicht angezeigt", + "AddListExclusionHelpText": "Verhindert, dass Künstler über Listen zu {appName} hinzugefügt werden", + "AlbumDetails": "Album Details", + "AlbumCount": "Anzahl Alben", + "ArtistIsMonitored": "Künstler wird beobachtet", + "ArtistIsUnmonitored": "Künstler wird nicht beobachtet", + "ArtistsEditRootFolderHelpText": "Das Verschieben von Interpreten in denselben Root-Ordner kann dazu verwendet werden, Interpretenordner umzubenennen, um sie an den aktualisierten Namen oder das neue Namensformat anzugleichen.", + "AlbumsLoadError": "Laden der Alben nicht möglich", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} Titel heruntergeladen", + "AlbumStudioTruncated": "Nur die letzten 20 Alben werden angezeigt, wähle Details, um alle Alben zu sehen", + "AddImportListExclusionArtistHelpText": "Verhindert, dass ein Künstler über Importlisten zu {appName} hinzugefügt wird", + "ArtistIndexFooterDownloading": "Lädt herunter", + "AddToDownloadQueue": "Zur Download Warteschlange hinzufügen", + "AddedToDownloadQueue": "Zur Download Warteschlange hinzugefügt", + "ApplyTagsHelpTextHowToApplyImportLists": "Wie Tags den selektierten Importlisten hinzugefügt werden können", + "ApplyTagsHelpTextHowToApplyIndexers": "Wie Tags zu den selektierten Indexern hinzugefügt werden können" } diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index e15248ddc..bf41b4b4f 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -45,11 +45,11 @@ "Filename": "Nombre de archivo", "FileNames": "Nombres de archivos", "Files": "Archivos", - "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información individual de los gestores de descarga, haz clic en los botones de información.", + "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información en los clientes de descarga individuales, pulsa en los botones Más información.", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Para más información individual sobre las listas de importación, haz clic en los botones de información.", "IgnoredHelpText": "Este lanzamiento será rechazado si contiene uno ó más de estos términos (mayúsculas ó minúsculas)", "IllRestartLater": "Lo reiniciaré más tarde", - "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.", + "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "{appName} soporta cualquier indexador que utilice el estándar Newznab, así como los otros indexadores listados debajo.", "LidarrTags": "Etiquetas de {appName}", "Local": "Local", "LocalPath": "Ruta Local", @@ -65,7 +65,7 @@ "MarkAsFailedMessageText": "Seguro que quieres marcar '{0}' como fallida?", "MaximumLimits": "Límites máximos", "MaximumSize": "Tamaño máximo", - "MaximumSizeHelpText": "Tamaño máximo de un lanzamiento para ser importado en MB. Ajustar a cero para ilimitado", + "MaximumSizeHelpText": "Tamaño máximo para que un lanzamiento sea capturado en MB. Establecer a cero para establecerlo a ilimitado.", "Mechanism": "Mecanismo", "MediaInfo": "Información de medios", "MetadataSettings": "Opciones de metadatos", @@ -75,7 +75,7 @@ "MinimumLimits": "Límites mínimos", "Missing": "Faltantes", "MustNotContain": "No debe contener", - "NoHistory": "Sin historia", + "NoHistory": "Sin historial.", "NoLeaveIt": "No, déjalo", "NoLogFiles": "No hay archivos de registro", "OpenBrowserOnStart": "Abrir navegador al inicio", @@ -181,8 +181,8 @@ "Style": "Estilo", "SuccessMyWorkIsDoneNoFilesToRename": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.", "SuccessMyWorkIsDoneNoFilesToRetag": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.", - "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer", - "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Buscar no está soportado por este indexer", + "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "No se soporta RSS con este indexador", + "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "No se soporta la búsqueda con este indexador", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por {appName}", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Se usará cuando se utilice la búsqueda interactiva", "TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada", @@ -192,7 +192,7 @@ "TestAllClients": "Probar todos los clientes", "TestAllIndexers": "Probar todos los indexadores", "TestAllLists": "Probar todas las listas", - "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexers, por favor sigue las reglas de los mismos", + "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexadores, por favor sigue las reglas de los mismos", "Time": "Tiempo", "TimeFormat": "Formato de hora", "TorrentDelay": "Retraso de torrent", @@ -203,7 +203,7 @@ "UiSettings": "Opciones de interfaz", "UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.", "UnableToAddANewImportListExclusionPleaseTryAgain": "No se ha podido añadir una nueva lista de exclusión, prueba otra vez.", - "UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.", + "UnableToAddANewIndexerPleaseTryAgain": "No se pudo añadir un nuevo indexador, por favor inténtalo de nuevo.", "UnableToAddANewListPleaseTryAgain": "No se ha podido añadir una nueva lista, prueba otra vez.", "UnableToAddANewMetadataProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.", "UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.", @@ -214,9 +214,9 @@ "UnableToLoadDownloadClientOptions": "No se han podido cargar las opciones del gestor de descargas", "UnableToLoadDownloadClients": "No se puden cargar los gestores de descargas", "UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales", - "UnableToLoadHistory": "No se ha podido cargar la historia", + "UnableToLoadHistory": "No se ha podido cargar el historial.", "UnableToLoadImportListExclusions": "No se pueden cargas las Excluidas de la Lista", - "UnableToLoadIndexerOptions": "No se han podido cargar las opciones del indexer", + "UnableToLoadIndexerOptions": "No se pudo cargar las opciones del indexador", "UnableToLoadIndexers": "No se pueden cargar los indexadores", "UnableToLoadLists": "No se pueden cargar las Listas", "UnableToLoadMediaManagementSettings": "No se han podido cargar los ajustes de Manipulación multimedia", @@ -235,15 +235,15 @@ "UnableToLoadUISettings": "No se han podido cargar los ajustes de UI", "Ungroup": "Sin agrupar", "Unmonitored": "Sin monitorizar", - "UnmonitoredHelpText": "Incluir las peliculas no monitoreadas en el feed de iCal", + "UnmonitoredHelpText": "Incluir los álbumes no monitorizados en el canal de iCal", "UpdateAll": "Actualizar todo", "UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones", - "UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script", + "UpdateMechanismHelpText": "Usar el actualizador integrado de {appName} o un script", "Updates": "Actualizaciones", "UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización", "UpgradeAllowedHelpText": "Si está desactivado las calidades no serán actualizadas", "Uptime": "Tiempo de actividad", - "URLBase": "URL Base", + "URLBase": "URL base", "UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío", "UrlBaseHelpTextWarning": "Requiere reiniciar para que surta efecto", "UseHardlinksInsteadOfCopy": "Utilizar enlaces directos en lugar de copiar", @@ -291,7 +291,7 @@ "About": "Acerca de", "Actions": "Acciones", "AddingTag": "Añadir etiqueta", - "AddListExclusion": "Agregar Lista de Exclusión", + "AddListExclusion": "Añadir lista de exclusión", "APIKey": "Clave API", "ApiKeyHelpTextWarning": "Requiere reiniciar para que surta efecto", "AppDataDirectory": "Directorio AppData", @@ -311,7 +311,7 @@ "ClickToChangeQuality": "Clic para cambiar la calidad", "Columns": "Columnas", "Component": "Componente", - "CopyUsingHardlinksHelpText": "Usar Hardlinks para importar torrents a la carpeta del artista sin ocupar espacio extra en disco ni copiar todo el contenido del archivo. Los enlaces duros sólo funcionarán si el origen y el destino están en el mismo volumen.", + "CopyUsingHardlinksHelpText": "Los enlaces duros permiten a {appName} importar torrents sembrados a la carpeta del artista sin ocupar espacio adicional en disco o copiar todo el contenido del archivo. Los enlaces duros sólo funcionarán si el origen y el destino están en el mismo volumen", "CreateEmptyArtistFolders": "Crear carpetas de películas vacías", "CreateEmptyArtistFoldersHelpText": "Crear carpetas de películas que faltan durante la exploración del disco", "CreateGroup": "Crear grupo", @@ -325,16 +325,16 @@ "DeleteImportListExclusion": "Eliminar exclusión de listas de importación", "DeleteImportListExclusionMessageText": "¿Está seguro de que desea eliminar esta exclusión de la lista de importación?", "DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?", - "DeleteIndexer": "Borrar Indexer", - "DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?", + "DeleteIndexer": "Borrar indexador", + "DeleteIndexerMessageText": "¿Estás seguro que quieres eliminar el indexador '{name}'?", "DeleteMetadataProfileMessageText": "¿Seguro que quieres eliminar el perfil de metadatos '{name}'?", "DeleteNotification": "Borrar Notificacion", "DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?", "DeleteQualityProfile": "Borrar perfil de calidad", "DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?", - "DeleteReleaseProfile": "Borrar perfil de estreno", - "DeleteReleaseProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?", - "DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{0}'?", + "DeleteReleaseProfile": "Eliminar perfil de lanzamiento", + "DeleteReleaseProfileMessageText": "¿Estás seguro que quieres eliminar este perfil de lanzamiento?", + "DeleteRootFolderMessageText": "¿Estás seguro que quieres eliminar la carpeta raíz '{name}'?", "DeleteSelectedTrackFiles": "Borrar Archivos Seleccionados", "DeleteSelectedTrackFilesMessageText": "Seguro que quieres eliminar el archivo de la película seleccionada?", "DeleteTag": "Eliminar Etiqueta", @@ -359,7 +359,7 @@ "Fixed": "Arreglado", "Folder": "Carpeta", "Folders": "Carpetas", - "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para más información individual sobre los indexers, haz clic en los botones de información.", + "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para obtener más información sobre indexadores individuales, pulsa en los botones de información.", "GeneralSettings": "Opciones generales", "Global": "Global", "GoToInterp": "Ir a {0}", @@ -373,7 +373,7 @@ "Host": "Host", "HostHelpText": "El mismo host especificado para el Gestor de Descargas remoto", "Hostname": "Nombre de host", - "ICalFeed": "Feed de iCal", + "ICalFeed": "Canal de iCal", "ICalHttpUrlHelpText": "Copia esta URL a tu gestor(es) o haz click en subscribir si tu navegador soporta webcal", "ICalLink": "Enlace de iCal", "IconForCutoffUnmet": "Icono para Umbrales no alcanzados", @@ -389,7 +389,7 @@ "Indexer": "Indexador", "IndexerPriority": "Prioridad del indexador", "Indexers": "Indexadores", - "IndexerSettings": "Ajustes de Indexador", + "IndexerSettings": "Opciones del indexador", "InteractiveSearch": "Búsqueda Interactiva", "Interval": "Intervalo", "IsCutoffCutoff": "Corte", @@ -397,7 +397,7 @@ "IsTagUsedCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso", "LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de {appName} al arrancar la app.", "Level": "Nivel", - "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Raddar soporta cualquier gestor de descargas que utilice el estandar Newznab, como también los clientes indicados debajo.", + "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "{appName} soporta muchos clientes de descarga populares de torrent y usenet.", "Logs": "Registros", "MediaManagementSettings": "Opciones de gestión de medios", "Medium": "Mediano", @@ -426,7 +426,7 @@ "SslCertPasswordHelpText": "Contraseña para el archivo pfx", "SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto", "TotalFileSize": "Tamaño total de archivo", - "Track": "Rastro", + "Track": "Pista", "Tracks": "Rastro", "Type": "Tipo", "UsenetDelay": "Retraso de usenet", @@ -440,7 +440,7 @@ "YesCancel": "Sí, Cancelar", "20MinutesTwenty": "20 Minutos: {0}", "Automatic": "Automático", - "DelayingDownloadUntil": "Retrasar descarga hasta {0} en {1}", + "DelayingDownloadUntil": "Retrasar la descarga hasta el {date} a las {time}", "Docker": "Docker", "AddMissing": "Añadir faltantes", "AddNewItem": "Añadir nuevo item", @@ -458,7 +458,7 @@ "OnHealthIssue": "Al haber un problema de salud", "MetadataProfile": "perfil de metadatos", "MetadataProfiles": "perfil de metadatos", - "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API", + "UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación que llamó a la API", "OnUpgrade": "Al actualizar", "DeleteTrackFileMessageText": "¿Seguro que quieres eliminar {0}?", "Label": "Etiqueta", @@ -509,7 +509,7 @@ "Ignored": "Ignorado", "Import": "Importar", "IndexerDownloadClientHelpText": "Especifica qué cliente de descarga es usado para capturas desde este indexador", - "IndexerTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.", + "IndexerTagHelpText": "Utilizar este indexador solo para artistas con al menos una etiqueta coincidente. Dejar en blanco para utilizarlo con todos los artistas.", "InstanceName": "Nombre de la Instancia", "InstanceNameHelpText": "Nombre de la instancia en la pestaña y para la aplicación Syslog", "LastDuration": "Última Duración", @@ -552,7 +552,7 @@ "TimeLeft": "Tiempo restante", "Title": "Título", "TotalSpace": "Espacio Total", - "Ui": "UI", + "Ui": "Interfaz", "UnmappedFilesOnly": "Solo archivos sin mapear", "UnmonitoredOnly": "Solo sin monitorizar", "UpgradesAllowed": "Actualizaciones permitidas", @@ -581,25 +581,25 @@ "Database": "Base de datos", "QualitiesHelpText": "Las calidades situadas mas arriba en la lista son las preferidas aunque no estén marcadas. Las calidades del mismo grupo son iguales. Sólo se buscarán las calidades marcadas", "DoneEditingGroups": "Terminado de editar grupos", - "ChooseImportMethod": "Elegir Modo de Importación", - "ClickToChangeReleaseGroup": "Clic para cambiar el grupo de lanzamiento", + "ChooseImportMethod": "Elegir método de importación", + "ClickToChangeReleaseGroup": "Pulsa para cambiar el grupo de lanzamiento", "SelectReleaseGroup": "Seleccionar grupo de lanzamiento", - "BypassIfHighestQuality": "Pasar sí es la calidad más alta", - "CustomFormatScore": "Puntuación de Formato personalizado", + "BypassIfHighestQuality": "Ignorar si es la calidad más alta", + "CustomFormatScore": "Puntuación de formato personalizado", "MinimumCustomFormatScore": "Puntuación mínima de formato personalizado", "PreferredProtocol": "Protocolo preferido", "Conditions": "Condiciones", "CopyToClipboard": "Copiar al portapapeles", "CouldntFindAnyResultsForTerm": "No se pudieron encontrar resultados para '{0}'", - "CustomFormat": "Formatos Personalizados", - "CustomFormatRequiredHelpText": "Esta condición {0} ha de igualar al formato propio para aplicarse. Si no, una sóla {1} es suficiente.", - "CustomFormatSettings": "Ajustes de Formatos Propios", + "CustomFormat": "Formato personalizado", + "CustomFormatRequiredHelpText": "Esta condición {0} debe coincidir con el formato personalizado para aplicarse. De otro modo una coincidencia simple {0} es suficiente.", + "CustomFormatSettings": "Ajustes de formato personalizado", "CustomFormats": "Formatos personalizados", "Customformat": "Formatos Personalizados", "CutoffFormatScoreHelpText": "Una vez alcanzada esta puntuación del formato propio {appName} dejará de descargar películas", - "DeleteCustomFormat": "Eliminar Formato Personalizado", - "DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{name}'?", - "DeleteFormatMessageText": "¿Está seguro de que desea eliminar la etiqueta de formato {0}?", + "DeleteCustomFormat": "Eliminar formato personalizado", + "DeleteCustomFormatMessageText": "¿Estás seguro que quieres eliminar el formato personalizado '{name}'?", + "DeleteFormatMessageText": "¿Estás seguro que quieres eliminar la etiqueta de formato '{name}'?", "DownloadPropersAndRepacksHelpTextWarning": "Usar formatos personalizados para actualizaciones automáticas a propers/repacks", "DownloadedUnableToImportCheckLogsForDetails": "Descargado: no se puede importar: verifique los registros para obtener detalles", "ExportCustomFormat": "Exportar formato personalizado", @@ -607,7 +607,7 @@ "FailedLoadingSearchResults": "Error al cargar los resultados de la busqueda, prueba otra vez.", "Formats": "Formatos", "IncludeCustomFormatWhenRenamingHelpText": "Incluir en el formato de renombrado {Formatos Propios}", - "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Es fácil añadir una película nueva, tan solo comienza a escribir el título de la que quieres añadir", + "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Es fácil añadir un artista nuevo, tan solo empieza escribiendo el nombre del artista que quieras añadir.", "MinFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar", "Monitor": "Monitorizar", "NegateHelpText": "Si se activa, el formato propio no se aplicará si esta condición {0} se iguala.", @@ -622,21 +622,21 @@ "PreferUsenet": "Preferir usenet", "UnableToLoadInteractiveSearch": "No se pueden cargar los resultados de esta búsqueda de películas. Vuelve a intentarlo más tarde", "EnableRssHelpText": "Se usará cuando {appName} busque periódicamente lanzamientos vía Sincronización RSS", - "HiddenClickToShow": "Oculto, click para mostrar", + "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.", - "DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores", - "DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}", + "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", "ImportListStatusCheckSingleClientMessage": "Listas no disponibles debido a errores: {0}", "ImportMechanismHealthCheckMessage": "Activar Manipulación de Descargas Completadas", "IndexerJackettAll": "Indexadores que utilizan el Endpoint Jackett 'all' no están soportados: {0}", - "IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas", - "IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}", - "IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexers capaces de RSS están temporalmente desactivados debido a errores recientes con el indexer", - "IndexerRssHealthCheckNoIndexers": "No hay indexers disponibles con sincronización RSS activada, {appName} no capturará nuevos estrenos automáticamente", - "IndexerSearchCheckNoAutomaticMessage": "No hay indexers con Búsqueda Automática disponibles, {appName} no dará ningún resultado de búsquedas automáticas", - "IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexers están temporalmente inactivos debido a errores recientes con ellos", + "IndexerLongTermStatusCheckAllClientMessage": "Ningún indexador está disponible debido a errores durante más de 6 horas", + "IndexerLongTermStatusCheckSingleClientMessage": "Ningún indexador disponible debido a errores durante más de 6 horas: {0}", + "IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexadores con capacidad de RSS no están disponibles temporalmente debido a errores recientes con el indexador", + "IndexerRssHealthCheckNoIndexers": "No hay indexadores disponibles con sincronización RSS habilitada, {appName} no capturará nuevos lanzamientos automáticamente", + "IndexerSearchCheckNoAutomaticMessage": "No hay indexadores disponibles con búsqueda automática habilitada, {appName} no proporcionará ningún resultado para búsqueda automática", + "IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexadores con capacidad de búsqueda no están disponibles temporalmente debido a errores recientes de indexador", "IndexerSearchCheckNoInteractiveMessage": "No hay indexadores disponibles con la búsqueda interactiva activada, {appName} no proporcionará ningún resultado con la búsqueda interactiva", "IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores", "ProxyCheckBadRequestMessage": "Fallo al comprobar el proxy. StatusCode: {0}", @@ -661,8 +661,8 @@ "UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".", "ShownClickToHide": "Mostrado, haz clic para ocultar", "AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar", - "DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible", - "DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.", + "DownloadClientCheckNoneAvailableMessage": "Ningún cliente de descarga disponible", + "DownloadClientCheckUnableToCommunicateMessage": "No se pudo comunicar con {0}.", "IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {0}", "MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ", "RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero {appName} no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.", @@ -677,13 +677,13 @@ "BlocklistReleaseHelpText": "Evita que {appName} vuelva a capturar esta película automáticamente", "FailedToLoadQueue": "No se pudo cargar la cola", "BlocklistReleases": "Lista de bloqueos de lanzamientos", - "DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?", + "DeleteConditionMessageText": "¿Estás seguro que quieres eliminar la condición '{name}'?", "Negated": "Anulado", "Required": "Solicitado", "ResetQualityDefinitions": "Restablecer definiciones de calidad", "DownloadClientSortingCheckMessage": "El cliente de descarga {0} tiene activada la clasificación {1} para la categoría de {appName}. Debe desactivar la clasificación en su cliente de descarga para evitar problemas de importación.", "DeleteSelectedDownloadClients": "Borrar Cliente(s) de Descarga Seleccionado(s)", - "DeleteSelectedIndexers": "Borrar indexer(s)", + "DeleteSelectedIndexers": "Borrar indexador(es)", "No": "No", "NoChange": "Sin cambio", "QueueIsEmpty": "La cola está vacía", @@ -706,9 +706,9 @@ "ApplyTagsHelpTextHowToApplyArtists": "Cómo añadir etiquetas a las películas seleccionadas", "ApplyTagsHelpTextHowToApplyImportLists": "Cómo añadir etiquetas a las listas de importación seleccionadas", "ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados", - "DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?", - "DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?", - "DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?", + "DeleteSelectedDownloadClientsMessageText": "¿Estás seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?", + "DeleteSelectedImportListsMessageText": "¿Estás seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?", + "DeleteSelectedIndexersMessageText": "¿Estás seguro que quieres eliminar {count} indexador(es) seleccionado(s)?", "ApplyTagsHelpTextHowToApplyDownloadClients": "Cómo añadir etiquetas a los clientes de descargas seleccionados", "SuggestTranslationChange": "Sugerir un cambio en la traducción", "UpdateSelected": "Actualizar seleccionados", @@ -730,7 +730,7 @@ "ListRefreshInterval": "Intervalo de Refresco de Lista", "ListWillRefreshEveryInterp": "La lista será refrescada cada {0}", "AutomaticAdd": "Añadir Automáticamente", - "CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)", + "CountDownloadClientsSelected": "{selectedCount} cliente(s) de descarga seleccionado(s)", "DeleteSelectedImportLists": "Eliminar Lista(s) de Importación", "Episode": "Episodio", "ManageImportLists": "Gestionar Listas de Importación", @@ -738,32 +738,32 @@ "ManageLists": "Gestionar Listas", "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", "ApplicationURL": "URL de la aplicación", - "CountImportListsSelected": "{0} lista(s) de importación seleccionada(s)", - "CountIndexersSelected": "{0} indexador(es) seleccionado(s)", + "CountImportListsSelected": "{selectedCount} lista(s) de importación seleccionada(s)", + "CountIndexersSelected": "{selectedCount} indexador(es) seleccionado(s)", "ManageDownloadClients": "Gestionar Clientes de Descarga", - "AddReleaseProfile": "Añadir Perfil de Lanzamiento", + "AddReleaseProfile": "Añadir perfil de lanzamiento", "DeleteRootFolder": "Eliminar Carpeta Raíz", "ImportListRootFolderMissingRootHealthCheckMessage": "Falta la capeta raíz para las listas: {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Múltiples carpetas raíz faltan para las listas de importación: {0}", - "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.", + "ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y tendrá que ser recargado para restaurar su funcionalidad.", "NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}", "AppUpdated": "{appName} Actualizado", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}", "ConnectionLost": "Conexión perdida", - "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.", + "ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puedes pulsar en recargar abajo.", "AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros", - "AllowFingerprintingHelpTextWarning": "Esto requiere que Readarr lea partes del archivo, lo que ralentizará los escaneos y puede provocar una alta actividad en el disco o en la red.", + "AllowFingerprintingHelpTextWarning": "Esto requiere que {appName} lea partes del archivo, lo que ralentizará los escaneos y puede provocar una alta actividad en el disco o en la red.", "ReleaseProfiles": "Perfiles de lanzamiento", - "AnyReleaseOkHelpText": "Readarrcambiará automáticamente a la versión que mejor coincida con las pistas descargadas", - "CatalogNumber": "número de catálogo", - "WhatsNew": "Que es lo nuevo?", + "AnyReleaseOkHelpText": "{appName} cambiará automáticamente a la versión que mejor coincida con las pistas descargadas", + "CatalogNumber": "Número de catálogo", + "WhatsNew": "¿Qué hay nuevo?", "Discography": "discografía", "ArtistNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)", "Artists": "artista", - "DeleteImportList": "Eliminar Lista(s) de Importación", + "DeleteImportList": "Eliminar lista de importación", "Artist": "Artista", "ArtistFolderFormat": "Formato de Carpeta de Autor", - "BackupIntervalHelpText": "Intervalo para respaldar la base de datos y configuraciones de Readarr", + "BackupIntervalHelpText": "Intervalo para respaldar la base de datos y configuraciones de {appName}", "CloneCondition": "Clonar Condición", "EditConnectionImplementation": "Editar Conexión - {implementationName}", "Enabled": "Habilitado", @@ -773,7 +773,7 @@ "WriteMetadataToAudioFiles": "Escribir metadatos en archivos de audio", "ExpandAlbumByDefaultHelpText": "álbum", "AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no son compatibles directamente al usar el mecanismo de actualización de Docker. Deberás actualizar la imagen del contenedor fuera de {appName} o utilizar un script", - "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos", + "NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a errores", "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} libros descargados", "AddConnectionImplementation": "Añadir Conexión - {implementationName}", "AddImportList": "Añadir Lista de Importación", @@ -784,7 +784,7 @@ "EditReleaseProfile": "Editar perfil de lanzamiento", "Absolute": "Absoluto", "AddNewArtistRootFolderHelpText": "La subcarpeta '{folder}' será creada automáticamente", - "AddConditionImplementation": "Agregar Condición - { implementationName}", + "AddConditionImplementation": "Añadir condición - {implementationName}", "EditIndexerImplementation": "Editar Indexador - {implementationName}", "AddImportListImplementation": "Añadir lista de importación - {implementationName}", "DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales", @@ -797,7 +797,7 @@ "CloneCustomFormat": "Clonar formato personalizado", "CloneProfile": "Clonar Perfil", "Close": "Cerrar", - "CloneIndexer": "Clonar Indexer", + "CloneIndexer": "Clonar indexador", "CompletedDownloadHandling": "Manipulación de descargas completas", "ColonReplacement": "Reemplazar dos puntos", "ClearBlocklistMessageText": "¿Estás seguro de que quieres borrar todos los elementos de la lista de bloqueos?", @@ -828,7 +828,7 @@ "AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.", "Auto": "Auto", "AutoTagging": "Etiquetado Automático", - "DeleteSpecification": "Borrar especificacion", + "DeleteSpecification": "Eliminar especificación", "EditAutoTag": "Editar Etiquetado Automático", "EditDownloadClientImplementation": "Editar Cliente de Descarga - {implementationName}", "EditImportListImplementation": "Añadir lista de importación - {implementationName}", @@ -847,12 +847,12 @@ "DeleteAutoTagHelpText": "¿Está seguro de querer eliminar el etiquetado automático '{name}'?", "AddNewArtistSearchForMissingAlbums": "Empezar a buscar por película ausente", "AutoTaggingLoadError": "No se pudo cargar el etiquetado automático", - "BypassIfAboveCustomFormatScore": "Omitir si está por encima de la puntuación del formato personalizado", + "BypassIfAboveCustomFormatScore": "Ignorar si está por encima de la puntuación del formato personalizado", "BypassIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado", "BypassIfHighestQualityHelpText": "Evitar el retardo cuando el lanzamiento tiene habilitada la máxima calidad en el perfil de calidad con el protocolo preferido", "CloneAutoTag": "Clonar Etiquetado Automático", - "ConditionUsingRegularExpressions": "Esta condición coincide con el uso de expresiones regulares. Tenga en cuenta que los caracteres `\\^$.|?*+()[{` tienen significados especiales y deben escaparse con un `\\`", - "DeleteSpecificationHelpText": "Esta seguro que desea borrar la especificacion '{name}'?", + "ConditionUsingRegularExpressions": "Esta condición coincide usando expresiones regulares. Ten en cuenta que los caracteres `\\^$.|?*+()[{` tienen significados especiales y necesitan ser escapados con un `\\`", + "DeleteSpecificationHelpText": "¿Estás seguro que quieres eliminar la especificación '{name}'?", "PosterOptions": "Opciones de póster", "EnableProfile": "Habilitar perfil", "AddNewAlbum": "Añadir nuevo álbum", @@ -865,7 +865,7 @@ "InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración", "HealthMessagesInfoBox": "Puede encontrar más información sobre la causa de estos mensajes de comprobación de salud haciendo clic en el enlace wiki (icono de libro) al final de la fila, o comprobando sus [logs]({link}). Si tienes dificultades para interpretar estos mensajes, puedes ponerte en contacto con nuestro servicio de asistencia en los enlaces que aparecen a continuación.", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)", - "ChownGroup": "Cambiar grupo propietario", + "ChownGroup": "chown grupo", "NoLimitForAnyDuration": "SIn límite para el tiempo de ejecución", "NoMinimumForAnyDuration": "Sin mínimo para el tiempo de ejecución", "PreferredSize": "Tamaño preferido", @@ -878,7 +878,7 @@ "ExtraFileExtensionsHelpTextsExamples": "Ejemplos: '.sub, .nfo' o 'sub,nfo'", "TBA": "Por determinar", "DeleteArtistFoldersHelpText": "Eliminar la carpeta de películas y su contenido", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} esta configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas del cliente antes que {1} las pueda importar.", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} está configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas de tu cliente antes de que {1} pueda importarlas.", "DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada", "DownloadClientPriorityHelpText": "Prioridad del cliente de descarga desde 1 (la más alta) hasta 50 (la más baja). Por defecto: 1. Se usa Round-Robin para clientes con la misma prioridad.", "AutomaticallySwitchRelease": "Desbloqueo automático", @@ -920,7 +920,7 @@ "AddNewAlbumSearchForNewAlbum": "Iniciar búsqueda de nuevo álbum", "AlbumIsNotMonitored": "Álbum no Monitorizado", "AlbumRelease": "Lanzamiento del álbum", - "AlbumStudioTracksDownloaded": "pistas descargadas", + "AlbumStudioTracksDownloaded": "{trackFileCount}/{totalTrackCount} pistas descargadas", "AllAlbums": "Todos los álbumes", "AllArtistAlbums": "Todos los álbumes de artistas", "ArtistsEditRootFolderHelpText": "Mover artistas a la misma carpeta raíz se puede utilizar para cambiar el nombre de las carpetas de artistas para que coincida con el nombre actualizado o el formato de nomenclatura", @@ -929,7 +929,7 @@ "AutoRedownloadFailed": "Descarga fallida", "AutoRedownloadFailedFromInteractiveSearch": "Fallo al volver a descargar desde la búsqueda interactiva", "ContinuingMoreAlbumsAreExpected": "Se esperan más álbumes", - "CountAlbums": "álbumes", + "CountAlbums": "{albumCount} álbumes", "CustomFormatsSpecificationRegularExpressionHelpText": "El formato personalizado RegEx no distingue mayúsculas de minúsculas", "Deceased": "Fallecido", "ErrorLoadingContent": "Hubo un error cargando este contenido", @@ -961,7 +961,7 @@ "Logout": "Cerrar Sesión", "Lowercase": "Minúscula", "IndexersSettingsSummary": "Indexadores y opciones de indexación", - "Dash": "Guión", + "Dash": "Guion", "DefaultCase": "Caso predeterminado", "DeleteEmptyFoldersHelpText": "Eliminar carpetas vacías de series y temporadas durante el escaneo del disco y cuando se eliminen archivos correspondientes a episodios", "DeleteSelectedArtists": "Borrar artista seleccionado", @@ -984,7 +984,7 @@ "DownloadClientsSettingsSummary": "Clientes de descarga, manejo de descarga y mapeo de rutas remotas", "EnabledHelpText": "Señalar para habilitar el perfil de lanzamiento", "GeneralSettingsSummary": "Puerto, SSL, usuario/contraseña, proxy, analíticas y actualizaciones", - "ImportListsSettingsSummary": "Listas de importación, excluidas de la lista", + "ImportListsSettingsSummary": "Importar desde otra instancia de {appName} o listas de Trakt y gestionar exclusiones de lista", "QualitySettingsSummary": "Tamaños de calidad y nombrado", "TagsSettingsSummary": "Vea todas las etiquetas y cómo se usan. Las etiquetas sin usar pueden ser eliminadas", "UiSettingsSummary": "Opciones de calendario, fecha y color alterado", @@ -996,7 +996,7 @@ "Donate": "Donar", "MassSearchCancelWarning": "Esto no puede ser cancelado una vez empiece sin reiniciar {appName} o deshabilitar todos tus indexadores.", "MediaManagementSettingsSummary": "Nombrado, opciones de gestión de archivos y carpetas raíz", - "CustomFilter": "Filtros personalizados", + "CustomFilter": "Filtro personalizado", "LabelIsRequired": "Se requiere etiqueta", "Monitoring": "Monitorizando", "MonitoringOptions": "Opciones de monitorización", @@ -1056,5 +1056,232 @@ "NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", "NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')", "Menu": "Menú", - "CustomFormatsSettingsTriggerInfo": "Un formato personalizado será aplicado al lanzamiento o archivo cuando coincida con al menos uno de los diferentes tipos de condición elegidos." + "CustomFormatsSettingsTriggerInfo": "Un formato personalizado será aplicado al lanzamiento o archivo cuando coincida con al menos uno de los diferentes tipos de condición elegidos.", + "DeleteSelected": "Eliminar seleccionados", + "ImportListSettings": "Opciones generales de lista de importación", + "ImportListSpecificSettings": "Opciones específicas de lista de importación", + "OnImportFailure": "En fallo de importación", + "PastDaysHelpText": "Días para que el canal de iCal busque en el pasado", + "UnableToLoadMetadataProviderSettings": "No se pudo cargar las opciones del proveedor de metadatos", + "UnmappedFiles": "Archivos sin mapear", + "TrackTitle": "Título de pista", + "WriteMetadataTags": "Escribir etiquetas de metadatos", + "FutureDays": "Días futuros", + "IsExpandedHideFileInfo": "Esconder información de archivo", + "RegularExpressionsCanBeTested": "Las expresiones regulares pueden ser probadas [aquí](http://regexstorm.net/tester).", + "WatchRootFoldersForFileChanges": "Supervisar las carpetas raíz para cambios de archivos", + "DeleteMetadataProfile": "Eliminar el perfil de metadatos", + "IndexerIdHelpTextWarning": "Usar un indexador específico con palabras preferidas puede provocar que se capturen lanzamientos duplicados", + "OnReleaseImport": "En importación de lanzamiento", + "FutureDaysHelpText": "Días para que el canal de iCal busque en el futuro", + "ManualDownload": "Descarga manual", + "PastDays": "Días pasados", + "WatchLibraryForChangesHelpText": "Vuelve a escanear automáticamente cuando los archivos cambien en una carpeta raíz", + "MetadataConsumers": "Consumidores de metadatos", + "MusicbrainzId": "ID de MusicBrainz", + "MusicBrainzReleaseID": "ID de lanzamiento de MusicBrainz", + "MusicBrainzRecordingID": "ID de grabación de MusicBrainz", + "MusicBrainzTrackID": "ID de pista de MusicBrainz", + "ShowName": "Mostrar nombre", + "UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Actualizar se encuentra deshabilitado en un contenedor docker. Actualiza la imagen del contenedor en su lugar.", + "AutoTaggingSpecificationTag": "Etiqueta", + "DeleteFormat": "Eliminar formato", + "DownloadPropersAndRepacksHelpTexts2": "Usar 'No preferir' para ordenar por puntuación de palabra preferida sobre propers/repacks", + "ImportFailures": "Importar fallos", + "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} en el título", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente prefija el título del mensaje con {appName} para diferenciar las notificaciones de las diferentes aplicaciones", + "TrackNumber": "Número de pista", + "DiscCount": "Recuento de disco", + "ShouldSearchHelpText": "Buscar indexadores para elementos añadido recientemente. Usar con precaución en listas largas.", + "IsExpandedShowFileInfo": "Mostrar información de archivo", + "PathHelpTextWarning": "Debe ser diferente al directorio donde tu cliente de descarga pone los archivos", + "PreviewRetag": "Vista previa de reetiquetado", + "EntityName": "Nombre de entidad", + "ExistingTagsScrubbed": "Etiquetas existentes borradas", + "RegularExpressionsTutorialLink": "Más detalles de las expresiones regulares pueden ser encontrados [aquí](https://www.regular-expressions.info/tutorial.html).", + "OnDownloadFailure": "En fallo de descarga", + "DiscNumber": "Número de disco", + "EditMetadata": "Editar metadatos", + "MonitorArtist": "Monitorizar artista", + "ClickToChangeIndexerFlags": "Pulsa para cambiar los indicadores del indexador", + "CustomFormatsSpecificationFlag": "Indicador", + "Disambiguation": "Desambiguación", + "EditSelectedArtists": "Editar artistas seleccionados", + "IndexerFlags": "Indicadores del indexador", + "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName} no pudo determinar a qué artista y álbum pertenecía este lanzamiento. {appName} no puede importar automáticamente este lanzamiento. ¿Quieres capturar '{title}'?", + "DeleteTrackFile": "Eliminar archivo de pista", + "LatestAlbumData": "Monitoriza los últimos álbumes y álbumes futuros", + "ExpandSingleByDefaultHelpText": "Sencillos", + "ExpandOtherByDefaultHelpText": "Otros", + "MissingTracksArtistNotMonitored": "Pistas faltantes (Artistas no monitorizados)", + "MonitoredHelpText": "Descarga álbumes monitorizados para este artista", + "EditArtist": "Editar artista", + "EndedAllTracksDownloaded": "Finalizado (Todas las pistas descargadas)", + "GroupInformation": "Información del grupo", + "HideTracks": "Esconder pistas", + "IndexerIdHelpText": "Especifica a qué indexador se aplica el perfil", + "MonitorArtists": "Monitorizar artistas", + "FilterArtistPlaceholder": "Filtrar artista", + "FilterAlbumPlaceholder": "Filtrar álbum", + "MissingAlbumsData": "Monitoriza álbumes que no tienen archivos o que no han sido lanzados aún", + "MissingTracksArtistMonitored": "Pistas faltantes (Artistas monitorizados)", + "DefaultLidarrTags": "Etiquetas predeterminadas de {appName}", + "ExpandItemsByDefault": "Expandir elementos predeterminados", + "DownloadedWaitingToImport": "'Descargados - Esperando para importar'", + "ImportFailed": "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", + "MediaCount": "Recuento de medios", + "MonitorAllAlbums": "Todos los álbumes", + "MonitorExistingAlbums": "Álbumes existentes", + "MonitorNewAlbums": "Nuevos álbumes", + "MonitorFirstAlbum": "Primer álbum", + "DownloadImported": "Descargar importados", + "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "Ningún álbum monitorizado para este artista", + "FirstAlbumData": "Monitoriza los primeros álbumes. El resto de álbumes será ignorado", + "MonitorAlbum": "Monitorizar álbum", + "ForeignIdHelpText": "La ID de MusicBrainz del artista/álbum a excluir", + "DeleteFilesHelpText": "Eliminar los archivos de pista y la carpeta de artista", + "IsExpandedHideAlbums": "Esconder álbumes", + "MonitorNewItems": "Monitorizar nuevos álbumes", + "ForNewImportsOnly": "Solo para nuevas importaciones", + "EmbedCoverArtInAudioFiles": "Arte de cubierta incrustado en archivos de audio", + "EmbedCoverArtHelpText": "Arte de álbum de Lidarr incrustado en los archivos de audio cuando se escriben etiquetas", + "ExistingAlbumsData": "Monitorizar álbumes que tienen archivos o que no han sido lanzados aún", + "MissingAlbums": "Álbumes faltantes", + "ExpandEPByDefaultHelpText": "EPs", + "MonitorAlbumExistingOnlyWarning": "Este es un ajuste único de la configuración monitorizada para cada álbum. Usa la opción debajo de Artista/Editar para controlar qué ocurre en álbumes añadidos recientemente", + "FutureAlbums": "Álbumes futuros", + "MissingTracks": "Pistas faltantes", + "MassAlbumsCutoffUnmetWarning": "¿Estás seguro que quieres buscar todos los álbumes '{0}' que no alcancen el umbral?", + "FutureAlbumsData": "Monitoriza álbumes que no han sido lanzados aún", + "MetadataSettingsArtistSummary": "Crea archivos de metadatos cuando las pistas son importados o los artistas refrescados", + "DefaultTagsHelpText": "Etiquetas predeterminadas de {appName} para artistas en esta carpeta", + "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} soporta múltiples listas para importar álbumes y artistas en la base de datos.", + "ManageTracks": "Gestionar pistas", + "HideAlbums": "Esconder álbumes", + "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "Si no añades una exclusión de lista de importación y el artista tenía un perfil de metadatos distinto a 'Ninguno', entonces este álbum puede ser añadido de nuevo durante el siguiente refresco de artista.", + "DeleteArtistFolder": "Eliminar carpeta de artista", + "DeleteArtistFolders": "Eliminar carpetas de artista", + "IsExpandedShowAlbums": "Mostrar álbumes", + "IsExpandedHideTracks": "Esconder pistas", + "LastAlbum": "Último álbum", + "LatestAlbum": "El último álbum", + "ArtistProgressBarText": "{trackFileCount} / {trackCount} (Total: {totalTrackCount}, Descargando: {downloadingCount})", + "DownloadedImporting": "'Descargados - Importando'", + "ExistingAlbums": "Álbumes existentes", + "ExpandBroadcastByDefaultHelpText": "Emisión", + "FirstAlbum": "Primer álbum", + "ForeignId": "ID foránea", + "Inactive": "Inactivo", + "FormatAgeDay": "día", + "FormatAgeMinute": "minuto", + "FormatAgeDays": "días", + "FormatAgeHour": "hora", + "FormatAgeHours": "horas", + "FormatAgeMinutes": "minutos", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}h", + "FormatRuntimeMinutes": "{minutes}m", + "FormatShortTimeSpanHours": "{hours} hora(s)", + "MonitorLastestAlbum": "El último álbum", + "MonitorMissingAlbums": "Álbumes faltantes", + "MonitorFutureAlbums": "Álbumes futuros", + "MonitorNoAlbums": "Ninguno", + "MonitorNoNewAlbums": "Ningún álbum nuevo", + "FormatShortTimeSpanMinutes": "{minutes} minuto(s)", + "FormatShortTimeSpanSeconds": "{seconds} segundo(s)", + "FormatTimeSpanDays": "{days}d {time}", + "GoToArtistListing": "Ir a listado de artistas", + "IndexerPriorityHelpText": "Prioridad del indexador desde 1 (la más alta) a 50 (la más baja). Predeterminado: 25. Usado para desempatar lanzamientos capturados que, de otra forma, serían iguales. {appName} aún empleará todos los indexadores habilitados para la sincronización RSS y la búsqueda", + "MonitorNewItemsHelpText": "Los nuevos álbumes que deberían ser monitorizados", + "AddToDownloadQueue": "Añadir a la cola de descarga", + "AddedToDownloadQueue": "Añadido a la cola de descarga", + "Retag": "Reetiquetar", + "RetagSelectedArtists": "Reetiquetar artistas seleccionados", + "SelectAlbumRelease": "Seleccionar lanzamiento de álbum", + "SearchForMonitoredAlbums": "Buscar álbumes monitorizados", + "SpecificMonitoringOptionHelpText": "Monitoriza artistas pero solo monitoriza álbumes explícitamente incluidos en la lista", + "TrackFileRenamedTooltip": "Archivo de pista renombrado", + "MusicBrainzArtistID": "ID de artista de MusicBrainz", + "SetIndexerFlags": "Establecer indicadores del indexador", + "SelectIndexerFlags": "Seleccionar indicadores del indexador", + "TagsHelpText": "Los perfiles de lanzamiento se aplicarán a artistas con al menos una etiqueta coincidente. Dejar en blanco para aplicar a todos los artistas", + "MultiDiscTrackFormat": "Formato de pista multi-disco", + "SecondaryAlbumTypes": "Tipos de álbum secundario", + "ShouldMonitorExistingHelpText": "Monitoriza automáticamente los álbumes de esta lista que ya estén en {appName}", + "ShouldSearch": "Buscar elementos nuevos", + "NewAlbums": "Nuevos álbumes", + "PrimaryTypes": "Tipos primarios", + "ShouldMonitorExisting": "Monitorizar álbumes existentes", + "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} pistas totales. {1} pistas con archivos.", + "TrackFileTagsUpdatedTooltip": "Etiquetas de archivo de pista actualizadas", + "TrackFilesLoadError": "No se pudieron cargar los archivos de pista", + "TheAlbumsFilesWillBeDeleted": "Los archivos del álbum serán eliminados.", + "MusicBrainzAlbumID": "ID de álbum de MusicBrainz", + "NextAlbum": "Siguiente álbum", + "ReplaceExistingFiles": "Reemplazar archivos existentes", + "TrackCount": "Recuento de pista", + "TrackFileDeletedTooltip": "Archivo de pista eliminado", + "ShowAlbumCount": "Mostrar recuento del álbum", + "TrackArtist": "Artista de la pista", + "TrackFiles": "Archivos de pista", + "Release": " Lanzamiento", + "Retagged": "Reetiquetados", + "ScrubExistingTags": "Limpiar etiquetas existentes", + "SelectAlbum": "Seleccionar álbum", + "SelectArtist": "Seleccionar artista", + "ShouldMonitorHelpText": "Monitoriza los artistas y álbumes añadidos desde esta lista", + "ShowBannersHelpText": "Muestra carteles en lugar de nombres", + "TagAudioFilesWithMetadata": "Etiquetar archivos de audio con metadatos", + "TrackStatus": "Estado de pista", + "TrackFilesCountMessage": "Sin archivos de pista", + "TrackProgress": "Progreso de pista", + "WriteAudioTagsHelpTextWarning": "Seleccionar 'Todos los archivos' alterará los archivos existentes cuando sean importados.", + "ShowTitleHelpText": "Muestra el nombre del artista debajo del póster", + "TrackImported": "Pista importada", + "OnAlbumDelete": "Al borrar el álbum", + "NotDiscography": "Sin discografía", + "OnArtistAdd": "Al añadir artista", + "SearchAlbum": "Buscar álbum", + "SceneNumberHasntBeenVerifiedYet": "El número de escena no ha sido verificado aún", + "SpecificAlbum": "Álbum específico", + "TrackDownloaded": "Pista descargada", + "TrackNaming": "Nombrado de pista", + "TrackFileMissingTooltip": "Archivo de pista faltante", + "OnTrackRetag": "Al reetiquetar pista", + "SearchBoxPlaceHolder": "p. ej. Breaking Benjamin, lidarr:854a1807-025b-42a8-ba8c-2a3917f1d25", + "SecondaryTypes": "Tipos secundarios", + "ShowLastAlbum": "Mostrar último álbum", + "TrackMissingFromDisk": "Pista faltante en el disco", + "RefreshArtist": "Refrescar artista", + "PathHelpText": "Carpeta raíz que contiene tu biblioteca de música", + "MediumFormat": "Formato del medio", + "MonitoringOptionsHelpText": "Qué álbumes deberían ser monitorizados una vez se añada el artista (ajuste único)", + "OneAlbum": "1 álbum", + "Rejections": "Rechazados", + "SelectTracks": "Seleccionar pistas", + "SetAppTags": "Establecer etiquetas de {appName}", + "ShowNextAlbumHelpText": "Muestra el siguiente álbum debajo del póster", + "SearchForAllMissingAlbumsConfirmationCount": "¿Estás seguro que quieres buscar los {totalRecords} álbumes faltantes?", + "ShowNextAlbum": "Mostrar siguiente álbum", + "MetadataProfileIdHelpText": "Los elementos de la lista del perfil de metadatos que deberían ser añadidos", + "NoneData": "Ningún álbum será monitorizado", + "RenameTracks": "Renombrar pistas", + "NoTracksInThisMedium": "Sin pistas en este medio", + "OnArtistDelete": "Al eliminar artista", + "ProfilesSettingsArtistSummary": "Calidad, metadatos, retraso y perfiles de lanzamiento", + "ScrubAudioTagsHelpText": "Elimina las etiquetas existentes de los archivos, dejando solo aquellas añadidas por {appName}.", + "RecycleBinUnableToWriteHealthCheck": "No se pudo escribir en la carpeta de papelera de reciclaje configurada: {0}. Aségurate de que esta ruta existe y que es modificable por el usuario que ejecuta {appName}", + "PrimaryAlbumTypes": "Tipos de álbum primario", + "Playlist": "Lista de reproducción", + "Proceed": "Proceder", + "SearchForAllMissingAlbums": "Buscar todos los álbumes faltantes", + "NoAlbums": "Sin álbumes", + "ReleasesHelpText": "Cambia el lanzamiento para este álbum", + "SelectedCountArtistsSelectedInterp": "{selectedCount} artista(s) seleccionado(s)", + "NoneMonitoringOptionHelpText": "No monitoriza artistas o álbumes", + "SkipRedownloadHelpText": "Evita que {appName} intente descargar lanzamientos alternativos para los elementos eliminados" } diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 2bc491f52..d867d639f 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -80,7 +80,7 @@ "BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi", "Cancel": "Peruuta", "Branch": "Haara", - "ClickToChangeQuality": "Vaihda laatua klikkaamalla", + "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.", "BlocklistRelease": "Lisää julkaisu estolistalle", @@ -277,7 +277,7 @@ "Global": "Yleiset", "MinimumFreeSpace": "Vapaan tilan vähimmäismäärä", "Missing": "Puuttuu", - "Monitored": "Valvotut", + "Monitored": "Valvonta", "OpenBrowserOnStart": "Avaa selain käynnistettäessä", "Profiles": "Profiilit", "Proper": "Kunnollinen", @@ -1068,7 +1068,7 @@ "ChangeCategoryMultipleHint": "Vaihtaa latausten kategoriaksi lataustyökalun \"Tuonnin jälkeinen kategoria\" -asetuksen kategorian.", "AutoRedownloadFailedFromInteractiveSearch": "Uudelleenlataus manuaalihaun tuloksista epäonnistui", "ImportListRootFolderMissingRootHealthCheckMessage": "Tuontilistalta tai -listoilta puuttuu juurikansio: {0}.", - "HiddenClickToShow": "Piilotettu, näytä painalla", + "HiddenClickToShow": "Piilotettu, näytä painamalla tästä", "Dash": "Yhdysmerkki", "RegularExpressionsCanBeTested": "Säännöllisiä lausekkeita voidaan testata [täällä](http://regexstorm.net/tester).", "MonitorArtists": "Valvo esittäjiä", @@ -1097,10 +1097,16 @@ "UpdateCheckStartupTranslocationMessage": "Päivitystä ei voida asentaa, koska käynnistyskansio \"{0}\" sijaitsee \"App Translocation\" -kansiossa.", "RemovingTag": "Tunniste poistetaan", "Required": "Pakollinen", - "ShownClickToHide": "Näkyvissä, piilota painamalla", + "ShownClickToHide": "Näytetään, piilota painamalla tästä", "Menu": "Valikko", "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ä." + "NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä.", + "ClickToChangeIndexerFlags": "Vaihda tietolähteen lippuja painamalla tästä", + "CustomFormatsSpecificationFlag": "Lippu", + "SelectIndexerFlags": "Valitse tietolähteen liput", + "SetIndexerFlags": "Aseta tietolähteen liput", + "CustomFilter": "Oma suodatin", + "LabelIsRequired": "Nimi on pakollinen" } diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index e3d4f5f81..91df8f492 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -105,7 +105,7 @@ "DetailedProgressBarHelpText": "Afficher le texte sur la barre de progression", "DiskSpace": "Espace disque", "DownloadClient": "Client de téléchargement", - "DownloadClients": "Clients de télécharg.", + "DownloadClients": "Clients de téléchargement", "DownloadClientSettings": "Télécharger les paramètres client", "DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails", "DownloadFailedInterp": "Échec du téléchargement : {0}", @@ -292,7 +292,7 @@ "ResetAPIKeyMessageText": "Êtes-vous sûr de vouloir réinitialiser votre clé API ?", "Restart": "Redémarrer", "RetentionHelpText": "Usenet uniquement : définissez-le sur zéro pour définir une rétention illimitée", - "RetryingDownloadOn": "Nouvelle tentative de téléchargement {0} à {1}", + "RetryingDownloadOn": "Nouvelle tentative de téléchargement le {date} à {time}", "RootFolder": "Dossier racine", "RootFolders": "Dossiers racine", "RSSSync": "Synchro RSS", @@ -486,7 +486,7 @@ "Duration": "Durée", "RemoveFailed": "Échec de la suppression", "RemoveDownloadsAlert": "Les paramètres de suppression ont été déplacés vers les paramètres individuels du client de téléchargement dans le tableau ci-dessus.", - "OnGrab": "À saisir", + "OnGrab": "Lors de la saisie", "OnHealthIssue": "Sur la question de la santé", "OnRename": "Au renommage", "OnUpgrade": "Lors de la mise à niveau", @@ -515,7 +515,7 @@ "Add": "Ajouter", "AddIndexer": "Ajouter un indexeur", "AddMetadataProfile": "profil de métadonnées", - "AddNew": "Ajouter une nouvelle", + "AddNew": "Ajouter", "AddQualityProfile": "Ajouter un profil de qualité", "AddRemotePathMapping": "Ajouter un mappage des chemins d'accès", "AddRootFolder": "Ajouter un dossier racine", @@ -571,7 +571,7 @@ "MediaManagement": "Gestion des médias", "Metadata": "Métadonnées", "MonitoredOnly": "Surveillé uniquement", - "MoveAutomatically": "Se déplacer automatiquement", + "MoveAutomatically": "Importation automatique", "MoveFiles": "Déplacer des fichiers", "OnlyTorrent": "Uniquement Torrent", "OnlyUsenet": "Uniquement Usenet", @@ -663,7 +663,7 @@ "CopyToClipboard": "Copier dans le presse-papier", "CouldntFindAnyResultsForTerm": "Aucun résultat pour de résultats pour '{0}'", "CustomFormat": "Format personnalisé", - "CustomFormatRequiredHelpText": "Cette {0} condition doit correspondre pour que le format personnalisé s'applique. Sinon, une seule correspondance {1} est suffisante.", + "CustomFormatRequiredHelpText": "Cette {0} condition doit correspondre pour que le format personnalisé s'applique. Sinon, une seule {0} correspondante est suffisante.", "CustomFormatSettings": "Réglages Formats Personnalisés", "CustomFormats": "Formats perso.", "Customformat": "Format Personnalisé", @@ -714,7 +714,7 @@ "IndexerRssHealthCheckNoIndexers": "Aucun indexeur disponible avec la synchronisation RSS activée, {appName} ne récupérera pas automatiquement les nouvelles versions", "IndexerSearchCheckNoAutomaticMessage": "Aucun indexeur disponible avec la recherche automatique activée, {appName} ne fournira aucun résultat de recherche automatique", "IndexerSearchCheckNoAvailableIndexersMessage": "Tous les indexeurs compatibles avec la recherche sont temporairement indisponibles en raison d'erreurs d'indexation récentes", - "IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur n'est disponible avec la recherche interactive activée. {appName} ne fournira aucun résultat de recherche interactif.", + "IndexerSearchCheckNoInteractiveMessage": "Aucun indexeur n'est disponible avec la recherche interactive activée, {appName} ne fournira aucun résultat de recherche interactif", "IndexerStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs", "IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}", "Loading": "Chargement", @@ -724,8 +724,8 @@ "ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}", "RecycleBinUnableToWriteHealthCheck": "Impossible d'écrire dans le dossier de corbeille configuré : {0}. Assurez vous que ce chemin existe et est accessible en écriture par l'utilisateur exécutant {appName}", "RemotePathMappingCheckFileRemoved": "Le fichier {0} a été supprimé pendant le processus.", - "RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.", - "RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.", + "RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.", + "RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} a signalé des fichiers dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.", "RemotePathMappingCheckFilesGenericPermissions": "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.", "RemotePathMappingCheckFilesLocalWrongOSPath": "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.", "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.", @@ -815,7 +815,7 @@ "AddIndexerImplementation": "Ajouter un indexeur - {implementationName}", "EditConnectionImplementation": "Modifier la connexion - {implementationName}", "EditIndexerImplementation": "Modifier l'indexeur - {implementationName}", - "AddNewArtistRootFolderHelpText": "'{0}' le sous-dossier sera créé automatiquement", + "AddNewArtistRootFolderHelpText": "Le sous-dossier « {folder} » sera créé automatiquement", "ImportLists": "Importer des listes", "ErrorLoadingContent": "Une erreur s'est produite lors du chargement de ce contenu", "AppUpdated": "{appName} mis à jour", @@ -831,7 +831,7 @@ "ManageClients": "Gérer les clients", "NoHistoryBlocklist": "Pas d'historique de liste noire", "ManageDownloadClients": "Gérer les clients de téléchargement", - "IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0].", + "IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0}.", "EditDownloadClientImplementation": "Modifier le client de téléchargement - {implementationName}", "ListWillRefreshEveryInterp": "La liste se rafraîchira tous/toutes la/les {0}", "DeleteRootFolder": "Supprimer le dossier racine", @@ -905,8 +905,8 @@ "ListRefreshInterval": "Intervalle d'actualisation de la liste", "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "{appName} prend en charge plusieurs listes pour importer des albums et des artistes dans la base de données.", "MediumFormat": "Format des médias", - "MonitorNewAlbums": "Surveiller les nouveaux albums", - "MonitorExistingAlbums": "Surveiller les albums existants", + "MonitorNewAlbums": "Nouveaux albums", + "MonitorExistingAlbums": "Albums existants", "MonitorNewItemsHelpText": "Quels nouveaux albums doivent être surveillés", "MusicBrainzReleaseID": "ID de version MusicBrainz", "OnDownloadFailure": "En cas d'échec de téléchargement", @@ -989,7 +989,7 @@ "SearchForMonitoredAlbums": "Rechercher des albums surveillés", "ImportListSpecificSettings": "Paramètres spécifiques à la liste d'importation", "MissingTracks": "Pistes manquantes", - "SearchForAllMissingAlbumsConfirmationCount": "Êtes-vous sûr de vouloir rechercher tous les albums manquants « {0} » ?", + "SearchForAllMissingAlbumsConfirmationCount": "Êtes-vous sûr de vouloir chercher tous les {totalRecords} albums manquants ?", "MonitoredHelpText": "Téléchargez les albums surveillés de cet artiste", "ContinuingMoreAlbumsAreExpected": "D'autres albums sont attendus", "MusicBrainzRecordingID": "Identifiant d'enregistrement MusicBrainz", @@ -1073,9 +1073,9 @@ "Auto": "Auto", "PosterOptions": "Paramètres des affiches", "Table": "Tableau", - "AddNewArtistSearchForMissingAlbums": "Lancer la recherche de film manquant", + "AddNewArtistSearchForMissingAlbums": "Lancer la recherche des albums manquants", "AlbumsLoadError": "Impossible de charger les albums", - "AddListExclusionHelpText": "Empêcher les séries d'être ajoutées à Sonarr par des listes", + "AddListExclusionHelpText": "Empêcher les artistes d'être ajoutées à {appName} par des listes", "AlbumStudioTruncated": "Seuls les 25 derniers albums sont affichés, allez dans les détails pour voir tous les albums", "DeleteArtistFolderCountWithFilesConfirmation": "Voulez-vous vraiment supprimer {count} séries sélectionnées et tous les contenus ?", "DeleteArtistFolderHelpText": "Supprimer le dossier de la série et son contenu", @@ -1099,7 +1099,7 @@ "UpdateFiltered": "Mise à jour filtrée", "AddAutoTag": "Ajouter un tag automatique", "AddCondition": "Ajouter une condition", - "AddConditionError": "Impossible d'ajouter une nouvelle condition, Réessayer.", + "AddConditionError": "Impossible d'ajouter une nouvelle condition, veuillez réessayer.", "QueueFilterHasNoItems": "Le filtre de file d'attente sélectionné ne contient aucun élément", "RegularExpressionsTutorialLink": "Vous trouverez plus de détails sur les expressions régulières [ici](https://www.regular-expressions.info/tutorial.html).", "ReleaseProfile": "Profil de version", @@ -1158,9 +1158,9 @@ "CustomFormatsSpecificationRegularExpressionHelpText": "Format personnalisé RegEx est insensible à la casse", "Deceased": "Décédé", "DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeter les hachages de torrents bloqués lors de la saisie", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeter les hachages de torrent sur liste noir lors de la saisie", "TrackFilesLoadError": "Impossible de charger les fichiers de pistes", - "SetAppTags": "Définir les étiquettes de {nom de l'application}", + "SetAppTags": "Définir les étiquettes de {appName}", "TrackFileMissingTooltip": "Fichier de la piste manquant", "TrackFileDeletedTooltip": "Fichier de la piste supprimé", "TrackFileRenamedTooltip": "Fichier de la piste renommé", @@ -1212,5 +1212,71 @@ "AddToDownloadQueue": "Ajouter à la file d'attente de téléchargement", "AddedToDownloadQueue": "Ajouté à la file d'attente de téléchargement", "IncludeHealthWarnings": "Inclure les avertissements de santé", - "CustomFormatsSettingsTriggerInfo": "Un format personnalisé sera appliqué à une version ou à un fichier lorsqu'il correspond à au moins un de chacun des différents types de conditions choisis." + "CustomFormatsSettingsTriggerInfo": "Un format personnalisé sera appliqué à une version ou à un fichier lorsqu'il correspond à au moins un de chacun des différents types de conditions choisis.", + "AutoTaggingSpecificationTag": "Étiquette", + "NotificationsTelegramSettingsIncludeAppName": "Inclure {appName} dans le Titre", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Préfixer éventuellement le titre du message par {appName} pour différencier les notifications des différentes applications", + "FileNameTokens": "Jetons de nom de fichier", + "ImportListsSettingsSummary": "Importer depuis une autre instance {appName} ou des listes Trakt et gérer les exclusions de listes", + "IndexerFlags": "Drapeaux de l'indexeur", + "MonitorFirstAlbum": "Premier album", + "NotificationsEmbySettingsSendNotifications": "Envoyer des notifications", + "NotificationsEmbySettingsUpdateLibraryHelpText": "Mettre à jour la bibliothèque lors d'import, de renommage ou de suppression ?", + "NotificationsEmbySettingsSendNotificationsHelpText": "Faire en sorte que MediaBrowser envoie des notifications aux fournisseurs configurés", + "NotificationsKodiSettingAlwaysUpdateHelpText": "Mettre à jour la bibliothèque lorsqu'une vidéo est lancée ?", + "NotificationsKodiSettingsCleanLibrary": "Nettoyer la bibliothèque", + "NotificationsKodiSettingsCleanLibraryHelpText": "Nettoyer la bibliothèque après une mise à jour", + "NotificationsKodiSettingsDisplayTime": "Temps d'affichage", + "NotificationsKodiSettingsDisplayTimeHelpText": "Combien de temps la notification doit être affichée (en seconde)", + "NotificationsKodiSettingsGuiNotification": "Notification GUI", + "NotificationsPlexSettingsAuthenticateWithPlexTv": "S'authentifier avec Plex.tv", + "NotificationsSettingsUpdateMapPathsFrom": "Mapper les chemins depuis", + "NotificationsSettingsUpdateMapPathsTo": "Mapper les chemins vers", + "NotificationsSettingsUseSslHelpText": "Se connecter à {serviceName} en HTTPS plutôt qu'en HTTP", + "Rejections": "Rejets", + "SelectIndexerFlags": "Sélectionner les drapeaux de l'indexeur", + "EmbedCoverArtHelpText": "Intégrer la pochette de l'album Lidarr dans les fichiers audio lors de l'écriture des balises", + "EmbedCoverArtInAudioFiles": "Intégrer la pochette dans les fichiers audio", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "Links": "Liens", + "NotificationsKodiSettingsUpdateLibraryHelpText": "Mettre à jour la bibliothèque lors de l'importation et du renommage ?", + "NotificationsPlexSettingsAuthToken": "Jeton d'authentification", + "NotificationsSettingsUpdateLibrary": "Mettre à jour la bibliothèque", + "QualitySettingsSummary": "Tailles et dénomination de qualité", + "SetIndexerFlags": "Définir les drapeaux de l'indexeur", + "Uppercase": "Majuscules", + "MonitoredStatus": "Surveillé/Statut", + "GeneralSettingsSummary": "Port, SSL, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour", + "IndexersSettingsSummary": "Indexeurs et options d'indexeur", + "Logout": "Se déconnecter", + "Lowercase": "Minuscule", + "MediaManagementSettingsSummary": "Nommage, paramètres de gestion de fichiers et dossiers racine", + "MetadataSettingsArtistSummary": "Créez les fichiers de métadonnées lorsque les pistes sont importées ou que les artistes sont actualisés", + "ProfilesSettingsArtistSummary": "Profils de qualité, de métadonnée, de délai et de version", + "TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées", + "MassSearchCancelWarning": "Cette opération ne peut pas être annulée une fois démarrée sans redémarrer {appName} ou désactiver tous vos indexeurs.", + "FormatAgeDay": "jour", + "FormatAgeDays": "jours", + "FormatAgeHour": "heure", + "FormatAgeHours": "heures", + "FormatAgeMinute": "minute", + "FormatAgeMinutes": "minutes", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatShortTimeSpanSeconds": "{seconds} seconde(s)", + "FormatShortTimeSpanHours": "{hours} heure(s)", + "FormatShortTimeSpanMinutes": "{minutes} minute(s)", + "FormatRuntimeHours": "{hours} h", + "FormatRuntimeMinutes": "{minutes} m", + "FormatTimeSpanDays": "{days} j {time}", + "KeyboardShortcuts": "Raccourcis clavier", + "MonitorAllAlbums": "Tous les albums", + "MonitorLastestAlbum": "Dernier album", + "MonitorMissingAlbums": "Albums manquants", + "MonitorNoAlbums": "Aucun", + "MonitorNoNewAlbums": "Aucun nouvel album", + "Tomorrow": "Demain", + "Yesterday": "Hier", + "OnArtistAdd": "Lors de l'ajout de l'artiste", + "IndexerPriorityHelpText": "Priorité de l'indexeur de 1 (la plus élevée) à 50 (la plus basse). Par défaut : 25. Utilisé lors de la récupération de versions pour départager des versions égales, {appName} utilisera toujours tous les indexeurs activés pour la synchronisation et la recherche RSS", + "NotificationsKodiSettingAlwaysUpdate": "Toujours mettre à jour" } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index 007a6f65a..4f23b9a2d 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -103,5 +103,6 @@ "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Konfirmasi sandi baru", "AuthenticationRequiredWarning": "Untuk mencegah akses jarak jauh tanpa autentikasi, {appName} kini mewajibkan pengaktifkan autentikasi. Kamu dapat menonaktifkan autentikasi dari jaringan lokal.", "Files": "File", - "TotalFileSize": "Jumlah Ukuran File" + "TotalFileSize": "Jumlah Ukuran File", + "20MinutesTwenty": "Indonesia" } diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 32f17ddd8..050932637 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -883,5 +883,6 @@ "ArtistIndexFooterDownloading": "Scaricando", "KeyboardShortcuts": "Scorciatoie Tastiera", "Links": "Collegamenti", - "RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate [qui](http://regexstorm.net/tester)." + "RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate [qui](http://regexstorm.net/tester).", + "AddListExclusion": "Aggiungi elenco esclusioni" } diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index ebb491e97..49318f419 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -1280,5 +1280,8 @@ "SelectIndexerFlags": "Selecionar Sinalizadores do Indexador", "SetIndexerFlags": "Definir Sinalizadores de Indexador", "CustomFormatsSettingsTriggerInfo": "Um formato personalizado será aplicado a um lançamento ou arquivo quando corresponder a pelo menos um de cada um dos diferentes tipos de condição escolhidos.", - "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25. Usado ao capturar lançamentos como desempate para lançamentos iguais, {appName} ainda usará todos os indexadores habilitados para sincronização e pesquisa de RSS" + "IndexerPriorityHelpText": "Prioridade do indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25. Usado ao capturar lançamentos como desempate para lançamentos iguais, {appName} ainda usará todos os indexadores habilitados para sincronização e pesquisa de RSS", + "AutoTaggingSpecificationTag": "Etiqueta", + "NotificationsTelegramSettingsIncludeAppName": "Incluir {appName} no Título", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Opcionalmente, prefixe o título da mensagem com {appName} para diferenciar notificações de diferentes aplicativos" } diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index d19c404b2..aa900d51c 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -4,7 +4,7 @@ "UnableToLoadRootFolders": "Kök klasörler yüklenemiyor", "UnableToLoadTheCalendar": "Takvim yüklenemiyor", "UnableToLoadUISettings": "UI ayarları yüklenemiyor", - "Unmonitored": "İzlenenmiyen", + "Unmonitored": "İzlenmeyen", "UnmonitoredHelpText": "İCal akışına izlenmeyen filmleri dahil et", "UpdateAll": "Tümünü Güncelle", "UpdateAutomaticallyHelpText": "Güncellemeleri otomatik olarak indirin ve yükleyin. Yine de Sistem'den yükleyebileceksiniz: Güncellemeler", @@ -33,14 +33,14 @@ "About": "Hakkında", "AddListExclusion": "Hariç Tutma Listesine Ekle", "AddingTag": "Etiket ekleniyor", - "AgeWhenGrabbed": "Yaş (yakalandığında)", + "AgeWhenGrabbed": "Yıl (yakalandığında)", "AlbumIsDownloadingInterp": "Film indiriliyor - {0}% {1}", - "AlreadyInYourLibrary": "Zaten kitaplığınızda", + "AlreadyInYourLibrary": "Kütüphanenizde mevcut", "AlternateTitles": "Alternatif Başlık", "AlternateTitleslength1Title": "Başlık", "AlternateTitleslength1Titles": "Başlıklar", - "Analytics": "Analitik", - "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Bu, tarayıcınızla ilgili bilgileri, kullandığınız {appName} WebUI sayfalarını, hata raporlamasının yanı sıra işletim sistemi ve çalışma zamanı sürümünü içerir. Bu bilgileri, özellikleri ve hata düzeltmelerini önceliklendirmek için kullanacağız.", + "Analytics": "Analiz", + "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Buna, tarayıcınız, hangi {appName} WebUI sayfalarını kullandığınız, hata raporlamanın yanı sıra işletim sistemi ve çalışma zamanı sürümü hakkındaki bilgiler de dahildir. Bu bilgiyi özelliklere ve hata düzeltmelerine öncelik vermek için kullanacağız.", "AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ApiKeyHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "Scheduled": "Tarifeli", @@ -75,7 +75,7 @@ "BackupNow": "Şimdi yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", "Backups": "Yedeklemeler", - "BindAddress": "Bağlama Adresi", + "BindAddress": "Bind Adresi", "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", "BindAddressHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "Blocklist": "Kara liste", @@ -124,16 +124,16 @@ "DeleteDownloadClientMessageText": "İndirme istemcisini '{0}' silmek istediğinizden emin misiniz?", "DeleteEmptyFolders": "Boş klasörleri silin", "DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", - "DeleteImportListExclusionMessageText": "Bu içe aktarma listesi dışlamasını silmek istediğinizden emin misiniz?", - "DeleteImportListMessageText": "'{0}' listesini silmek istediğinizden emin misiniz?", + "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": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", "DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteNotification": "Bildirimi Sil", "DeleteNotificationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", "DeleteQualityProfile": "Kalite Profilini Sil", - "DeleteQualityProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", - "DeleteReleaseProfile": "Gecikme Profilini Sil", + "DeleteQualityProfileMessageText": "'{name}' kalite profilini silmek istediğinizden emin misiniz?", + "DeleteReleaseProfile": "Sürüm Profilini Sil", "DeleteReleaseProfileMessageText": "Bu gecikme profilini silmek istediğinizden emin misiniz?", "DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", "DeleteSelectedTrackFiles": "Seçili Film Dosyalarını Sil", @@ -145,7 +145,7 @@ "DetailedProgressBarHelpText": "İlerleme çubuğundaki metni göster", "DiskSpace": "Disk Alanı", "DownloadClient": "İstemciyi İndir", - "DownloadClients": "İstemcileri İndir", + "DownloadClients": "İndirme İstemcileri", "DownloadClientSettings": "İstemci Ayarlarını İndir", "DownloadFailedCheckDownloadClientForMoreDetails": "İndirme başarısız oldu: Daha fazla ayrıntı için indirme istemcisini kontrol edin", "DownloadFailedInterp": "İndirme başarısız oldu: {0}", @@ -189,7 +189,7 @@ "Group": "Grup", "HasPendingChangesNoChanges": "Değişiklikler yok", "HasPendingChangesSaveChanges": "Değişiklikleri Kaydet", - "History": "Tarih", + "History": "Geçmiş", "Host": "Ana bilgisayar", "HostHelpText": "Uzaktan İndirme İstemcisi için belirttiğiniz ana bilgisayar", "Hostname": "Hostname", @@ -327,7 +327,7 @@ "RenameTracksHelpText": "Yeniden adlandırma devre dışı bırakılırsa, {appName} mevcut dosya adını kullanacaktır", "Reorder": "Yeniden sırala", "ReplaceIllegalCharacters": "Yasadışı Karakterleri Değiştirin", - "ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretli değilse, {appName} onları kaldıracaktır.", + "ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretlenmezse bunun yerine {appName} bunları kaldıracak", "RequiredHelpText": "Sürüm, bu terimlerden en az birini içermelidir (büyük / küçük harfe duyarlı değildir)", "RequiredPlaceHolder": "Yeni kısıtlama ekle", "RequiresRestartToTakeEffect": "Etkili olması için yeniden başlatma gerektirir", @@ -438,7 +438,7 @@ "AppDataDirectory": "Uygulama Veri Dizini", "20MinutesTwenty": "60 Dakika: {0}", "Automatic": "Otomatik", - "DelayingDownloadUntil": "İndirme işlemi {0} saat {1} itibarıyla erteleniyor", + "DelayingDownloadUntil": "İndirme işlemi {date} tarihine, {time} tarihine kadar erteleniyor", "Docker": "Liman işçisi", "Dates": "Tarih", "Name": "İsim", @@ -450,7 +450,7 @@ "Tracks": "İzleme", "NETCore": ".NET Çekirdeği", "Ok": "Tamam", - "Test": "Ölçek", + "Test": "Sına", "UnmappedFilesOnly": "Yalnızca Eşlenmemiş Dosyalar", "Activity": "Etkinlik", "Add": "Ekle", @@ -468,7 +468,7 @@ "UpgradesAllowed": "Yükseltmelere İzin Verildi", "Wanted": "İstenenler", "Warn": "Uyar", - "Connect": "Bağlan", + "Connect": "Bildirimler", "Added": "Eklendi", "AddIndexer": "Dizin Oluşturucu Ekle", "AddNew": "Yeni Ekle", @@ -476,8 +476,8 @@ "AddRemotePathMapping": "Uzak Yol Eşleme Ekleme", "AddRootFolder": "Kök Klasör Ekle", "AfterManualRefresh": "Manüel Yenilemeden Sonra", - "Age": "Yaş", - "All": "Herşey", + "Age": "Yıl", + "All": "Hepsi", "AllFiles": "Tüm dosyalar", "Always": "Her zaman", "AudioInfo": "Ses Bilgileri", @@ -508,14 +508,14 @@ "HardlinkCopyFiles": "Hardlink / Dosyaları Kopyala", "HideAdvanced": "Gelişmiş'i Gizle", "Ignored": "Yok sayıldı", - "Import": "İthalat", + "Import": "İçe aktar", "InteractiveImport": "Etkileşimli İçe Aktarma", "Location": "yer", "Manual": "Manuel", "MediaManagement": "Medya işletme", "Metadata": "Meta veri", "MonitoredOnly": "Sadece İzlenenler", - "MoveAutomatically": "Hızlı İçe Aktarma", + "MoveAutomatically": "Otomatik Olarak Taşı", "MoveFiles": "Dosyaları Taşı", "NextExecution": "Sonraki Yürütme", "NoTagsHaveBeenAddedYet": "Henüz etiket eklenmedi", @@ -531,14 +531,14 @@ "ReleaseTitle": "Yayin Başlığı", "Renamed": "Yeniden adlandırıldı", "RestoreBackupAdditionalInfo": "Not: {appName}, geri yükleme işlemi sırasında kullanıcı arayüzünü otomatik olarak yeniden başlatacak ve yeniden yükleyecektir.", - "Save": "Kayıt etmek", + "Save": "Kaydet", "Seeders": "Ekme makineleri", "Select...": "'Seçin ...", "SelectFolder": "Dosya Seç", "SelectQuality": "Kaliteyi Seçin", "WouldYouLikeToRestoreBackup": "{0} yedeğini geri yüklemek ister misiniz?", - "Apply": "Uygulamak", - "Backup": "Destek olmak", + "Apply": "Uygula", + "Backup": "Yedek", "Details": "Detaylar", "Genres": "Türler", "Info": "Bilgi", @@ -567,7 +567,7 @@ "Customformat": "Özel Biçimler", "CutoffFormatScoreHelpText": "Bu özel format puanına ulaşıldığında, {appName} artık film indirmeyecektir", "DeleteCustomFormat": "Özel Formatı Sil", - "DeleteCustomFormatMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", + "DeleteCustomFormatMessageText": "'{name}' özel biçimini silmek istediğinizden emin misiniz?", "DeleteFormatMessageText": "{0} biçim etiketini silmek istediğinizden emin misiniz?", "DownloadPropersAndRepacksHelpTextWarning": "Propers / Repacks'e otomatik yükseltmeler için özel formatlar kullanın", "DownloadedUnableToImportCheckLogsForDetails": "İndirildi - İçe Aktarılamıyor: ayrıntılar için günlükleri kontrol edin", @@ -634,8 +634,8 @@ "SetTags": "Etiketleri Ayarla", "Yes": "Evet", "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", - "DeleteSelectedIndexers": "Dizinleyiciyi Sil", - "BlocklistReleases": "Kara Liste Yayını", + "DeleteSelectedIndexers": "Dizin Oluşturucuları Sil", + "BlocklistReleases": "Kara Liste Sürümü", "DeleteConditionMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", "NoEventsFound": "Etkinlik bulunamadı", "QueueIsEmpty": "Kuyruk boş", @@ -658,7 +658,7 @@ "ConnectionLost": "Bağlantı koptu", "RecentChanges": "Son değişiklikler", "WhatsNew": "Ne var ne yok?", - "NotificationStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm listeler kullanılamıyor", + "NotificationStatusAllClientHealthCheckMessage": "Arızalar nedeniyle tüm bildirimler kullanılamıyor", "NotificationStatusSingleClientHealthCheckMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ConnectionLostReconnect": "{appName} otomatik bağlanmayı deneyecek veya aşağıda yeniden yükle seçeneğini işaretleyebilirsiniz.", "MetadataProfile": "üstveri profili", @@ -676,13 +676,13 @@ "AddAutoTag": "Otomatik Etiket Ekle", "AddCondition": "Koşul Ekle", "Release": " Yayınlandı", - "EditConditionImplementation": "Koşul Ekle - {uygulama Adı}", + "EditConditionImplementation": "Koşulu Düzenle - {implementationName}", "Overview": "Genel Bakış", - "GrabId": "Grab ID", + "GrabId": "ID Yakala", "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "DeleteArtistFolderHelpText": "Film klasörünü ve içeriğini silin", - "DeleteAutoTagHelpText": "Kalite profilini silmek istediğinizden emin misiniz {0}", - "DeleteSpecification": "Bildirimi Sil", + "DeleteAutoTagHelpText": "'{name}' etiketini otomatik silmek istediğinizden emin misiniz?", + "DeleteSpecification": "Spesifikasyonu Sil", "DisabledForLocalAddresses": "Yerel Adresler için Devre Dışı Bırakıldı", "EditConnectionImplementation": "Koşul Ekle - {implementationName}", "Negate": "Reddet", @@ -697,7 +697,7 @@ "AddConditionError": "Yeni bir koşul eklenemiyor, lütfen tekrar deneyin.", "AlbumsLoadError": "Yedeklemeler yüklenemiyor", "AuthBasic": "Temel (Tarayıcı Açılır Penceresi)", - "DeleteSpecificationHelpText": "Kalite profilini silmek istediğinizden emin misiniz {0}", + "DeleteSpecificationHelpText": "'{name}' spesifikasyonunu silmek istediğinizden emin misiniz?", "AutoTaggingNegateHelpText": "İşaretlenirse, {implementationName} koşulu eşleştiğinde otomatik etiketleme kuralı uygulanmayacaktır.", "ConditionUsingRegularExpressions": "Bu koşul Normal İfadeler kullanılarak eşleşir. `\\^$.|?*+()[{` karakterlerinin özel anlamlara sahip olduğunu ve `\\` ile kaçılması gerektiğini unutmayın", "Connection": "Bağlantılar", @@ -724,14 +724,14 @@ "AddReleaseProfile": "Sürüm Profili Ekle", "AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", "ImportLists": "Listeler", - "EditReleaseProfile": "Sürüm Profili Ekle", + "EditReleaseProfile": "Sürüm Profilini Düzenle", "DefaultCase": "Varsayılan Durum", "FileNameTokens": "Dosya Adı Belirteçleri", "KeyboardShortcuts": "Klavye kısayolları", "MonitoredStatus": "İzlendi / Durum", "Lowercase": "Küçük Harf", - "EditDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", - "EditImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", + "EditDownloadClientImplementation": "İndirme İstemcisini Düzenle - {implementationName}", + "EditImportListImplementation": "İçe Aktarma Listesini Düzenle - {implementationName}", "ImportList": "Listeler", "Uppercase": "Büyük Harf", "TagsSettingsSummary": "Tüm etiketleri ve nasıl kullanıldıklarını göster. Kullanılmayan etiketler kaldırılabilinir", @@ -739,7 +739,7 @@ "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları", "CustomFormatsSettings": "Özel Biçim Ayarları", "CustomFormatsSettingsSummary": "Özel Biçimler ve Ayarlar", - "DownloadClientsSettingsSummary": "İstemcileri indirin, indirme işlemlerini ve uzak yol haritalarını indirin", + "DownloadClientsSettingsSummary": "İndirme İstemcileri, indirme işlemleri ve uzaktan yol eşlemeleri", "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler", "ImportListsSettingsSummary": "Listeleri İçe Aktar, hariç tutulanları listele", "QualitySettingsSummary": "Kalite boyutları ve adlandırma", @@ -794,8 +794,8 @@ "ChooseImportMethod": "İçe Aktarma Modunu Seçin", "MinimumCustomFormatScoreHelpText": "Tercih edilen protokolde gecikmeyi atlamak için gereken Minimum Özel Format Puanı", "CountDownloadClientsSelected": "{count} indirme istemcisi seçildi", - "FormatAgeMinute": "Dakika", - "FormatAgeMinutes": "Dakika", + "FormatAgeMinute": "dakika", + "FormatAgeMinutes": "dakika", "MonitorNoAlbums": "Yok", "Tomorrow": "Yarın", "CountArtistsSelected": "{count} içe aktarma listesi seçildi", @@ -806,7 +806,91 @@ "BypassIfHighestQuality": "En Yüksek Kalitedeyse Atla", "BypassIfHighestQualityHelpText": "Tercih edilen protokolle kalite profilinde en yüksek etkin kaliteye sahip sürüm olduğunda gecikmeyi atlayın", "CustomFormatsSpecificationFlag": "Bayrak", - "FormatAgeHours": "Saatler", + "FormatAgeHours": "saat", "GrabReleaseUnknownArtistOrAlbumMessageText": "{appName}, bu sürümün hangi film için olduğunu belirleyemedi. {appName} bu sürümü otomatik olarak içe aktaramayabilir. '{0}' almak istiyor musunuz?", - "Yesterday": "Dün" + "Yesterday": "Dün", + "DownloadClientDelugeSettingsDirectoryCompleted": "Tamamlandığında Dizini Taşı", + "Dash": "Çizgi", + "DeleteImportList": "İçe Aktarma Listesini Sil", + "Donate": "Bağış yap", + "DownloadClientAriaSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı konum, varsayılan Aria2 konumunu kullanmak için boş bırakın", + "Database": "Veri tabanı", + "DeleteRootFolder": "Kök Klasörü Sil", + "RegularExpressionsCanBeTested": "Normal ifadeler [burada](http://regexstorm.net/tester) test edilebilir.", + "AutoTaggingSpecificationTag": "Etiket", + "DoNotBlocklistHint": "Engellenenler listesine eklemeden kaldır", + "DownloadClientDelugeSettingsDirectory": "İndirme Dizini", + "DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Tamamlanan indirmelerin taşınacağı isteğe bağlı konum; varsayılan Deluge konumunu kullanmak için boş bırakın", + "DoNotBlocklist": "Engelleme Listesine Eklemeyin", + "DownloadClientDelugeSettingsDirectoryHelpText": "İndirilenlerin yerleştirileceği isteğe bağlı konum; varsayılan Deluge konumunu kullanmak için boş bırakın", + "DeleteCondition": "Koşulu Sil", + "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", + "DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil", + "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} dizin oluşturucuyu silmek istediğinizden emin misiniz?", + "IndexerPriorityHelpText": "Dizin Oluşturucu Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan sürümler için eşitlik bozucu olarak sürümler alınırken kullanılan {appName}, RSS Senkronizasyonu ve Arama için etkinleştirilmiş tüm dizin oluşturucuları kullanmaya devam edecek", + "ConnectionSettingsUrlBaseHelpText": "{connectionName} URL'sine {url} gibi bir önek ekler", + "Album": "Albüm", + "DownloadClientQbittorrentSettingsContentLayout": "İçerik Düzeni", + "EditAutoTag": "Otomatik Etiket Düzenle", + "Duration": "Süre", + "DownloadClientPriorityHelpText": "İstemci Önceliğini 1'den (En Yüksek) 50'ye (En Düşük) indirin. Varsayılan: 1. Aynı önceliğe sahip istemciler için Round-Robin kullanılır.", + "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent'in yapılandırılmış içerik düzenini mi, torrentteki orijinal düzeni mi kullanacağınızı yoksa her zaman bir alt klasör oluşturup oluşturmayacağınızı (qBittorrent 4.3.2+)", + "NotificationsKodiSettingAlwaysUpdate": "Daima Güncelle", + "NotificationsKodiSettingAlwaysUpdateHelpText": "Bir video oynatılırken bile kitaplık güncellensin mi?", + "NotificationsKodiSettingsCleanLibrary": "Kütüphaneyi Temizle", + "NotificationsKodiSettingsDisplayTime": "Gösterim Süresi", + "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 dizin oluşturucudan yakalamak 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 [günlüklerinizi]({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ü", + "NoImportListsFound": "İçe aktarma listesi bulunamadı", + "EditSelectedDownloadClients": "Seçilen İndirme İstemcilerini Düzenle", + "Implementation": "Uygula", + "InstanceName": "Örnek isim", + "ListRefreshInterval": "Liste Yenileme Aralığı", + "EditSelectedIndexers": "Seçili Dizin Oluşturucuları Düzenle", + "ManageIndexers": "Dizin Oluşturucuları Yönet", + "NoHistoryBlocklist": "Geçmiş engellenenler listesi yok", + "Label": "Etiket", + "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizin oluşturucular: {0}.", + "EnableProfile": "Profili Etkinleştir", + "EnableRssHelpText": "{appName}, RSS Senkronizasyonu aracılığıyla düzenli aralıklarla sürüm değişikliği aradığında kullanacak", + "IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur", + "IgnoreDownloads": "İndirilenleri Yoksay", + "InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için", + "LabelIsRequired": "Etiket gerekli", + "ManageLists": "Listeleri Yönet", + "InvalidUILanguage": "Kullanıcı arayüzünüz geçersiz bir dile ayarlanmış, düzeltin ve ayarlarınızı kaydedin", + "FormatAgeDay": "gün", + "FormatDateTime": "{formattedDate} {formattedTime}", + "FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}", + "FormatRuntimeHours": "{hours}s", + "FormatRuntimeMinutes": "{minutes}dk", + "FormatShortTimeSpanHours": "{hours} saat", + "FormatTimeSpanDays": "{days}g {time}", + "FormatShortTimeSpanMinutes": "{minutes} dakika", + "FormatShortTimeSpanSeconds": "{seconds} saniye", + "NoDownloadClientsFound": "İndirme istemcisi bulunamadı", + "ManageClients": "İstemcileri Yönet", + "ManageDownloadClients": "İndirme İstemcilerini Yönet", + "InfoUrl": "Bilgi URL'si", + "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent karma tarafından engellendiyse, RSS/Bazı dizin oluşturucuları arama sırasında düzgün şekilde reddedilmeyebilir; bunun etkinleştirilmesi, torrent yakalandıktan sonra ancak istemciye gönderilmeden önce reddedilmesine olanak tanır.", + "EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle", + "NoIndexersFound": "Dizin oluşturucu 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", + "IgnoreDownloadsHint": "{appName}'ın bu indirmeleri daha fazla işlemesi durdurulur", + "FormatAgeDays": "gün", + "FormatAgeHour": "saat", + "ManageImportLists": "İçe Aktarma Listelerini Yönet", + "NotificationsEmbySettingsSendNotifications": "Bildirim Gönder", + "NotificationsKodiSettingsCleanLibraryHelpText": "Güncellemeden sonra kitaplığı temizle", + "IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 590d68e65..869010fb3 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -537,5 +537,9 @@ "AuthenticationRequiredPasswordHelpTextWarning": "Введіть новий пароль", "AuthenticationRequiredUsernameHelpTextWarning": "Введіть нове ім'я користувача", "AuthenticationRequiredWarning": "Щоб запобігти віддаленому доступу без автентифікації, {appName} тепер вимагає ввімкнення автентифікації. За бажанням можна вимкнути автентифікацію з локальних адрес.", - "UpdateAll": "Оновити все" + "UpdateAll": "Оновити все", + "20MinutesTwenty": "20 хвилин: {0}", + "45MinutesFourtyFive": "45 хвилин: {0}", + "60MinutesSixty": "60 хвилин: {0}", + "AddAlbumWithTitle": "Додати {albumTitle}" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 6849c0a12..d05193a61 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -1074,7 +1074,6 @@ "OverviewOptions": "概览选项", "PosterOptions": "海报选项", "Posters": "海报", - "AddAutoTagError": "无法添加新的自动标签,请重试。", "OrganizeSelectedArtists": "整理选定的剧集", "Table": "表格", "AddAutoTag": "添加自动标签", @@ -1262,5 +1261,8 @@ "NotificationsKodiSettingsUpdateLibraryHelpText": "导入和重命名时更新资源库?", "ConnectionSettingsUrlBaseHelpText": "向 {clientName} url 添加前缀,例如 {url}", "DownloadClientDelugeSettingsDirectoryHelpText": "可选的下载位置,留空使用 Aria2 默认位置", - "UseSsl": "使用 SSL" + "UseSsl": "使用 SSL", + "CustomFormatsSpecificationFlag": "标记", + "AutoTaggingSpecificationTag": "标签", + "AddAutoTagError": "无法添加新的自动标签,请重试。" } From a735eccb6503eb540e3797a4c3ddae88554f46c3 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 Apr 2024 12:57:55 +0300 Subject: [PATCH 126/491] Bump version to 2.3.2 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 39ce8a20a..99bc4a00b 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.3.1' + majorVersion: '2.3.2' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From 5f248aa25ea9acf40685a2f1d621a982bb8bafae Mon Sep 17 00:00:00 2001 From: Christopher Date: Sat, 27 Apr 2024 21:04:16 -0400 Subject: [PATCH 127/491] New: Remove qBitorrent torrents that reach inactive seeding time (cherry picked from commit d738035fed859eb475051f3df494b9c975a42e82) --- .../QBittorrentTests/QBittorrentFixture.cs | 69 +++++++++++++++++-- .../Clients/QBittorrent/QBittorrent.cs | 22 +++++- .../QBittorrent/QBittorrentPreferences.cs | 6 ++ .../Clients/QBittorrent/QBittorrentTorrent.cs | 6 ++ 4 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index c83c6e5dd..07f1c664e 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -108,7 +108,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Subject.Definition.Settings.As().RecentMusicPriority = (int)QBittorrentPriority.First; } - protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause) + protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, int maxInactiveSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause) { Mocker.GetMock() .Setup(s => s.GetConfig(It.IsAny())) @@ -118,7 +118,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests MaxRatio = maxRatio, MaxRatioEnabled = maxRatio >= 0, MaxSeedingTime = maxSeedingTime, - MaxSeedingTimeEnabled = maxSeedingTime >= 0 + MaxSeedingTimeEnabled = maxSeedingTime >= 0, + MaxInactiveSeedingTime = maxInactiveSeedingTime, + MaxInactiveSeedingTimeEnabled = maxInactiveSeedingTime >= 0 }); } @@ -609,7 +611,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests float ratio = 0.1f, float ratioLimit = -2, int seedingTime = 1, - int seedingTimeLimit = -2) + int seedingTimeLimit = -2, + int inactiveSeedingTimeLimit = -2, + long lastActivity = -1) { var torrent = new QBittorrentTorrent { @@ -623,7 +627,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests SavePath = "", Ratio = ratio, RatioLimit = ratioLimit, - SeedingTimeLimit = seedingTimeLimit + SeedingTimeLimit = seedingTimeLimit, + InactiveSeedingTimeLimit = inactiveSeedingTimeLimit, + LastActivity = lastActivity == -1 ? DateTimeOffset.UtcNow.ToUnixTimeSeconds() : lastActivity }; GivenTorrents(new List() { torrent }); @@ -737,6 +743,50 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } + [Test] + public void should_not_be_removable_and_should_not_allow_move_files_if_max_inactive_seedingtime_reached_and_not_paused() + { + GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); + GivenCompletedTorrent("uploading", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeFalse(); + item.CanMoveFiles.Should().BeFalse(); + } + + [Test] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused() + { + GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); + GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + + [Test] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused() + { + GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40); + GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds()); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + + [Test] + public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused() + { + GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); + GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds()); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeFalse(); + item.CanMoveFiles.Should().BeFalse(); + } + [Test] public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused() { @@ -748,6 +798,17 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeTrue(); } + [Test] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused() + { + GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20); + GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + + var item = Subject.GetItems().Single(); + item.CanBeRemoved.Should().BeTrue(); + item.CanMoveFiles.Should().BeTrue(); + } + [Test] public void should_not_fetch_details_twice() { diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index 4a0edeccd..a1b5d9071 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -621,7 +621,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent } } - if (HasReachedSeedingTimeLimit(torrent, config)) + if (HasReachedSeedingTimeLimit(torrent, config) || HasReachedInactiveSeedingTimeLimit(torrent, config)) { return true; } @@ -693,6 +693,26 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent return false; } + protected bool HasReachedInactiveSeedingTimeLimit(QBittorrentTorrent torrent, QBittorrentPreferences config) + { + long inactiveSeedingTimeLimit; + + if (torrent.InactiveSeedingTimeLimit >= 0) + { + inactiveSeedingTimeLimit = torrent.InactiveSeedingTimeLimit * 60; + } + else if (torrent.InactiveSeedingTimeLimit == -2 && config.MaxInactiveSeedingTimeEnabled) + { + inactiveSeedingTimeLimit = config.MaxInactiveSeedingTime * 60; + } + else + { + return false; + } + + return DateTimeOffset.UtcNow.ToUnixTimeSeconds() - torrent.LastActivity > inactiveSeedingTimeLimit; + } + protected void FetchTorrentDetails(QBittorrentTorrent torrent) { var torrentProperties = Proxy.GetTorrentProperties(torrent.Hash, Settings); diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentPreferences.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentPreferences.cs index e2979bd3a..d33b7bfe8 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentPreferences.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentPreferences.cs @@ -28,6 +28,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [JsonProperty(PropertyName = "max_seeding_time")] public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes + [JsonProperty(PropertyName = "max_inactive_seeding_time_enabled")] + public bool MaxInactiveSeedingTimeEnabled { get; set; } // True if share inactive time limit is enabled + + [JsonProperty(PropertyName = "max_inactive_seeding_time")] + public long MaxInactiveSeedingTime { get; set; } // Get the global share inactive time limit in minutes + [JsonProperty(PropertyName = "max_ratio_act")] public QBittorrentMaxRatioAction MaxRatioAction { get; set; } // Action performed when a torrent reaches the maximum share ratio. diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentTorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentTorrent.cs index 41e300446..589840a73 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrentTorrent.cs @@ -37,6 +37,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent [JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited) public long SeedingTimeLimit { get; set; } = -2; + + [JsonProperty(PropertyName = "inactive_seeding_time_limit")] // Per torrent inactive seeding time limit (-2 = use global, -1 = unlimited) + public long InactiveSeedingTimeLimit { get; set; } = -2; + + [JsonProperty(PropertyName = "last_activity")] // Timestamp in unix seconds when a chunk was last downloaded/uploaded + public long LastActivity { get; set; } } public class QBittorrentTorrentProperties From 580e4becbe6cab467960f966a42328929909c25c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 18 Apr 2024 21:40:22 -0700 Subject: [PATCH 128/491] Fixed: Improve paths longer than 256 on Windows failing to hardlink (cherry picked from commit a97fbcc40a6247bf59678425cf460588fd4dbecd) --- src/NzbDrone.Windows/Disk/DiskProvider.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NzbDrone.Windows/Disk/DiskProvider.cs b/src/NzbDrone.Windows/Disk/DiskProvider.cs index 2bb4d6821..3a3126471 100644 --- a/src/NzbDrone.Windows/Disk/DiskProvider.cs +++ b/src/NzbDrone.Windows/Disk/DiskProvider.cs @@ -181,6 +181,11 @@ namespace NzbDrone.Windows.Disk { try { + if (source.Length > 256 && !source.StartsWith(@"\\?\")) + { + source = @"\\?\" + source; + } + return CreateHardLink(destination, source, IntPtr.Zero); } catch (Exception ex) From 8b57b33c9912537c4606f90756c1e89bcc6f7e9c Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sun, 28 Apr 2024 03:07:41 +0200 Subject: [PATCH 129/491] New: Don't initially select 0 byte files in Interactive Import (cherry picked from commit 04bd535cfca5e25c6a2d5417c6f18d5bf5180f67) Closes #4776 --- .../InteractiveImport/Interactive/InteractiveImportRow.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/InteractiveImport/Interactive/InteractiveImportRow.js b/frontend/src/InteractiveImport/Interactive/InteractiveImportRow.js index af3734406..f5395ccbc 100644 --- a/frontend/src/InteractiveImport/Interactive/InteractiveImportRow.js +++ b/frontend/src/InteractiveImport/Interactive/InteractiveImportRow.js @@ -48,14 +48,16 @@ class InteractiveImportRow extends Component { artist, album, tracks, - quality + quality, + size } = this.props; if ( artist && album != null && tracks.length && - quality + quality && + size > 0 ) { this.props.onSelectedChange({ id, value: true }); } From 66c7521f4b0baf7a6086246a28c497acd5f25120 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 25 Apr 2024 22:59:00 +0300 Subject: [PATCH 130/491] Fixed: Limit titles in task name to 10 artists (cherry picked from commit c81ae6546118e954e481894d0b3fa6e9a20359c7) Closes #4777 --- .../Tasks/Queued/QueuedTaskRowNameCell.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx index 9fc4f9e21..77142c5a3 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx @@ -6,6 +6,22 @@ import createMultiArtistsSelector from 'Store/Selectors/createMultiArtistsSelect import translate from 'Utilities/String/translate'; import styles from './QueuedTaskRowNameCell.css'; +function formatTitles(titles: string[]) { + if (!titles) { + return null; + } + + if (titles.length > 11) { + return ( + + {titles.slice(0, 10).join(', ')}, {titles.length - 10} more + + ); + } + + return {titles.join(', ')}; +} + export interface QueuedTaskRowNameCellProps { commandName: string; body: CommandBody; @@ -32,7 +48,7 @@ export default function QueuedTaskRowNameCell( {commandName} {sortedArtists.length ? ( - - {sortedArtists.map((a) => a.artistName).join(', ')} + - {formatTitles(sortedArtists.map((a) => a.artistName))} ) : null} From 9660ec37cd7756b8026a9c4597fc8fffec853a42 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 29 Apr 2024 14:32:46 +0300 Subject: [PATCH 131/491] Use newer Node.js task for in pipelines --- azure-pipelines.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 99bc4a00b..f0fd6957f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -166,10 +166,10 @@ stages: pool: vmImage: $(imageName) steps: - - task: NodeTool@0 + - task: UseNode@1 displayName: Set Node.js version inputs: - versionSpec: $(nodeVersion) + version: $(nodeVersion) - checkout: self submodules: true fetchDepth: 1 @@ -1093,10 +1093,10 @@ stages: pool: vmImage: $(imageName) steps: - - task: NodeTool@0 + - task: UseNode@1 displayName: Set Node.js version inputs: - versionSpec: $(nodeVersion) + version: $(nodeVersion) - checkout: self submodules: true fetchDepth: 1 From 4d28d3f25a5465c421b1d9161c8841015626001c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 01:03:15 +0300 Subject: [PATCH 132/491] Fixed: Initialize databases after app folder migrations Co-authored-by: Mark McDowall --- src/NzbDrone.Host/Bootstrap.cs | 3 --- src/NzbDrone.Host/Startup.cs | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 30dd1e627..38828dc72 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -8,7 +8,6 @@ using System.Security.Cryptography.X509Certificates; using System.Text; using DryIoc; using DryIoc.Microsoft.DependencyInjection; -using Lidarr.Http.ClientSchema; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -151,8 +150,6 @@ namespace NzbDrone.Host .AddNzbDroneLogger() .AddDatabase() .AddStartupContext(context); - - SchemaBuilder.Initialize(c); }) .ConfigureServices(services => { diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 3f6fa35a0..849bf6a68 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using DryIoc; using Lidarr.Api.V1.System; using Lidarr.Http; using Lidarr.Http.Authentication; +using Lidarr.Http.ClientSchema; using Lidarr.Http.ErrorManagement; using Lidarr.Http.Frontend; using Lidarr.Http.Middleware; @@ -209,6 +211,7 @@ namespace NzbDrone.Host } public void Configure(IApplicationBuilder app, + IContainer container, IStartupContext startupContext, Lazy mainDatabaseFactory, Lazy logDatabaseFactory, @@ -239,6 +242,7 @@ namespace NzbDrone.Host _ = logDatabaseFactory.Value; dbTarget.Register(); + SchemaBuilder.Initialize(container); if (OsInfo.IsNotWindows) { From 1bdcf910146d2088b1a4f349fff65dd4c80ac587 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 12:32:12 +0300 Subject: [PATCH 133/491] Bump version to 2.3.3 --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f0fd6957f..948d446ec 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.3.2' + majorVersion: '2.3.3' minorVersion: $[counter('minorVersion', 1076)] lidarrVersion: '$(majorVersion).$(minorVersion)' buildName: '$(Build.SourceBranchName).$(lidarrVersion)' From f4a02ffc838ae9336082c6b65cf2f6ba37e47394 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 28 Apr 2024 09:25:42 -0700 Subject: [PATCH 134/491] Forward X-Forwarded-Host header (cherry picked from commit 3fbe4361386e9fb8dafdf82ad9f00f02bec746cc) --- src/NzbDrone.Host/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Host/Startup.cs b/src/NzbDrone.Host/Startup.cs index 849bf6a68..0d264734b 100644 --- a/src/NzbDrone.Host/Startup.cs +++ b/src/NzbDrone.Host/Startup.cs @@ -59,7 +59,7 @@ namespace NzbDrone.Host services.Configure(options => { - options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); }); From a25e5aae1094f5158a8afe0a1a61cdd1ac637ad0 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 5 May 2024 04:56:52 +0300 Subject: [PATCH 135/491] Fixed: Indexer flags for torrent release pushes (cherry picked from commit 47ba002806fe2c2004a649aa193ae318343a84e4) --- src/Lidarr.Api.V1/Indexers/ReleaseResource.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs index e8fc6f891..cc8261bcc 100644 --- a/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs +++ b/src/Lidarr.Api.V1/Indexers/ReleaseResource.cs @@ -132,7 +132,8 @@ namespace Lidarr.Api.V1.Indexers MagnetUrl = resource.MagnetUrl, InfoHash = resource.InfoHash, Seeders = resource.Seeders, - Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null + Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null, + IndexerFlags = (IndexerFlags)resource.IndexerFlags }; } else From 94d2a20b6a79306fc3075d5dd9ad3c6dee4f39a9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 5 May 2024 09:32:25 +0000 Subject: [PATCH 136/491] Multiple Translations updated by Weblate ignore-downstream Co-authored-by: GkhnGRBZ Co-authored-by: Michael5564445 Co-authored-by: Weblate Co-authored-by: fordas Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/es/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/tr/ Translate-URL: https://translate.servarr.com/projects/servarr/lidarr/uk/ Translation: Servarr/Lidarr --- src/NzbDrone.Core/Localization/Core/es.json | 4 +- src/NzbDrone.Core/Localization/Core/tr.json | 211 +++++++++++++------- src/NzbDrone.Core/Localization/Core/uk.json | 8 +- 3 files changed, 142 insertions(+), 81 deletions(-) diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index bf41b4b4f..cad6f8872 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -170,7 +170,7 @@ "ShowUnknownArtistItems": "Mostrar Elementos Desconocidos", "SSLCertPassword": "Contraseña del Certificado SSL", "SSLCertPath": "Ruta del Certificado SSL", - "SslCertPathHelpText": "Ruta al archivo pfx", + "SslCertPathHelpText": "Ruta del archivo pfx", "SslCertPathHelpTextWarning": "Requiere reiniciar para que surta efecto", "SSLPort": "Puerto SSL", "SslPortHelpTextWarning": "Requiere reiniciar para que surta efecto", @@ -423,7 +423,7 @@ "RemoveCompletedDownloadsHelpText": "Elimina las descargas importadas desde el historial del cliente de descarga", "RemovedFromTaskQueue": "Eliminar de la cola de tareas", "Reset": "Reiniciar", - "SslCertPasswordHelpText": "Contraseña para el archivo pfx", + "SslCertPasswordHelpText": "Contraseña para archivo pfx", "SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto", "TotalFileSize": "Tamaño total de archivo", "Track": "Pista", diff --git a/src/NzbDrone.Core/Localization/Core/tr.json b/src/NzbDrone.Core/Localization/Core/tr.json index aa900d51c..f3e22548f 100644 --- a/src/NzbDrone.Core/Localization/Core/tr.json +++ b/src/NzbDrone.Core/Localization/Core/tr.json @@ -11,14 +11,14 @@ "UpdateMechanismHelpText": "{appName}'ın yerleşik güncelleyicisini veya bir komut dosyasını kullanın", "UpdateScriptPathHelpText": "Çıkarılan bir güncelleme paketini alan ve güncelleme işleminin geri kalanını işleyen özel bir komut dosyasına giden yol", "UpgradeAllowedHelpText": "Devre dışı bırakılırsa nitelikler yükseltilmez", - "Uptime": "Uptime", + "Uptime": "Çalışma süresi", "URLBase": "URL Tabanı", "UrlBaseHelpText": "Ters proxy desteği için varsayılan boştur", "UrlBaseHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "UseHardlinksInsteadOfCopy": "Kopyalama yerine Sabit Bağlantıları Kullanın", "Usenet": "Usenet", "UsenetDelay": "Usenet Gecikmesi", - "UsenetDelayHelpText": "Usenet'ten bir sürüm almadan önce beklemek için dakika cinsinden gecikme", + "UsenetDelayHelpText": "Usenet'ten bir yayın almadan önce beklemek için dakika cinsinden gecikme", "UseProxy": "Proxy kullan", "Username": "Kullanıcı adı", "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "{appName}'ı güncellemek için kullanılacak dal", @@ -39,11 +39,11 @@ "AlternateTitles": "Alternatif Başlık", "AlternateTitleslength1Title": "Başlık", "AlternateTitleslength1Titles": "Başlıklar", - "Analytics": "Analiz", + "Analytics": "Analitik", "AnalyticsEnabledHelpText": "Anonim kullanım ve hata bilgilerini {appName} sunucularına gönderin. Buna, tarayıcınız, hangi {appName} WebUI sayfalarını kullandığınız, hata raporlamanın yanı sıra işletim sistemi ve çalışma zamanı sürümü hakkındaki bilgiler de dahildir. Bu bilgiyi özelliklere ve hata düzeltmelerine öncelik vermek için kullanacağız.", "AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ApiKeyHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", - "Scheduled": "Tarifeli", + "Scheduled": "Planlı", "ScriptPath": "Komut Dosyası Yolu", "Search": "Ara", "SearchForMissing": "Kayıpları Ara", @@ -70,7 +70,7 @@ "ArtistAlbumClickToChangeTrack": "Filmi değiştirmek için tıklayın", "Authentication": "Doğrulama", "AuthenticationMethodHelpText": "{appName}'a erişmek için Kullanıcı Adı ve Şifre gerektir", - "AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir sürüm arayın ve indirmeye çalışın", + "AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın", "BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır", "BackupNow": "Şimdi yedekle", "BackupRetentionHelpText": "Saklama süresinden daha eski olan otomatik yedeklemeler otomatik olarak temizlenecektir", @@ -79,7 +79,7 @@ "BindAddressHelpText": "Tüm arayüzler için geçerli IP adresi, localhost veya '*'", "BindAddressHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "Blocklist": "Kara liste", - "BlocklistRelease": "Kara Liste Yayını", + "BlocklistRelease": "Kara Liste Sürümü", "Branch": "Şube", "BypassProxyForLocalAddresses": "Yerel Adresler için Proxy'yi Atla", "Calendar": "Takvim", @@ -117,29 +117,29 @@ "DelayProfiles": "Gecikme Profilleri", "Delete": "Sil", "DeleteBackup": "Yedeklemeyi Sil", - "DeleteBackupMessageText": "'{0}' yedeğini silmek istediğinizden emin misiniz?", + "DeleteBackupMessageText": "'{name}' yedeğini silmek istediğinizden emin misiniz?", "DeleteDelayProfile": "Gecikme Profilini Sil", "DeleteDelayProfileMessageText": "Bu gecikme profilini silmek istediğinizden emin misiniz?", "DeleteDownloadClient": "İndirme İstemcisini Sil", - "DeleteDownloadClientMessageText": "İndirme istemcisini '{0}' silmek istediğinizden emin misiniz?", + "DeleteDownloadClientMessageText": "'{name}' indirme istemcisini silmek istediğinizden emin misiniz?", "DeleteEmptyFolders": "Boş klasörleri silin", "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": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", + "DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?", "DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteNotification": "Bildirimi Sil", - "DeleteNotificationMessageText": "'{0}' bildirimini silmek istediğinizden emin misiniz?", + "DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?", "DeleteQualityProfile": "Kalite Profilini Sil", "DeleteQualityProfileMessageText": "'{name}' kalite profilini silmek istediğinizden emin misiniz?", - "DeleteReleaseProfile": "Sürüm Profilini Sil", + "DeleteReleaseProfile": "Yayımlama Profilini Sil", "DeleteReleaseProfileMessageText": "Bu gecikme profilini silmek istediğinizden emin misiniz?", "DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", "DeleteSelectedTrackFiles": "Seçili Film Dosyalarını Sil", "DeleteSelectedTrackFilesMessageText": "Seçili film dosyalarını silmek istediğinizden emin misiniz?", "DeleteTag": "Etiketi Sil", - "DeleteTagMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", + "DeleteTagMessageText": "'{label}' etiketini silmek istediğinizden emin misiniz?", "DestinationPath": "Hedef yol", "DetailedProgressBar": "Ayrıntılı İlerleme Çubuğu", "DetailedProgressBarHelpText": "İlerleme çubuğundaki metni göster", @@ -184,7 +184,7 @@ "Global": "Küresel", "GoToInterp": "{0} adresine gidin", "Grab": "Kapmak", - "GrabRelease": "Bırakma", + "GrabRelease": "Yayın Yakalama", "GrabSelected": "Seçilenleri Kap", "Group": "Grup", "HasPendingChangesNoChanges": "Değişiklikler yok", @@ -208,12 +208,12 @@ "Importing": "İçe aktarılıyor", "IncludeUnknownArtistItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir", "IncludeUnmonitored": "İzlenmeyenleri Dahil Et", - "Indexer": "Dizin oluşturucu", - "IndexerPriority": "Dizin Oluşturucu Önceliği", - "Indexers": "Dizin oluşturucular", - "IndexerSettings": "Dizin Oluşturucu Ayarları", + "Indexer": "Dizinleyici", + "IndexerPriority": "Dizinleyici Önceliği", + "Indexers": "Dizinleyiciler", + "IndexerSettings": "Dizinleyici Ayarları", "InteractiveSearch": "Etkileşimli Arama", - "Interval": "Aralık", + "Interval": "Periyot", "IsCutoffCutoff": "Ayırmak", "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin", "IsTagUsedCannotBeDeletedWhileInUse": "Kullanımdayken silinemez", @@ -226,12 +226,12 @@ "LocalPath": "Yerel Yol", "LocalPathHelpText": "{appName}'ın uzak yola yerel olarak erişmek için kullanması gereken yol", "LogFiles": "Log dosyaları", - "Logging": "Logging", + "Logging": "Loglama", "LogLevel": "Günlük Düzeyi", "LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "İzleme günlük kaydı yalnızca geçici olarak etkinleştirilmelidir", "Logs": "Kütükler", "LongDateFormat": "Uzun Tarih Formatı", - "ManualImport": "Manuel İçe Aktarma", + "ManualImport": "Manuel İçe Aktar", "MarkAsFailed": "Başarısız olarak işaretle", "MarkAsFailedMessageText": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?", "MaximumLimits": "Maksimum Sınırlar", @@ -245,7 +245,7 @@ "MetadataSettings": "Meta Veri Ayarları", "MIA": "MIA", "MinimumAge": "Asgari yaş", - "MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin alınmadan önceki dakika cinsinden minimum yaşı. Yeni sürümlerin usenet sağlayıcınıza yayılması için zaman tanımak için bunu kullanın.", + "MinimumAgeHelpText": "Yalnızca Usenet: NZB'lerin alınmadan önceki dakika cinsinden minimum yaşı. Yeni yayınların usenet sağlayıcınıza yayılması için zaman tanımak için bunu kullanın.", "MinimumFreeSpace": "Minimum Boş Alan", "MinimumFreeSpaceWhenImportingHelpText": "Bu miktardan daha az kullanılabilir disk alanı bırakacaksa içe aktarmayı önleyin", "MinimumLimits": "Minimum Limitler", @@ -253,8 +253,8 @@ "Mode": "Mod", "Monitored": "İzlendi", "MoreInfo": "Daha fazla bilgi", - "MustContain": "İçermek zorundadır", - "MustNotContain": "İçermemelidir", + "MustContain": "İçermeli", + "MustNotContain": "İçermemeli", "NamingSettings": "Adlandırma Ayarları", "New": "Yeni", "NoBackupsAreAvailable": "Kullanılabilir yedek yok", @@ -267,7 +267,7 @@ "OpenBrowserOnStart": "Başlangıçta tarayıcıyı aç", "Options": "Seçenekler", "Original": "Orijinal", - "PackageVersion": "Paket Sürümü", + "PackageVersion": "Paket Versiyonu", "PageSize": "Sayfa boyutu", "PageSizeHelpText": "Her sayfada gösterilecek öğe sayısı", "Password": "Parola", @@ -276,7 +276,7 @@ "Port": "Liman", "PortNumber": "Port numarası", "PosterSize": "Poster Boyutu", - "PreviewRename": "Ad değiştirmeyi ön izle", + "PreviewRename": "Yeniden Adlandır ve Önizle", "Profiles": "Profiller", "Proper": "Uygun", "PropersAndRepacks": "Propers ve Repacks", @@ -287,13 +287,13 @@ "ProxyPasswordHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", "ProxyType": "Proxy Türü", "ProxyUsernameHelpText": "Gerekirse yalnızca bir kullanıcı adı ve şifre girmeniz gerekir. Aksi takdirde boş bırakın.", - "PublishedDate": "yayınlanma tarihi", + "PublishedDate": "Yayınlanma Tarihi", "Quality": "Kalite", "QualityDefinitions": "Kalite Tanımları", "QualityProfile": "Kalite Profili", "QualityProfiles": "Kalite Profileri", "QualitySettings": "Kalite Ayarları", - "Queue": "Sıra", + "Queue": "Sırada", "ReadTheWikiForMoreInformation": "Daha fazla bilgi için Wiki'yi okuyun", "Real": "Gerçek", "Reason": "Nedeni", @@ -307,7 +307,7 @@ "RefreshInformationAndScanDisk": "Bilgileri ve tarama diskini yenileyin", "RefreshScan": "Yenile ve Tara", "ReleaseDate": "Yayın tarihleri", - "ReleaseGroup": "Yayın Grubu", + "ReleaseGroup": "Yayımlayan Grup", "ReleaseRejected": "Reddedildi", "ReleaseStatuses": "Yayın Durumu", "ReleaseWillBeProcessedInterp": "İzin işlenecek {0}", @@ -320,7 +320,7 @@ "RemoveFailedDownloadsHelpText": "Başarısız indirmeleri indirme istemcisi geçmişinden kaldırın", "RemoveFromBlocklist": "Kara listeden kaldır", "RemoveFromDownloadClient": "İndirme İstemcisinden Kaldır", - "RemoveFromQueue": "Sıradan kaldır", + "RemoveFromQueue": "Kuyruktan kaldır", "RemoveSelected": "Seçilenleri Kaldır", "RemoveTagExistingTag": "Mevcut etiket", "RemoveTagRemovingTag": "Etiket kaldırılıyor", @@ -345,12 +345,12 @@ "Result": "Sonuç", "Retention": "Saklama", "RetentionHelpText": "Yalnızca Usenet: Sınırsız saklamaya ayarlamak için sıfıra ayarlayın", - "RetryingDownloadOn": "İndirme işlemi {0}, {1} tarihinde yeniden deneniyor", + "RetryingDownloadOn": "{date} tarihinde, {time} itibarıyla indirme işlemi yeniden deneniyor", "RootFolder": "Kök Klasör", "RootFolders": "Kök klasörler", "RSSSync": "RSS Senkronizasyonu", "RSSSyncInterval": "RSS Senkronizasyon Aralığı", - "RssSyncIntervalHelpText": "Dakika cinsinden aralık. Devre dışı bırakmak için sıfıra ayarlayın (bu, tüm otomatik bırakmayı durdurur)", + "RssSyncIntervalHelpText": "Dakika cinsinden periyot. Devre dışı bırakmak için sıfıra ayarlayın (tüm otomatik yayın yakalamayı durduracaktır)", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Aktif görünüm hafta olduğunda her bir sütunun üzerinde gösterilir", "ShowPath": "Yolu Göster", "ShowQualityProfile": "Kalite Profilini Göster", @@ -362,7 +362,7 @@ "ShowSizeOnDisk": "Diskte Boyutu Göster", "ShowUnknownArtistItems": "Bilinmeyen Film Öğelerini Göster", "SSLCertPassword": "SSL Sertifika Parolası", - "SslCertPasswordHelpText": "Pfx dosyası için şifre", + "SslCertPasswordHelpText": "Pfx dosyasının şifresi", "SslCertPasswordHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "SSLCertPath": "SSL Sertifika Yolu", "SslCertPathHelpText": "Pfx dosyasının yolu", @@ -371,7 +371,7 @@ "SslPortHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "StandardTrackFormat": "Standart Film Formatı", "StartTypingOrSelectAPathBelow": "Yazmaya başlayın veya aşağıdan bir yol seçin", - "StartupDirectory": "Başlangıç dizini", + "StartupDirectory": "Başlangıç Dizini", "Status": "Durum", "Style": "Tarz", "SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", @@ -401,7 +401,7 @@ "UnableToLoadTags": "Etiketler yüklenemiyor", "Ungroup": "Grubu çöz", "ApplyTags": "Etiketleri Uygula", - "Remove": "Kaldırmak", + "Remove": "Kaldır", "SearchAll": "Tümünü ara", "UiLanguageHelpText": "{appName}'ın UI için kullanacağı dil", "UiLanguageHelpTextWarning": "Tarayıcının Yeniden Yüklenmesi Gerekiyor", @@ -458,7 +458,7 @@ "Replace": "Değiştir", "RestartRequiredHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "ShowAdvanced": "Gelişmiş'i Göster", - "SizeOnDisk": "Diskteki ölçü", + "SizeOnDisk": "Diskteki boyut", "SourceTitle": "Kaynak başlığı", "System": "Sistem", "TimeLeft": "Kalan zaman", @@ -470,7 +470,7 @@ "Warn": "Uyar", "Connect": "Bildirimler", "Added": "Eklendi", - "AddIndexer": "Dizin Oluşturucu Ekle", + "AddIndexer": "Dizinleyici Ekle", "AddNew": "Yeni Ekle", "AddQualityProfile": "Kalite Profili Ekle", "AddRemotePathMapping": "Uzak Yol Eşleme Ekleme", @@ -501,7 +501,7 @@ "ErrorRestoringBackup": "Yedeği geri yüklerken hata", "Events": "Etkinlikler", "EventType": "Etkinlik tipi", - "Filters": "Filtre", + "Filters": "Filtreler", "FreeSpace": "Boş alan", "General": "Genel", "Grabbed": "Yakalandı", @@ -521,7 +521,7 @@ "NoTagsHaveBeenAddedYet": "Henüz etiket eklenmedi", "OnlyTorrent": "Sadece Torrent", "OnlyUsenet": "Sadece Usenet", - "Organize": "Düzenlemek", + "Organize": "Düzenle", "OutputPath": "Çıkış yolu", "Peers": "Akranlar", "PreferAndUpgrade": "Tercih Et ve Yükselt", @@ -536,34 +536,34 @@ "Select...": "'Seçin ...", "SelectFolder": "Dosya Seç", "SelectQuality": "Kaliteyi Seçin", - "WouldYouLikeToRestoreBackup": "{0} yedeğini geri yüklemek ister misiniz?", + "WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?", "Apply": "Uygula", - "Backup": "Yedek", + "Backup": "Yedekler", "Details": "Detaylar", "Genres": "Türler", "Info": "Bilgi", - "LastDuration": "lastDuration", + "LastDuration": "Yürütme Süresi", "LastExecution": "Son Yürütme", "LastUsed": "Son kullanılan", "LastWriteTime": "Son Yazma Zamanı", "Progress": "İlerleme", - "Queued": "Sıraya alındı", - "Rating": "Puanlar", + "Queued": "Kuyruğa alındı", + "Rating": "Puan", "Ui": "UI", "AddImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", "ImportListExclusions": "İçe Aktarma Listesi Hariç Tutmasını Sil", "DoneEditingGroups": "Grupları Düzenleme Bitti", - "QualitiesHelpText": "Listede daha yüksek nitelikler daha çok tercih edilir. Aynı grup içindeki nitelikler eşittir. Sadece kontrol edilen nitelikler istenir", + "QualitiesHelpText": "Listede üst sıralarda yer alan nitelikler işaretlenmese bile en çok tercih edilendir. Aynı grup içindeki nitelikler eşittir. Yalnızca kontrol edilen nitelikler aranır", "EditGroups": "Grupları Düzenle", "CustomFormatScore": "Özel Biçim Puanı", - "MinimumCustomFormatScore": "Minimum Özel Biçim Puanı", + "MinimumCustomFormatScore": "Minimum Özel Format Puanı", "CloneCustomFormat": "Özel Formatı Klonla", "CopyToClipboard": "Panoya kopyala", "CouldntFindAnyResultsForTerm": "'{0}' için hiçbir sonuç bulunamadı", - "CustomFormat": "Özel Biçimler", + "CustomFormat": "Özel Format", "CustomFormatRequiredHelpText": "Özel biçimin uygulanabilmesi için bu {0} koşulunun eşleşmesi gerekir. Aksi takdirde tek bir {1} eşleşmesi yeterlidir.", "CustomFormatSettings": "Özel Biçim Ayarları", - "CustomFormats": "Özel Biçimler", + "CustomFormats": "Özel Formatlar", "Customformat": "Özel Biçimler", "CutoffFormatScoreHelpText": "Bu özel format puanına ulaşıldığında, {appName} artık film indirmeyecektir", "DeleteCustomFormat": "Özel Formatı Sil", @@ -574,7 +574,7 @@ "ExportCustomFormat": "Özel Formatı Dışa Aktar", "FailedDownloadHandling": "Başarısız İndirme İşlemi", "FailedLoadingSearchResults": "Arama sonuçları yüklenemedi, lütfen tekrar deneyin.", - "Formats": "Biçimler", + "Formats": "Formatlar", "IncludeCustomFormatWhenRenamingHelpText": "{Özel Biçimler} yeniden adlandırma biçimine dahil et", "ItsEasyToAddANewArtistJustStartTypingTheNameOfTheArtistYouWantToAdd": "Yeni bir film eklemek kolaydır, eklemek istediğiniz filmin adını yazmaya başlayın", "MinFormatScoreHelpText": "İndirmeye izin verilen minimum özel biçim puanı", @@ -596,17 +596,17 @@ "DownloadClientStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor", "DownloadClientStatusCheckSingleClientMessage": "Hatalar nedeniyle indirilemeyen istemciler: {0}", "HiddenClickToShow": "Gizli, göstermek için tıklayın", - "AppDataLocationHealthCheckMessage": "Güncellemede AppData'nın silinmesini önlemek için güncelleme mümkün olmayacak", + "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 listeler 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": "Yakın zamanda yapılan dizin oluşturucu hataları nedeniyle, rss özellikli tüm dizinleyiciler geçici olarak kullanılamıyor", - "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni sürümleri otomatik olarak almayacak", + "IndexerRssHealthCheckNoAvailableIndexers": "Son indeksleyici hataları nedeniyle tüm rss özellikli indeksleyiciler geçici olarak kullanılamıyor", + "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni yayınlar otomatik olarak almayacak", "IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak", - "IndexerSearchCheckNoAvailableIndexersMessage": "Yakın zamanda yapılan dizin oluşturucu hataları nedeniyle arama özellikli tüm dizin oluşturucular geçici olarak kullanılamıyor", + "IndexerSearchCheckNoAvailableIndexersMessage": "Son indeksleyici hataları nedeniyle arama özellikli indeksleyicilerin tümü geçici olarak kullanılamıyor", "IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinken indeksleyici yok, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır", "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", @@ -622,19 +622,19 @@ "UpdateCheckStartupNotWritableMessage": "'{0}' başlangıç klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", "UpdateCheckStartupTranslocationMessage": "Başlangıç klasörü '{0}' bir Uygulama Yer Değiştirme klasöründe olduğu için güncelleme yüklenemiyor.", "UpdateCheckUINotWritableMessage": "'{0}' UI klasörü '{1}' kullanıcısı tarafından yazılamadığından güncelleme yüklenemiyor.", - "DeleteRemotePathMapping": "Uzak Yol Eşlemeyi Düzenle", + "DeleteRemotePathMapping": "Uzak Yol Eşlemeyi Sil", "DeleteRemotePathMappingMessageText": "Bu uzak yol eşlemesini silmek istediğinizden emin misiniz?", "BlocklistReleaseHelpText": "{appName}'ın bu sürümü otomatik olarak tekrar yakalamasını engeller", "FailedToLoadQueue": "Sıra yüklenemedi", "ApplyTagsHelpTextAdd": "Ekle: Etiketleri mevcut etiket listesine ekleyin", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", - "RemoveSelectedItemQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", + "RemoveSelectedItemQueueMessageText": "1 öğeyi kuyruktan kaldırmak istediğinizden emin misiniz?", "RemoveSelectedItemsQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", "SetTags": "Etiketleri Ayarla", "Yes": "Evet", "DeleteSelectedDownloadClients": "İndirme İstemcisini Sil", - "DeleteSelectedIndexers": "Dizin Oluşturucuları Sil", + "DeleteSelectedIndexers": "Dizinleyicileri Sil", "BlocklistReleases": "Kara Liste Sürümü", "DeleteConditionMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?", "NoEventsFound": "Etkinlik bulunamadı", @@ -678,7 +678,7 @@ "Release": " Yayınlandı", "EditConditionImplementation": "Koşulu Düzenle - {implementationName}", "Overview": "Genel Bakış", - "GrabId": "ID Yakala", + "GrabId": "ID'den Yakala", "AddIndexerImplementation": "Yeni Dizin Ekle - {implementationName}", "DeleteArtistFolderHelpText": "Film klasörünü ve içeriğini silin", "DeleteAutoTagHelpText": "'{name}' etiketini otomatik silmek istediğinizden emin misiniz?", @@ -717,14 +717,14 @@ "PreferredSize": "Tercih Edilen Boyut", "Unlimited": "Sınırsız", "IncludeHealthWarnings": "Sağlık Uyarılarını Dahil Et", - "RemoveQueueItemConfirmation": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?", + "RemoveQueueItemConfirmation": "'{sourceTitle}' dosyasını kuyruktan kaldırmak istediğinizden emin misiniz?", "AutoRedownloadFailed": "Yeniden İndirme Başarısız", "AddDownloadClientImplementation": "İndirme İstemcisi Ekle - {implementationName}", "AddImportList": "İçe Aktarım Listesi Ekle", - "AddReleaseProfile": "Sürüm Profili Ekle", + "AddReleaseProfile": "Yayın Profili Ekle", "AddImportListImplementation": "İçe Aktarım Listesi Ekle -{implementationName}", "ImportLists": "Listeler", - "EditReleaseProfile": "Sürüm Profilini Düzenle", + "EditReleaseProfile": "Yayımlama Profilini Düzenle", "DefaultCase": "Varsayılan Durum", "FileNameTokens": "Dosya Adı Belirteçleri", "KeyboardShortcuts": "Klavye kısayolları", @@ -737,11 +737,11 @@ "TagsSettingsSummary": "Tüm etiketleri ve nasıl kullanıldıklarını göster. Kullanılmayan etiketler kaldırılabilinir", "UiSettingsSummary": "Takvim, tarih ve renk engelli seçenekler", "ConnectSettingsSummary": "Bildirimler, medya sunucularına/oynatıcılara bağlantılar ve özel komut dosyaları", - "CustomFormatsSettings": "Özel Biçim Ayarları", - "CustomFormatsSettingsSummary": "Özel Biçimler ve Ayarlar", + "CustomFormatsSettings": "Özel Format Ayarları", + "CustomFormatsSettingsSummary": "Özel Formatlar ve Ayarlar", "DownloadClientsSettingsSummary": "İndirme İstemcileri, indirme işlemleri ve uzaktan yol eşlemeleri", "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analitikler ve güncellemeler", - "ImportListsSettingsSummary": "Listeleri İçe Aktar, hariç tutulanları listele", + "ImportListsSettingsSummary": "Başka bir {appName} örneğinden veya Trakt listelerinden içe aktarın ve liste hariç tutma işlemlerini yönetin", "QualitySettingsSummary": "Kalite boyutları ve adlandırma", "ArtistIndexFooterDownloading": "İndiriliyor", "AutomaticSearch": "Otomatik Arama", @@ -783,12 +783,12 @@ "ChownGroup": "Chown Grubu", "ClearBlocklist": "Engellenenler listesini temizle", "ClearBlocklistMessageText": "Engellenenler listesindeki tüm öğeleri temizlemek istediğinizden emin misiniz?", - "ClickToChangeReleaseGroup": "Sürüm grubunu değiştirmek için tıklayın", + "ClickToChangeReleaseGroup": "Yayım grubunu değiştirmek için tıklayın", "Clone": "Klon", "CloneAutoTag": "Otomatik Etiketi Klonla", "CloneCondition": "Klon Durumu", - "ClickToChangeIndexerFlags": "Dizin oluşturucu bayraklarını değiştirmek için tıklayın", - "IndexerFlags": "Dizin Oluşturucu Bayrakları", + "ClickToChangeIndexerFlags": "Dizinleyici bayraklarını değiştirmek için tıklayın", + "IndexerFlags": "Dizinleyici 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", @@ -800,7 +800,7 @@ "Tomorrow": "Yarın", "CountArtistsSelected": "{count} içe aktarma listesi seçildi", "AddToDownloadQueue": "İndirme kuyruğuna ekleyin", - "AddedToDownloadQueue": "İndirme sırasına eklendi", + "AddedToDownloadQueue": "İndirme kuyruğuna eklendi", "BypassIfAboveCustomFormatScore": "Özel Format Koşullarının Üstündeyse Baypas Et", "BypassIfAboveCustomFormatScoreHelpText": "Sürümün puanı, yapılandırılan minimum özel format puanından yüksek olduğunda bypass'ı etkinleştirin", "BypassIfHighestQuality": "En Yüksek Kalitedeyse Atla", @@ -826,11 +826,11 @@ "DeleteCondition": "Koşulu Sil", "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", "DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil", - "DeleteAutoTag": "Etiketi Otomatik Sil", + "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} dizin oluşturucuyu silmek istediğinizden emin misiniz?", - "IndexerPriorityHelpText": "Dizin Oluşturucu Önceliği (En Yüksek) 1'den (En Düşük) 50'ye kadar. Varsayılan: 25'dir. Eşit olmayan sürümler için eşitlik bozucu olarak sürümler 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} 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", "ConnectionSettingsUrlBaseHelpText": "{connectionName} URL'sine {url} gibi bir önek ekler", "Album": "Albüm", "DownloadClientQbittorrentSettingsContentLayout": "İçerik Düzeni", @@ -845,7 +845,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 dizin oluşturucudan yakalamak için hangi indirme istemcisinin kullanılacağını belirtin", + "IndexerDownloadClientHelpText": "Bu dizinleyiciden yakalamak 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 [günlüklerinizi]({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ü", @@ -854,13 +854,13 @@ "Implementation": "Uygula", "InstanceName": "Örnek isim", "ListRefreshInterval": "Liste Yenileme Aralığı", - "EditSelectedIndexers": "Seçili Dizin Oluşturucuları Düzenle", - "ManageIndexers": "Dizin Oluşturucuları Yönet", + "EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle", + "ManageIndexers": "Dizinleyicileri Yönet", "NoHistoryBlocklist": "Geçmiş engellenenler listesi yok", "Label": "Etiket", - "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizin oluşturucular: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.", "EnableProfile": "Profili Etkinleştir", - "EnableRssHelpText": "{appName}, RSS Senkronizasyonu aracılığıyla düzenli aralıklarla sürüm değişikliği aradığında kullanacak", + "EnableRssHelpText": "{appName}, RSS Senkronizasyonu aracılığıyla düzenli periyotlarda yayın değişikliği aradığında kullanacak", "IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur", "IgnoreDownloads": "İndirilenleri Yoksay", "InstanceNameHelpText": "Sekmedeki örnek adı ve Syslog uygulaması adı için", @@ -880,9 +880,9 @@ "ManageClients": "İstemcileri Yönet", "ManageDownloadClients": "İndirme İstemcilerini Yönet", "InfoUrl": "Bilgi URL'si", - "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Bir torrent karma tarafından engellendiyse, RSS/Bazı dizin oluşturucuları arama sırasında düzgün şekilde reddedilmeyebilir; bunun etkinleştirilmesi, torrent yakalandıktan sonra ancak istemciye gönderilmeden önce reddedilmesine olanak tanır.", + "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 yakalandıktan sonra, ancak istemciye gönderilmeden önce reddedilmesine izin verecektir.", "EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle", - "NoIndexersFound": "Dizin oluşturucu bulunamadı", + "NoIndexersFound": "Dizinleyici 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", @@ -892,5 +892,62 @@ "ManageImportLists": "İçe Aktarma Listelerini Yönet", "NotificationsEmbySettingsSendNotifications": "Bildirim Gönder", "NotificationsKodiSettingsCleanLibraryHelpText": "Güncellemeden sonra kitaplığı temizle", - "IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet" + "IndexerSettingsRejectBlocklistedTorrentHashes": "Yakalarken Engellenen Torrent Karmalarını Reddet", + "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", + "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", + "NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}, kitaplık yolu konumunu {appName}'den farklı gördüğünde seri yollarını değiştirmek için kullanılan {serviceName} yolu ('Kütüphaneyi Güncelle' gerektirir)", + "PasswordConfirmation": "Şifre onayı", + "Rejections": "Reddedilenler", + "ReleaseProfiles": "Yayımlama Profilleri", + "SelectIndexerFlags": "Dizinleyici Bayraklarını Seçin", + "UpdateFiltered": "Filtrelenenleri Güncelle", + "UseSsl": "SSL kullan", + "RemoveCompletedDownloads": "Tamamlanan İndirmeleri Kaldır", + "RemoveDownloadsAlert": "Kaldırma ayarları, yukarıdaki tabloda bireysel İndirme İstemcisi ayarlarına taşınmıştır.", + "ResetTitles": "Başlıkları Sıfırla", + "Period": "Periyot", + "RemoveMultipleFromDownloadClientHint": "İndirilenleri ve dosyaları indirme istemcisinden kaldırır", + "RemoveQueueItemRemovalMethod": "Kaldırma Yöntemi", + "RemoveFromDownloadClientHint": "İndirilenleri ve dosyaları indirme istemcisinden kaldırır", + "ResetQualityDefinitionsMessageText": "Kalite tanımlarını sıfırlamak istediğinizden emin misiniz?", + "ResetQualityDefinitions": "Kalite Tanımlarını Sıfırla", + "RemoveQueueItem": "Kaldır - {sourceTitle}", + "RemoveQueueItemRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirme işlemini ve dosyaları indirme istemcisinden kaldıracaktır.", + "RemoveQueueItemsRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirilenleri ve dosyaları indirme istemcisinden kaldıracaktır.", + "Space": "Boşluk", + "Theme": "Tema", + "Underscore": "Vurgula", + "OnApplicationUpdate": "Uygulama Güncellemesinde", + "SizeLimit": "Boyut Limiti", + "OnHealthRestored": "Sağlığın İyileştirilmesi Hakkında", + "RemoveTagsAutomaticallyHelpText": "Koşullar karşılanmazsa otomatik etiketlemeyi kaldırın", + "UpdateAvailable": "Yeni güncelleme mevcut", + "NotificationsTelegramSettingsIncludeAppName": "{appName}'i Başlığa dahil et", + "NotificationsTelegramSettingsIncludeAppNameHelpText": "Farklı uygulamalardan gelen bildirimleri ayırt etmek için isteğe bağlı olarak mesaj başlığının önüne {appName} ekleyin", + "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", + "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ı", + "ThereWasAnErrorLoadingThisPage": "Sayfa yüklenirken bir hata oluştu", + "ResetDefinitions": "Tanımları Sıfırla", + "RootFolderPath": "Kök Klasör Yolu", + "RemoveCompleted": "Tamamlananları Kaldır", + "RemoveFailed": "Başarısızları Kaldır", + "RemoveSelectedItems": "Seçili öğeleri kaldır", + "RemoveTagsAutomatically": "Otomatik Etiketlemeyi Kaldır", + "Started": "Başlatıldı", + "RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır", + "RegularExpressionsTutorialLink": "Normal ifadelerle ilgili daha fazla ayrıntıyı [burada](https://www.regular-expressions.info/tutorial.html) bulabilirsiniz.", + "SelectReleaseGroup": "Yayımlama Grubunu Seçin", + "QueueFilterHasNoItems": "Seçilen kuyruk filtresinde hiç öğe yok", + "NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları", + "PreferProtocol": "{preferredProtocol}'u tercih edin" } diff --git a/src/NzbDrone.Core/Localization/Core/uk.json b/src/NzbDrone.Core/Localization/Core/uk.json index 869010fb3..3daf5ac41 100644 --- a/src/NzbDrone.Core/Localization/Core/uk.json +++ b/src/NzbDrone.Core/Localization/Core/uk.json @@ -1,7 +1,7 @@ { "About": "Про нас", "Actions": "Дії", - "AddingTag": "Додавання тегу", + "AddingTag": "Додавання тега", "AddListExclusion": "Додати виняток зі списку", "AgeWhenGrabbed": "Вік (коли схоплено)", "AutoRedownloadFailedHelpText": "Автоматичний пошук і спроба завантажити інший випуск", @@ -541,5 +541,9 @@ "20MinutesTwenty": "20 хвилин: {0}", "45MinutesFourtyFive": "45 хвилин: {0}", "60MinutesSixty": "60 хвилин: {0}", - "AddAlbumWithTitle": "Додати {albumTitle}" + "AddAlbumWithTitle": "Додати {albumTitle}", + "AddNewAlbum": "Додати новий альбом", + "AddNewAlbumSearchForNewAlbum": "Почати пошук нового альбому", + "AddToDownloadQueue": "Додати до черги завантажень", + "AlbumDetails": "Деталі альбому" } From 94bb8a436b88dde3ceef191f7052e7d055d8b47d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 6 May 2024 21:24:34 +0300 Subject: [PATCH 137/491] Fixed: Parsing long downloading/seeding values from Transmission (cherry picked from commit 8360dd7a7bab1dfb49a40aae382b47e9253d9fd1) --- .../Download/Clients/Transmission/TransmissionTorrent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs index 70ab8a3b9..9e97b94bc 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs @@ -11,8 +11,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission public bool IsFinished { get; set; } public long Eta { get; set; } public TransmissionTorrentStatus Status { get; set; } - public int SecondsDownloading { get; set; } - public int SecondsSeeding { get; set; } + public long SecondsDownloading { get; set; } + public long SecondsSeeding { get; set; } public string ErrorString { get; set; } public long DownloadedEver { get; set; } public long UploadedEver { get; set; } From 596a36d45ff8444fbe9dad0a182c154be5f2ea62 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 10 May 2024 00:50:52 +0300 Subject: [PATCH 138/491] Fixed: Notifications with only On Rename enabled --- src/NzbDrone.Core/Notifications/NotificationDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NzbDrone.Core/Notifications/NotificationDefinition.cs b/src/NzbDrone.Core/Notifications/NotificationDefinition.cs index f5f4e2f05..5c35fe128 100644 --- a/src/NzbDrone.Core/Notifications/NotificationDefinition.cs +++ b/src/NzbDrone.Core/Notifications/NotificationDefinition.cs @@ -32,6 +32,6 @@ namespace NzbDrone.Core.Notifications public bool SupportsOnTrackRetag { get; set; } public bool SupportsOnApplicationUpdate { get; set; } - public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnArtistAdd || OnArtistDelete || OnAlbumDelete || OnHealthIssue || OnHealthRestored || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate; + public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnRename || OnArtistAdd || OnArtistDelete || OnAlbumDelete || OnHealthIssue || OnHealthRestored || OnDownloadFailure || OnImportFailure || OnTrackRetag || OnApplicationUpdate; } } From 31f342b8ad370cf7ba4f3a07cf80303d7c441c48 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 7 May 2024 00:21:50 +0300 Subject: [PATCH 139/491] Use number input for seed ratio (cherry picked from commit 1eddf3a152fae04142263c02a3e3b317ff2feeb2) Plus translations Closes #4802 --- src/Lidarr.Http/ClientSchema/SchemaBuilder.cs | 2 +- src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs | 4 ++-- src/NzbDrone.Core/Localization/Core/en.json | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs b/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs index 1ffa7ff8c..7b71a73a7 100644 --- a/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs +++ b/src/Lidarr.Http/ClientSchema/SchemaBuilder.cs @@ -161,7 +161,7 @@ namespace Lidarr.Http.ClientSchema field.Hidden = fieldAttribute.Hidden.ToString().FirstCharToLower(); } - if (fieldAttribute.Type is FieldType.Number && propertyInfo.PropertyType == typeof(double)) + if (fieldAttribute.Type is FieldType.Number && (propertyInfo.PropertyType == typeof(double) || propertyInfo.PropertyType == typeof(double?))) { field.IsFloat = true; } diff --git a/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs b/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs index 04f7ee040..741de03c4 100644 --- a/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs +++ b/src/NzbDrone.Core/Indexers/SeedCriteriaSettings.cs @@ -48,10 +48,10 @@ namespace NzbDrone.Core.Indexers public class SeedCriteriaSettings { - [FieldDefinition(0, Type = FieldType.Textbox, Label = "Seed Ratio", HelpText = "The ratio a torrent should reach before stopping, empty is download client's default. Ratio should be at least 1.0 and follow the indexers rules")] + [FieldDefinition(0, Type = FieldType.Number, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")] public double? SeedRatio { get; set; } - [FieldDefinition(1, Type = FieldType.Textbox, Label = "Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)] + [FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)] public int? SeedTime { get; set; } [FieldDefinition(2, Type = FieldType.Textbox, Label = "Discography Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)] diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index c8d813d70..c645ce654 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -594,6 +594,10 @@ "IndexerSettings": "Indexer Settings", "IndexerSettingsRejectBlocklistedTorrentHashes": "Reject Blocklisted Torrent Hashes While Grabbing", "IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", + "IndexerSettingsSeedRatio": "Seed Ratio", + "IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules", + "IndexerSettingsSeedTime": "Seed Time", + "IndexerSettingsSeedTimeHelpText": "The time a torrent should be seeded before stopping, empty uses the download client's default", "IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures", "IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}", "IndexerTagHelpText": "Only use this indexer for artist with at least one matching tag. Leave blank to use with all artists.", From 9da690f807b3476b86cb6b3b7a1d11a8fa243104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Thomas?= Date: Thu, 9 May 2024 03:41:59 +0200 Subject: [PATCH 140/491] New: Support stoppedUP and stoppedDL states from qBittorrent (cherry picked from commit 73a4bdea5247ee87e6bbae95f5325e1f03c88a7f) Closes #4795 --- .../QBittorrentTests/QBittorrentFixture.cs | 120 ++++++++++-------- .../Clients/QBittorrent/QBittorrent.cs | 8 +- 2 files changed, 74 insertions(+), 54 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index 07f1c664e..8757e713a 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -178,8 +178,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests VerifyWarning(item); } - [Test] - public void paused_item_should_have_required_properties() + [TestCase("pausedDL")] + [TestCase("stoppedDL")] + public void paused_item_should_have_required_properties(string state) { var torrent = new QBittorrentTorrent { @@ -188,7 +189,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedDL", + State = state, Label = "", SavePath = "" }; @@ -200,6 +201,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests } [TestCase("pausedUP")] + [TestCase("stoppedUP")] [TestCase("queuedUP")] [TestCase("uploading")] [TestCase("stalledUP")] @@ -417,8 +419,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.RemainingTime.Should().NotHaveValue(); } - [Test] - public void api_261_should_use_content_path() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void api_261_should_use_content_path(string state) { var torrent = new QBittorrentTorrent { @@ -427,7 +430,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedUP", + State = state, Label = "", SavePath = @"C:\Torrents".AsOsAgnostic(), ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic() @@ -655,44 +658,48 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set(string state) { GivenGlobalSeedLimits(-1); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(1.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(2.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 1.0f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state) { GivenGlobalSeedLimits(0.2f); - GivenCompletedTorrent("pausedUP", ratio: 0.5f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 0.5f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -710,33 +717,36 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 40); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -754,66 +764,72 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused(string state) { GivenGlobalSeedLimits(2.0f, 20); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, seedingTime: 30); + GivenCompletedTorrent(state, ratio: 1.0f, seedingTime: 30); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused(string state) { GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); + GivenCompletedTorrent(state, ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds()); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_fetch_details_twice() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_fetch_details_twice(string state) { GivenGlobalSeedLimits(-1, 30); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -825,8 +841,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests .Verify(p => p.GetTorrentProperties(It.IsAny(), It.IsAny()), Times.Once()); } - [Test] - public void should_get_category_from_the_category_if_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_category_if_set(string state) { const string category = "music-lidarr"; GivenGlobalSeedLimits(1.0f); @@ -838,7 +855,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Category = category, SavePath = "", Ratio = 1.0f @@ -850,8 +867,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.Category.Should().Be(category); } - [Test] - public void should_get_category_from_the_label_if_the_category_is_not_available() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_label_if_the_category_is_not_available(string state) { const string category = "music-lidarr"; GivenGlobalSeedLimits(1.0f); @@ -863,7 +881,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Label = category, SavePath = "", Ratio = 1.0f diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index a1b5d9071..7452b3d0a 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -237,7 +237,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent // Avoid removing torrents that haven't reached the global max ratio. // Removal also requires the torrent to be paused, in case a higher max ratio was set on the torrent itself (which is not exposed by the api). - item.CanMoveFiles = item.CanBeRemoved = torrent.State == "pausedUP" && HasReachedSeedLimit(torrent, config); + item.CanMoveFiles = item.CanBeRemoved = torrent.State is "pausedUP" or "stoppedUP" && HasReachedSeedLimit(torrent, config); switch (torrent.State) { @@ -246,7 +246,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Message = "qBittorrent is reporting an error"; break; - case "pausedDL": // torrent is paused and has NOT finished downloading + case "stoppedDL": // torrent is stopped and has NOT finished downloading + case "pausedDL": // torrent is paused and has NOT finished downloading (qBittorrent < 5) item.Status = DownloadItemStatus.Paused; break; @@ -257,7 +258,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Status = DownloadItemStatus.Queued; break; - case "pausedUP": // torrent is paused and has finished downloading + case "pausedUP": // torrent is paused and has finished downloading (qBittorent < 5) + case "stoppedUP": // torrent is stopped and has finished downloading case "uploading": // torrent is being seeded and data is being transferred case "stalledUP": // torrent is being seeded, but no connection were made case "queuedUP": // queuing is enabled and torrent is queued for upload From 9f8c4530cabc761e84d1c6006bd29d7bb8191b2d Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 3 May 2024 20:53:03 -0700 Subject: [PATCH 141/491] New: Dark theme for login screen (cherry picked from commit cae134ec7b331d1c906343716472f3d043614b2c) Closes #4798 --- frontend/src/App/App.js | 9 +- frontend/src/App/ApplyTheme.js | 50 ---------- frontend/src/App/ApplyTheme.tsx | 37 ++++++++ frontend/src/Styles/Themes/index.js | 2 +- frontend/src/login.html | 93 +++++++++++++++---- frontend/src/typings/UiSettings.ts | 1 + .../Frontend/Mappers/HtmlMapperBase.cs | 2 +- .../Frontend/Mappers/LoginHtmlMapper.cs | 13 +++ 8 files changed, 131 insertions(+), 76 deletions(-) delete mode 100644 frontend/src/App/ApplyTheme.js create mode 100644 frontend/src/App/ApplyTheme.tsx diff --git a/frontend/src/App/App.js b/frontend/src/App/App.js index 3871b14e9..9e8d508ac 100644 --- a/frontend/src/App/App.js +++ b/frontend/src/App/App.js @@ -12,11 +12,10 @@ function App({ store, history }) { - - - - - + + + + diff --git a/frontend/src/App/ApplyTheme.js b/frontend/src/App/ApplyTheme.js deleted file mode 100644 index 7e937e586..000000000 --- a/frontend/src/App/ApplyTheme.js +++ /dev/null @@ -1,50 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Fragment, useCallback, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import themes from 'Styles/Themes'; - -function createMapStateToProps() { - return createSelector( - (state) => state.settings.ui.item.theme || window.Lidarr.theme, - ( - theme - ) => { - return { - theme - }; - } - ); -} - -function ApplyTheme({ theme, children }) { - // Update the CSS Variables - - const updateCSSVariables = useCallback(() => { - const arrayOfVariableKeys = Object.keys(themes[theme]); - const arrayOfVariableValues = Object.values(themes[theme]); - - // Loop through each array key and set the CSS Variables - arrayOfVariableKeys.forEach((cssVariableKey, index) => { - // Based on our snippet from MDN - document.documentElement.style.setProperty( - `--${cssVariableKey}`, - arrayOfVariableValues[index] - ); - }); - }, [theme]); - - // On Component Mount and Component Update - useEffect(() => { - updateCSSVariables(theme); - }, [updateCSSVariables, theme]); - - return {children}; -} - -ApplyTheme.propTypes = { - theme: PropTypes.string.isRequired, - children: PropTypes.object.isRequired -}; - -export default connect(createMapStateToProps)(ApplyTheme); diff --git a/frontend/src/App/ApplyTheme.tsx b/frontend/src/App/ApplyTheme.tsx new file mode 100644 index 000000000..e04dda8c4 --- /dev/null +++ b/frontend/src/App/ApplyTheme.tsx @@ -0,0 +1,37 @@ +import React, { Fragment, ReactNode, useCallback, useEffect } from 'react'; +import { useSelector } from 'react-redux'; +import { createSelector } from 'reselect'; +import themes from 'Styles/Themes'; +import AppState from './State/AppState'; + +interface ApplyThemeProps { + children: ReactNode; +} + +function createThemeSelector() { + return createSelector( + (state: AppState) => state.settings.ui.item.theme || window.Lidarr.theme, + (theme) => { + return theme; + } + ); +} + +function ApplyTheme({ children }: ApplyThemeProps) { + const theme = useSelector(createThemeSelector()); + + const updateCSSVariables = useCallback(() => { + Object.entries(themes[theme]).forEach(([key, value]) => { + document.documentElement.style.setProperty(`--${key}`, value); + }); + }, [theme]); + + // On Component Mount and Component Update + useEffect(() => { + updateCSSVariables(); + }, [updateCSSVariables, theme]); + + return {children}; +} + +export default ApplyTheme; diff --git a/frontend/src/Styles/Themes/index.js b/frontend/src/Styles/Themes/index.js index d93c5dd8c..4dec39164 100644 --- a/frontend/src/Styles/Themes/index.js +++ b/frontend/src/Styles/Themes/index.js @@ -2,7 +2,7 @@ import * as dark from './dark'; import * as light from './light'; const defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches; -const auto = defaultDark ? { ...dark } : { ...light }; +const auto = defaultDark ? dark : light; export default { auto, diff --git a/frontend/src/login.html b/frontend/src/login.html index 9474c8544..874a7c426 100644 --- a/frontend/src/login.html +++ b/frontend/src/login.html @@ -57,8 +57,8 @@