mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-18 21:34:28 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 25114082a1 |
Vendored
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
"editor.formatOnSave": false,
|
"editor.formatOnSave": false,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll": "explicit"
|
"source.fixAll": true
|
||||||
},
|
},
|
||||||
|
|
||||||
"typescript.preferences.quoteStyle": "single",
|
"typescript.preferences.quoteStyle": "single",
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ module.exports = (env) => {
|
|||||||
output: {
|
output: {
|
||||||
path: distFolder,
|
path: distFolder,
|
||||||
publicPath: '/',
|
publicPath: '/',
|
||||||
filename: isProduction ? '[name]-[contenthash].js' : '[name].js',
|
filename: '[name]-[contenthash].js',
|
||||||
sourceMapFilename: '[file].map'
|
sourceMapFilename: '[file].map'
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ module.exports = (env) => {
|
|||||||
|
|
||||||
new MiniCssExtractPlugin({
|
new MiniCssExtractPlugin({
|
||||||
filename: 'Content/styles.css',
|
filename: 'Content/styles.css',
|
||||||
chunkFilename: isProduction ? 'Content/[id]-[chunkhash].css' : 'Content/[id].css'
|
chunkFilename: 'Content/[id]-[chunkhash].css'
|
||||||
}),
|
}),
|
||||||
|
|
||||||
new HtmlWebpackPlugin({
|
new HtmlWebpackPlugin({
|
||||||
@@ -202,7 +202,7 @@ module.exports = (env) => {
|
|||||||
options: {
|
options: {
|
||||||
importLoaders: 1,
|
importLoaders: 1,
|
||||||
modules: {
|
modules: {
|
||||||
localIdentName: isProduction ? '[name]/[local]/[hash:base64:5]' : '[name]/[local]'
|
localIdentName: '[name]/[local]/[hash:base64:5]'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
|
}
|
||||||
&.isDisabled {
|
|
||||||
color: var(--disabledColor);
|
.isDisabled {
|
||||||
cursor: not-allowed;
|
color: var(--disabledColor);
|
||||||
}
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,17 @@
|
|||||||
.leftButtons,
|
.leftButtons,
|
||||||
.rightButtons {
|
.rightButtons {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1 0 50%;
|
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftButtons {
|
||||||
|
flex: 0 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rightButtons {
|
.rightButtons {
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
flex: 1 1 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.importMode,
|
.importMode,
|
||||||
@@ -31,6 +36,7 @@
|
|||||||
composes: select from '~Components/Form/SelectInput.css';
|
composes: select from '~Components/Form/SelectInput.css';
|
||||||
|
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
|
max-width: 100%;
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,10 +49,12 @@
|
|||||||
.leftButtons,
|
.leftButtons,
|
||||||
.rightButtons {
|
.rightButtons {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
gap: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leftButtons {
|
.leftButtons {
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
|
max-width: fit-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rightButtons {
|
.rightButtons {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
@@ -14,11 +15,11 @@ function createMapStateToProps() {
|
|||||||
(state) => state.settings.advancedSettings,
|
(state) => state.settings.advancedSettings,
|
||||||
(state) => state.settings.namingExamples,
|
(state) => state.settings.namingExamples,
|
||||||
createSettingsSectionSelector(SECTION),
|
createSettingsSectionSelector(SECTION),
|
||||||
(advancedSettings, namingExamples, sectionSettings) => {
|
(advancedSettings, examples, sectionSettings) => {
|
||||||
return {
|
return {
|
||||||
advancedSettings,
|
advancedSettings,
|
||||||
examples: namingExamples.item,
|
examples: examples.item,
|
||||||
examplesPopulated: namingExamples.isPopulated,
|
examplesPopulated: !_.isEmpty(examples.item),
|
||||||
...sectionSettings
|
...sectionSettings
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
<PackageVersion Include="AutoFixture" Version="4.17.0" />
|
<PackageVersion Include="AutoFixture" Version="4.17.0" />
|
||||||
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
|
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
|
||||||
<PackageVersion Include="Dapper" Version="2.0.151" />
|
<PackageVersion Include="Dapper" Version="2.0.151" />
|
||||||
<PackageVersion Include="Diacritical.Net" Version="1.0.4" />
|
|
||||||
<PackageVersion Include="DryIoc.dll" Version="5.4.3" />
|
<PackageVersion Include="DryIoc.dll" Version="5.4.3" />
|
||||||
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
||||||
<PackageVersion Include="Equ" Version="2.3.0" />
|
<PackageVersion Include="Equ" Version="2.3.0" />
|
||||||
@@ -66,4 +65,4 @@
|
|||||||
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
||||||
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -89,10 +89,6 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
|||||||
[TestCase(@"https://discord.com/api/webhooks/mySecret")]
|
[TestCase(@"https://discord.com/api/webhooks/mySecret")]
|
||||||
[TestCase(@"https://discord.com/api/webhooks/mySecret/01233210")]
|
[TestCase(@"https://discord.com/api/webhooks/mySecret/01233210")]
|
||||||
|
|
||||||
// Telegram
|
|
||||||
[TestCase(@"https://api.telegram.org/bot1234567890:mySecret/sendmessage: chat_id=123456&parse_mode=HTML&text=<text>")]
|
|
||||||
[TestCase(@"https://api.telegram.org/bot1234567890:mySecret/")]
|
|
||||||
|
|
||||||
public void should_clean_message(string message)
|
public void should_clean_message(string message)
|
||||||
{
|
{
|
||||||
var cleansedMessage = CleanseLogMessage.Cleanse(message);
|
var cleansedMessage = CleanseLogMessage.Cleanse(message);
|
||||||
|
|||||||
@@ -54,10 +54,7 @@ namespace NzbDrone.Common.Instrumentation
|
|||||||
new (@"api/v[0-9]/notification/readarr/(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
new (@"api/v[0-9]/notification/readarr/(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||||
|
|
||||||
// Discord
|
// Discord
|
||||||
new (@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
new (@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
|
||||||
|
|
||||||
// Telegram
|
|
||||||
new (@"api.telegram.org/bot(?<id>[\d]+):(?<secret>[\w-]+)/", RegexOptions.Compiled | RegexOptions.IgnoreCase)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
|
private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
|
||||||
|
|||||||
+2
-5
@@ -49,13 +49,10 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void magnet_download_should_be_returned_as_queued()
|
public void magnet_download_should_not_return_the_item()
|
||||||
{
|
{
|
||||||
PrepareClientToReturnMagnetItem();
|
PrepareClientToReturnMagnetItem();
|
||||||
|
Subject.GetItems().Count().Should().Be(0);
|
||||||
var item = Subject.GetItems().Single();
|
|
||||||
|
|
||||||
item.Status.Should().Be(DownloadItemStatus.Queued);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -60,10 +60,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests
|
|||||||
public void magnet_download_should_not_return_the_item()
|
public void magnet_download_should_not_return_the_item()
|
||||||
{
|
{
|
||||||
PrepareClientToReturnMagnetItem();
|
PrepareClientToReturnMagnetItem();
|
||||||
|
Subject.GetItems().Count().Should().Be(0);
|
||||||
var item = Subject.GetItems().Single();
|
|
||||||
|
|
||||||
item.Status.Should().Be(DownloadItemStatus.Queued);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using NzbDrone.Core.Test.Framework;
|
|||||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
||||||
{
|
{
|
||||||
private MetadataProfile _metadataProfile;
|
private MetadataProfile _metadataProfile;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ using NzbDrone.Test.Common;
|
|||||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ namespace NzbDrone.Core.Configuration
|
|||||||
// TODO: Change back to "master" for the first stable release
|
// TODO: Change back to "master" for the first stable release
|
||||||
public string Branch => _updateOptions.Branch ?? GetValue("Branch", "develop").ToLowerInvariant();
|
public string Branch => _updateOptions.Branch ?? GetValue("Branch", "develop").ToLowerInvariant();
|
||||||
|
|
||||||
public string LogLevel => _logOptions.Level ?? GetValue("LogLevel", "debug").ToLowerInvariant();
|
public string LogLevel => _logOptions.Level ?? GetValue("LogLevel", "info").ToLowerInvariant();
|
||||||
public string ConsoleLogLevel => _logOptions.ConsoleLevel ?? GetValue("ConsoleLogLevel", string.Empty, persist: false);
|
public string ConsoleLogLevel => _logOptions.ConsoleLevel ?? GetValue("ConsoleLogLevel", string.Empty, persist: false);
|
||||||
|
|
||||||
public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false);
|
public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false);
|
||||||
@@ -357,7 +357,7 @@ namespace NzbDrone.Core.Configuration
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL
|
// If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL
|
||||||
if (EnableSsl && (GetValue("SslCertHash", string.Empty, false).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace()))
|
if (EnableSsl && (GetValue("SslCertHash", null).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace()))
|
||||||
{
|
{
|
||||||
SetValue("EnableSsl", false);
|
SetValue("EnableSsl", false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,12 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||||||
|
|
||||||
foreach (var torrent in torrents)
|
foreach (var torrent in torrents)
|
||||||
{
|
{
|
||||||
|
// If totalsize == 0 the torrent is a magnet downloading metadata
|
||||||
|
if (torrent.TotalSize == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
var outputPath = new OsPath(torrent.DownloadDir);
|
var outputPath = new OsPath(torrent.DownloadDir);
|
||||||
|
|
||||||
if (Settings.TvDirectory.IsNotNullOrWhiteSpace())
|
if (Settings.TvDirectory.IsNotNullOrWhiteSpace())
|
||||||
@@ -91,10 +97,6 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
|||||||
item.Status = DownloadItemStatus.Warning;
|
item.Status = DownloadItemStatus.Warning;
|
||||||
item.Message = torrent.ErrorString;
|
item.Message = torrent.ErrorString;
|
||||||
}
|
}
|
||||||
else if (torrent.TotalSize == 0)
|
|
||||||
{
|
|
||||||
item.Status = DownloadItemStatus.Queued;
|
|
||||||
}
|
|
||||||
else if (torrent.LeftUntilDone == 0 && (torrent.Status == TransmissionTorrentStatus.Stopped ||
|
else if (torrent.LeftUntilDone == 0 && (torrent.Status == TransmissionTorrentStatus.Stopped ||
|
||||||
torrent.Status == TransmissionTorrentStatus.Seeding ||
|
torrent.Status == TransmissionTorrentStatus.Seeding ||
|
||||||
torrent.Status == TransmissionTorrentStatus.SeedingWait))
|
torrent.Status == TransmissionTorrentStatus.SeedingWait))
|
||||||
|
|||||||
@@ -615,7 +615,7 @@
|
|||||||
"NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}",
|
"NotificationStatusSingleClientHealthCheckMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}",
|
||||||
"SomeResultsAreHiddenByTheAppliedFilter": "بعض النتائج مخفية بواسطة عامل التصفية المطبق",
|
"SomeResultsAreHiddenByTheAppliedFilter": "بعض النتائج مخفية بواسطة عامل التصفية المطبق",
|
||||||
"ConnectionLost": "انقطع الاتصال",
|
"ConnectionLost": "انقطع الاتصال",
|
||||||
"ConnectionLostReconnect": "سيحاول {appName} الاتصال تلقائيًا ، أو يمكنك النقر فوق إعادة التحميل أدناه.",
|
"ConnectionLostReconnect": "سيحاول Radarr الاتصال تلقائيًا ، أو يمكنك النقر فوق إعادة التحميل أدناه.",
|
||||||
"LastDuration": "المدة الماضية",
|
"LastDuration": "المدة الماضية",
|
||||||
"Large": "كبير",
|
"Large": "كبير",
|
||||||
"WhatsNew": "ما هو الجديد؟",
|
"WhatsNew": "ما هو الجديد؟",
|
||||||
|
|||||||
@@ -699,19 +699,5 @@
|
|||||||
"ChangeCategory": "Změnit kategorii",
|
"ChangeCategory": "Změnit kategorii",
|
||||||
"BlocklistMultipleOnlyHint": "Blokovat a nehledat náhradu",
|
"BlocklistMultipleOnlyHint": "Blokovat a nehledat náhradu",
|
||||||
"CustomFormatsSettingsTriggerInfo": "Vlastní formát se použije na vydání nebo soubor, pokud odpovídá alespoň jednomu z různých typů zvolených podmínek.",
|
"CustomFormatsSettingsTriggerInfo": "Vlastní formát se použije na vydání nebo soubor, pokud odpovídá alespoň jednomu z různých typů zvolených podmínek.",
|
||||||
"ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}",
|
"ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}"
|
||||||
"AuthBasic": "Základní (vyskakovací okno prohlížeče)",
|
|
||||||
"AuthenticationMethod": "Metoda ověřování",
|
|
||||||
"AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování",
|
|
||||||
"AuthenticationRequired": "Vyžadované ověření",
|
|
||||||
"AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Pokud nerozumíte rizikům, neměňte je.",
|
|
||||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo",
|
|
||||||
"AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo",
|
|
||||||
"AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno",
|
|
||||||
"AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.",
|
|
||||||
"BlocklistOnlyHint": "Blokovat a nehledat náhradu",
|
|
||||||
"Enabled": "Povoleno",
|
|
||||||
"ApiKey": "Klíč API",
|
|
||||||
"AuthForm": "Formuláře (přihlašovací stránka)",
|
|
||||||
"DisabledForLocalAddresses": "Zakázáno pro místní adresy"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -896,7 +896,7 @@
|
|||||||
"DataListMonitorNone": "No monitorizar autores o libros",
|
"DataListMonitorNone": "No monitorizar autores o libros",
|
||||||
"Iso639-3": "Códigos de idioma ISO 639-3, o 'nulo', separados por coma",
|
"Iso639-3": "Códigos de idioma ISO 639-3, o 'nulo', separados por coma",
|
||||||
"MinPopularityHelpText": "Popularidad es la media de valoraciones * número de votos",
|
"MinPopularityHelpText": "Popularidad es la media de valoraciones * número de votos",
|
||||||
"DeleteSelected": "Borrar seleccionados",
|
"DeleteSelected": "Eliminar seleccionados",
|
||||||
"IsExpandedShowFileInfo": "Mostrar información de archivo",
|
"IsExpandedShowFileInfo": "Mostrar información de archivo",
|
||||||
"MassBookSearchWarning": "¿Estás seguro que quieres llevar a cabo una búsqueda masiva para {0} libros?",
|
"MassBookSearchWarning": "¿Estás seguro que quieres llevar a cabo una búsqueda masiva para {0} libros?",
|
||||||
"MonitorNewItemsHelpText": "Qué nuevos libros deberían ser monitorizados",
|
"MonitorNewItemsHelpText": "Qué nuevos libros deberían ser monitorizados",
|
||||||
|
|||||||
@@ -551,7 +551,7 @@
|
|||||||
"OnBookFileDeleteForUpgradeHelpText": "Lors de la suppression du fichier d'un livre pour la mise à niveau",
|
"OnBookFileDeleteForUpgradeHelpText": "Lors de la suppression du fichier d'un livre pour la mise à niveau",
|
||||||
"OnBookFileDeleteHelpText": "Lors de la suppression du fichier d'un livre",
|
"OnBookFileDeleteHelpText": "Lors de la suppression du fichier d'un livre",
|
||||||
"OnGrab": "Lors de la saisie",
|
"OnGrab": "Lors de la saisie",
|
||||||
"OnHealthIssue": "Lors de problème de santé",
|
"OnHealthIssue": "Sur la question de la santé",
|
||||||
"OnRename": "Au renommage",
|
"OnRename": "Au renommage",
|
||||||
"ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode : {0}",
|
"ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode : {0}",
|
||||||
"ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}",
|
"ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}",
|
||||||
@@ -679,7 +679,7 @@
|
|||||||
"CopyToClipboard": "Copier dans le presse-papier",
|
"CopyToClipboard": "Copier dans le presse-papier",
|
||||||
"CustomFormat": "Format personnalisé",
|
"CustomFormat": "Format personnalisé",
|
||||||
"CustomFormatSettings": "Réglages Formats Personnalisés",
|
"CustomFormatSettings": "Réglages Formats Personnalisés",
|
||||||
"CustomFormats": "Formats personnalisés",
|
"CustomFormats": "Formats perso.",
|
||||||
"DeleteCustomFormat": "Supprimer le format personnalisé",
|
"DeleteCustomFormat": "Supprimer le format personnalisé",
|
||||||
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
|
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
|
||||||
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag « {0} » ?",
|
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag « {0} » ?",
|
||||||
@@ -766,7 +766,7 @@
|
|||||||
"ConnectionLostToBackend": "{appName} a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.",
|
"ConnectionLostToBackend": "{appName} a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.",
|
||||||
"RecentChanges": "Changements récents",
|
"RecentChanges": "Changements récents",
|
||||||
"System": "Système",
|
"System": "Système",
|
||||||
"WhatsNew": "Quoi de neuf ?",
|
"WhatsNew": "Quoi de neuf ?",
|
||||||
"AllResultsAreHiddenByTheAppliedFilter": "Tous les résultats sont masqués par le filtre appliqué",
|
"AllResultsAreHiddenByTheAppliedFilter": "Tous les résultats sont masqués par le filtre appliqué",
|
||||||
"Location": "Emplacement",
|
"Location": "Emplacement",
|
||||||
"NoResultsFound": "Aucun résultat trouvé",
|
"NoResultsFound": "Aucun résultat trouvé",
|
||||||
@@ -923,7 +923,7 @@
|
|||||||
"ExtraFileExtensionsHelpText": "Liste de fichiers supplémentaires séparés par des virgules à importer (.nfo sera importé en tant que .nfo-orig)",
|
"ExtraFileExtensionsHelpText": "Liste de fichiers supplémentaires séparés par des virgules à importer (.nfo sera importé en tant que .nfo-orig)",
|
||||||
"ExtraFileExtensionsHelpTextsExamples": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
"ExtraFileExtensionsHelpTextsExamples": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
||||||
"UseSSL": "Utiliser SSL",
|
"UseSSL": "Utiliser SSL",
|
||||||
"DeleteSelected": "Supprimer la sélection",
|
"DeleteSelected": "Supprimer sélectionnée",
|
||||||
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres",
|
"InvalidUILanguage": "Votre interface utilisateur est définie sur une langue non valide, corrigez-la et enregistrez vos paramètres",
|
||||||
"DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu",
|
"DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu",
|
||||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)",
|
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)",
|
||||||
@@ -990,9 +990,9 @@
|
|||||||
"InteractiveSearchModalHeader": "Recherche interactive",
|
"InteractiveSearchModalHeader": "Recherche interactive",
|
||||||
"FailedLoadingSearchResults": "Échec du chargement des résultats de recherche, veuillez réessayer.",
|
"FailedLoadingSearchResults": "Échec du chargement des résultats de recherche, veuillez réessayer.",
|
||||||
"MonitoredAuthorIsMonitored": "Artiste non surveillé",
|
"MonitoredAuthorIsMonitored": "Artiste non surveillé",
|
||||||
"IndexerSettingsSeedRatio": "Ratio d'envoi",
|
"IndexerSettingsSeedRatio": "Ratio d'envoie",
|
||||||
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
|
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
|
||||||
"IndexerSettingsSeedTime": "Temps d'envoi",
|
"IndexerSettingsSeedTime": "Temps d'envoie",
|
||||||
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
|
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
|
||||||
"WhySearchesCouldBeFailing": "Cliquez ici pour savoir pourquoi les recherches pourraient échouer",
|
"WhySearchesCouldBeFailing": "Cliquez ici pour savoir pourquoi les recherches pourraient échouer",
|
||||||
"ApiKey": "Clé API",
|
"ApiKey": "Clé API",
|
||||||
@@ -1099,7 +1099,5 @@
|
|||||||
"WriteTagsAll": "Tous les fichiers ; importation initiale uniquement",
|
"WriteTagsAll": "Tous les fichiers ; importation initiale uniquement",
|
||||||
"WriteTagsSync": "Tous les fichiers ; rester synchronisé avec Goodreads",
|
"WriteTagsSync": "Tous les fichiers ; rester synchronisé avec Goodreads",
|
||||||
"Iso639-3": "Codes de langage ISO 639-3, ou 'null', séparés par des virgules",
|
"Iso639-3": "Codes de langage ISO 639-3, ou 'null', séparés par des virgules",
|
||||||
"SpecificBook": "Livre spécifique",
|
"SpecificBook": "Livre spécifique"
|
||||||
"SkipSecondarySeriesBooks": "Sauter les livres de séries secondaires",
|
|
||||||
"SkipPartBooksAndSets": "Livres et coffrets \"Skip part\""
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
"DelayingDownloadUntilInterp": "Ritardare il download fino al {0} a {1}",
|
"DelayingDownloadUntilInterp": "Ritardare il download fino al {0} a {1}",
|
||||||
"Delete": "Cancella",
|
"Delete": "Cancella",
|
||||||
"DeleteBackup": "Cancella Backup",
|
"DeleteBackup": "Cancella Backup",
|
||||||
"DeleteBackupMessageText": "Sei sicuro di voler eliminare il backup '{name}'?",
|
"DeleteBackupMessageText": "Sei sicuro di voler cancellare il backup '{name}'?",
|
||||||
"DeleteDelayProfile": "Elimina Profilo di Ritardo",
|
"DeleteDelayProfile": "Elimina Profilo di Ritardo",
|
||||||
"DeleteDelayProfileMessageText": "Sei sicuro di volere eliminare questo profilo di ritardo?",
|
"DeleteDelayProfileMessageText": "Sei sicuro di volere eliminare questo profilo di ritardo?",
|
||||||
"DeleteDownloadClient": "Cancella Client di Download",
|
"DeleteDownloadClient": "Cancella Client di Download",
|
||||||
@@ -89,9 +89,9 @@
|
|||||||
"DeleteEmptyFoldersHelpText": "Cancellare le cartelle vuote dei film durante la scansione del disco e quando i file di film vengono cancellati",
|
"DeleteEmptyFoldersHelpText": "Cancellare le cartelle vuote dei film durante la scansione del disco e quando i file di film vengono cancellati",
|
||||||
"DeleteImportListExclusion": "Rimuovi Esclusione dalla Lista Importazioni",
|
"DeleteImportListExclusion": "Rimuovi Esclusione dalla Lista Importazioni",
|
||||||
"DeleteImportListExclusionMessageText": "Sei sicuro di voler cancellare questa lista di esclusioni delle importazioni?",
|
"DeleteImportListExclusionMessageText": "Sei sicuro di voler cancellare questa lista di esclusioni delle importazioni?",
|
||||||
"DeleteImportListMessageText": "Sei sicuro di voler eliminare la lista '{name}'?",
|
"DeleteImportListMessageText": "Sei sicuro di volere eliminare la lista '{name}'?",
|
||||||
"DeleteIndexer": "Cancella Indicizzatore",
|
"DeleteIndexer": "Cancella Indicizzatore",
|
||||||
"DeleteIndexerMessageText": "Sei sicuro di voler eliminare l'indicizzatore '{name}'?",
|
"DeleteIndexerMessageText": "Sicuro di voler eliminare l'indicizzatore '{name}'?",
|
||||||
"DeleteMetadataProfileMessageText": "Sicuro di voler cancellare il profilo di qualità '{name}'?",
|
"DeleteMetadataProfileMessageText": "Sicuro di voler cancellare il profilo di qualità '{name}'?",
|
||||||
"DeleteNotification": "Cancella Notifica",
|
"DeleteNotification": "Cancella Notifica",
|
||||||
"DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{name}'?",
|
"DeleteNotificationMessageText": "Sei sicuro di voler eliminare la notifica '{name}'?",
|
||||||
@@ -677,7 +677,7 @@
|
|||||||
"RemoveSelectedItem": "Rimuovi elemento selezionato",
|
"RemoveSelectedItem": "Rimuovi elemento selezionato",
|
||||||
"ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)",
|
"ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)",
|
||||||
"ApplyTagsHelpTextHowToApplyAuthors": "Come applicare etichette agli indicizzatori selezionati",
|
"ApplyTagsHelpTextHowToApplyAuthors": "Come applicare etichette agli indicizzatori selezionati",
|
||||||
"CountIndexersSelected": "{selectedCount} indicizzatori selezionati",
|
"CountIndexersSelected": "{selectedCount} indicizzatore(i) selezionato(i)",
|
||||||
"No": "No",
|
"No": "No",
|
||||||
"NoChange": "Nessun Cambio",
|
"NoChange": "Nessun Cambio",
|
||||||
"RemoveCompleted": "Rimuovi completati",
|
"RemoveCompleted": "Rimuovi completati",
|
||||||
@@ -898,7 +898,5 @@
|
|||||||
"ShouldMonitorExisting": "Monitora Libri Esistenti",
|
"ShouldMonitorExisting": "Monitora Libri Esistenti",
|
||||||
"UseSSL": "Usa SSL",
|
"UseSSL": "Usa SSL",
|
||||||
"Fixed": "Fissato",
|
"Fixed": "Fissato",
|
||||||
"MusicBrainzTrackID": "ID Libro MusicBrainz",
|
"MusicBrainzTrackID": "ID Libro MusicBrainz"
|
||||||
"CountImportListsSelected": "{selectedCount} autore/i selezionato/i",
|
|
||||||
"DownloadClientDelugeSettingsDirectory": "Cartella Download"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -739,20 +739,5 @@
|
|||||||
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
|
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
|
||||||
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
|
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
|
||||||
"Enabled": "Ingeschakeld",
|
"Enabled": "Ingeschakeld",
|
||||||
"ApiKey": "API-sleutel",
|
"ApiKey": "API-sleutel"
|
||||||
"ClickToChangeIndexerFlags": "Klik om indexeringsvlaggen te wijzigen",
|
|
||||||
"CustomFormatsSpecificationFlag": "Vlag",
|
|
||||||
"CustomFormatsSpecificationRegularExpression": "Reguliere expressie",
|
|
||||||
"BlocklistOnlyHint": "Blokkeer lijst zonder te zoeken naar een vervanger",
|
|
||||||
"BlocklistAndSearch": "Blokkeerlijst en zoeken",
|
|
||||||
"BlocklistAndSearchHint": "Een vervanger zoeken na het blokkeren",
|
|
||||||
"BlocklistAndSearchMultipleHint": "Zoekopdrachten voor vervangers starten na het blokkeren van de lijst",
|
|
||||||
"CustomFormatsSettingsTriggerInfo": "Een Aangepast Formaat wordt toegepast op een uitgave of bestand als het overeenkomt met ten minste één van de verschillende condities die zijn gekozen.",
|
|
||||||
"ConnectionSettingsUrlBaseHelpText": "Voegt een voorvoegsel toe aan de {connectionName} url, zoals {url}",
|
|
||||||
"BlocklistMultipleOnlyHint": "Blocklist zonder te zoeken naar vervangers",
|
|
||||||
"BlocklistOnly": "Alleen bloklijst",
|
|
||||||
"ChangeCategoryHint": "Verandert download naar de 'Post-Import Categorie' van Downloadclient",
|
|
||||||
"Clone": "Kloon",
|
|
||||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Aangepaste opmaak RegEx is hoofdletterongevoelig",
|
|
||||||
"ChangeCategoryMultipleHint": "Wijzigt downloads naar de 'Post-Import Categorie' van Downloadclient"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
"AddingTag": "Dodawanie tagu",
|
"AddingTag": "Dodawanie tagu",
|
||||||
"RemoveTagExistingTag": "Istniejący tag",
|
"RemoveTagExistingTag": "Istniejący tag",
|
||||||
"RemoveTagRemovingTag": "Usuwanie tagu",
|
"RemoveTagRemovingTag": "Usuwanie tagu",
|
||||||
"AgeWhenGrabbed": "Wiek (przy złapaniu)",
|
"AgeWhenGrabbed": "Wiek (po złapaniu)",
|
||||||
"ShowRelativeDates": "Pokaż daty względne",
|
"ShowRelativeDates": "Pokaż daty względne",
|
||||||
"AlreadyInYourLibrary": "Już w Twojej bibliotece",
|
"AlreadyInYourLibrary": "Już w Twojej bibliotece",
|
||||||
"AlternateTitles": "Alternatywny tytuł",
|
"AlternateTitles": "Alternatywny tytuł",
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"BackupRetentionHelpText": "Automatyczne kopie zapasowe starsze niż okres przechowywania zostaną automatycznie wyczyszczone",
|
"BackupRetentionHelpText": "Automatyczne kopie zapasowe starsze niż okres przechowywania zostaną automatycznie wyczyszczone",
|
||||||
"Backups": "Kopie zapasowe",
|
"Backups": "Kopie zapasowe",
|
||||||
"BindAddress": "Adres powiązania",
|
"BindAddress": "Adres powiązania",
|
||||||
"BindAddressHelpText": "Prawidłowy adres IP, localhost lub '*' dla wszystkich interfejsów",
|
"BindAddressHelpText": "Prawidłowy adres IPv4 lub „*” dla wszystkich interfejsów",
|
||||||
"BindAddressHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
|
"BindAddressHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
|
||||||
"BookIsDownloading": "Film jest pobierany",
|
"BookIsDownloading": "Film jest pobierany",
|
||||||
"BookIsDownloadingInterp": "Film jest pobierany - {0}% {1}",
|
"BookIsDownloadingInterp": "Film jest pobierany - {0}% {1}",
|
||||||
@@ -111,18 +111,18 @@
|
|||||||
"DelayingDownloadUntilInterp": "Opóźnianie pobierania do {0} o {1}",
|
"DelayingDownloadUntilInterp": "Opóźnianie pobierania do {0} o {1}",
|
||||||
"Delete": "Usunąć",
|
"Delete": "Usunąć",
|
||||||
"DeleteBackup": "Usuń kopię zapasową",
|
"DeleteBackup": "Usuń kopię zapasową",
|
||||||
"DeleteBackupMessageText": "Czy na pewno chcesz usunąć kopię zapasową „{name}”?",
|
"DeleteBackupMessageText": "Czy na pewno chcesz usunąć kopię zapasową „{0}”?",
|
||||||
"DeleteDelayProfile": "Usuń profil opóźnienia",
|
"DeleteDelayProfile": "Usuń profil opóźnienia",
|
||||||
"DeleteDelayProfileMessageText": "Czy na pewno chcesz usunąć ten profil opóźnienia?",
|
"DeleteDelayProfileMessageText": "Czy na pewno chcesz usunąć ten profil opóźnienia?",
|
||||||
"DeleteDownloadClient": "Usuń klienta pobierania",
|
"DeleteDownloadClient": "Usuń klienta pobierania",
|
||||||
"DeleteDownloadClientMessageText": "Czy na pewno chcesz usunąć klienta pobierania „{name}”?",
|
"DeleteDownloadClientMessageText": "Czy na pewno chcesz usunąć klienta pobierania „{0}”?",
|
||||||
"DeleteEmptyFolders": "Usuń puste foldery",
|
"DeleteEmptyFolders": "Usuń puste foldery",
|
||||||
"DeleteEmptyFoldersHelpText": "Usuń puste foldery z filmami podczas skanowania dysku i po usunięciu plików filmowych",
|
"DeleteEmptyFoldersHelpText": "Usuń puste foldery z filmami podczas skanowania dysku i po usunięciu plików filmowych",
|
||||||
"DeleteImportListExclusion": "Usuń wykluczenie listy importu",
|
"DeleteImportListExclusion": "Usuń wykluczenie listy importu",
|
||||||
"DeleteImportListExclusionMessageText": "Czy na pewno chcesz usunąć to wykluczenie listy importu?",
|
"DeleteImportListExclusionMessageText": "Czy na pewno chcesz usunąć to wykluczenie listy importu?",
|
||||||
"DeleteImportListMessageText": "Czy na pewno chcesz usunąć listę „{0}”?",
|
"DeleteImportListMessageText": "Czy na pewno chcesz usunąć listę „{0}”?",
|
||||||
"DeleteIndexer": "Usuń indeksator",
|
"DeleteIndexer": "Usuń indeksator",
|
||||||
"DeleteIndexerMessageText": "Czy na pewno chcesz usunąć indeksator „{name}”?",
|
"DeleteIndexerMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||||
"DeleteMetadataProfileMessageText": "Czy na pewno usunąć informacje dodatkowe '{0name}'?",
|
"DeleteMetadataProfileMessageText": "Czy na pewno usunąć informacje dodatkowe '{0name}'?",
|
||||||
"DeleteNotification": "Usuń powiadomienie",
|
"DeleteNotification": "Usuń powiadomienie",
|
||||||
"DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?",
|
"DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?",
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
"RemoveCompletedDownloadsHelpText": "Usuń zaimportowane pliki do pobrania z historii klienta pobierania",
|
"RemoveCompletedDownloadsHelpText": "Usuń zaimportowane pliki do pobrania z historii klienta pobierania",
|
||||||
"RemoveFailedDownloadsHelpText": "Usuń nieudane pobieranie z historii klienta pobierania",
|
"RemoveFailedDownloadsHelpText": "Usuń nieudane pobieranie z historii klienta pobierania",
|
||||||
"RemoveFilter": "Usuń filtr",
|
"RemoveFilter": "Usuń filtr",
|
||||||
"RemoveFromDownloadClient": "Usuń z Klienta Pobierania",
|
"RemoveFromDownloadClient": "Usuń z klienta pobierania",
|
||||||
"RemoveFromQueue": "Usuń z kolejki",
|
"RemoveFromQueue": "Usuń z kolejki",
|
||||||
"RemoveHelpTextWarning": "Usunięcie spowoduje usunięcie pobierania i plików z klienta pobierania.",
|
"RemoveHelpTextWarning": "Usunięcie spowoduje usunięcie pobierania i plików z klienta pobierania.",
|
||||||
"RemoveSelected": "Usuń zaznaczone",
|
"RemoveSelected": "Usuń zaznaczone",
|
||||||
@@ -352,7 +352,7 @@
|
|||||||
"SslPortHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
|
"SslPortHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
|
||||||
"StandardBookFormat": "Standardowy format filmu",
|
"StandardBookFormat": "Standardowy format filmu",
|
||||||
"StartTypingOrSelectAPathBelow": "Zacznij pisać lub wybierz ścieżkę poniżej",
|
"StartTypingOrSelectAPathBelow": "Zacznij pisać lub wybierz ścieżkę poniżej",
|
||||||
"StartupDirectory": "Katalog Startowy",
|
"StartupDirectory": "Katalog startowy",
|
||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"StatusEndedEnded": "Zakończone",
|
"StatusEndedEnded": "Zakończone",
|
||||||
"Style": "Styl",
|
"Style": "Styl",
|
||||||
@@ -691,11 +691,5 @@
|
|||||||
"AuthForm": "Formularze (strona logowania)",
|
"AuthForm": "Formularze (strona logowania)",
|
||||||
"DisabledForLocalAddresses": "Wyłączone dla adresów lokalnych",
|
"DisabledForLocalAddresses": "Wyłączone dla adresów lokalnych",
|
||||||
"Enabled": "Włączone",
|
"Enabled": "Włączone",
|
||||||
"ApiKey": "Klucz API",
|
"ApiKey": "Klucz API"
|
||||||
"ASIN": "ASIN",
|
|
||||||
"AppUpdatedVersion": "{appName} został zaktualizowany do wersji `{version}`, by uzyskać nowe zmiany należy przeładować {appName}",
|
|
||||||
"AppUpdated": "{appName} Zaktualizowany",
|
|
||||||
"AuthenticationMethod": "Metoda Autoryzacji",
|
|
||||||
"AuthenticationMethodHelpTextWarning": "Wybierz prawidłową metodę autoryzacji",
|
|
||||||
"AuthenticationRequired": "Wymagana Autoryzacja"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@
|
|||||||
"DownloadFailedInterp": "Неудачное скачивание: {0}",
|
"DownloadFailedInterp": "Неудачное скачивание: {0}",
|
||||||
"DownloadPropersAndRepacksHelpTexts1": "Следует ли автоматически обновляться до Propers / Repacks",
|
"DownloadPropersAndRepacksHelpTexts1": "Следует ли автоматически обновляться до Propers / Repacks",
|
||||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Предупреждения по скачиванию: подробности в программе для скачивания",
|
"DownloadWarningCheckDownloadClientForMoreDetails": "Предупреждения по скачиванию: подробности в программе для скачивания",
|
||||||
"Edit": "Изменить",
|
"Edit": "Редактирование",
|
||||||
"Edition": "Издание",
|
"Edition": "Издание",
|
||||||
"Enable": "Включить",
|
"Enable": "Включить",
|
||||||
"EnableAutomaticAdd": "Включить автоматическое добавление",
|
"EnableAutomaticAdd": "Включить автоматическое добавление",
|
||||||
@@ -245,7 +245,7 @@
|
|||||||
"PortHelpTextWarning": "Для вступления в силу требуется перезапуск",
|
"PortHelpTextWarning": "Для вступления в силу требуется перезапуск",
|
||||||
"PortNumber": "Номер порта",
|
"PortNumber": "Номер порта",
|
||||||
"PosterSize": "Размер постера",
|
"PosterSize": "Размер постера",
|
||||||
"PreviewRename": "Предпросмотр\nпереименования",
|
"PreviewRename": "Предварительный просмотр переименования",
|
||||||
"Profiles": "Профили",
|
"Profiles": "Профили",
|
||||||
"Proper": "Пропер (Proper)",
|
"Proper": "Пропер (Proper)",
|
||||||
"PropersAndRepacks": "Проперы и репаки",
|
"PropersAndRepacks": "Проперы и репаки",
|
||||||
@@ -491,7 +491,7 @@
|
|||||||
"IndexersSettingsSummary": "Ограничения для индексаторов и релизов",
|
"IndexersSettingsSummary": "Ограничения для индексаторов и релизов",
|
||||||
"IndexerStatusCheckAllClientMessage": "Все индексаторы недоступны из-за ошибок",
|
"IndexerStatusCheckAllClientMessage": "Все индексаторы недоступны из-за ошибок",
|
||||||
"IndexerStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}",
|
"IndexerStatusCheckSingleClientMessage": "Индексаторы недоступны из-за ошибок: {0}",
|
||||||
"MaintenanceRelease": "Техническая версия: исправлены ошибки и другие улучшения. Дополнительную информацию см. в истории коммитов Github",
|
"MaintenanceRelease": "Техническая версия: исправлены ошибки и другие улучшения. Дополнительную информацию см. в истории коммитов Github.",
|
||||||
"Monitor": "Монитор",
|
"Monitor": "Монитор",
|
||||||
"OnBookFileDeleteForUpgradeHelpText": "При удалении файла фильма для обновления",
|
"OnBookFileDeleteForUpgradeHelpText": "При удалении файла фильма для обновления",
|
||||||
"OnGrab": "При захвате",
|
"OnGrab": "При захвате",
|
||||||
@@ -499,7 +499,7 @@
|
|||||||
"OnUpgrade": "При обновлении",
|
"OnUpgrade": "При обновлении",
|
||||||
"Queued": "В очереди",
|
"Queued": "В очереди",
|
||||||
"ReadarrSupportsAnyDownloadClient": "Radarr поддерживает многие популярные торрент и usenet-клиенты для скачивания.",
|
"ReadarrSupportsAnyDownloadClient": "Radarr поддерживает многие популярные торрент и usenet-клиенты для скачивания.",
|
||||||
"RefreshAndScan": "Обновить",
|
"RefreshAndScan": "Обновить и сканировать",
|
||||||
"RemotePathMappingCheckDownloadPermissions": "Radarr видит загруженный фильм {0}, но не может получить доступ к нему. Возможно, ошибка в правах доступа.",
|
"RemotePathMappingCheckDownloadPermissions": "Radarr видит загруженный фильм {0}, но не может получить доступ к нему. Возможно, ошибка в правах доступа.",
|
||||||
"RemotePathMappingCheckFileRemoved": "Файл {0} был удален в процессе обработки.",
|
"RemotePathMappingCheckFileRemoved": "Файл {0} был удален в процессе обработки.",
|
||||||
"RemotePathMappingCheckFilesBadDockerPath": "Вы используете docker; клиент загрузки {0} сообщил о файлах в {1}, но это не корректный путь {2}. Проверьте правильность указанного пути и настройки клиента загрузки.",
|
"RemotePathMappingCheckFilesBadDockerPath": "Вы используете docker; клиент загрузки {0} сообщил о файлах в {1}, но это не корректный путь {2}. Проверьте правильность указанного пути и настройки клиента загрузки.",
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
"AllAuthorBooks": "Все книги автора",
|
"AllAuthorBooks": "Все книги автора",
|
||||||
"AllowAuthorChangeClickToChangeAuthor": "Нажмите, чтобы изменить автора",
|
"AllowAuthorChangeClickToChangeAuthor": "Нажмите, чтобы изменить автора",
|
||||||
"AllExpandedExpandAll": "Развернуть Все",
|
"AllExpandedExpandAll": "Развернуть Все",
|
||||||
"RestartRequiredHelpTextWarning": "Для применения изменений, требуется перезапуск",
|
"RestartRequiredHelpTextWarning": "Для вступления в силу требуется перезапуск",
|
||||||
"Label": "Метка",
|
"Label": "Метка",
|
||||||
"AddList": "Добавить список",
|
"AddList": "Добавить список",
|
||||||
"Publisher": "Издатель",
|
"Publisher": "Издатель",
|
||||||
@@ -822,35 +822,12 @@
|
|||||||
"ShowBanners": "Показывать баннеры",
|
"ShowBanners": "Показывать баннеры",
|
||||||
"SetIndexerFlags": "Установить флаги индексатора",
|
"SetIndexerFlags": "Установить флаги индексатора",
|
||||||
"SelectIndexerFlags": "Выбор флагов индексатора",
|
"SelectIndexerFlags": "Выбор флагов индексатора",
|
||||||
"SearchMonitored": "Искать сериал",
|
"SearchMonitored": "Искать отслеживаемое",
|
||||||
"CustomFormatsSettingsTriggerInfo": "Пользовательский формат будет применен к релизу или файлу, если он соответствует хотя бы одному из каждого из выбранных типов условий.",
|
"CustomFormatsSettingsTriggerInfo": "Пользовательский формат будет применен к релизу или файлу, если он соответствует хотя бы одному из каждого из выбранных типов условий.",
|
||||||
"CustomFormatsSpecificationRegularExpressionHelpText": "RegEx пользовательского формата не чувствителен к регистру",
|
"CustomFormatsSpecificationRegularExpressionHelpText": "RegEx пользовательского формата не чувствителен к регистру",
|
||||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Использовать ли настроенный макет контента qBittorrent, исходный макет из торрента или всегда создавать подпапку (qBittorrent 4.3.2+)",
|
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Использовать ли настроенный макет контента qBittorrent, исходный макет из торрента или всегда создавать подпапку (qBittorrent 4.3.2+)",
|
||||||
"MetadataSource": "Источник метаданных",
|
"MetadataSource": "Источник метаданных",
|
||||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Путь {appName}, используемый для изменения путей к сериалам, когда {serviceName} видит путь к библиотеке иначе, чем {appName} (требуется 'Обновить библиотеку')",
|
"NotificationsSettingsUpdateMapPathsFromHelpText": "Путь {appName}, используемый для изменения путей к сериалам, когда {serviceName} видит путь к библиотеке иначе, чем {appName} (требуется 'Обновить библиотеку')",
|
||||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Путь {serviceName}, используемый для изменения путей к сериям, когда {serviceName} видит путь к библиотеке иначе, чем {appName} (требуется 'Обновить библиотеку')",
|
"NotificationsSettingsUpdateMapPathsToHelpText": "Путь {serviceName}, используемый для изменения путей к сериям, когда {serviceName} видит путь к библиотеке иначе, чем {appName} (требуется 'Обновить библиотеку')",
|
||||||
"PasswordConfirmation": "Подтверждение пароля",
|
"PasswordConfirmation": "Подтверждение пароля"
|
||||||
"DashOrSpaceDashDependingOnName": "Тире или пробел в зависимости от имени",
|
|
||||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Клиент загрузки {downloadClientName} настроен на удаление завершенных загрузок. Это может привести к удалению загрузок из вашего клиента до того, как {appName} сможет их импортировать.",
|
|
||||||
"NoMissingItems": "Нет отсутствующих элементов",
|
|
||||||
"ShowBannersHelpText": "Показывать баннеры вместо заголовков",
|
|
||||||
"RootFolderPathHelpText": "Элементы списка корневых папок будут добавлены в",
|
|
||||||
"MetadataSettingsSummary": "Создавать файлы метаданных при импорте эпизодов или обновлении сериалов",
|
|
||||||
"DataMissingBooks": "Отслеживать эпизоды, у которых нет файлов или которые еще не вышли в эфир",
|
|
||||||
"MetadataProfileIdHelpText": "Элементы списка профиля качества будут добавлены с помощью",
|
|
||||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "{appName} поддерживает несколько списков для импорта сериалов в базу данных.",
|
|
||||||
"IndexerIdHelpText": "Укажите, к какому индексатору применяется профиль",
|
|
||||||
"ContinuingAllBooksDownloaded": "Продолжается (все эпизоды скачаны)",
|
|
||||||
"DeleteBookFileMessageText": "Вы уверены, что хотите удалить '{path}'?",
|
|
||||||
"QualityProfileIdHelpText": "Элементы списка профиля качества будут добавлены с помощью",
|
|
||||||
"UseSSL": "Использовать SSL",
|
|
||||||
"EndedAllBooksDownloaded": "Завершено (Все эпизоды скачаны)",
|
|
||||||
"SearchForAllCutoffUnmetBooks": "Искать все эпизоды не достигшие указанного качества",
|
|
||||||
"StatusEndedContinuing": "Продолжается",
|
|
||||||
"Author": "Автор",
|
|
||||||
"IsShowingMonitoredUnmonitorSelected": "Неотслеживаемые выбраны",
|
|
||||||
"EnabledHelpText": "Установите флажок, чтобы включить профиль релиза",
|
|
||||||
"Authors": "Автор",
|
|
||||||
"IsShowingMonitoredMonitorSelected": "Отслеживание выбрано",
|
|
||||||
"SearchForAllMissingBooks": "Искать все недостающие эпизоды"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -823,6 +823,5 @@
|
|||||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Yeni şifreyi onayla",
|
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Yeni şifreyi onayla",
|
||||||
"AuthenticationRequiredPasswordHelpTextWarning": "Yeni şifre girin",
|
"AuthenticationRequiredPasswordHelpTextWarning": "Yeni şifre girin",
|
||||||
"AuthenticationRequiredUsernameHelpTextWarning": "Yeni kullanıcı adınızı girin",
|
"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.",
|
"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."
|
||||||
"DeleteSelected": "Seçileni Sil"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -740,10 +740,5 @@
|
|||||||
"BlocklistAndSearchMultipleHint": "Розпочати пошук замін після додавання до чорного списку",
|
"BlocklistAndSearchMultipleHint": "Розпочати пошук замін після додавання до чорного списку",
|
||||||
"ChangeCategoryMultipleHint": "Змінює завантаження на «Категорію після імпорту» з клієнта завантажувача",
|
"ChangeCategoryMultipleHint": "Змінює завантаження на «Категорію після імпорту» з клієнта завантажувача",
|
||||||
"CloneCondition": "Клонування умови",
|
"CloneCondition": "Клонування умови",
|
||||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Автоматично шукати та намагатися завантажити інший реліз, якщо обраний реліз не вдалось завантажити з інтерактивного пошуку.",
|
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Автоматично шукати та намагатися завантажити інший реліз, якщо обраний реліз не вдалось завантажити з інтерактивного пошуку."
|
||||||
"BypassIfAboveCustomFormatScoreHelpText": "Увімкнути обхід, якщо реліз має оцінку вищу за встановлений мінімальний бал користувацького формату",
|
|
||||||
"CountDownloadClientsSelected": "Вибрано {count} клієнтів завантажувача",
|
|
||||||
"ReleaseProfiles": "профіль релізу",
|
|
||||||
"MinimumCustomFormatScoreHelpText": "Мінімальна оцінка користувацького формату, необхідна для обходу затримки для обраного протоколу",
|
|
||||||
"BypassIfAboveCustomFormatScore": "Пропустити, якщо перевищено оцінку користувацького формату"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,15 +25,15 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnGrab(GrabMessage message)
|
public override void OnGrab(GrabMessage message)
|
||||||
{
|
{
|
||||||
var embeds = new List<Embed>
|
var embeds = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Description = message.Message,
|
Description = message.Message,
|
||||||
Title = message.Author.Name,
|
Title = message.Author.Name,
|
||||||
Text = message.Message,
|
Text = message.Message,
|
||||||
Color = (int)DiscordColors.Warning
|
Color = (int)DiscordColors.Warning
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var payload = CreatePayload($"Grabbed: {message.Message}", embeds);
|
var payload = CreatePayload($"Grabbed: {message.Message}", embeds);
|
||||||
|
|
||||||
_proxy.SendPayload(payload, Settings);
|
_proxy.SendPayload(payload, Settings);
|
||||||
@@ -43,7 +43,7 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Description = message.Message,
|
Description = message.Message,
|
||||||
Title = message.Author.Name,
|
Title = message.Author.Name,
|
||||||
@@ -59,12 +59,12 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnRename(Author author, List<RenamedBookFile> renamedFiles)
|
public override void OnRename(Author author, List<RenamedBookFile> renamedFiles)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = author.Name,
|
Title = author.Name,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload("Renamed", attachments);
|
var payload = CreatePayload("Renamed", attachments);
|
||||||
|
|
||||||
@@ -74,21 +74,21 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnAuthorAdded(Author author)
|
public override void OnAuthorAdded(Author author)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = author.Name,
|
Title = author.Name,
|
||||||
Fields = new List<DiscordField>()
|
Fields = new List<DiscordField>()
|
||||||
{
|
{
|
||||||
new ()
|
new DiscordField()
|
||||||
{
|
{
|
||||||
Name = "Links",
|
Name = "Links",
|
||||||
Value = string.Join(" / ", author.Metadata.Value.Links.Select(link => $"[{link.Name}]({link.Url})"))
|
Value = string.Join(" / ", author.Metadata.Value.Links.Select(link => $"[{link.Name}]({link.Url})"))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var payload = CreatePayload("Author Added", attachments);
|
var payload = CreatePayload($"Author Added", attachments);
|
||||||
|
|
||||||
_proxy.SendPayload(payload, Settings);
|
_proxy.SendPayload(payload, Settings);
|
||||||
}
|
}
|
||||||
@@ -96,13 +96,13 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
|
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = deleteMessage.Author.Name,
|
Title = deleteMessage.Author.Name,
|
||||||
Description = deleteMessage.DeletedFilesMessage
|
Description = deleteMessage.DeletedFilesMessage
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload("Author Deleted", attachments);
|
var payload = CreatePayload("Author Deleted", attachments);
|
||||||
|
|
||||||
@@ -112,13 +112,13 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnBookDelete(BookDeleteMessage deleteMessage)
|
public override void OnBookDelete(BookDeleteMessage deleteMessage)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = $"{deleteMessage.Book.Author.Value.Name} - ${deleteMessage.Book.Title}",
|
Title = $"${deleteMessage.Book.Author.Value.Name} - ${deleteMessage.Book.Title}",
|
||||||
Description = deleteMessage.DeletedFilesMessage
|
Description = deleteMessage.DeletedFilesMessage
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload("Book Deleted", attachments);
|
var payload = CreatePayload("Book Deleted", attachments);
|
||||||
|
|
||||||
@@ -128,13 +128,13 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnBookFileDelete(BookFileDeleteMessage deleteMessage)
|
public override void OnBookFileDelete(BookFileDeleteMessage deleteMessage)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = $"{deleteMessage.Book.Author.Value.Name} - ${deleteMessage.Book.Title} - file deleted",
|
Title = $"${deleteMessage.Book.Author.Value.Name} - ${deleteMessage.Book.Title} - file deleted",
|
||||||
Description = deleteMessage.BookFile.Path
|
Description = deleteMessage.BookFile.Path
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload("Book File Deleted", attachments);
|
var payload = CreatePayload("Book File Deleted", attachments);
|
||||||
|
|
||||||
@@ -144,14 +144,14 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = healthCheck.Source.Name,
|
Title = healthCheck.Source.Name,
|
||||||
Text = healthCheck.Message,
|
Text = healthCheck.Message,
|
||||||
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger
|
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Danger
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload("Health Issue", attachments);
|
var payload = CreatePayload("Health Issue", attachments);
|
||||||
|
|
||||||
@@ -161,13 +161,13 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnBookRetag(BookRetagMessage message)
|
public override void OnBookRetag(BookRetagMessage message)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Title = BOOK_RETAGGED_TITLE,
|
Title = BOOK_RETAGGED_TITLE,
|
||||||
Text = message.Message
|
Text = message.Message
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload($"Track file tags updated: {message.Message}", attachments);
|
var payload = CreatePayload($"Track file tags updated: {message.Message}", attachments);
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Description = message.Message,
|
Description = message.Message,
|
||||||
Title = message.SourceTitle,
|
Title = message.SourceTitle,
|
||||||
@@ -195,7 +195,7 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Description = message.Message,
|
Description = message.Message,
|
||||||
Title = message.Book?.Title ?? message.Message,
|
Title = message.Book?.Title ?? message.Message,
|
||||||
@@ -211,32 +211,32 @@ namespace NzbDrone.Core.Notifications.Discord
|
|||||||
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
|
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
|
||||||
{
|
{
|
||||||
var attachments = new List<Embed>
|
var attachments = new List<Embed>
|
||||||
{
|
{
|
||||||
new ()
|
new Embed
|
||||||
{
|
{
|
||||||
Author = new DiscordAuthor
|
Author = new DiscordAuthor
|
||||||
{
|
{
|
||||||
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
Name = Settings.Author.IsNullOrWhiteSpace() ? Environment.MachineName : Settings.Author,
|
||||||
IconUrl = "https://raw.githubusercontent.com/Readarr/Readarr/develop/Logo/256.png"
|
IconUrl = "https://raw.githubusercontent.com/Readarr/Readarr/develop/Logo/256.png"
|
||||||
},
|
},
|
||||||
Title = APPLICATION_UPDATE_TITLE,
|
Title = APPLICATION_UPDATE_TITLE,
|
||||||
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
|
||||||
Color = (int)DiscordColors.Standard,
|
Color = (int)DiscordColors.Standard,
|
||||||
Fields = new List<DiscordField>()
|
Fields = new List<DiscordField>()
|
||||||
{
|
{
|
||||||
new ()
|
new DiscordField()
|
||||||
{
|
{
|
||||||
Name = "Previous Version",
|
Name = "Previous Version",
|
||||||
Value = updateMessage.PreviousVersion.ToString()
|
Value = updateMessage.PreviousVersion.ToString()
|
||||||
},
|
},
|
||||||
new ()
|
new DiscordField()
|
||||||
{
|
{
|
||||||
Name = "New Version",
|
Name = "New Version",
|
||||||
Value = updateMessage.NewVersion.ToString()
|
Value = updateMessage.NewVersion.ToString()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var payload = CreatePayload(null, attachments);
|
var payload = CreatePayload(null, attachments);
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Dapper" />
|
<PackageReference Include="Dapper" />
|
||||||
<PackageReference Include="Diacritical.Net" />
|
|
||||||
<PackageReference Include="LazyCache" />
|
<PackageReference Include="LazyCache" />
|
||||||
<PackageReference Include="Polly" />
|
<PackageReference Include="Polly" />
|
||||||
<PackageReference Include="System.Text.Json" />
|
<PackageReference Include="System.Text.Json" />
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ namespace NzbDrone.Core.ThingiProvider.Status
|
|||||||
where TModel : ProviderStatusBase, new()
|
where TModel : ProviderStatusBase, new()
|
||||||
{
|
{
|
||||||
TModel FindByProviderId(int providerId);
|
TModel FindByProviderId(int providerId);
|
||||||
void DeleteByProviderId(int providerId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ProviderStatusRepository<TModel> : BasicRepository<TModel>, IProviderStatusRepository<TModel>
|
public class ProviderStatusRepository<TModel> : BasicRepository<TModel>, IProviderStatusRepository<TModel>
|
||||||
@@ -23,10 +22,5 @@ namespace NzbDrone.Core.ThingiProvider.Status
|
|||||||
{
|
{
|
||||||
return Query(c => c.ProviderId == providerId).SingleOrDefault();
|
return Query(c => c.ProviderId == providerId).SingleOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteByProviderId(int providerId)
|
|
||||||
{
|
|
||||||
Delete(c => c.ProviderId == providerId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,7 +151,12 @@ namespace NzbDrone.Core.ThingiProvider.Status
|
|||||||
|
|
||||||
public virtual void HandleAsync(ProviderDeletedEvent<TProvider> message)
|
public virtual void HandleAsync(ProviderDeletedEvent<TProvider> message)
|
||||||
{
|
{
|
||||||
_providerStatusRepository.DeleteByProviderId(message.ProviderId);
|
var providerStatus = _providerStatusRepository.FindByProviderId(message.ProviderId);
|
||||||
|
|
||||||
|
if (providerStatus != null)
|
||||||
|
{
|
||||||
|
_providerStatusRepository.Delete(providerStatus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ namespace NzbDrone.Host
|
|||||||
Name = "apikey",
|
Name = "apikey",
|
||||||
Type = SecuritySchemeType.ApiKey,
|
Type = SecuritySchemeType.ApiKey,
|
||||||
Scheme = "apiKey",
|
Scheme = "apiKey",
|
||||||
Description = "Apikey passed as query parameter",
|
Description = "Apikey passed as header",
|
||||||
In = ParameterLocation.Query,
|
In = ParameterLocation.Query,
|
||||||
Reference = new OpenApiReference
|
Reference = new OpenApiReference
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Readarr.Api.V1.Author;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class AuthorEditorFixture : IntegrationTest
|
public class AuthorEditorFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
private void GivenExistingAuthor()
|
private void GivenExistingAuthor()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using NUnit.Framework;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class AuthorFixture : IntegrationTest
|
public class AuthorFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using NUnit.Framework;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class AuthorLookupFixture : IntegrationTest
|
public class AuthorLookupFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[TestCase("Robert Harris", "Robert Harris")]
|
[TestCase("Robert Harris", "Robert Harris")]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using Readarr.Api.V1.Blocklist;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class BlocklistFixture : IntegrationTest
|
public class BlocklistFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
private AuthorResource _author;
|
private AuthorResource _author;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using Readarr.Api.V1.Books;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests
|
namespace NzbDrone.Integration.Test.ApiTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class CalendarFixture : IntegrationTest
|
public class CalendarFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
public ClientBase<BookResource> Calendar;
|
public ClientBase<BookResource> Calendar;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using Readarr.Api.V1.RootFolders;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class CutoffUnmetFixture : IntegrationTest
|
public class CutoffUnmetFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Readarr.Api.V1.RootFolders;
|
|||||||
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
namespace NzbDrone.Integration.Test.ApiTests.WantedTests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
[Ignore("Waiting for metadata to be back again", Until = "2024-12-15 00:00:00Z")]
|
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||||
public class MissingFixture : IntegrationTest
|
public class MissingFixture : IntegrationTest
|
||||||
{
|
{
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
|||||||
@@ -13815,7 +13815,7 @@
|
|||||||
},
|
},
|
||||||
"apikey": {
|
"apikey": {
|
||||||
"type": "apiKey",
|
"type": "apiKey",
|
||||||
"description": "Apikey passed as query parameter",
|
"description": "Apikey passed as header",
|
||||||
"name": "apikey",
|
"name": "apikey",
|
||||||
"in": "query"
|
"in": "query"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Diacritical;
|
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using NzbDrone.Core.Authentication;
|
using NzbDrone.Core.Authentication;
|
||||||
using NzbDrone.Core.Configuration;
|
|
||||||
|
|
||||||
namespace Readarr.Http.Authentication
|
namespace Readarr.Http.Authentication
|
||||||
{
|
{
|
||||||
public static class AuthenticationBuilderExtensions
|
public static class AuthenticationBuilderExtensions
|
||||||
{
|
{
|
||||||
private static readonly Regex CookieNameRegex = new Regex(@"[^a-z0-9]+", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder authenticationBuilder, string name, Action<ApiKeyAuthenticationOptions> options)
|
public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder authenticationBuilder, string name, Action<ApiKeyAuthenticationOptions> options)
|
||||||
{
|
{
|
||||||
return authenticationBuilder.AddScheme<ApiKeyAuthenticationOptions, ApiKeyAuthenticationHandler>(name, options);
|
return authenticationBuilder.AddScheme<ApiKeyAuthenticationOptions, ApiKeyAuthenticationHandler>(name, options);
|
||||||
@@ -35,27 +29,19 @@ namespace Readarr.Http.Authentication
|
|||||||
|
|
||||||
public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services)
|
public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddOptions<CookieAuthenticationOptions>(AuthenticationType.Forms.ToString())
|
return services.AddAuthentication()
|
||||||
.Configure<IConfigFileProvider>((options, configFileProvider) =>
|
.AddNone(AuthenticationType.None.ToString())
|
||||||
|
.AddExternal(AuthenticationType.External.ToString())
|
||||||
|
.AddBasic(AuthenticationType.Basic.ToString())
|
||||||
|
.AddCookie(AuthenticationType.Forms.ToString(), options =>
|
||||||
{
|
{
|
||||||
// Replace diacritics and replace non-word characters to ensure cookie name doesn't contain any valid URL characters not allowed in cookie names
|
options.Cookie.Name = "ReadarrAuth";
|
||||||
var instanceName = configFileProvider.InstanceName;
|
|
||||||
instanceName = instanceName.RemoveDiacritics();
|
|
||||||
instanceName = CookieNameRegex.Replace(instanceName, string.Empty);
|
|
||||||
|
|
||||||
options.Cookie.Name = $"{instanceName}Auth";
|
|
||||||
options.AccessDeniedPath = "/login?loginFailed=true";
|
options.AccessDeniedPath = "/login?loginFailed=true";
|
||||||
options.LoginPath = "/login";
|
options.LoginPath = "/login";
|
||||||
options.ExpireTimeSpan = TimeSpan.FromDays(7);
|
options.ExpireTimeSpan = TimeSpan.FromDays(7);
|
||||||
options.SlidingExpiration = true;
|
options.SlidingExpiration = true;
|
||||||
options.ReturnUrlParameter = "returnUrl";
|
options.ReturnUrlParameter = "returnUrl";
|
||||||
});
|
})
|
||||||
|
|
||||||
return services.AddAuthentication()
|
|
||||||
.AddNone(AuthenticationType.None.ToString())
|
|
||||||
.AddExternal(AuthenticationType.External.ToString())
|
|
||||||
.AddBasic(AuthenticationType.Basic.ToString())
|
|
||||||
.AddCookie(AuthenticationType.Forms.ToString())
|
|
||||||
.AddApiKey("API", options =>
|
.AddApiKey("API", options =>
|
||||||
{
|
{
|
||||||
options.HeaderName = "X-Api-Key";
|
options.HeaderName = "X-Api-Key";
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace Readarr.Http.Authentication
|
|||||||
|
|
||||||
await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties);
|
await HttpContext.SignInAsync(AuthenticationType.Forms.ToString(), new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "identifier")), authProperties);
|
||||||
|
|
||||||
if (returnUrl.IsNullOrWhiteSpace() || !Url.IsLocalUrl(returnUrl))
|
if (returnUrl.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
return Redirect(_configFileProvider.UrlBase + "/");
|
return Redirect(_configFileProvider.UrlBase + "/");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user