From 3ff9b8bd8546e0260a9a1c3e37ba31d57ec58e71 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 29 Feb 2024 06:43:28 +0200 Subject: [PATCH 001/446] 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 002/446] 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 003/446] 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 004/446] 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 005/446] 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 006/446] 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 007/446] 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 008/446] 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 009/446] 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 010/446] 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 011/446] 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 012/446] 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 013/446] 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 014/446] 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 015/446] 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 016/446] 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 017/446] 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 018/446] 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 019/446] 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 020/446] 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 021/446] 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 022/446] 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 023/446] 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 024/446] 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 025/446] 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 026/446] 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 027/446] 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 028/446] 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 029/446] 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 030/446] 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 031/446] 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 032/446] 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 033/446] 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 034/446] 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 035/446] 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 036/446] 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 037/446] 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 038/446] 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 039/446] 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 040/446] 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 041/446] 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 042/446] 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 043/446] 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 044/446] 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 045/446] 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 046/446] 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 047/446] 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 048/446] 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 049/446] 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 050/446] 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 051/446] 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 052/446] 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 053/446] 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 054/446] 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 055/446] 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 056/446] 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 057/446] 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 058/446] 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 059/446] 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 060/446] 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 061/446] 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 062/446] 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 063/446] 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 064/446] 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 068/446] 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 069/446] 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 070/446] 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 071/446] 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 072/446] 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 073/446] 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 074/446] 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 075/446] 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 076/446] 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 077/446] 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 078/446] 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 079/446] 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 080/446] 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 081/446] 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 082/446] 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 083/446] 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 084/446] 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 085/446] 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 086/446] 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 087/446] 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 088/446] 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 089/446] 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 090/446] 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 091/446] 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 092/446] 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 093/446] 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 094/446] 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 095/446] 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 096/446] 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 @@