Compare commits

...

32 Commits

Author SHA1 Message Date
Bogdan 3ed41554ce Log Notifiarr errors as warnings 2023-10-07 22:58:40 +03:00
Bogdan ce808c6d7b Prevent mapping null metadata responses
Fixes #2971
2023-10-07 01:40:49 +03:00
Weblate 63b1b56a4f Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Garkus98 <ivan12061998@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: blankhang <blankhang@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-10-07 01:04:37 +03:00
Bogdan a5647bedc8 Remove reddit from support issues 2023-10-07 00:25:19 +03:00
Servarr fe659bb79d Automated API Docs update 2023-10-04 06:59:02 +03:00
MxMarx 9918535509 New: Author Added notification
(cherry picked from commit https://github.com/Radarr/Radarr/commit/f890aadffa5ae579bcf65abdcf3e3948837084a9)
2023-10-04 06:47:23 +03:00
William Brockhus f9a6db40b8 Fixed: Ignore timezone when comparing tag dates 2023-10-04 06:26:08 +03:00
Bogdan 6273d69ed6 Fix tests 2023-10-04 05:50:57 +03:00
dependabot[bot] 7012380e95 Bump postcss from 8.4.23 to 8.4.31
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.23 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.23...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-04 04:05:39 +03:00
Bogdan b001ecd698 Preserve the protocol for fanart images
Closes #2944
2023-10-01 17:29:46 +03:00
Bogdan e28becdda4 Preserve the protocol in Author Image
Closes #2942
2023-10-01 17:27:38 +03:00
Mark McDowall eae06695e8 Fixed: Completed downloads in Qbit missing import path
(cherry picked from commit 35365665cfd436ac276dd9591e23333bd26cf789)

Closes #2959
2023-10-01 17:23:21 +03:00
Weblate 54a9af2ced Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mr cmuc <github@nextcos.de>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-10-01 17:20:42 +03:00
Stevie Robinson c9b55266fc Fixed: qBittorent history retention to allow at least 14 days seeding
(cherry picked from commit 33b87acabf2b4c71ee24cda1a466dec6f4f76996)
2023-10-01 17:20:16 +03:00
bakerboy448 05b64406a4 Fixed: Only apply remote path mappings for completed items in Qbit
(cherry picked from commit 583eb52ddc01b608ab6cb17e863a8830c17b7b75)
2023-10-01 17:20:06 +03:00
Bogdan 1f37c5387b Revert "Avoid returning null in static resource mapper Task"
This reverts commit d7305b9753.
2023-10-01 03:26:00 +03:00
Stevie Robinson 4a6c7042fe Fixed: SABnzbd history retention to allow at least 14 days
(cherry picked from commit a3938d8e0264b48b35f4715cbc15329fb489218a)
2023-09-27 19:47:13 +03:00
Bogdan d7305b9753 Avoid returning null in static resource mapper Task
(cherry picked from commit a1ea7accb32bc72f61ed4531d109f76fad843939)
2023-09-27 18:54:41 +03:00
Bogdan bd56643eaa Bump version to 0.3.7 2023-09-24 16:24:12 +03:00
Stevie Robinson 44e6de2e23 Add health check for dl clients removing completed downloads + enable for sab and qbit
(cherry picked from commit 7f2cd8a0e99b537a1c616998514bacdd8468a016)

Closes #2939
2023-09-19 21:44:45 +03:00
Mark McDowall b209d047fa Fixed: Don't try to create metadata images if source files doesn't exist
(cherry picked from commit 9a1022386a031c928fc0495d6ab990ebce605ec1)

Closes #2933
2023-09-19 21:37:09 +03:00
Mark McDowall fd5ab27df6 New: Don't treat 400 responses from Notifiarr as errors
(cherry picked from commit 5eb420bbe12f59d0a5392abf3d351be28ca210e6)

Closes #2938
2023-09-19 21:35:26 +03:00
Bogdan 4a89befd79 Log request failures in Notifiarr 2023-09-19 21:34:12 +03:00
Bogdan 1a30293c33 Check for empty description as well in ParseQuality 2023-09-19 21:33:26 +03:00
Bogdan f5c2a6bf51 Fix use of empty Author SortName in filename 2023-09-19 18:55:24 +03:00
Weblate f3d90fdaf1 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Akashi2020 <dieux02400@gmail.com>
Co-authored-by: Anthony Veaudry <anthonyveaudry@gmail.com>
Co-authored-by: Gyuyeop Kim <rlarbduq777@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Herve Lauwerier <hervelauwerier@gmail.com>
Co-authored-by: Richard de Souza Leite <rs9010482@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mati300m <mateusz.smolec@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-09-19 14:32:26 +03:00
MxMarx 04c5671a0a Fixed: Release Push api broken when no indexer id is specified 2023-09-19 14:31:44 +03:00
Qstick 22cc88c5e7 Fixed: Show correct error on unauthorized caps call
(cherry picked from commit f2b0fc946e1fb1b4649f1b46a003bd2add09a461)
2023-09-19 14:28:41 +03:00
Bogdan ca0c95a2d2 Fixed: Skip parsing releases without title
(cherry picked from commit c7824bb593291634bf14a5f7aa689666969b03bf)
2023-09-19 14:28:14 +03:00
Mark McDowall 419f790d66 Fixed: Don't allow quality profile to be created without all qualities
(cherry picked from commit 32e1ae2f64827272d351991838200884876e52b4)
2023-09-19 14:28:01 +03:00
Bogdan 9fe08429bc Use await on reading the response content
(cherry picked from commit 82d586e7015d7ea06356ca436024a8af5a4fb677)
2023-09-18 03:24:30 +03:00
Bogdan 71f4a88ab3 Bump version to 0.3.6 2023-09-17 12:02:41 +03:00
87 changed files with 888 additions and 253 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
name: Bug Report name: Bug Report
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first' description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Discord first'
labels: ['Type: Bug', 'Status: Needs Triage'] labels: ['Type: Bug', 'Status: Needs Triage']
body: body:
- type: checkboxes - type: checkboxes
-3
View File
@@ -3,6 +3,3 @@ contact_links:
- name: Support via Discord - name: Support via Discord
url: https://readarr.com/discord url: https://readarr.com/discord
about: Chat with users and devs on support and setup related topics. about: Chat with users and devs on support and setup related topics.
- name: Support via Reddit
url: https://reddit.com/r/Readarr
about: Discuss and search thru support topics.
+1 -2
View File
@@ -15,8 +15,7 @@ jobs:
issue-comment: > issue-comment: >
:wave: @{issue-author}, we use the issue tracker exclusively :wave: @{issue-author}, we use the issue tracker exclusively
for bug reports and feature requests. However, this issue appears for bug reports and feature requests. However, this issue appears
to be a support request. Please hop over onto our [Discord](https://readarr.com/discord) to be a support request. Please hop over onto our [Discord](https://readarr.com/discord).
or [Subreddit](https://reddit.com/r/readarr)
close-issue: true close-issue: true
lock-issue: false lock-issue: false
- uses: dessant/support-requests@v3 - uses: dessant/support-requests@v3
+1 -1
View File
@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests' testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.3.5' majorVersion: '0.3.7'
minorVersion: $[counter('minorVersion', 1)] minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)' readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)' buildName: '$(Build.SourceBranchName).$(readarrVersion)'
+3 -6
View File
@@ -7,13 +7,10 @@ function findImage(images, coverType) {
} }
function getUrl(image, coverType, size) { function getUrl(image, coverType, size) {
if (image) { const imageUrl = image?.url;
// Remove protocol
let url = image.url;
url = url.replace(`${coverType}.jpg`, `${coverType}-${size}.jpg`); if (imageUrl) {
return imageUrl.replace(`${coverType}.jpg`, `${coverType}-${size}.jpg`);
return url;
} }
} }
@@ -25,12 +25,7 @@ const defaultFontSize = parseInt(fonts.defaultFontSize);
const lineHeight = parseFloat(fonts.lineHeight); const lineHeight = parseFloat(fonts.lineHeight);
function getFanartUrl(images) { function getFanartUrl(images) {
const fanartImage = images.find((x) => x.coverType === 'fanart'); return images.find((x) => x.coverType === 'fanart')?.url;
if (fanartImage) {
// Remove protocol
return fanartImage.url.replace(/^https?:/, '');
}
} }
class AuthorDetailsHeader extends Component { class AuthorDetailsHeader extends Component {
@@ -21,12 +21,7 @@ const defaultFontSize = parseInt(fonts.defaultFontSize);
const lineHeight = parseFloat(fonts.lineHeight); const lineHeight = parseFloat(fonts.lineHeight);
function getFanartUrl(images) { function getFanartUrl(images) {
const fanartImage = images.find((x) => x.coverType === 'fanart'); return images.find((x) => x.coverType === 'fanart')?.url;
if (fanartImage) {
// Remove protocol
return fanartImage.url.replace(/^https?:/, '');
}
} }
class BookDetailsHeader extends Component { class BookDetailsHeader extends Component {
@@ -60,6 +60,7 @@ class Notification extends Component {
onReleaseImport, onReleaseImport,
onUpgrade, onUpgrade,
onRename, onRename,
onAuthorAdded,
onAuthorDelete, onAuthorDelete,
onBookDelete, onBookDelete,
onBookFileDelete, onBookFileDelete,
@@ -73,6 +74,7 @@ class Notification extends Component {
supportsOnReleaseImport, supportsOnReleaseImport,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnAuthorAdded,
supportsOnAuthorDelete, supportsOnAuthorDelete,
supportsOnBookDelete, supportsOnBookDelete,
supportsOnBookFileDelete, supportsOnBookFileDelete,
@@ -136,6 +138,14 @@ class Notification extends Component {
null null
} }
{
supportsOnAuthorAdded && onAuthorAdded ?
<Label kind={kinds.SUCCESS}>
{translate('OnAuthorAdded')}
</Label> :
null
}
{ {
supportsOnAuthorDelete && onAuthorDelete ? supportsOnAuthorDelete && onAuthorDelete ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
@@ -244,6 +254,7 @@ Notification.propTypes = {
onReleaseImport: PropTypes.bool.isRequired, onReleaseImport: PropTypes.bool.isRequired,
onUpgrade: PropTypes.bool.isRequired, onUpgrade: PropTypes.bool.isRequired,
onRename: PropTypes.bool.isRequired, onRename: PropTypes.bool.isRequired,
onAuthorAdded: PropTypes.bool.isRequired,
onAuthorDelete: PropTypes.bool.isRequired, onAuthorDelete: PropTypes.bool.isRequired,
onBookDelete: PropTypes.bool.isRequired, onBookDelete: PropTypes.bool.isRequired,
onBookFileDelete: PropTypes.bool.isRequired, onBookFileDelete: PropTypes.bool.isRequired,
@@ -257,6 +268,7 @@ Notification.propTypes = {
supportsOnReleaseImport: PropTypes.bool.isRequired, supportsOnReleaseImport: PropTypes.bool.isRequired,
supportsOnUpgrade: PropTypes.bool.isRequired, supportsOnUpgrade: PropTypes.bool.isRequired,
supportsOnRename: PropTypes.bool.isRequired, supportsOnRename: PropTypes.bool.isRequired,
supportsOnAuthorAdded: PropTypes.bool.isRequired,
supportsOnAuthorDelete: PropTypes.bool.isRequired, supportsOnAuthorDelete: PropTypes.bool.isRequired,
supportsOnBookDelete: PropTypes.bool.isRequired, supportsOnBookDelete: PropTypes.bool.isRequired,
supportsOnBookFileDelete: PropTypes.bool.isRequired, supportsOnBookFileDelete: PropTypes.bool.isRequired,
@@ -19,6 +19,7 @@ function NotificationEventItems(props) {
onReleaseImport, onReleaseImport,
onUpgrade, onUpgrade,
onRename, onRename,
onAuthorAdded,
onAuthorDelete, onAuthorDelete,
onBookDelete, onBookDelete,
onBookFileDelete, onBookFileDelete,
@@ -32,6 +33,7 @@ function NotificationEventItems(props) {
supportsOnReleaseImport, supportsOnReleaseImport,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnAuthorAdded,
supportsOnAuthorDelete, supportsOnAuthorDelete,
supportsOnBookDelete, supportsOnBookDelete,
supportsOnBookFileDelete, supportsOnBookFileDelete,
@@ -123,6 +125,17 @@ function NotificationEventItems(props) {
/> />
</div> </div>
<div>
<FormInputGroup
type={inputTypes.CHECK}
name="onAuthorAdded"
helpText={translate('OnAuthorAddedHelpText')}
isDisabled={!supportsOnAuthorAdded.value}
{...onAuthorAdded}
onChange={onInputChange}
/>
</div>
<div> <div>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@@ -106,6 +106,7 @@ export default {
selectedSchema.onReleaseImport = selectedSchema.supportsOnReleaseImport; selectedSchema.onReleaseImport = selectedSchema.supportsOnReleaseImport;
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade; selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
selectedSchema.onRename = selectedSchema.supportsOnRename; selectedSchema.onRename = selectedSchema.supportsOnRename;
selectedSchema.onAuthorAdded = selectedSchema.supportsOnAuthorAdded;
selectedSchema.onAuthorDelete = selectedSchema.supportsOnAuthorDelete; selectedSchema.onAuthorDelete = selectedSchema.supportsOnAuthorDelete;
selectedSchema.onBookDelete = selectedSchema.supportsOnBookDelete; selectedSchema.onBookDelete = selectedSchema.supportsOnBookDelete;
selectedSchema.onBookFileDelete = selectedSchema.supportsOnBookFileDelete; selectedSchema.onBookFileDelete = selectedSchema.supportsOnBookFileDelete;
+2 -1
View File
@@ -95,6 +95,7 @@
"@babel/preset-react": "7.22.5", "@babel/preset-react": "7.22.5",
"@babel/preset-typescript": "7.22.11", "@babel/preset-typescript": "7.22.11",
"@types/lodash": "4.14.197", "@types/lodash": "4.14.197",
"@types/react-lazyload": "3.2.1",
"@types/redux-actions": "2.6.2", "@types/redux-actions": "2.6.2",
"@typescript-eslint/eslint-plugin": "6.5.0", "@typescript-eslint/eslint-plugin": "6.5.0",
"@typescript-eslint/parser": "6.5.0", "@typescript-eslint/parser": "6.5.0",
@@ -120,7 +121,7 @@
"html-webpack-plugin": "5.5.3", "html-webpack-plugin": "5.5.3",
"loader-utils": "^3.2.1", "loader-utils": "^3.2.1",
"mini-css-extract-plugin": "2.7.6", "mini-css-extract-plugin": "2.7.6",
"postcss": "8.4.23", "postcss": "8.4.31",
"postcss-color-function": "4.1.0", "postcss-color-function": "4.1.0",
"postcss-loader": "7.3.0", "postcss-loader": "7.3.0",
"postcss-mixins": "9.0.4", "postcss-mixins": "9.0.4",
@@ -162,7 +162,7 @@ namespace NzbDrone.Common.Extensions
{ {
if (text.IsNullOrWhiteSpace()) if (text.IsNullOrWhiteSpace())
{ {
throw new ArgumentNullException("text"); throw new ArgumentNullException(nameof(text));
} }
return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0; return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0;
@@ -115,7 +115,7 @@ namespace NzbDrone.Common.Http.Dispatchers
} }
else else
{ {
data = responseMessage.Content.ReadAsByteArrayAsync(cts.Token).GetAwaiter().GetResult(); data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token);
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -1,9 +1,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Books; using NzbDrone.Core.Books;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.DecisionEngine.Specifications.RssSync; using NzbDrone.Core.DecisionEngine.Specifications.RssSync;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
@@ -33,8 +34,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
}; };
Mocker Mocker
.GetMock<IIndexerRepository>() .GetMock<IIndexerFactory>()
.Setup(m => m.Get(It.IsAny<int>())) .Setup(m => m.Get(It.IsAny<int>()))
.Throws(new ModelNotFoundException(typeof(IndexerDefinition), -1));
Mocker
.GetMock<IIndexerFactory>()
.Setup(m => m.Get(1))
.Returns(_fakeIndexerDefinition); .Returns(_fakeIndexerDefinition);
_specification = Mocker.Resolve<IndexerTagSpecification>(); _specification = Mocker.Resolve<IndexerTagSpecification>();
@@ -106,5 +112,25 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeFalse(); _specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeFalse();
} }
[Test]
public void release_without_indexerid_should_return_true()
{
_fakeIndexerDefinition.Tags = new HashSet<int> { 456 };
_fakeAuthor.Tags = new HashSet<int> { 123, 789 };
_fakeRelease.IndexerId = 0;
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeTrue();
}
[Test]
public void release_with_invalid_indexerid_should_return_true()
{
_fakeIndexerDefinition.Tags = new HashSet<int> { 456 };
_fakeAuthor.Tags = new HashSet<int> { 123, 789 };
_fakeRelease.IndexerId = 2;
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeTrue();
}
} }
} }
@@ -405,7 +405,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
Size = 1000, Size = 1000,
Progress = 0.7, Progress = 0.7,
Eta = 8640000, Eta = 8640000,
State = "stalledDL", State = "pausedUP",
Label = "", Label = "",
SavePath = @"C:\Torrents".AsOsAgnostic(), SavePath = @"C:\Torrents".AsOsAgnostic(),
ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic() ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic()
@@ -452,6 +452,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
result.OutputRootFolders.First().Should().Be(fullCategoryDir); result.OutputRootFolders.First().Should().Be(fullCategoryDir);
} }
[TestCase("0")]
[TestCase("15d")]
public void should_set_history_removes_completed_downloads_false(string historyRetention)
{
_config.Misc.history_retention = historyRetention;
var downloadClientInfo = Subject.GetStatus();
downloadClientInfo.RemovesCompletedDownloads.Should().BeFalse();
}
[TestCase("-1")]
[TestCase("15")]
[TestCase("3")]
[TestCase("3d")]
public void should_set_history_removes_completed_downloads_true(string historyRetention)
{
_config.Misc.history_retention = historyRetention;
var downloadClientInfo = Subject.GetStatus();
downloadClientInfo.RemovesCompletedDownloads.Should().BeTrue();
}
[TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads", @"Y:\nzbget\root\completed\downloads\vv")] [TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads", @"Y:\nzbget\root\completed\downloads\vv")]
[TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed", @"Y:\nzbget\root\completed\vv")] [TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed", @"Y:\nzbget\root\completed\vv")]
[TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads", @"/nzbget/root/completed/downloads/vv")] [TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads", @"/nzbget/root/completed/downloads/vv")]
@@ -0,0 +1,78 @@
using System;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Download;
using NzbDrone.Core.Download.Clients;
using NzbDrone.Core.HealthCheck.Checks;
using NzbDrone.Core.Localization;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.HealthCheck.Checks
{
[TestFixture]
public class DownloadClientRemovesCompletedDownloadsCheckFixture : CoreTest<DownloadClientRemovesCompletedDownloadsCheck>
{
private DownloadClientInfo _clientStatus;
private Mock<IDownloadClient> _downloadClient;
private static Exception[] DownloadClientExceptions =
{
new DownloadClientUnavailableException("error"),
new DownloadClientAuthenticationException("error"),
new DownloadClientException("error")
};
[SetUp]
public void Setup()
{
_clientStatus = new DownloadClientInfo
{
IsLocalhost = true,
// SortingMode = null,
RemovesCompletedDownloads = true
};
_downloadClient = Mocker.GetMock<IDownloadClient>();
_downloadClient.Setup(s => s.Definition)
.Returns(new DownloadClientDefinition { Name = "Test" });
_downloadClient.Setup(s => s.GetStatus())
.Returns(_clientStatus);
Mocker.GetMock<IProvideDownloadClient>()
.Setup(s => s.GetDownloadClients(It.IsAny<bool>()))
.Returns(new IDownloadClient[] { _downloadClient.Object });
Mocker.GetMock<ILocalizationService>()
.Setup(s => s.GetLocalizedString(It.IsAny<string>()))
.Returns("Some Warning Message");
}
[Test]
public void should_return_warning_if_removing_completed_downloads_is_enabled()
{
Subject.Check().ShouldBeWarning();
}
[Test]
public void should_return_ok_if_remove_completed_downloads_is_not_enabled()
{
_clientStatus.RemovesCompletedDownloads = false;
Subject.Check().ShouldBeOk();
}
[Test]
[TestCaseSource(nameof(DownloadClientExceptions))]
public void should_return_ok_if_client_throws_downloadclientexception(Exception ex)
{
_downloadClient.Setup(s => s.GetStatus())
.Throws(ex);
Subject.Check().ShouldBeOk();
ExceptionVerification.ExpectedErrors(0);
}
}
}
@@ -64,6 +64,11 @@ namespace NzbDrone.Core.Test.NotificationTests
TestLogger.Info("OnRename was called"); TestLogger.Info("OnRename was called");
} }
public override void OnAuthorAdded(Author author)
{
TestLogger.Info("OnAuthorAdded was called");
}
public override void OnAuthorDelete(AuthorDeleteMessage message) public override void OnAuthorDelete(AuthorDeleteMessage message)
{ {
TestLogger.Info("OnAuthorDelete was called"); TestLogger.Info("OnAuthorDelete was called");
@@ -138,6 +143,7 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnUpgrade.Should().BeTrue(); notification.SupportsOnUpgrade.Should().BeTrue();
notification.SupportsOnRename.Should().BeTrue(); notification.SupportsOnRename.Should().BeTrue();
notification.SupportsOnHealthIssue.Should().BeTrue(); notification.SupportsOnHealthIssue.Should().BeTrue();
notification.SupportsOnAuthorAdded.Should().BeTrue();
notification.SupportsOnAuthorDelete.Should().BeTrue(); notification.SupportsOnAuthorDelete.Should().BeTrue();
notification.SupportsOnBookDelete.Should().BeTrue(); notification.SupportsOnBookDelete.Should().BeTrue();
notification.SupportsOnBookFileDelete.Should().BeTrue(); notification.SupportsOnBookFileDelete.Should().BeTrue();
@@ -157,6 +163,7 @@ namespace NzbDrone.Core.Test.NotificationTests
notification.SupportsOnReleaseImport.Should().BeFalse(); notification.SupportsOnReleaseImport.Should().BeFalse();
notification.SupportsOnUpgrade.Should().BeFalse(); notification.SupportsOnUpgrade.Should().BeFalse();
notification.SupportsOnRename.Should().BeFalse(); notification.SupportsOnRename.Should().BeFalse();
notification.SupportsOnAuthorAdded.Should().BeFalse();
notification.SupportsOnAuthorDelete.Should().BeFalse(); notification.SupportsOnAuthorDelete.Should().BeFalse();
notification.SupportsOnBookDelete.Should().BeFalse(); notification.SupportsOnBookDelete.Should().BeFalse();
notification.SupportsOnBookFileDelete.Should().BeFalse(); notification.SupportsOnBookFileDelete.Should().BeFalse();
@@ -0,0 +1,14 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(038)]
public class add_on_author_added_to_notifications : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Notifications").AddColumn("OnAuthorAdded").AsBoolean().WithDefaultValue(false);
}
}
}
@@ -85,6 +85,7 @@ namespace NzbDrone.Core.Datastore
.Ignore(i => i.SupportsOnReleaseImport) .Ignore(i => i.SupportsOnReleaseImport)
.Ignore(i => i.SupportsOnUpgrade) .Ignore(i => i.SupportsOnUpgrade)
.Ignore(i => i.SupportsOnRename) .Ignore(i => i.SupportsOnRename)
.Ignore(i => i.SupportsOnAuthorAdded)
.Ignore(i => i.SupportsOnAuthorDelete) .Ignore(i => i.SupportsOnAuthorDelete)
.Ignore(i => i.SupportsOnBookDelete) .Ignore(i => i.SupportsOnBookDelete)
.Ignore(i => i.SupportsOnBookFileDelete) .Ignore(i => i.SupportsOnBookFileDelete)
@@ -1,6 +1,7 @@
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@@ -10,12 +11,12 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
public class IndexerTagSpecification : IDecisionEngineSpecification public class IndexerTagSpecification : IDecisionEngineSpecification
{ {
private readonly Logger _logger; private readonly Logger _logger;
private readonly IIndexerRepository _indexerRepository; private readonly IIndexerFactory _indexerFactory;
public IndexerTagSpecification(Logger logger, IIndexerRepository indexerRepository) public IndexerTagSpecification(Logger logger, IIndexerFactory indexerFactory)
{ {
_logger = logger; _logger = logger;
_indexerRepository = indexerRepository; _indexerFactory = indexerFactory;
} }
public SpecificationPriority Priority => SpecificationPriority.Default; public SpecificationPriority Priority => SpecificationPriority.Default;
@@ -23,8 +24,24 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
public virtual Decision IsSatisfiedBy(RemoteBook subject, SearchCriteriaBase searchCriteria) public virtual Decision IsSatisfiedBy(RemoteBook subject, SearchCriteriaBase searchCriteria)
{ {
// If indexer has tags, check that at least one of them is present on the author if (subject.Release == null || subject.Author?.Tags == null || subject.Release.IndexerId == 0)
var indexerTags = _indexerRepository.Get(subject.Release.IndexerId).Tags; {
return Decision.Accept();
}
IndexerDefinition indexer;
try
{
indexer = _indexerFactory.Get(subject.Release.IndexerId);
}
catch (ModelNotFoundException)
{
_logger.Debug("Indexer with id {0} does not exist, skipping indexer tags check", subject.Release.IndexerId);
return Decision.Accept();
}
// If indexer has tags, check that at least one of them is present on the series
var indexerTags = indexer.Tags;
if (indexerTags.Any() && indexerTags.Intersect(subject.Author.Tags).Empty()) if (indexerTags.Any() && indexerTags.Intersect(subject.Author.Tags).Empty())
{ {
@@ -304,13 +304,13 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
break; break;
} }
if (version >= new Version("2.6.1")) if (version >= new Version("2.6.1") && item.Status == DownloadItemStatus.Completed)
{ {
if (torrent.ContentPath != torrent.SavePath) if (torrent.ContentPath != torrent.SavePath)
{ {
item.OutputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(torrent.ContentPath)); item.OutputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(torrent.ContentPath));
} }
else if (item.Status == DownloadItemStatus.Completed) else
{ {
item.Status = DownloadItemStatus.Warning; item.Status = DownloadItemStatus.Warning;
item.Message = "Unable to Import. Path matches client base download directory, it's possible 'Keep top-level folder' is disabled for this torrent or 'Torrent Content Layout' is NOT set to 'Original' or 'Create Subfolder'?"; item.Message = "Unable to Import. Path matches client base download directory, it's possible 'Keep top-level folder' is disabled for this torrent or 'Torrent Content Layout' is NOT set to 'Original' or 'Create Subfolder'?";
@@ -386,10 +386,13 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
} }
} }
var minimumRetention = 60 * 24 * 14;
return new DownloadClientInfo return new DownloadClientInfo
{ {
IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost", IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost",
OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) } OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) },
RemovesCompletedDownloads = (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
}; };
} }
@@ -263,6 +263,17 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
status.OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, category.FullPath) }; status.OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, category.FullPath) };
} }
if (config.Misc.history_retention.IsNotNullOrWhiteSpace() && config.Misc.history_retention.EndsWith("d"))
{
int.TryParse(config.Misc.history_retention.AsSpan(0, config.Misc.history_retention.Length - 1),
out var daysRetention);
status.RemovesCompletedDownloads = daysRetention < 14;
}
else
{
status.RemovesCompletedDownloads = config.Misc.history_retention != "0";
}
return status; return status;
} }
@@ -29,6 +29,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
public string[] date_categories { get; set; } public string[] date_categories { get; set; }
public bool enable_date_sorting { get; set; } public bool enable_date_sorting { get; set; }
public bool pre_check { get; set; } public bool pre_check { get; set; }
public string history_retention { get; set; }
} }
public class SabnzbdCategory public class SabnzbdCategory
@@ -11,6 +11,7 @@ namespace NzbDrone.Core.Download
} }
public bool IsLocalhost { get; set; } public bool IsLocalhost { get; set; }
public bool RemovesCompletedDownloads { get; set; }
public List<OsPath> OutputRootFolders { get; set; } public List<OsPath> OutputRootFolders { get; set; }
} }
} }
@@ -346,6 +346,7 @@ namespace NzbDrone.Core.Extras.Metadata
private void DownloadImage(Author author, ImageFileResult image) private void DownloadImage(Author author, ImageFileResult image)
{ {
var fullPath = Path.Combine(author.Path, image.RelativePath); var fullPath = Path.Combine(author.Path, image.RelativePath);
var downloaded = true;
try try
{ {
@@ -353,12 +354,19 @@ namespace NzbDrone.Core.Extras.Metadata
{ {
_httpClient.DownloadFile(image.Url, fullPath); _httpClient.DownloadFile(image.Url, fullPath);
} }
else else if (_diskProvider.FileExists(image.Url))
{ {
_diskProvider.CopyFile(image.Url, fullPath); _diskProvider.CopyFile(image.Url, fullPath);
} }
else
{
downloaded = false;
}
_mediaFileAttributeService.SetFilePermissions(fullPath); if (downloaded)
{
_mediaFileAttributeService.SetFilePermissions(fullPath);
}
} }
catch (WebException ex) catch (WebException ex)
{ {
@@ -0,0 +1,64 @@
using System;
using NLog;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.Download;
using NzbDrone.Core.Download.Clients;
using NzbDrone.Core.Localization;
using NzbDrone.Core.RemotePathMappings;
using NzbDrone.Core.RootFolders;
using NzbDrone.Core.ThingiProvider.Events;
namespace NzbDrone.Core.HealthCheck.Checks
{
[CheckOn(typeof(ProviderUpdatedEvent<IDownloadClient>))]
[CheckOn(typeof(ProviderDeletedEvent<IDownloadClient>))]
[CheckOn(typeof(ModelEvent<RootFolder>))]
[CheckOn(typeof(ModelEvent<RemotePathMapping>))]
public class DownloadClientRemovesCompletedDownloadsCheck : HealthCheckBase, IProvideHealthCheck
{
private readonly IProvideDownloadClient _downloadClientProvider;
private readonly Logger _logger;
public DownloadClientRemovesCompletedDownloadsCheck(IProvideDownloadClient downloadClientProvider,
Logger logger,
ILocalizationService localizationService)
: base(localizationService)
{
_downloadClientProvider = downloadClientProvider;
_logger = logger;
}
public override HealthCheck Check()
{
var clients = _downloadClientProvider.GetDownloadClients(true);
foreach (var client in clients)
{
try
{
var clientName = client.Definition.Name;
var status = client.GetStatus();
if (status.RemovesCompletedDownloads)
{
return new HealthCheck(GetType(),
HealthCheckResult.Warning,
string.Format(_localizationService.GetLocalizedString("DownloadClientRemovesCompletedDownloadsHealthCheckMessage"), clientName, "Readarr"),
"#download-client-removes-completed-downloads");
}
}
catch (DownloadClientException ex)
{
_logger.Debug(ex, "Unable to communicate with {0}", client.Definition.Name);
}
catch (Exception ex)
{
_logger.Error(ex, "Unknown error occurred in DownloadClientHistoryRetentionCheck HealthCheck");
}
}
return new HealthCheck(GetType());
}
}
}
@@ -257,9 +257,17 @@ namespace NzbDrone.Core.Indexers
protected virtual bool IsValidRelease(ReleaseInfo release) protected virtual bool IsValidRelease(ReleaseInfo release)
{ {
if (release.Title.IsNullOrWhiteSpace())
{
_logger.Trace("Invalid Release: '{0}' from indexer: {1}. No title provided.", release.InfoUrl, Definition.Name);
return false;
}
if (release.DownloadUrl.IsNullOrWhiteSpace()) if (release.DownloadUrl.IsNullOrWhiteSpace())
{ {
_logger.Trace("Invalid Release: '{0}' from indexer: {1}. No Download URL provided.", release.Title, release.Indexer); _logger.Trace("Invalid Release: '{0}' from indexer: {1}. No Download URL provided.", release.Title, Definition.Name);
return false; return false;
} }
@@ -7,6 +7,7 @@ using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.Indexers.Exceptions;
namespace NzbDrone.Core.Indexers.Newznab namespace NzbDrone.Core.Indexers.Newznab
{ {
@@ -73,6 +74,13 @@ namespace NzbDrone.Core.Indexers.Newznab
_logger.Debug(ex, "Failed to parse newznab api capabilities for {0}", indexerSettings.BaseUrl); _logger.Debug(ex, "Failed to parse newznab api capabilities for {0}", indexerSettings.BaseUrl);
throw; throw;
} }
catch (ApiKeyException ex)
{
ex.WithData(response, 128 * 1024);
_logger.Trace("Unexpected Response content ({0} bytes): {1}", response.ResponseData.Length, response.Content);
_logger.Debug(ex, "Failed to parse newznab api capabilities for {0}, invalid API key", indexerSettings.BaseUrl);
throw;
}
catch (Exception ex) catch (Exception ex)
{ {
ex.WithData(response, 128 * 1024); ex.WithData(response, 128 * 1024);
+3 -1
View File
@@ -626,5 +626,7 @@
"AddNew": "Добави нов", "AddNew": "Добави нов",
"NextExecution": "Следващо изпълнение", "NextExecution": "Следващо изпълнение",
"AllResultsAreHiddenByTheAppliedFilter": "Всички резултати са скрити от приложения филтър", "AllResultsAreHiddenByTheAppliedFilter": "Всички резултати са скрити от приложения филтър",
"Backup": "Архивиране" "Backup": "Архивиране",
"MetadataProfiles": "Добави профил на метадата",
"MetadataProfile": "Добави профил на метадата"
} }
+2 -1
View File
@@ -662,5 +662,6 @@
"MinimumCustomFormatScoreHelpText": "Minimální skóre vlastního formátu požadované pro obejití zpoždění preferovaného protokolu", "MinimumCustomFormatScoreHelpText": "Minimální skóre vlastního formátu požadované pro obejití zpoždění preferovaného protokolu",
"Series": "Seriál", "Series": "Seriál",
"DeleteCondition": "Odstranit podmínku", "DeleteCondition": "Odstranit podmínku",
"Database": "Databáze" "Database": "Databáze",
"CountDownloadClientsSelected": "{count} vybraných klientů ke stahování"
} }
+1 -1
View File
@@ -338,7 +338,7 @@
"ShowSizeOnDisk": "Belegter Speicherplatz anzeigen", "ShowSizeOnDisk": "Belegter Speicherplatz anzeigen",
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Wird in der Wochenansicht über jeder Spalte angezeigt", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Wird in der Wochenansicht über jeder Spalte angezeigt",
"Size": " Größe", "Size": " Größe",
"SkipFreeSpaceCheck": "Pürfung des freien Speichers überspringen", "SkipFreeSpaceCheck": "Prüfung des freien Speichers überspringen",
"SkipFreeSpaceCheckWhenImportingHelpText": "Aktiviere diese Option, wenn es Readarr nicht möglich ist, den freien Speicherplatz des Stammverzeichnisses für Autoren zu erkennen", "SkipFreeSpaceCheckWhenImportingHelpText": "Aktiviere diese Option, wenn es Readarr nicht möglich ist, den freien Speicherplatz des Stammverzeichnisses für Autoren zu erkennen",
"SorryThatAuthorCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.", "SorryThatAuthorCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.",
"SorryThatBookCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.", "SorryThatBookCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.",
+4 -1
View File
@@ -993,5 +993,8 @@
"AddNew": "Προσθήκη Νέων", "AddNew": "Προσθήκη Νέων",
"Backup": "Αντίγραφο Ασφαλείας", "Backup": "Αντίγραφο Ασφαλείας",
"NextExecution": "Επόμενη εκτέλεση", "NextExecution": "Επόμενη εκτέλεση",
"Small": "Μικρό" "Small": "Μικρό",
"AppUpdated": "{appName} Ενημερώθηκε",
"AppUpdatedVersion": "ξαναφορτωθεί",
"AutoAdd": "Προσθήκη"
} }
@@ -265,6 +265,7 @@
"DownloadClientCheckDownloadingToRoot": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.", "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", "DownloadClientCheckNoneAvailableMessage": "No download client is available",
"DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {0}.", "DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {0}.",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {0} is set to remove completed downloads. This can result in downloads being removed from your client before {1} can import them.",
"DownloadClientSettings": "Download Client Settings", "DownloadClientSettings": "Download Client Settings",
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures", "DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}", "DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",
@@ -591,6 +592,8 @@
"NotificationTriggers": "Notification Triggers", "NotificationTriggers": "Notification Triggers",
"OnApplicationUpdate": "On Application Update", "OnApplicationUpdate": "On Application Update",
"OnApplicationUpdateHelpText": "On Application Update", "OnApplicationUpdateHelpText": "On Application Update",
"OnAuthorAdded": "On Author Added",
"OnAuthorAddedHelpText": "On Author Added",
"OnAuthorDelete": "On Author Delete", "OnAuthorDelete": "On Author Delete",
"OnAuthorDeleteHelpText": "On Author Delete", "OnAuthorDeleteHelpText": "On Author Delete",
"OnBookDelete": "On Book Delete", "OnBookDelete": "On Book Delete",
+4 -3
View File
@@ -738,14 +738,14 @@
"BookFilesCountMessage": "No hay archivos de libros", "BookFilesCountMessage": "No hay archivos de libros",
"AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros", "AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros",
"BookStudio": "Estudio de libros", "BookStudio": "Estudio de libros",
"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", "AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no están soportadas directamente cuando se utiliza el mecanismo de actualización de Docker. Tendrá que actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
"AuthorIndex": "Índice de autor", "AuthorIndex": "Índice de autor",
"AudioFileMetadata": "Escribir metadatos en archivos de audio", "AudioFileMetadata": "Escribir metadatos en archivos de audio",
"BookIndex": "Índice de libro", "BookIndex": "Índice de libro",
"BookEditor": "Editor de Libro", "BookEditor": "Editor de Libro",
"ASIN": "ASIN", "ASIN": "ASIN",
"AnyEditionOkHelpText": "Readarr cambiará automáticamente a la edición que mejor coincida con los archivos descargados", "AnyEditionOkHelpText": "Readarr cambiará automáticamente a la edición que mejor coincida con los archivos descargados",
"AppUpdated": "{appName} Actualizado", "AppUpdated": "{appName} Actualizada",
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}", "AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}",
"AuthorFolderFormat": "Formato de Carpeta de Autor", "AuthorFolderFormat": "Formato de Carpeta de Autor",
"AuthorNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)", "AuthorNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)",
@@ -754,5 +754,6 @@
"BookFileCountBookCountTotalTotalBookCountInterp": "{0} / {1} (Total: {2})", "BookFileCountBookCountTotalTotalBookCountInterp": "{0} / {1} (Total: {2})",
"Book": "Libro", "Book": "Libro",
"AutomaticallySwitchEdition": "Cambiar edición automáticamente", "AutomaticallySwitchEdition": "Cambiar edición automáticamente",
"BookNaming": "Nombrado de libros" "BookNaming": "Nombrado de libros",
"Books": "Libro"
} }
+25 -21
View File
@@ -12,15 +12,15 @@
"About": "Tietoja", "About": "Tietoja",
"AddListExclusion": "Lisää tuontilistojen poikkeussääntö", "AddListExclusion": "Lisää tuontilistojen poikkeussääntö",
"AddingTag": "Tunniste lisätään", "AddingTag": "Tunniste lisätään",
"AgeWhenGrabbed": "Ikä (siepatessa)", "AgeWhenGrabbed": "Ikä (sieppaushetkellä)",
"AlreadyInYourLibrary": "Elokuva on jo kirjastossasi", "AlreadyInYourLibrary": "Elokuva on jo kirjastossasi",
"AlternateTitles": "Vaihtoehtoiset nimet", "AlternateTitles": "Vaihtoehtoiset nimet",
"Analytics": "Analytiikka", "Analytics": "Analytiikka",
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja sovelluksen palvelimille. Tämä sisältää tietoja selaimestasi, verkkokäyttöliittymän sivujen käytöstä, virheraportoinnista sekä käyttöjärjestelmästäsi ja versiosta. Käytämme näitä tietoja ominaisuuksien ja virhekorjauksien painotukseen.", "AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
"AppDataDirectory": "AppData-kansio", "AppDataDirectory": "AppData-kansio",
"ApplyTags": "Tunnistetoimenpide", "ApplyTags": "Tunnistetoimenpide",
"Authentication": "Todennus", "Authentication": "Todennus",
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana.", "AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.",
"AuthorClickToChangeBook": "Vaihda kirjaa painamalla", "AuthorClickToChangeBook": "Vaihda kirjaa painamalla",
"AutoRedownloadFailedHelpText": "Etsi ja yritä ladata toinen julkaisu automaattisesti", "AutoRedownloadFailedHelpText": "Etsi ja yritä ladata toinen julkaisu automaattisesti",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Levyltä poistettavien kirjojen valvonta lopetetaan automaattisesti.", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Levyltä poistettavien kirjojen valvonta lopetetaan automaattisesti.",
@@ -30,7 +30,7 @@
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat, automaattiset varmuuskopiot poistetaan automaattisesti.", "BackupRetentionHelpText": "Säilytysjaksoa vanhemmat, automaattiset varmuuskopiot poistetaan automaattisesti.",
"Backups": "Varmuuskopiointi", "Backups": "Varmuuskopiointi",
"BindAddress": "Sidososoite", "BindAddress": "Sidososoite",
"BindAddressHelpText": "Toimiva IPv4-osoite tai '*' (tähti) kaikille yhteyksille.", "BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.",
"BindAddressHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.", "BindAddressHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
"BookIsDownloading": "Kirjaa ladataan", "BookIsDownloading": "Kirjaa ladataan",
"BookIsDownloadingInterp": "Kirjaa ladataan - {0} % {1}", "BookIsDownloadingInterp": "Kirjaa ladataan - {0} % {1}",
@@ -112,7 +112,7 @@
"EnableAutomaticAdd": "Automaattilisäys", "EnableAutomaticAdd": "Automaattilisäys",
"EnableAutomaticSearch": "Automaattihaku", "EnableAutomaticSearch": "Automaattihaku",
"EnableColorImpairedMode": "Heikentyneen värinäön tila", "EnableColorImpairedMode": "Heikentyneen värinäön tila",
"EnableColorImpairedModeHelpText": "Muokattu tyyli käyttäjille, joiden värinäkö on heikentynyt. Auttaa erottamaan värikoodatun tiedon.", "EnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin",
"EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset lataustyökalusta automaattisesti.", "EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset lataustyökalusta automaattisesti.",
"EnableHelpText": "Luo tälle metatietotyypille metatietotiedostot.", "EnableHelpText": "Luo tälle metatietotyypille metatietotiedostot.",
"EnableInteractiveSearch": "Vuorovaikutteinen haku", "EnableInteractiveSearch": "Vuorovaikutteinen haku",
@@ -142,7 +142,7 @@
"Global": "Järjestelmänlaajuiset", "Global": "Järjestelmänlaajuiset",
"GoToInterp": "Siirry kohteeseen '{0}'", "GoToInterp": "Siirry kohteeseen '{0}'",
"Grab": "Sieppaa", "Grab": "Sieppaa",
"GrabID": "Sieppauksen ID", "GrabID": "Sieppaustunniste",
"GrabRelease": "Sieppaa julkaisu", "GrabRelease": "Sieppaa julkaisu",
"GrabReleaseMessageText": "Readarr ei tunnistanut, mille kirjailijalle ja kirjalle tämä julkaisu kuuluu, eikä julkaisun automaattinen tuonti onnistu. Haluatko siepata julkaisun '{0}'?", "GrabReleaseMessageText": "Readarr ei tunnistanut, mille kirjailijalle ja kirjalle tämä julkaisu kuuluu, eikä julkaisun automaattinen tuonti onnistu. Haluatko siepata julkaisun '{0}'?",
"GrabSelected": "Sieppaa valitut", "GrabSelected": "Sieppaa valitut",
@@ -320,9 +320,9 @@
"SearchSelected": "Haku valittu", "SearchSelected": "Haku valittu",
"Security": "Suojaus", "Security": "Suojaus",
"SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja", "SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja",
"SetPermissions": "Aseta käyttöoikeudet", "SetPermissions": "Määritä käyttöoikeudet",
"SetPermissionsLinuxHelpText": "Pitäisikö chmod suorittaa, kun tiedostoja tuodaan / nimetään uudelleen?", "SetPermissionsLinuxHelpText": "Tulisiko chmod suorittaa, kun tiedostoja tuodaan/nimetään uudelleen?",
"SetPermissionsLinuxHelpTextWarning": "Jos et ole varma näiden asetusten toiminnasta, älä muuta niitä.", "SetPermissionsLinuxHelpTextWarning": "Jollet ole varma mitä nämä asetukset tekevät, älä muuta niitä.",
"Settings": "Asetukset", "Settings": "Asetukset",
"ShortDateFormat": "Lyhyt päivämäärämuoto", "ShortDateFormat": "Lyhyt päivämäärämuoto",
"ShowCutoffUnmetIconHelpText": "Näytä kuvake elokuville, joiden tiedostot eivät vastaa vielä määritettyä katkaisutasoa.", "ShowCutoffUnmetIconHelpText": "Näytä kuvake elokuville, joiden tiedostot eivät vastaa vielä määritettyä katkaisutasoa.",
@@ -332,7 +332,7 @@
"ShowQualityProfile": "Näytä laatuprofiili", "ShowQualityProfile": "Näytä laatuprofiili",
"ShowQualityProfileHelpText": "Näytä laatuprofiili julisteen alla.", "ShowQualityProfileHelpText": "Näytä laatuprofiili julisteen alla.",
"ShowRelativeDates": "Näytä suhteutetut päiväykset", "ShowRelativeDates": "Näytä suhteutetut päiväykset",
"ShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) tai absoluuttiset päiväykset.", "ShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan",
"ShowSearch": "Näytä haku", "ShowSearch": "Näytä haku",
"ShowSearchActionHelpText": "Näytä hakupainike osoitettaessa.", "ShowSearchActionHelpText": "Näytä hakupainike osoitettaessa.",
"ShowSizeOnDisk": "Näytä tiedostokoko", "ShowSizeOnDisk": "Näytä tiedostokoko",
@@ -352,12 +352,12 @@
"StartupDirectory": "Käynnistyskansio", "StartupDirectory": "Käynnistyskansio",
"Status": "Tila", "Status": "Tila",
"StatusEndedEnded": "Päättynyt", "StatusEndedEnded": "Päättynyt",
"Style": "Ulkoasun tyyli", "Style": "Ulkoasu",
"SuccessMyWorkIsDoneNoFilesToRename": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.", "SuccessMyWorkIsDoneNoFilesToRename": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.",
"SuccessMyWorkIsDoneNoFilesToRetag": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.", "SuccessMyWorkIsDoneNoFilesToRetag": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.",
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle",
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Hakemistoa ei tueta tällä hakemistolla", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Hakemistoa ei tueta tällä hakemistolla",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Profiilia käytetään automaattihaun yhteydessä, kun haku suoritetaan käyttöliittymästä tai Readarrin toimesta.", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai Readarrin toimesta.",
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.", "TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
"Tags": "Tunnisteet", "Tags": "Tunnisteet",
@@ -367,7 +367,7 @@
"TestAllIndexers": "Testaa tietolähteet", "TestAllIndexers": "Testaa tietolähteet",
"TestAllLists": "Testaa listat", "TestAllLists": "Testaa listat",
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.",
"TimeFormat": "Kellonajan esitystapa", "TimeFormat": "Kellonajan esitys",
"Title": "Nimike", "Title": "Nimike",
"TorrentDelay": "Torrent-viive", "TorrentDelay": "Torrent-viive",
"TorrentDelayHelpText": "Viive minuutteina ennen kuin torrentia siepataan.", "TorrentDelayHelpText": "Viive minuutteina ennen kuin torrentia siepataan.",
@@ -469,7 +469,7 @@
"ShowTitleHelpText": "Näytä kirjailijan nimi julisteen alla", "ShowTitleHelpText": "Näytä kirjailijan nimi julisteen alla",
"ShowUnknownAuthorItems": "Näytä 'Tuntemattomat kirjailijat' -kohde", "ShowUnknownAuthorItems": "Näytä 'Tuntemattomat kirjailijat' -kohde",
"SkipBooksWithMissingReleaseDate": "Ohita kirjat, joilta puuttuu julkaisupäivä", "SkipBooksWithMissingReleaseDate": "Ohita kirjat, joilta puuttuu julkaisupäivä",
"UrlBaseHelpText": "Lisää Calibren URL-osoitteeseen etuliitteen, (esim. 'http://[host]:[port]/[urlBase]').", "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.",
"Author": "Kirjailija", "Author": "Kirjailija",
"BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.", "BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.",
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.", "TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.",
@@ -539,7 +539,7 @@
"CalibreNotCalibreWeb": "Readarr voi käyttää Calibren omaa sisältöpalvelinta, muttei täysin erillistä Calibre-Web-sovellusta.", "CalibreNotCalibreWeb": "Readarr voi käyttää Calibren omaa sisältöpalvelinta, muttei täysin erillistä Calibre-Web-sovellusta.",
"CalibreContentServer": "Calibre-sisältöpalvelin", "CalibreContentServer": "Calibre-sisältöpalvelin",
"CalibreLibrary": "Calibre-kirjasto", "CalibreLibrary": "Calibre-kirjasto",
"CalibreHost": "Calibren isäntä", "CalibreHost": "Calibre-palvelin",
"CalibreMetadata": "Calibren metatiedot", "CalibreMetadata": "Calibren metatiedot",
"CalibreOutputFormat": "Calibren kohdemuoto", "CalibreOutputFormat": "Calibren kohdemuoto",
"CalibreOutputProfile": "Calibren kohdeprofiili", "CalibreOutputProfile": "Calibren kohdeprofiili",
@@ -662,7 +662,7 @@
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma", "OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
"OnRename": "Kun elokuva nimetään uudelleen", "OnRename": "Kun elokuva nimetään uudelleen",
"OnUpgrade": "Kun elokuva päivitetään", "OnUpgrade": "Kun elokuva päivitetään",
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen '{0}' IP-osoitteen selvitys epäonnistui.", "ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.",
"QualitySettingsSummary": "Laatumääritykset erilaisia sisältömuotoja ja tiedostokokoja varten.", "QualitySettingsSummary": "Laatumääritykset erilaisia sisältömuotoja ja tiedostokokoja varten.",
"QueueIsEmpty": "Jono on tyhjä", "QueueIsEmpty": "Jono on tyhjä",
"ReadarrSupportsAnyDownloadClient": "Monet torrent- ja Usenet-lataustyökalut ovat tuettuja.", "ReadarrSupportsAnyDownloadClient": "Monet torrent- ja Usenet-lataustyökalut ovat tuettuja.",
@@ -775,7 +775,7 @@
"OnApplicationUpdate": "Sovelluksen päivittyessä", "OnApplicationUpdate": "Sovelluksen päivittyessä",
"OnApplicationUpdateHelpText": "Sovelluksen päivittyessä", "OnApplicationUpdateHelpText": "Sovelluksen päivittyessä",
"Theme": "Teema", "Theme": "Teema",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan käyttöjärjestelmäsi teemaa vastaavaksi. Innoittanut Theme.Park.", "ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"EnableRssHelpText": "Käytetään etsittäessä julkaisuja RSS-syötteistä ajoitetusti.", "EnableRssHelpText": "Käytetään etsittäessä julkaisuja RSS-syötteistä ajoitetusti.",
"BypassIfHighestQuality": "Ohita, jos korkein laatu", "BypassIfHighestQuality": "Ohita, jos korkein laatu",
"CustomFormatScore": "Mukautetun muodon pisteytys", "CustomFormatScore": "Mukautetun muodon pisteytys",
@@ -826,7 +826,7 @@
"ResetQualityDefinitions": "Palauta laatumääritykset", "ResetQualityDefinitions": "Palauta laatumääritykset",
"ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?", "ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?",
"NoEventsFound": "Tapahtumia ei löytynyt", "NoEventsFound": "Tapahtumia ei löytynyt",
"BlocklistReleaseHelpText": "Estää julkaisun automaattisen uudelleensieppauksen.", "BlocklistReleaseHelpText": "Estää {appName}ia sieppaamasta näitä tiedostoja automaattisesti uudelleen.",
"RecycleBinUnableToWriteHealthCheck": "Määritettyyn roskakorikansioon ei voi tallentaa: {0}. Varmista, että sijainti on olemassa ja että käyttäjällä on kirjoitusoikeus kansioon.", "RecycleBinUnableToWriteHealthCheck": "Määritettyyn roskakorikansioon ei voi tallentaa: {0}. Varmista, että sijainti on olemassa ja että käyttäjällä on kirjoitusoikeus kansioon.",
"ApplyTagsHelpTextHowToApplyAuthors": "Tunnisteisiin kohdistettavat toimenpiteet:", "ApplyTagsHelpTextHowToApplyAuthors": "Tunnisteisiin kohdistettavat toimenpiteet:",
"DeleteSelectedImportLists": "Poista tuontilista", "DeleteSelectedImportLists": "Poista tuontilista",
@@ -853,7 +853,7 @@
"RemoveCompleted": "Poista valmistuneet", "RemoveCompleted": "Poista valmistuneet",
"RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevassa taulukossa yksittäisten lataustyökalujen alle.", "RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevassa taulukossa yksittäisten lataustyökalujen alle.",
"SetTags": "Tunnisteiden määritys", "SetTags": "Tunnisteiden määritys",
"ConnectionLostToBackend": "Radarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.", "ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.",
"NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi", "NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi",
"NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}", "NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}",
"System": "Järjestelmä", "System": "Järjestelmä",
@@ -866,7 +866,7 @@
"Events": "Tapahtumat", "Events": "Tapahtumat",
"FreeSpace": "Vapaa tila", "FreeSpace": "Vapaa tila",
"ConnectionLost": "Yhteys on katkennut", "ConnectionLost": "Yhteys on katkennut",
"ConnectionLostReconnect": "Radarr pyrkii muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".", "ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".",
"RecentChanges": "Viimeaikaiset muutokset", "RecentChanges": "Viimeaikaiset muutokset",
"WhatsNew": "Mikä on uutta?", "WhatsNew": "Mikä on uutta?",
"Large": "Suuri", "Large": "Suuri",
@@ -879,5 +879,9 @@
"Activity": "Tapahtumat", "Activity": "Tapahtumat",
"AddNew": "Lisää uusi", "AddNew": "Lisää uusi",
"Backup": "Varmuuskopio", "Backup": "Varmuuskopio",
"NextExecution": "Seuraava suoritus" "NextExecution": "Seuraava suoritus",
"AutomaticUpdatesDisabledDocker": "Suoraa automaattista päivitystä ei tueta käytettäessä Dockerin päivitysmekanismia. Joko Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava skriptillä.",
"AppUpdated": "{appName} on päivitetty",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
"Iso639-3": "ISO 639-3 -kielikoodit tai \"null\" (pilkuin eroteltuna)"
} }
+105 -82
View File
@@ -18,32 +18,32 @@
"Logging": "Enregistrement", "Logging": "Enregistrement",
"Mode": "Mode", "Mode": "Mode",
"ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.", "ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.",
"QualityProfiles": "Profils qualité", "QualityProfiles": "Profils de qualité",
"Security": "Sécurité", "Security": "Sécurité",
"SslPortHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "SslPortHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"SslCertPathHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "SslCertPathHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"UnableToLoadMetadataProfiles": "Impossible de charger les profils de délai", "UnableToLoadMetadataProfiles": "Impossible de charger les profils de délai",
"AddingTag": "Ajouter un tag", "AddingTag": "Ajout d'une étiquette",
"AgeWhenGrabbed": "Age (au moment du téléchargement)", "AgeWhenGrabbed": "Âge (au moment de la saisie)",
"AlreadyInYourLibrary": "Déjà disponible dans votre librairie", "AlreadyInYourLibrary": "Déjà dans la bibliothèque",
"AlternateTitles": "Titre alternatif", "AlternateTitles": "Titres alternatifs",
"Analytics": "Statistiques", "Analytics": "Statistiques",
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Readarr. Cela inclut des informations sur votre navigateur, quelle page de l'interface web Readarr vous utilisez, les rapports d'erreur ainsi que le SE 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 vers les serveurs de Readarr. Cela inclut des informations sur votre navigateur, quelle page de l'interface web Readarr vous utilisez, les rapports d'erreur ainsi que le SE et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
"AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"AppDataDirectory": "Dossier AppData", "AppDataDirectory": "Dossier AppData",
"ApplyTags": "Appliquer les tags", "ApplyTags": "Appliquer les étiquettes",
"Authentication": "Authentification", "Authentication": "Authentification",
"AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Readarr", "AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à Readarr",
"AuthorClickToChangeBook": "Cliquer pour changer le livre", "AuthorClickToChangeBook": "Cliquer pour changer le livre",
"AutoRedownloadFailedHelpText": "Chercher et essayer de télécharger une version différente automatiquement", "AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres qui sont effacés du disque dur sont automatiquement non-surveillés dans Readarr", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres effacés du disque dur ne seront plus surveillés dans Readarr",
"Automatic": "Automatique", "Automatic": "Automatique",
"BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Readarr", "BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Readarr",
"BackupNow": "Sauvegarder maintenant", "BackupNow": "Sauvegarder maintenant",
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées", "BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de rétention seront nettoyées automatiquement",
"Backups": "Sauvegardes", "Backups": "Sauvegardes",
"BindAddress": "Adresse d'attache", "BindAddress": "Adresse de liaison",
"BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces", "BindAddressHelpText": "Adresse IP valide, localhost ou « * » pour toutes les interfaces",
"BookIsDownloading": "Le livre est en cours de téléchargement", "BookIsDownloading": "Le livre est en cours de téléchargement",
"BookIsDownloadingInterp": "Le livre est en cours de téléchargement - {0}% {1}", "BookIsDownloadingInterp": "Le livre est en cours de téléchargement - {0}% {1}",
"BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales", "BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales",
@@ -52,16 +52,16 @@
"Cancel": "Annuler", "Cancel": "Annuler",
"CancelMessageText": "Êtes-vous sur de vouloir annuler cette tâche en attente ?", "CancelMessageText": "Êtes-vous sur de vouloir annuler cette tâche en attente ?",
"CertificateValidation": "Validation du certificat", "CertificateValidation": "Validation du certificat",
"CertificateValidationHelpText": "Modifier le degré de rigueur de la validation de la certification HTTPS. Ne changez rien si vous ne comprenez pas les risques.", "CertificateValidationHelpText": "Modifier le niveau de rigueur de la validation de la certification HTTPS. Ne pas modifier si vous ne maîtrisez pas les risques.",
"ChangeFileDate": "Changer la date du fichier", "ChangeFileDate": "Changer la date du fichier",
"ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés", "ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés",
"ChmodFolder": "chmod Dossier", "ChmodFolder": "chmod Dossier",
"ChmodFolderHelpText": "Nombre, appliqué durant l'import/renommage vers les dossiers et fichiers multimédias (sans exécuter les bits)", "ChmodFolderHelpText": "Octal, appliqué lors de l'importation/du renommage des dossiers et fichiers multimédias (sans bits d'exécution)",
"ChmodFolderHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier les permissions du client de téléchargement.", "ChmodFolderHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier les permissions du client de téléchargement.",
"ChownGroupHelpText": "Nom du Groupe ou GID. Utiliser le GID pour les systèmes de fichier distants.", "ChownGroupHelpText": "Nom du groupe ou gid. Utilisez gid pour les systèmes de fichiers distants.",
"ChownGroupHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier que le client de téléchargement utilise le même Groupe que Readarr.", "ChownGroupHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier que le client de téléchargement utilise le même Groupe que Readarr.",
"Clear": "Effacer", "Clear": "Effacer",
"ClickToChangeQuality": "Cliquer pour changer la qualité", "ClickToChangeQuality": "Cliquez pour changer la qualité",
"ClientPriority": "Priorité du client", "ClientPriority": "Priorité du client",
"CloneIndexer": "Dupliqué l'indexeur", "CloneIndexer": "Dupliqué l'indexeur",
"CloneProfile": "Dupliqué le profil", "CloneProfile": "Dupliqué le profil",
@@ -83,21 +83,21 @@
"DelayingDownloadUntilInterp": "Retarder le téléchargement jusqu'au {0} à {1}", "DelayingDownloadUntilInterp": "Retarder le téléchargement jusqu'au {0} à {1}",
"Delete": "Supprimer", "Delete": "Supprimer",
"DeleteBackup": "Supprimer la sauvegarde", "DeleteBackup": "Supprimer la sauvegarde",
"DeleteBackupMessageText": "Êtes-vous sûr de vouloir supprimer la sauvegarde '{0}' ?", "DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?",
"DeleteDelayProfile": "Supprimer le profil de délai", "DeleteDelayProfile": "Supprimer le profil de délai",
"DeleteDelayProfileMessageText": "Êtes vous sûr de vouloir effacer ce profil de délai ?", "DeleteDelayProfileMessageText": "Êtes vous sûr de vouloir effacer ce profil de délai ?",
"DeleteDownloadClient": "Supprimer le client de téléchargement", "DeleteDownloadClient": "Supprimer le client de téléchargement",
"DeleteDownloadClientMessageText": "Êtes-vous sûr de vouloir supprimer le client de téléchargement '{0}' ?", "DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?",
"DeleteEmptyFolders": "Supprimer les dossiers vides", "DeleteEmptyFolders": "Supprimer les dossiers vides",
"DeleteEmptyFoldersHelpText": "Supprimer les dossiers auteurs vides pendant le scan du disque dur et quand les fichiers de livres sont supprimés", "DeleteEmptyFoldersHelpText": "Supprimer les dossiers auteurs vides pendant le scan du disque dur et quand les fichiers de livres sont supprimés",
"DeleteImportListExclusion": "Supprimer les exclusions de liste d'imports", "DeleteImportListExclusion": "Supprimer les exclusions de liste d'imports",
"DeleteImportListExclusionMessageText": "Êtes vous sûr de vouloir effacer cette exclusion de liste d'imports ?", "DeleteImportListExclusionMessageText": "Êtes vous sûr de vouloir effacer cette exclusion de liste d'imports ?",
"DeleteImportListMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?", "DeleteImportListMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
"DeleteIndexer": "Supprimer l'indexeur", "DeleteIndexer": "Supprimer l'indexeur",
"DeleteIndexerMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DeleteIndexerMessageText": "Voulez-vous vraiment supprimer l'indexeur « {name} » ?",
"DeleteMetadataProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?", "DeleteMetadataProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?",
"DeleteNotification": "Supprimer la notification", "DeleteNotification": "Supprimer la notification",
"DeleteNotificationMessageText": "Êtes-vous sûr de vouloir supprimer la notification '{0}' ?", "DeleteNotificationMessageText": "Voulez-vous supprimer la notification « {name} » ?",
"DeleteQualityProfile": "Supprimer le profil qualité", "DeleteQualityProfile": "Supprimer le profil qualité",
"DeleteQualityProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?", "DeleteQualityProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?",
"DeleteReleaseProfile": "Supprimer le profil de version", "DeleteReleaseProfile": "Supprimer le profil de version",
@@ -112,12 +112,12 @@
"DiskSpace": "Espace disque", "DiskSpace": "Espace disque",
"DownloadClient": "Client de Téléchargement", "DownloadClient": "Client de Téléchargement",
"DownloadClientSettings": "Réglages Clients de téléchargement", "DownloadClientSettings": "Réglages Clients de téléchargement",
"DownloadClients": "Clients téléchargement", "DownloadClients": "Clients de télécharg.",
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails", "DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
"DownloadFailedInterp": "Échec du téléchargement : {0}", "DownloadFailedInterp": "Échec du téléchargement : {0}",
"DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks", "DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks",
"DownloadWarningCheckDownloadClientForMoreDetails": "Avertissement téléchargement : voir le client de téléchargement pour plus de détails", "DownloadWarningCheckDownloadClientForMoreDetails": "Avertissement téléchargement : voir le client de téléchargement pour plus de détails",
"Edit": "Éditer", "Edit": "Modifier",
"Edition": "Édition", "Edition": "Édition",
"Enable": "Activer", "Enable": "Activer",
"EnableAutomaticAdd": "Activer l'ajout automatique", "EnableAutomaticAdd": "Activer l'ajout automatique",
@@ -155,12 +155,12 @@
"GrabReleaseMessageText": "Readarr n'a pas été en mesure de déterminer à quel auteur et livre correspondait cette version. Readarr peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?", "GrabReleaseMessageText": "Readarr n'a pas été en mesure de déterminer à quel auteur et livre correspondait cette version. Readarr peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?",
"GrabSelected": "Saisir la sélection", "GrabSelected": "Saisir la sélection",
"Group": "Groupe", "Group": "Groupe",
"HasPendingChangesNoChanges": "Aucun changement", "HasPendingChangesNoChanges": "Aucune modification",
"HasPendingChangesSaveChanges": "Sauvegarder les modifications", "HasPendingChangesSaveChanges": "Sauvegarder les modifications",
"History": "Historique", "History": "Historique",
"Hostname": "Nom d'hôte", "Hostname": "Nom d'hôte",
"ICalFeed": "Flux iCal", "ICalFeed": "Flux iCal",
"ICalHttpUrlHelpText": "Copiez cette URL dans votre client ou cliquez pour souscrire si votre navigateur est compatible avec webcal", "ICalHttpUrlHelpText": "Copiez cette URL dans votre/vos client(s) ou cliquez pour abonner si votre navigateur est compatible avec webcal",
"ICalLink": "Lien iCal", "ICalLink": "Lien iCal",
"IconForCutoffUnmet": "Icône pour limite non atteinte", "IconForCutoffUnmet": "Icône pour limite non atteinte",
"IconTooltip": "Programmé", "IconTooltip": "Programmé",
@@ -175,7 +175,7 @@
"Importing": "Importation", "Importing": "Importation",
"IncludeHealthWarningsHelpText": "Inclure avertissements santé", "IncludeHealthWarningsHelpText": "Inclure avertissements santé",
"IncludeUnknownAuthorItemsHelpText": "Afficher les éléments sans auteur dans la file d'attente. Cela peut inclure des auteurs, livres ou autres éléments supprimés de la catégorie de Readarr", "IncludeUnknownAuthorItemsHelpText": "Afficher les éléments sans auteur dans la file d'attente. Cela peut inclure des auteurs, livres ou autres éléments supprimés de la catégorie de Readarr",
"IncludeUnmonitored": "Inclure non surveillé", "IncludeUnmonitored": "Inclure les non surveillés",
"Indexer": "Indexeur", "Indexer": "Indexeur",
"IndexerPriority": "Priorité de l'indexeur", "IndexerPriority": "Priorité de l'indexeur",
"IndexerSettings": "Paramètres de l'indexeur", "IndexerSettings": "Paramètres de l'indexeur",
@@ -199,7 +199,7 @@
"MarkAsFailedMessageText": "Voulez-vous vraiment marquer '{0}' comme échoué ?", "MarkAsFailedMessageText": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
"MaximumLimits": "Limites maximales", "MaximumLimits": "Limites maximales",
"MaximumSize": "Taille maximum", "MaximumSize": "Taille maximum",
"MaximumSizeHelpText": "Taille maximale d'une version à saisir en Mo. Mettre à zéro pour définir sur illimité", "MaximumSizeHelpText": "Taille maximale d'une release à récupérer en Mo. Mettre à zéro pour définir sur illimité.",
"Mechanism": "Mécanisme", "Mechanism": "Mécanisme",
"MediaInfo": "Média Info", "MediaInfo": "Média Info",
"MediaManagementSettings": "Paramètres de gestion des médias", "MediaManagementSettings": "Paramètres de gestion des médias",
@@ -219,7 +219,7 @@
"NamingSettings": "Paramètres dénomination", "NamingSettings": "Paramètres dénomination",
"New": "Nouveau", "New": "Nouveau",
"NoBackupsAreAvailable": "Aucune sauvegarde n'est disponible", "NoBackupsAreAvailable": "Aucune sauvegarde n'est disponible",
"NoHistory": "Pas d'historique", "NoHistory": "Aucun historique.",
"NoLeaveIt": "Non, laisse-le", "NoLeaveIt": "Non, laisse-le",
"NoLimitForAnyRuntime": "Aucune limite pour aucune durée", "NoLimitForAnyRuntime": "Aucune limite pour aucune durée",
"NoLogFiles": "Aucun fichier journal", "NoLogFiles": "Aucun fichier journal",
@@ -244,7 +244,7 @@
"Port": "Port", "Port": "Port",
"PortHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "PortHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"PortNumber": "Numéro de port", "PortNumber": "Numéro de port",
"PosterSize": "Taille des posters", "PosterSize": "Taille des affiches",
"PreviewRename": "Aperçu Renommage", "PreviewRename": "Aperçu Renommage",
"Profiles": "Profils", "Profiles": "Profils",
"Proper": "Proper", "Proper": "Proper",
@@ -257,8 +257,8 @@
"ProxyType": "Type de proxy", "ProxyType": "Type de proxy",
"PublishedDate": "Date de publication", "PublishedDate": "Date de publication",
"Quality": "Qualité", "Quality": "Qualité",
"QualityDefinitions": "Définitions qualité", "QualityDefinitions": "Définitions des qualités",
"QualityProfile": "Profil qualité", "QualityProfile": "Profil de qualité",
"QualitySettings": "Paramètres Qualité", "QualitySettings": "Paramètres Qualité",
"Queue": "File d'attente", "Queue": "File d'attente",
"RSSSync": "Synchro RSS", "RSSSync": "Synchro RSS",
@@ -302,7 +302,7 @@
"RescanAuthorFolderAfterRefresh": "Réanalyser le dossier de l'auteur après l'actualisation", "RescanAuthorFolderAfterRefresh": "Réanalyser le dossier de l'auteur après l'actualisation",
"Reset": "Réinitialiser", "Reset": "Réinitialiser",
"ResetAPIKey": "Réinitialiser la clé API", "ResetAPIKey": "Réinitialiser la clé API",
"ResetAPIKeyMessageText": "Êtes-vous sûr de vouloir réinitialiser votre clé API ?", "ResetAPIKeyMessageText": "Voulez-vous réinitialiser votre clé d'API ?",
"Restart": "Redémarrer", "Restart": "Redémarrer",
"RestartNow": "Redémarrer maintenant", "RestartNow": "Redémarrer maintenant",
"RestartReadarr": "Redémarrer Readarr", "RestartReadarr": "Redémarrer Readarr",
@@ -321,9 +321,9 @@
"Scheduled": "Programmé", "Scheduled": "Programmé",
"ScriptPath": "Chemin du script", "ScriptPath": "Chemin du script",
"Search": "Rechercher", "Search": "Rechercher",
"SearchAll": "Rechercher tout", "SearchAll": "Tout rechercher",
"SearchForMissing": "Recherche les manquants", "SearchForMissing": "Recherche les manquants",
"SearchSelected": "Recherche sélectionnée", "SearchSelected": "Rechercher la sélection",
"SendAnonymousUsageData": "Envoyer des données d'utilisation anonymes", "SendAnonymousUsageData": "Envoyer des données d'utilisation anonymes",
"SetPermissions": "Définir les autorisations", "SetPermissions": "Définir les autorisations",
"SetPermissionsLinuxHelpText": "Chmod doit-il être exécuté lorsque les fichiers sont importés/renommés?", "SetPermissionsLinuxHelpText": "Chmod doit-il être exécuté lorsque les fichiers sont importés/renommés?",
@@ -333,14 +333,14 @@
"ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte", "ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte",
"ShowDateAdded": "Afficher la date d'ajout", "ShowDateAdded": "Afficher la date d'ajout",
"ShowMonitored": "Afficher les éléments surveillés", "ShowMonitored": "Afficher les éléments surveillés",
"ShowMonitoredHelpText": "Afficher le statut surveillé sous l'affiche", "ShowMonitoredHelpText": "Affiche le statut surveillé sous l'affiche",
"ShowPath": "Afficher le chemin", "ShowPath": "Afficher le chemin",
"ShowQualityProfile": "Afficher le profil de qualité", "ShowQualityProfile": "Afficher le profil de qualité",
"ShowQualityProfileHelpText": "Afficher le profil de qualité sous l'affiche", "ShowQualityProfileHelpText": "Affiche le profil de qualité sous l'affiche",
"ShowRelativeDates": "Afficher les dates relatives", "ShowRelativeDates": "Afficher les dates relatives",
"ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/ Hier/ etc) ou absolues", "ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/ Hier/ etc) ou absolues",
"ShowSearch": "Afficher la recherche", "ShowSearch": "Afficher la recherche",
"ShowSearchActionHelpText": "Afficher le bouton de recherche au survol de la souris", "ShowSearchActionHelpText": "Afficher le bouton de recherche au survol du curseur",
"ShowSizeOnDisk": "Afficher la taille sur le disque", "ShowSizeOnDisk": "Afficher la taille sur le disque",
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Affiché au dessus de chaque colonne quand \"Semaine\" est l'affichage actif", "ShownAboveEachColumnWhenWeekIsTheActiveView": "Affiché au dessus de chaque colonne quand \"Semaine\" est l'affichage actif",
"Size": " Taille", "Size": " Taille",
@@ -354,9 +354,9 @@
"SslCertPasswordHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "SslCertPasswordHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"SslCertPathHelpText": "Chemin vers le fichier pfx", "SslCertPathHelpText": "Chemin vers le fichier pfx",
"StandardBookFormat": "Format de livre standard", "StandardBookFormat": "Format de livre standard",
"StartTypingOrSelectAPathBelow": "Commencer à taper ou sélectionner un chemin ci-dessous", "StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous",
"StartupDirectory": "Répertoire de démarrage", "StartupDirectory": "Répertoire de démarrage",
"Status": "Statut", "Status": "État",
"StatusEndedEnded": "Terminé", "StatusEndedEnded": "Terminé",
"Style": "Style", "Style": "Style",
"SuccessMyWorkIsDoneNoFilesToRename": "Victoire ! Mon travail est terminé, aucun fichier à renommer.", "SuccessMyWorkIsDoneNoFilesToRename": "Victoire ! Mon travail est terminé, aucun fichier à renommer.",
@@ -365,8 +365,8 @@
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La recherche n'est pas prise en charge avec cet indexeur", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La recherche n'est pas prise en charge avec cet indexeur",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par Readarr", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par Readarr",
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Sera utilisé lorsque la recherche interactive est utilisée", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Sera utilisé lorsque la recherche interactive est utilisée",
"TagIsNotUsedAndCanBeDeleted": "La balise n'est pas utilisée et peut être supprimée", "TagIsNotUsedAndCanBeDeleted": "L'étiquette n'est pas utilisée et peut être supprimée",
"Tags": "Tags", "Tags": "Étiquettes",
"Tasks": "Tâches", "Tasks": "Tâches",
"TestAll": "Tout tester", "TestAll": "Tout tester",
"TestAllClients": "Tester tous les clients", "TestAllClients": "Tester tous les clients",
@@ -375,11 +375,11 @@
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Cela s'appliquera à tous les indexeurs, veuillez suivre les règles définies par eux", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Cela s'appliquera à tous les indexeurs, veuillez suivre les règles définies par eux",
"TimeFormat": "Format de l'heure", "TimeFormat": "Format de l'heure",
"Title": "Titre", "Title": "Titre",
"TorrentDelay": "Torrent Délai", "TorrentDelay": "Retard du torrent",
"TorrentDelayHelpText": "Délia en minutes avant de récupérer un torrent", "TorrentDelayHelpText": "Délai en minutes avant de récupérer un torrent",
"Torrents": "Torrents", "Torrents": "Torrents",
"TotalFileSize": "Taille totale du fichier", "TotalFileSize": "Taille totale du fichier",
"UILanguage": "UI Langue", "UILanguage": "Langue de l'IU",
"UILanguageHelpText": "Langue que Readarr utilisera pour l'interface utilisateur", "UILanguageHelpText": "Langue que Readarr utilisera pour l'interface utilisateur",
"UILanguageHelpTextWarning": "Rechargement du navigateur requis", "UILanguageHelpTextWarning": "Rechargement du navigateur requis",
"UISettings": "Paramètres UI", "UISettings": "Paramètres UI",
@@ -394,7 +394,7 @@
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Impossible d'ajouter un nouveau mappage de chemin distant, veuillez réessayer.", "UnableToAddANewRemotePathMappingPleaseTryAgain": "Impossible d'ajouter un nouveau mappage de chemin distant, veuillez réessayer.",
"UnableToAddANewRootFolderPleaseTryAgain": "Impossible d'ajouter un nouveau format personnalisé, veuillez réessayer.", "UnableToAddANewRootFolderPleaseTryAgain": "Impossible d'ajouter un nouveau format personnalisé, veuillez réessayer.",
"UnableToLoadBackups": "Impossible de charger les sauvegardes", "UnableToLoadBackups": "Impossible de charger les sauvegardes",
"UnableToLoadDelayProfiles": "Impossible de charger les profils de délai", "UnableToLoadDelayProfiles": "Impossible de charger les profils de retard",
"UnableToLoadDownloadClientOptions": "Impossible de charger les options du client de téléchargement", "UnableToLoadDownloadClientOptions": "Impossible de charger les options du client de téléchargement",
"UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement", "UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement",
"UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux", "UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux",
@@ -413,7 +413,7 @@
"UnableToLoadReleaseProfiles": "Impossible de charger les profils de délai", "UnableToLoadReleaseProfiles": "Impossible de charger les profils de délai",
"UnableToLoadRemotePathMappings": "Impossible de charger les mappages de chemins distants", "UnableToLoadRemotePathMappings": "Impossible de charger les mappages de chemins distants",
"UnableToLoadRootFolders": "Impossible de charger les dossiers racine", "UnableToLoadRootFolders": "Impossible de charger les dossiers racine",
"UnableToLoadTags": "Impossible de charger les balises", "UnableToLoadTags": "Impossible de charger les étiquettes",
"UnableToLoadTheCalendar": "Impossible de charger le calendrier", "UnableToLoadTheCalendar": "Impossible de charger le calendrier",
"UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur", "UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur",
"Ungroup": "Dissocier", "Ungroup": "Dissocier",
@@ -424,14 +424,14 @@
"UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Readarr ou un script", "UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Readarr ou un script",
"UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour", "UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour",
"Updates": "Mises à jour", "Updates": "Mises à jour",
"UpgradeAllowedHelpText": "Si désactivé, la qualité ne sera pas améliorée", "UpgradeAllowedHelpText": "Si désactivé, les qualités ne seront pas améliorées",
"Uptime": "Durée de fonctionnent", "Uptime": "Durée de fonctionnent",
"UrlBaseHelpTextWarning": "Nécessite un redémarrage pour prendre effet", "UrlBaseHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
"UseHardlinksInsteadOfCopy": "Utiliser des liens physiques au lieu de copier", "UseHardlinksInsteadOfCopy": "Utiliser des liens physiques au lieu de copier",
"UseProxy": "Utiliser un proxy", "UseProxy": "Utiliser un proxy",
"Usenet": "Usenet", "Usenet": "Usenet",
"UsenetDelay": "Délai Usenet", "UsenetDelay": "Retard Usenet",
"UsenetDelayHelpText": "Délai en minutes avant de récupérer une version Usenet", "UsenetDelayHelpText": "Délai en minutes avant de récupérer une release de Usenet",
"Username": "Nom d'utilisateur", "Username": "Nom d'utilisateur",
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Branche à utiliser pour mettre à jour Readarr", "UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Branche à utiliser pour mettre à jour Readarr",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur",
@@ -458,11 +458,11 @@
"BookAvailableButMissing": "Livre disponible, mais manquant", "BookAvailableButMissing": "Livre disponible, mais manquant",
"OutputPath": "Chemin de sortie", "OutputPath": "Chemin de sortie",
"ReleaseTitle": "Titre de la version", "ReleaseTitle": "Titre de la version",
"ShowBookTitleHelpText": "Afficher le titre du livre sous l'affiche", "ShowBookTitleHelpText": "Affiche le titre du livre sous l'affiche",
"ShowReleaseDate": "Afficher la date de sortie", "ShowReleaseDate": "Afficher la date de sortie",
"ShowTitle": "Afficher le titre", "ShowTitle": "Afficher le titre",
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.", "TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.",
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non cochée, Readarr les supprimera à la place", "ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non coché, Readarr les supprimera",
"Level": "Niveau", "Level": "Niveau",
"Publisher": "Éditeur", "Publisher": "Éditeur",
"Label": "Label", "Label": "Label",
@@ -478,7 +478,7 @@
"SelectAll": "Tout sélectionner", "SelectAll": "Tout sélectionner",
"SelectedCountBooksSelectedInterp": "{0} Livre(s) Sélectionné(s)", "SelectedCountBooksSelectedInterp": "{0} Livre(s) Sélectionné(s)",
"ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.", "ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.",
"UnselectAll": "Tout déselectionner", "UnselectAll": "Tout désélectionner",
"UpdateSelected": "Mettre à jour la sélection", "UpdateSelected": "Mettre à jour la sélection",
"All": "Tout", "All": "Tout",
"Wanted": "Recherché", "Wanted": "Recherché",
@@ -634,7 +634,7 @@
"CalibreOutputFormat": "Format de sortie de Calibre", "CalibreOutputFormat": "Format de sortie de Calibre",
"CalibreOutputProfile": "Profil de sortie de Calibre", "CalibreOutputProfile": "Profil de sortie de Calibre",
"CalibrePassword": "Mot de passe de Calibre", "CalibrePassword": "Mot de passe de Calibre",
"ChownGroup": "Groupe chown", "ChownGroup": "chown Groupe",
"CollapseMultipleBooks": "Regrouper plusieurs livres", "CollapseMultipleBooks": "Regrouper plusieurs livres",
"CollapseMultipleBooksHelpText": "Regrouper les livres qui sortent le même jour", "CollapseMultipleBooksHelpText": "Regrouper les livres qui sortent le même jour",
"ConvertToFormat": "Convertir au format", "ConvertToFormat": "Convertir au format",
@@ -663,11 +663,11 @@
"MetadataProfile": "profil de métadonnées", "MetadataProfile": "profil de métadonnées",
"StatusEndedContinuing": "Continuant", "StatusEndedContinuing": "Continuant",
"Database": "Base de données", "Database": "Base de données",
"ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL", "ApplicationUrlHelpText": "L'URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL",
"ApplicationURL": "URL de l'application", "ApplicationURL": "URL de l'application",
"ImportListExclusions": "Supprimer les exclusions de liste d'imports", "ImportListExclusions": "Supprimer les exclusions de liste d'imports",
"ChooseImportMethod": "Choisir une méthode d'importation", "ChooseImportMethod": "Choisir une méthode d'importation",
"ClickToChangeReleaseGroup": "Cliquer pour changer le groupe de publication", "ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion",
"HardlinkCopyFiles": "Lier/copier les fichiers", "HardlinkCopyFiles": "Lier/copier les fichiers",
"MoveFiles": "Déplacer les fichiers", "MoveFiles": "Déplacer les fichiers",
"OnApplicationUpdate": "Lors de la mise à jour de l'app", "OnApplicationUpdate": "Lors de la mise à jour de l'app",
@@ -687,7 +687,7 @@
"CustomFormatSettings": "Réglages Formats Personnalisés", "CustomFormatSettings": "Réglages Formats Personnalisés",
"CustomFormats": "Formats perso.", "CustomFormats": "Formats perso.",
"DeleteCustomFormat": "Supprimer le format personnalisé", "DeleteCustomFormat": "Supprimer le format personnalisé",
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "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} ?",
"ExportCustomFormat": "Exporter format personnalisé", "ExportCustomFormat": "Exporter format personnalisé",
"Formats": "Formats", "Formats": "Formats",
@@ -713,28 +713,28 @@
"ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration",
"DeleteBookFile": "Effacer le fichier du livre", "DeleteBookFile": "Effacer le fichier du livre",
"HiddenClickToShow": "Caché, cliquez pour afficher", "HiddenClickToShow": "Caché, cliquez pour afficher",
"HideAdvanced": "Masquer avancé", "HideAdvanced": "Masquer param. av.",
"ShowAdvanced": "Afficher avancés", "ShowAdvanced": "Afficher param. av.",
"ShownClickToHide": "Montré, cliquez pour masquer", "ShownClickToHide": "Montré, cliquez pour masquer",
"ColonReplacement": "Remplacement pour le 'deux-points'", "ColonReplacement": "Remplacement pour le « deux-points »",
"ReplaceWithDash": "Remplacer par Dash", "ReplaceWithDash": "Remplacer par un tiret",
"ReplaceWithSpaceDash": "Remplacer par Space Dash", "ReplaceWithSpaceDash": "Remplacer par un espace puis un tiret",
"ReplaceWithSpaceDashSpace": "Remplacer par Space Dash Space", "ReplaceWithSpaceDashSpace": "Remplacer par un espace, un tiret puis un espace",
"DeleteRemotePathMapping": "Éditer le chemin distant", "DeleteRemotePathMapping": "Éditer le chemin distant",
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir effacer ce chemin ?", "DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir effacer ce chemin ?",
"BlocklistReleases": "Mettre cette release sur la liste noire", "BlocklistReleases": "Publications de la liste de blocage",
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?", "DeleteConditionMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
"Negated": "Inversé", "Negated": "Inversé",
"RemoveSelectedItem": "Supprimer l'élément sélectionné", "RemoveSelectedItem": "Supprimer l'élément sélectionné",
"RemoveSelectedItemBlocklistMessageText": "Êtes-vous sûr de vouloir supprimer les films sélectionnés de la liste noire ?", "RemoveSelectedItemBlocklistMessageText": "Êtes-vous sûr de vouloir supprimer les films sélectionnés de la liste noire ?",
"RemoveSelectedItemQueueMessageText": "Êtes-vous sûr de vouloir désinstaller {0} objet{1} de la file d'attente ?", "RemoveSelectedItemQueueMessageText": "Voulez-vous vraiment supprimer 1 élément de la file d'attente ?",
"RemoveSelectedItems": "Supprimer les éléments sélectionnés", "RemoveSelectedItems": "Supprimer les éléments sélectionnés",
"RemoveSelectedItemsQueueMessageText": "Êtes-vous sûr de vouloir supprimer {0} objet(s) de la file d'attente ?", "RemoveSelectedItemsQueueMessageText": "Voulez-vous vraiment supprimer {0} éléments de la file d'attente ?",
"Required": "Obligatoire", "Required": "Obligatoire",
"ResetQualityDefinitions": "Réinitialiser les définitions de qualité", "ResetQualityDefinitions": "Réinitialiser les définitions de qualité",
"ResetQualityDefinitionsMessageText": "Êtes-vous sûr de vouloir réinitialiser les définitions de qualité ?", "ResetQualityDefinitionsMessageText": "Voulez-vous vraiment réinitialiser les définitions de qualité ?",
"ApplyTagsHelpTextHowToApplyAuthors": "Comment appliquer des étiquettes aux indexeurs sélectionnés", "ApplyTagsHelpTextHowToApplyAuthors": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
"ApplyTagsHelpTextRemove": "Suprimer : Suprime les étiquettes renseignées", "ApplyTagsHelpTextRemove": "Supprimer : supprime les étiquettes renseignées",
"AutomaticAdd": "Ajout automatique", "AutomaticAdd": "Ajout automatique",
"BlocklistReleaseHelpText": "Empêche Lidarr de récupérer automatiquement cette version", "BlocklistReleaseHelpText": "Empêche Lidarr de récupérer automatiquement cette version",
"NoChange": "Pas de changement", "NoChange": "Pas de changement",
@@ -744,41 +744,41 @@
"RedownloadFailed": "Échec du téléchargement", "RedownloadFailed": "Échec du téléchargement",
"RemoveCompleted": "Supprimer les complétés", "RemoveCompleted": "Supprimer les complétés",
"RemoveFailed": "Echec de la suppression", "RemoveFailed": "Echec de la suppression",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des tags au film sélectionné", "ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des étiquettes aux clients de téléchargement sélectionnés",
"ApplyChanges": "Appliquer les modifications", "ApplyChanges": "Appliquer les modifications",
"ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes", "ApplyTagsHelpTextAdd": "Ajouter : ajoute les étiquettes à la liste de étiquettes existantes",
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des tags au film sélectionné", "ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des étiquettes aux listes d'importation sélectionnées",
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés", "ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
"ApplyTagsHelpTextReplace": "Remplacer : Remplace les tags par les tags renseignés (ne pas renseigner de tags pour effacer tous les tags)", "ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)",
"CountIndexersSelected": "{0} indexeur(s) sélectionné(s)", "CountIndexersSelected": "{0} indexeur(s) sélectionné(s)",
"DeleteSelectedDownloadClients": "Supprimer le client de téléchargement", "DeleteSelectedDownloadClients": "Supprimer le client de téléchargement",
"DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?",
"DeleteSelectedImportListsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DeleteSelectedImportListsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
"DeleteSelectedIndexers": "Supprimer l'indexeur", "DeleteSelectedIndexers": "Supprimer l'indexeur",
"DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?", "DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer les {count} indexeur(s) sélectionné(s) ?",
"DownloadClientTagHelpText": "Utiliser seulement cet indexeur pour les films avec au moins un tag correspondant. Laissez vide pour l'utiliser avec tous les films.", "DownloadClientTagHelpText": "Utiliser seulement cet indexeur pour les films avec au moins un tag correspondant. Laissez vide pour l'utiliser avec tous les films.",
"ExistingTag": "Tag existant", "ExistingTag": "Tag existant",
"No": "Non", "No": "Non",
"RemovingTag": "Suppression du tag", "RemovingTag": "Suppression du tag",
"SetTags": "Définir Tags", "SetTags": "Définir les étiquettes",
"CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)", "CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)",
"EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés", "EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés",
"EditSelectedIndexers": "Modifier les indexeurs sélectionnés", "EditSelectedIndexers": "Modifier les indexeurs sélectionnés",
"ConnectionLostReconnect": "Radarr essaiera de se connecter automatiquement, ou vous pouvez cliquer sur \"Recharger\" en bas.", "ConnectionLostReconnect": "{appName} essaiera de se connecter automatiquement, ou vous pouvez cliquer sur « Recharger » en bas.",
"NotificationStatusAllClientHealthCheckMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements", "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications sont indisponibles en raison de dysfonctionnements",
"NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}", "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison de dysfonctionnements : {0}",
"SomeResultsAreHiddenByTheAppliedFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué", "SomeResultsAreHiddenByTheAppliedFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
"ConnectionLost": "Connexion perdue", "ConnectionLost": "Connexion perdue",
"ConnectionLostToBackend": "Radarr 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 ont été dissimulés par le filtre actuellement 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é",
"Events": "Événements", "Events": "Événements",
"FreeSpace": "Espace libre", "FreeSpace": "Espace libre",
"Large": "Grand", "Large": "Grande",
"LastDuration": "Dernière durée", "LastDuration": "Dernière durée",
"LastExecution": "Dernière exécution", "LastExecution": "Dernière exécution",
"Library": "Bibliothèque", "Library": "Bibliothèque",
@@ -789,6 +789,29 @@
"TotalSpace": "Espace total", "TotalSpace": "Espace total",
"Ui": "UI", "Ui": "UI",
"Activity": "Activité", "Activity": "Activité",
"AddNew": "Ajouter un nouveau", "AddNew": "Ajouter une nouvelle",
"Backup": "Sauvegarde" "Backup": "Sauvegarde",
"AutoAdd": "Ajout automatique",
"AutomaticUpdatesDisabledDocker": "Les mises à jour automatiques ne sont pas directement prises en charge lors de l'utilisation du mécanisme de mise à jour de Docker. Vous devrez mettre à jour l'image du conteneur en dehors de {appName} ou utiliser un script",
"AppUpdated": "{appName} mis à jour",
"NoMissingItems": "Aucun élément manquant",
"MediaManagementSettingsSummary": "Nommage, paramètres de gestion des médias et dossiers racine",
"SmartReplace": "Replacement intelligent",
"Clone": "Cloner",
"IsShowingMonitoredUnmonitorSelected": "Arrêter de surveiller la sélection",
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "C'est facile d'ajouter un nouvel auteur ou livre, commencez simplement à saisir le nom de l'élément que vous souhaitez ajouter",
"DeleteRootFolder": "Supprimer le dossier racine",
"DeleteCondition": "Supprimer la condition",
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde « {name} » ?",
"DashOrSpaceDashDependingOnName": "Tiret ou espace puis tiret selon le nom",
"Implementation": "Implémentation",
"ManageDownloadClients": "Gérer les clients de téléchargement",
"ManageClients": "Gérer les clients",
"NoIndexersFound": "Aucun indexeur n'a été trouvé",
"ListWillRefreshEveryInterp": "La liste se rafraîchira tous/toutes la/les {0}",
"NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé",
"MinimumPopularity": "Popularité minimum",
"NoHistoryBlocklist": "Pas d'historique de liste noire",
"AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}",
"IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0]."
} }
+2 -1
View File
@@ -656,5 +656,6 @@
"Small": "קָטָן", "Small": "קָטָן",
"System": "מערכת", "System": "מערכת",
"Theme": "ערכת נושא", "Theme": "ערכת נושא",
"TotalSpace": "השטח הכולל" "TotalSpace": "השטח הכולל",
"Publisher": "מוציא לאור"
} }
+4 -4
View File
@@ -10,7 +10,7 @@
"DeleteReleaseProfile": "지연 프로필 삭제", "DeleteReleaseProfile": "지연 프로필 삭제",
"DeleteIndexer": "인덱서 삭제", "DeleteIndexer": "인덱서 삭제",
"HasPendingChangesSaveChanges": "변경 사항을 저장하다", "HasPendingChangesSaveChanges": "변경 사항을 저장하다",
"History": "역", "History": "역",
"DownloadClients": "클라이언트 다운로드", "DownloadClients": "클라이언트 다운로드",
"Host": "주최자", "Host": "주최자",
"GoToInterp": "{0}로 이동", "GoToInterp": "{0}로 이동",
@@ -408,7 +408,7 @@
"UnableToLoadRemotePathMappings": "원격 경로 매핑을로드 할 수 없습니다.", "UnableToLoadRemotePathMappings": "원격 경로 매핑을로드 할 수 없습니다.",
"UnableToLoadRootFolders": "루트 폴더를로드 할 수 없습니다.", "UnableToLoadRootFolders": "루트 폴더를로드 할 수 없습니다.",
"UnableToLoadTags": "태그를로드 할 수 없습니다.", "UnableToLoadTags": "태그를로드 할 수 없습니다.",
"UnableToLoadTheCalendar": "캘린더를로드 할 수 없습니다.", "UnableToLoadTheCalendar": "달력을 불러올 수 없습니다.",
"UnableToLoadUISettings": "UI 설정을로드 할 수 없습니다.", "UnableToLoadUISettings": "UI 설정을로드 할 수 없습니다.",
"Ungroup": "그룹 해제", "Ungroup": "그룹 해제",
"Unmonitored": "모니터링되지 않음", "Unmonitored": "모니터링되지 않음",
@@ -608,7 +608,7 @@
"FreeSpace": "여유 공간", "FreeSpace": "여유 공간",
"NextExecution": "다음 실행", "NextExecution": "다음 실행",
"SomeResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.", "SomeResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.",
"System": "체계", "System": "시스템",
"Medium": "매질", "Medium": "매질",
"ConnectionLost": "연결이 끊어졌습니다.", "ConnectionLost": "연결이 끊어졌습니다.",
"AllResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.", "AllResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.",
@@ -616,6 +616,6 @@
"LastDuration": "lastDuration", "LastDuration": "lastDuration",
"LastExecution": "마지막 실행", "LastExecution": "마지막 실행",
"Activity": "활동", "Activity": "활동",
"AddNew": "새로 추가", "AddNew": "새로 추가하기",
"Backup": "백업" "Backup": "백업"
} }
+2 -2
View File
@@ -90,11 +90,11 @@
"DeleteImportListMessageText": "Bent u zeker dat u de lijst '{0}' wilt verwijderen?", "DeleteImportListMessageText": "Bent u zeker dat u de lijst '{0}' wilt verwijderen?",
"DeleteIndexer": "Verwijder Indexeerder", "DeleteIndexer": "Verwijder Indexeerder",
"DeleteIndexerMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?", "DeleteIndexerMessageText": "Bent u zeker dat u de indexeerder '{0}' wilt verwijderen?",
"DeleteMetadataProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen", "DeleteMetadataProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
"DeleteNotification": "Verwijder Notificatie", "DeleteNotification": "Verwijder Notificatie",
"DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?", "DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?",
"DeleteQualityProfile": "Verwijder Kwaliteitsprofiel", "DeleteQualityProfile": "Verwijder Kwaliteitsprofiel",
"DeleteQualityProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {0} wilt verwijderen", "DeleteQualityProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
"DeleteReleaseProfile": "Verwijder Vertragingsprofiel", "DeleteReleaseProfile": "Verwijder Vertragingsprofiel",
"DeleteReleaseProfileMessageText": "Weet u zeker dat u dit vertragingsprofiel wilt verwijderen?", "DeleteReleaseProfileMessageText": "Weet u zeker dat u dit vertragingsprofiel wilt verwijderen?",
"DeleteSelectedBookFiles": "Verwijder Geselecteerde Filmbestanden", "DeleteSelectedBookFiles": "Verwijder Geselecteerde Filmbestanden",
+1 -1
View File
@@ -125,7 +125,7 @@
"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 „{0}”?", "DeleteIndexerMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
"DeleteMetadataProfileMessageText": "Czy na pewno chcesz usunąć profil metadanych '{0}'?", "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}”?",
"DeleteQualityProfile": "Usuń profil jakości", "DeleteQualityProfile": "Usuń profil jakości",
+21 -10
View File
@@ -140,18 +140,18 @@
"SearchAll": "Pesquisar todos", "SearchAll": "Pesquisar todos",
"Source": "Origem", "Source": "Origem",
"AddListExclusion": "Adicionar exclusão de lista", "AddListExclusion": "Adicionar exclusão de lista",
"AddingTag": "A adicionar etiqueta", "AddingTag": "Adicionando etiqueta",
"AgeWhenGrabbed": "Tempo de vida (quando capturado)", "AgeWhenGrabbed": "Idade (quando capturada)",
"AlreadyInYourLibrary": "Já está na sua biblioteca", "AlreadyInYourLibrary": "Já está na sua biblioteca",
"AlternateTitles": "Título alternativo", "AlternateTitles": "Títulos Alternativos",
"Analytics": "Análises", "Analytics": "Análise",
"AnalyticsEnabledHelpText": "Envia informações anônimas de uso e de erros aos servidores do Readarr. Isso inclui informações sobre seu browser, páginas utilizadas na WebUI do Readarr, relatórios de erros, bem como as versões do sistema operativo e da aplicação. Utilizaremos essas informações para priorizar funcionalidades e correções de bugs.", "AnalyticsEnabledHelpText": "Envia informações anônimas de uso e de erros aos servidores do Readarr. Isso inclui informações sobre seu browser, páginas utilizadas na WebUI do Readarr, relatórios de erros, bem como as versões do sistema operativo e da aplicação. Utilizaremos essas informações para priorizar funcionalidades e correções de bugs.",
"AppDataDirectory": "Pasta AppData", "AppDataDirectory": "Diretório AppData",
"ApplyTags": "Aplicar etiquetas", "ApplyTags": "Aplicar etiquetas",
"Authentication": "Autenticação", "Authentication": "Autenticação",
"AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Readarr", "AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Readarr",
"AuthorClickToChangeBook": "Clique para mudar o livro", "AuthorClickToChangeBook": "Clique para mudar o livro",
"AutoRedownloadFailedHelpText": "Pesquisar e tentar transferir automaticamente uma versão diferente", "AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Livros eliminados do disco deixam automaticamente de ser monitorados no Readarr", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Livros eliminados do disco deixam automaticamente de ser monitorados no Readarr",
"Automatic": "Automático", "Automatic": "Automático",
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do Readarr", "BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do Readarr",
@@ -690,7 +690,7 @@
"IndexerJackettAll": "Indexadores que usam o ponto de extremidade não suportado do Jackett 'all (tudo)' : {0}", "IndexerJackettAll": "Indexadores que usam o ponto de extremidade não suportado do Jackett 'all (tudo)' : {0}",
"Duration": "Duração", "Duration": "Duração",
"Filters": "Filtros", "Filters": "Filtros",
"AppDataLocationHealthCheckMessage": "Não foi possivél actualizar para prevenir apagar a AppData durante a actualização", "AppDataLocationHealthCheckMessage": "Não foi possível atualizar para prevenir apagar a AppData durante a atualização",
"FileWasDeletedByViaUI": "O ficheiro foi eliminado por meio da IU", "FileWasDeletedByViaUI": "O ficheiro foi eliminado por meio da IU",
"SizeLimit": "Tamanho Limite", "SizeLimit": "Tamanho Limite",
"Started": "Começado", "Started": "Começado",
@@ -781,7 +781,7 @@
"OnBookFileDelete": "Ao eliminar o ficheiro do filme", "OnBookFileDelete": "Ao eliminar o ficheiro do filme",
"InstanceName": "Nome da Instancia", "InstanceName": "Nome da Instancia",
"RestartRequiredHelpTextWarning": "Requer reinício para aplicar alterações", "RestartRequiredHelpTextWarning": "Requer reinício para aplicar alterações",
"AddList": "Adicionar lista", "AddList": "Adicionar Lista",
"RenameFiles": "Renomear ficheiros", "RenameFiles": "Renomear ficheiros",
"Test": "Testar", "Test": "Testar",
"InstanceNameHelpText": "Nome da instância na aba e nome da aplicação para Syslog", "InstanceNameHelpText": "Nome da instância na aba e nome da aplicação para Syslog",
@@ -789,7 +789,7 @@
"AddedAuthorSettings": "Definições de Autor adicionadas", "AddedAuthorSettings": "Definições de Autor adicionadas",
"ManualImportSelectEdition": "Importação manual - Seleciona o filme", "ManualImportSelectEdition": "Importação manual - Seleciona o filme",
"ApplicationUrlHelpText": "O URL desta aplicação externa, incluindo http(s)://, porta e URL base", "ApplicationUrlHelpText": "O URL desta aplicação externa, incluindo http(s)://, porta e URL base",
"ApplicationURL": "URL da aplicação", "ApplicationURL": "URL do Aplicativo",
"ChooseImportMethod": "Selecionar Modo de Importação", "ChooseImportMethod": "Selecionar Modo de Importação",
"HardlinkCopyFiles": "Realizar ligação fixa/copiar ficheiros", "HardlinkCopyFiles": "Realizar ligação fixa/copiar ficheiros",
"MoveFiles": "Mover ficheiros", "MoveFiles": "Mover ficheiros",
@@ -834,5 +834,16 @@
"ReplaceWithDash": "Substituir por travessão", "ReplaceWithDash": "Substituir por travessão",
"ReplaceWithSpaceDash": "Substituir por espaço e travessão", "ReplaceWithSpaceDash": "Substituir por espaço e travessão",
"ReplaceWithSpaceDashSpace": "Substituir por espaço, travessão e espaço", "ReplaceWithSpaceDashSpace": "Substituir por espaço, travessão e espaço",
"ApiKeyValidationHealthCheckMessage": "Por favor, actualize a sua API Key para ter no minimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração" "ApiKeyValidationHealthCheckMessage": "Por favor, atualize a sua API Key para ter no mínimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração",
"AppUpdated": "{appName} Atualizado",
"ApplyTagsHelpTextAdd": "Adicionar: agregar as etiquetas à lista existente de etiquetas",
"ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas",
"ApplyTagsHelpTextReplace": "Substituir: mudar as etiquetas pelas adicionadas (deixe em branco para limpar todas as etiquetas)",
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados",
"AutoAdd": "Adicionar automaticamente",
"AllResultsAreHiddenByTheAppliedFilter": "Todos os resultados foram ocultados pelo filtro aplicado",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar etiquetas aos clientes de download selecionados",
"Activity": "Atividade",
"AddNew": "Adicionar Novo",
"ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar etiquetas às listas de importação selecionadas"
} }
+19 -16
View File
@@ -373,7 +373,7 @@
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Será usado quando pesquisas automáticas forem realizadas pela interface ou pelo Readarr", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Será usado quando pesquisas automáticas forem realizadas pela interface ou pelo Readarr",
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Será usado com a pesquisa interativa", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Será usado com a pesquisa interativa",
"TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída", "TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída",
"Tags": "Etiquetas", "Tags": "Tags",
"Tasks": "Tarefas", "Tasks": "Tarefas",
"TestAll": "Testar tudo", "TestAll": "Testar tudo",
"TestAllClients": "Testar todos os clientes", "TestAllClients": "Testar todos os clientes",
@@ -454,7 +454,7 @@
"TrackNumber": "Número da faixa", "TrackNumber": "Número da faixa",
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} livro(s) no total. {1} livro(s) com arquivos.", "TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} livro(s) no total. {1} livro(s) com arquivos.",
"TheBooksFilesWillBeDeleted": "Os arquivos do livro serão excluídos.", "TheBooksFilesWillBeDeleted": "Os arquivos do livro serão excluídos.",
"TagsHelpText": "Aplica-se a autores com pelo menos uma etiqueta correspondente. Deixe em branco para aplicar a todos os autores", "TagsHelpText": "Aplica-se a autores com pelo menos uma tag correspondente. Deixe em branco para aplicar a todos os autores",
"StatusEndedDeceased": "Falecido", "StatusEndedDeceased": "Falecido",
"StatusEndedContinuing": "Continuação", "StatusEndedContinuing": "Continuação",
"SslCertPasswordHelpTextWarning": "Requer reinício para ter efeito", "SslCertPasswordHelpTextWarning": "Requer reinício para ter efeito",
@@ -488,7 +488,7 @@
"RescanAfterRefreshHelpText": "Verificar novamente a pasta de autor após atualizar o autor", "RescanAfterRefreshHelpText": "Verificar novamente a pasta de autor após atualizar o autor",
"ReplaceIllegalCharactersHelpText": "Substituir caracteres ilegais. Se desmarcada, o Readarr irá removê-los", "ReplaceIllegalCharactersHelpText": "Substituir caracteres ilegais. Se desmarcada, o Readarr irá removê-los",
"RenameBooks": "Renomear livros", "RenameBooks": "Renomear livros",
"ReleaseProfiles": "Perfis de Lançamento", "ReleaseProfiles": "Perfis de Lançamentos",
"RefreshInformation": "Atualizar informações", "RefreshInformation": "Atualizar informações",
"RefreshAuthor": "Atualizar autor", "RefreshAuthor": "Atualizar autor",
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "O Readarr oferece suporte a várias listas para importar livros e autores para o banco de dados.", "ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "O Readarr oferece suporte a várias listas para importar livros e autores para o banco de dados.",
@@ -829,7 +829,7 @@
"UISettingsSummary": "Opções de calendário, data e cores prejudicadas", "UISettingsSummary": "Opções de calendário, data e cores prejudicadas",
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", "UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.",
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", "UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.",
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação", "TagsSettingsSummary": "Gerenciar tags de autor, perfil, restrição e notificação",
"InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog", "InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog",
"AddList": "Adicionar Lista", "AddList": "Adicionar Lista",
"DataExistingBooks": "Monitorar livros que você tem arquivos ou que não foram lançados ainda", "DataExistingBooks": "Monitorar livros que você tem arquivos ou que não foram lançados ainda",
@@ -880,7 +880,7 @@
"DataFutureBooks": "Monitorar livros que ainda não foram lançados", "DataFutureBooks": "Monitorar livros que ainda não foram lançados",
"DeleteFormatMessageText": "Tem certeza de que deseja excluir a tag de formato '{0}'?", "DeleteFormatMessageText": "Tem certeza de que deseja excluir a tag de formato '{0}'?",
"IncludeCustomFormatWhenRenamingHelpText": "'Incluir em {Formatos Personalizados} formato de renomeação'", "IncludeCustomFormatWhenRenamingHelpText": "'Incluir em {Formatos Personalizados} formato de renomeação'",
"IndexerTagsHelpText": "Use este indexador apenas para autores com pelo menos uma etiqueta correspondente. Deixe em branco para usar com todos os autores.", "IndexerTagsHelpText": "Use este indexador apenas para autores com pelo menos uma tag correspondente. Deixe em branco para usar com todos os autores.",
"MinFormatScoreHelpText": "Pontuação mínima de formato personalizado permitida para download", "MinFormatScoreHelpText": "Pontuação mínima de formato personalizado permitida para download",
"RecycleBinUnableToWriteHealthCheck": "Não é possível gravar na pasta da lixeira configurada: {0}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o Readarr", "RecycleBinUnableToWriteHealthCheck": "Não é possível gravar na pasta da lixeira configurada: {0}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o Readarr",
"Clone": "Clonar", "Clone": "Clonar",
@@ -955,18 +955,18 @@
"RemoveFailedDownloads": "Remover downloads com falha", "RemoveFailedDownloads": "Remover downloads com falha",
"RemoveDownloadsAlert": "As configurações de remoção foram movidas para as configurações individuais do cliente de download na tabela acima.", "RemoveDownloadsAlert": "As configurações de remoção foram movidas para as configurações individuais do cliente de download na tabela acima.",
"RemoveFailed": "Falha na remoção", "RemoveFailed": "Falha na remoção",
"SetTags": "Definir etiquetas", "SetTags": "Definir tags",
"Yes": "Sim", "Yes": "Sim",
"ApplyTagsHelpTextHowToApplyAuthors": "Como aplicar etiquetas aos autores selecionados", "ApplyTagsHelpTextHowToApplyAuthors": "Como aplicar tags aos autores selecionados",
"ManageDownloadClients": "Gerenciar clientes de download", "ManageDownloadClients": "Gerenciar clientes de download",
"ManageImportLists": "Gerenciar listas de importação", "ManageImportLists": "Gerenciar listas de importação",
"RemoveCompleted": "Remoção Concluída", "RemoveCompleted": "Remoção Concluída",
"AutoAdd": "Adicionar automaticamente", "AutoAdd": "Adicionar automaticamente",
"AutomaticAdd": "Adição Automática", "AutomaticAdd": "Adição Automática",
"ApplyChanges": "Aplicar Mudanças", "ApplyChanges": "Aplicar Mudanças",
"ApplyTagsHelpTextAdd": "Adicionar: adicione as etiquetas à lista existente de etiquetas", "ApplyTagsHelpTextAdd": "Adicionar: adicione as tags à lista existente de tags",
"ApplyTagsHelpTextRemove": "Remover: remove as etiquetas inseridas", "ApplyTagsHelpTextRemove": "Remover: Remove as tags inseridas",
"ApplyTagsHelpTextReplace": "Substituir: Substitua as etiquetas pelas etiquetas inseridas (não digite nenhuma etiqueta para limpar todas as etiquetas)", "ApplyTagsHelpTextReplace": "Substituir: Substitua as tags pelas tags inseridas (não digite nenhuma tag para limpar todas as tags)",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar tags aos clientes de download selecionados", "ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar tags aos clientes de download selecionados",
"ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar tags às listas de importação selecionadas", "ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar tags às listas de importação selecionadas",
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar tags aos indexadores selecionados", "ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar tags aos indexadores selecionados",
@@ -977,11 +977,11 @@
"DeleteSelectedImportLists": "Excluir lista(s) de importação", "DeleteSelectedImportLists": "Excluir lista(s) de importação",
"DeleteSelectedImportListsMessageText": "Tem certeza de que deseja excluir {count} lista(s) de importação selecionada(s)?", "DeleteSelectedImportListsMessageText": "Tem certeza de que deseja excluir {count} lista(s) de importação selecionada(s)?",
"DeleteSelectedIndexers": "Excluir indexador(es)", "DeleteSelectedIndexers": "Excluir indexador(es)",
"DownloadClientTagHelpText": "Use este cliente de download apenas para autores com pelo menos uma etiqueta correspondente. Deixe em branco para usar com todos os autores.", "DownloadClientTagHelpText": "Use este cliente de download apenas para autores com pelo menos uma tag correspondente. Deixe em branco para usar com todos os autores.",
"ExistingTag": "Etiqueta existente", "ExistingTag": "Tag existente",
"No": "Não", "No": "Não",
"RemoveCompletedDownloads": "Remover downloads concluídos", "RemoveCompletedDownloads": "Remover downloads concluídos",
"RemovingTag": "Removendo etiqueta", "RemovingTag": "Removendo tag",
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos", "SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos",
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.", "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.",
"Activity": "Atividade", "Activity": "Atividade",
@@ -1011,12 +1011,15 @@
"AutomaticUpdatesDisabledDocker": "As atualizações automáticas não têm suporte direto ao usar o mecanismo de atualização do Docker. Você precisará atualizar a imagem do contêiner fora de {appName} ou usar um script", "AutomaticUpdatesDisabledDocker": "As atualizações automáticas não têm suporte direto ao usar o mecanismo de atualização do Docker. Você precisará atualizar a imagem do contêiner fora de {appName} ou usar um script",
"WouldYouLikeToRestoreBackup": "Gostaria de restaurar o backup '{name}'?", "WouldYouLikeToRestoreBackup": "Gostaria de restaurar o backup '{name}'?",
"AppUpdated": "{appName} Atualizado", "AppUpdated": "{appName} Atualizado",
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}", "AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`. Para obter as alterações mais recentes, você precisará recarregar {appName}",
"ConnectionLost": "Conexão Perdida", "ConnectionLost": "Conexão Perdida",
"ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.", "ConnectionLostToBackend": "{appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
"CountAuthorsSelected": "{selectedCount} autor(es) selecionado(s)", "CountAuthorsSelected": "{selectedCount} autor(es) selecionado(s)",
"RecentChanges": "Mudanças Recentes", "RecentChanges": "Mudanças Recentes",
"WhatsNew": "O que há de novo?", "WhatsNew": "O que há de novo?",
"RemotePathMappingsInfo": "Raramente são necessários mapeamentos de caminho remoto, se {app} e seu cliente de download estiverem no mesmo sistema, é melhor combinar seus caminhos. Para obter mais informações, consulte o [wiki]({wikiLink}).", "RemotePathMappingsInfo": "Raramente são necessários mapeamentos de caminho remoto, se {app} e seu cliente de download estiverem no mesmo sistema, é melhor combinar seus caminhos. Para obter mais informações, consulte o [wiki]({wikiLink}).",
"ErrorLoadingContent": "Ocorreu um erro ao carregar este conteúdo" "ErrorLoadingContent": "Ocorreu um erro ao carregar este conteúdo",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los.",
"OnAuthorAdded": "Sobre o Autor Adicionado",
"OnAuthorAddedHelpText": "Sobre o Autor Adicionado"
} }
+1 -1
View File
@@ -3,7 +3,7 @@
"45MinutesFourtyFive": "60 минут: {0}", "45MinutesFourtyFive": "60 минут: {0}",
"60MinutesSixty": "60 минут: {0}", "60MinutesSixty": "60 минут: {0}",
"APIKey": "API ключ", "APIKey": "API ключ",
"About": "Подробности", "About": "Об",
"AddListExclusion": "Добавить исключения списка", "AddListExclusion": "Добавить исключения списка",
"AddingTag": "Добавить ярлык", "AddingTag": "Добавить ярлык",
"AgeWhenGrabbed": "Возраст (когда захвачен)", "AgeWhenGrabbed": "Возраст (когда захвачен)",
+4 -1
View File
@@ -628,5 +628,8 @@
"AddNew": "Yeni ekle", "AddNew": "Yeni ekle",
"Large": "Büyük", "Large": "Büyük",
"LastDuration": "lastDuration", "LastDuration": "lastDuration",
"AllResultsAreHiddenByTheAppliedFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir" "AllResultsAreHiddenByTheAppliedFilter": "Tüm sonuçlar, uygulanan filtre tarafından gizlenir",
"Library": "kütüphane",
"MetadataProfile": "üstveri profili",
"MetadataProfiles": "üstveri profili"
} }
+42 -39
View File
@@ -10,24 +10,24 @@
"AlreadyInYourLibrary": "已经在你的库中", "AlreadyInYourLibrary": "已经在你的库中",
"AlternateTitles": "备选标题", "AlternateTitles": "备选标题",
"Analytics": "分析", "Analytics": "分析",
"AnalyticsEnabledHelpText": "发送匿名使用信息和错误信息给我们,这些信息包括您的浏览器信息使用的Web界面,错误报告操作系统运行版本。我们会根据这些信息来调整功能和修复问题的优先级。", "AnalyticsEnabledHelpText": "发送匿名使用和错误信息到Readarr的服务器。这包括有关浏览器信息、您使用的Readarr web页面、错误报告以及操作系统运行版本。我们将使用这些信息来确定功能和bug修复的优先级。",
"AnalyticsEnabledHelpTextWarning": "需要重启才能生效", "AnalyticsEnabledHelpTextWarning": "需要重启生效",
"AppDataDirectory": "AppData目录", "AppDataDirectory": "AppData目录",
"ApplyTags": "应用标签", "ApplyTags": "应用标签",
"Authentication": "认证", "Authentication": "认证",
"AuthenticationMethodHelpText": "您需要用户名和密码来访问Radarr", "AuthenticationMethodHelpText": "您需要用户名和密码来访问Radarr",
"AuthorClickToChangeBook": "点击更改影片", "AuthorClickToChangeBook": "点击更改图书",
"AutoRedownloadFailedHelpText": "自动搜索并尝试下载不同的版本", "AutoRedownloadFailedHelpText": "自动搜索并尝试下载不同的版本",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "从磁盘中删除的影片会自动在 Radarr 中取消监控", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "从磁盘中删除的影片会自动在 Radarr 中取消监控",
"Automatic": "自动化", "Automatic": "自动化",
"BackupFolderHelpText": "相对路径将在Radarr的AppData目录下", "BackupFolderHelpText": "相对路径位于Readarr的AppData目录下",
"BackupNow": "马上备份", "BackupNow": "马上备份",
"BackupRetentionHelpText": "早于保留周期的自动备份将被自动清", "BackupRetentionHelpText": "超过保留期限的自动备份将被自动清",
"Backups": "历史备份", "Backups": "历史备份",
"BindAddress": "绑定地址", "BindAddress": "绑定地址",
"BindAddressHelpTextWarning": "需重启生效", "BindAddressHelpTextWarning": "需重启生效",
"BookIsDownloading": "影片正在下载中", "BookIsDownloading": "影片正在下载中",
"BookIsDownloadingInterp": "影片正在下载中 - {0}% {1}", "BookIsDownloadingInterp": "书籍正在下载中 - {0}% {1}",
"Branch": "分支", "Branch": "分支",
"BypassProxyForLocalAddresses": "对局域网地址不使用代理", "BypassProxyForLocalAddresses": "对局域网地址不使用代理",
"Calendar": "日历", "Calendar": "日历",
@@ -38,7 +38,7 @@
"CertificateValidationHelpText": "改变HTTPS证书验证的严格程度。不要更改除非您了解风险。", "CertificateValidationHelpText": "改变HTTPS证书验证的严格程度。不要更改除非您了解风险。",
"ChangeFileDate": "修改文件日期", "ChangeFileDate": "修改文件日期",
"ChangeHasNotBeenSavedYet": "修改暂未保存", "ChangeHasNotBeenSavedYet": "修改暂未保存",
"ChmodFolderHelpTextWarning": "这只在运行Radarr的用户是文件所有者的情况下才有效。最好确保下载客户端正确设置权限。", "ChmodFolderHelpTextWarning": "只有当运行Readarr的用户是文件所有者时,这才有效。最好确保下载客户端正确设置权限。",
"ChownGroupHelpText": "组名称或GID。对于远程文件系统请使用GID。", "ChownGroupHelpText": "组名称或GID。对于远程文件系统请使用GID。",
"ChownGroupHelpTextWarning": "这只在运行Radarr的用户是文件所有者的情况下才有效。最好确保下载客户端使用与Radarr相同的组。", "ChownGroupHelpTextWarning": "这只在运行Radarr的用户是文件所有者的情况下才有效。最好确保下载客户端使用与Radarr相同的组。",
"Clear": "清除", "Clear": "清除",
@@ -64,7 +64,7 @@
"DelayingDownloadUntilInterp": "延时下载直到 {1} 在 {0} 之前 Delaying download until {0} at {1}", "DelayingDownloadUntilInterp": "延时下载直到 {1} 在 {0} 之前 Delaying download until {0} at {1}",
"Delete": "删除", "Delete": "删除",
"DeleteBackup": "删除备份", "DeleteBackup": "删除备份",
"DeleteBackupMessageText": "您确定要删除备份 '{name}' 吗?", "DeleteBackupMessageText": "您确定要删除备份{name}”吗?",
"DeleteDelayProfile": "删除延迟配置", "DeleteDelayProfile": "删除延迟配置",
"DeleteDelayProfileMessageText": "你确定要删除此延迟配置吗?", "DeleteDelayProfileMessageText": "你确定要删除此延迟配置吗?",
"DeleteDownloadClient": "删除下载客户端", "DeleteDownloadClient": "删除下载客户端",
@@ -76,7 +76,7 @@
"DeleteImportListMessageText": "您确定要删除列表 “{name}” 吗?", "DeleteImportListMessageText": "您确定要删除列表 “{name}” 吗?",
"DeleteIndexer": "删除索引器", "DeleteIndexer": "删除索引器",
"DeleteIndexerMessageText": "您确定要删除索引器 “{name}” 吗?", "DeleteIndexerMessageText": "您确定要删除索引器 “{name}” 吗?",
"DeleteMetadataProfileMessageText": "您确定要删除元数据配置文件 “{name}” 吗?", "DeleteMetadataProfileMessageText": "您确定要删除元数据配置文件“{name}”吗?",
"DeleteNotification": "删除消息推送", "DeleteNotification": "删除消息推送",
"DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?", "DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?",
"DeleteQualityProfile": "删除质量配置", "DeleteQualityProfile": "删除质量配置",
@@ -437,16 +437,16 @@
"ProxyUsernameHelpText": "如果需要,您只需要输入用户名和密码。否则就让它们为空。", "ProxyUsernameHelpText": "如果需要,您只需要输入用户名和密码。否则就让它们为空。",
"MaintenanceRelease": "维护发布:bug修复和其他改进。更多细节请参见Github提交历史", "MaintenanceRelease": "维护发布:bug修复和其他改进。更多细节请参见Github提交历史",
"DeleteBookFileMessageText": "您确认您想删除吗?", "DeleteBookFileMessageText": "您确认您想删除吗?",
"ApiKeyHelpTextWarning": "需重启生效", "ApiKeyHelpTextWarning": "需重启生效",
"Actions": "动作", "Actions": "动作",
"AddMissing": "添加丢失项", "AddMissing": "添加丢失项",
"AddNewItem": "添加新项目", "AddNewItem": "添加新项目",
"DeleteRootFolderMessageText": "您确定要删除根文件夹 “{name}” 吗?", "DeleteRootFolderMessageText": "您确定要删除根文件夹“{name}”吗?",
"Progress": "进度", "Progress": "进度",
"Publisher": "发布者", "Publisher": "发布者",
"Series": "节目", "Series": "节目",
"ShowBookTitleHelpText": "在海报下显示电影标题", "ShowBookTitleHelpText": "在海报下显示电影标题",
"BookAvailableButMissing": "影片可下载,但没有下载", "BookAvailableButMissing": "本书可用,但失踪了",
"ShowReleaseDate": "显示发布日期", "ShowReleaseDate": "显示发布日期",
"ShowTitle": "显示标题", "ShowTitle": "显示标题",
"ReplaceIllegalCharactersHelpText": "替换非法字符,如未勾选,则会被Radarr移除", "ReplaceIllegalCharactersHelpText": "替换非法字符,如未勾选,则会被Radarr移除",
@@ -492,7 +492,7 @@
"SizeLimit": "尺寸限制", "SizeLimit": "尺寸限制",
"Started": "已开始", "Started": "已开始",
"AllowAuthorChangeClickToChangeAuthor": "点击更改作者", "AllowAuthorChangeClickToChangeAuthor": "点击更改作者",
"AnyEditionOkHelpText": "Readarr 将会自动切换到与已下载文件最匹配的版本", "AnyEditionOkHelpText": "Readarr自动切换到最匹配下载文件的版本",
"Author": "作者", "Author": "作者",
"Disabled": "禁用", "Disabled": "禁用",
"OnBookFileDeleteHelpText": "关于电影文件删除", "OnBookFileDeleteHelpText": "关于电影文件删除",
@@ -581,11 +581,11 @@
"OnGrab": "抓取中", "OnGrab": "抓取中",
"OnHealthIssue": "健康度异常", "OnHealthIssue": "健康度异常",
"ShowUnknownAuthorItems": "显示未知影片条目", "ShowUnknownAuthorItems": "显示未知影片条目",
"AllowFingerprintingHelpText": "利用指纹技术提高航迹匹配的准确性", "AllowFingerprintingHelpText": "利用指纹识别提高图书匹配的准确性",
"AllowFingerprintingHelpTextWarning": "这需要读取部分文件,这减慢扫描速度,并可能导致磁盘或网络活动频繁。", "AllowFingerprintingHelpTextWarning": "这需要Readarr读取文件的一部分,这减慢扫描速度,并可能导致磁盘或网络活动频繁。",
"AuthorFolderFormat": "作者文件夹格式", "AuthorFolderFormat": "作者文件夹格式",
"Authors": "作者", "Authors": "作者",
"BackupIntervalHelpText": "备份 Lidarr 数据库和设置的时间间隔", "BackupIntervalHelpText": "备份Readarr数据库和设置的间隔时间",
"MetadataProfile": "元数据配置", "MetadataProfile": "元数据配置",
"MetadataProfiles": "元数据配置", "MetadataProfiles": "元数据配置",
"InstanceName": "应用名称", "InstanceName": "应用名称",
@@ -736,7 +736,7 @@
"RefreshAuthor": "刷新作者", "RefreshAuthor": "刷新作者",
"RefreshBook": "刷新书籍", "RefreshBook": "刷新书籍",
"RefreshInformation": "刷新信息", "RefreshInformation": "刷新信息",
"ReleaseProfiles": "发行配置文件", "ReleaseProfiles": "发行版概要",
"RenameBooks": "重命名书籍", "RenameBooks": "重命名书籍",
"RenameFiles": "重命名文件", "RenameFiles": "重命名文件",
"RestartRequiredHelpTextWarning": "需重启以生效", "RestartRequiredHelpTextWarning": "需重启以生效",
@@ -775,7 +775,7 @@
"ContinuingNoAdditionalBooksAreExpected": "预计不会有其他书籍", "ContinuingNoAdditionalBooksAreExpected": "预计不会有其他书籍",
"ProfilesSettingsSummary": "质量、元数据、延迟、发行配置", "ProfilesSettingsSummary": "质量、元数据、延迟、发行配置",
"AuthorIndex": "作者索引", "AuthorIndex": "作者索引",
"BookEditor": "书籍编辑", "BookEditor": "编辑书籍",
"CalibreUsername": "Calibre用户名", "CalibreUsername": "Calibre用户名",
"ChownGroup": "修改组权限", "ChownGroup": "修改组权限",
"ContinuingAllBooksDownloaded": "仍在继续(所有书籍已下载)", "ContinuingAllBooksDownloaded": "仍在继续(所有书籍已下载)",
@@ -833,7 +833,7 @@
"LatestBook": "最新书籍", "LatestBook": "最新书籍",
"LibraryHelpText": "校准内容服务器库名称。默认为空。", "LibraryHelpText": "校准内容服务器库名称。默认为空。",
"ListsSettingsSummary": "导入列表", "ListsSettingsSummary": "导入列表",
"AddImportListExclusionHelpText": "通过导入列表或作者刷新 防止书籍添加到Readarr", "AddImportListExclusionHelpText": "防止通过导入列表或作者刷新将图书添加到Readarr",
"ManualDownload": "手动下载", "ManualDownload": "手动下载",
"BookMonitoring": "书籍监控", "BookMonitoring": "书籍监控",
"BookNaming": "书籍命名", "BookNaming": "书籍命名",
@@ -850,11 +850,11 @@
"CalibreUrlBase": "Calibre基本URL", "CalibreUrlBase": "Calibre基本URL",
"BookStudio": "书籍出版商", "BookStudio": "书籍出版商",
"AudioFileMetadata": "将元数据写入音频文件", "AudioFileMetadata": "将元数据写入音频文件",
"AuthorEditor": "作者编辑", "AuthorEditor": "编辑作者",
"AuthorNameHelpText": "要排除的作者/书籍的名称任何有义的均可)", "AuthorNameHelpText": "要排除的作者/书籍的名称(可以是任何有义的名称)",
"CollapseMultipleBooks": "折叠多本书籍", "CollapseMultipleBooks": "折叠多本书籍",
"CollapseMultipleBooksHelpText": "折叠在同日发行的多本书籍", "CollapseMultipleBooksHelpText": "折叠在同日发行的多本书籍",
"ASIN": "亚马逊标准识别码", "ASIN": "ASIN",
"NoTagsHaveBeenAddedYet": "尚未添加标签,添加标签以链接具有延迟配置文件、限制或通知的作者。单击{0}以了解有关Readarr中标签的更多信息。", "NoTagsHaveBeenAddedYet": "尚未添加标签,添加标签以链接具有延迟配置文件、限制或通知的作者。单击{0}以了解有关Readarr中标签的更多信息。",
"BindAddressHelpText": "有效的 IP 地址、localhost、或以'*'代表所有接口", "BindAddressHelpText": "有效的 IP 地址、localhost、或以'*'代表所有接口",
"ApplicationURL": "应用程序 URL", "ApplicationURL": "应用程序 URL",
@@ -878,7 +878,7 @@
"CustomFormats": "自定义命名格式", "CustomFormats": "自定义命名格式",
"CutoffFormatScoreHelpText": "一旦自定义格式分数满足则Radarr不会再下载影片", "CutoffFormatScoreHelpText": "一旦自定义格式分数满足则Radarr不会再下载影片",
"DeleteCustomFormat": "删除自定义命名格式", "DeleteCustomFormat": "删除自定义命名格式",
"DeleteCustomFormatMessageText": "您确定要删除自定义格式 '{name}' 吗?", "DeleteCustomFormatMessageText": "您确定要删除自定义格式{name}”吗?",
"DeleteFormatMessageText": "您确定要删除格式标签 '{0}' 吗?", "DeleteFormatMessageText": "您确定要删除格式标签 '{0}' 吗?",
"Formats": "格式", "Formats": "格式",
"ImportListMissingRoot": "在导入列表中缺少根目录文件夹", "ImportListMissingRoot": "在导入列表中缺少根目录文件夹",
@@ -946,8 +946,8 @@
"AppUpdated": "{appName} 升级", "AppUpdated": "{appName} 升级",
"ConnectionLost": "连接丢失", "ConnectionLost": "连接丢失",
"ConnectionLostReconnect": "{appName} 将会尝试自动连接,您也可以点击下方的重新加载。", "ConnectionLostReconnect": "{appName} 将会尝试自动连接,您也可以点击下方的重新加载。",
"ConnectionLostToBackend": "{appName} 与后端的链接已断开,需要重新加载恢复功能。", "ConnectionLostToBackend": "{appName}失去了与后端的连接,需要重新加载恢复功能。",
"DeleteRemotePathMapping": "删除远程映射路径", "DeleteRemotePathMapping": "删除远程路径映射",
"AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)", "AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)",
"ColonReplacement": "替换冒号", "ColonReplacement": "替换冒号",
"Clone": "复制", "Clone": "复制",
@@ -961,21 +961,21 @@
"RedownloadFailed": "重新下载失败", "RedownloadFailed": "重新下载失败",
"SomeResultsAreHiddenByTheAppliedFilter": "部分结果已被过滤隐藏", "SomeResultsAreHiddenByTheAppliedFilter": "部分结果已被过滤隐藏",
"NoResultsFound": "无结果", "NoResultsFound": "无结果",
"NotificationStatusAllClientHealthCheckMessage": "由于故障所有通知都不可用", "NotificationStatusAllClientHealthCheckMessage": "由于故障所有通知都不可用",
"NotificationStatusSingleClientHealthCheckMessage": "由于故障通知不可用: {0}", "NotificationStatusSingleClientHealthCheckMessage": "由于失败导致通知不可用:{0}",
"Medium": "中", "Medium": "中",
"RemoveDownloadsAlert": "移除设置被移至上表中的单个下载客户端设置。", "RemoveDownloadsAlert": "移除设置被移至上表中的单个下载客户端设置。",
"Small": "小", "Small": "小",
"Ui": "UI", "Ui": "UI",
"SmartReplace": "智能替换", "SmartReplace": "智能替换",
"WhatsNew": "什么是新的?", "WhatsNew": "什么是新的?",
"BlocklistReleaseHelpText": "止 Readarr 再次自动抓取这些文件", "BlocklistReleaseHelpText": "止 Readarr 再次自动抓取这些文件",
"AppUpdatedVersion": "{appName} 已经更新到 `{version}` 版本,为了获最新的更改,需要重新加载 {appName}", "AppUpdatedVersion": "{appName}已更新为版本` {version}`,为了获最新的更改,需要重新加载{appName}",
"BypassIfAboveCustomFormatScoreHelpText": "当抓取发布版本的分数高于配置的最低自定义格式分数时跳过延时", "BypassIfAboveCustomFormatScoreHelpText": "当抓取发布版本的分数高于配置的最低自定义格式分数时跳过延时",
"CountAuthorsSelected": "已选择{selectedCount}个作者", "CountAuthorsSelected": "已选择{selectedCount}个作者",
"CountDownloadClientsSelected": "已选择 {selectedCount}下载客户端", "CountDownloadClientsSelected": "{selectedCount}下载客户端已选中",
"CountImportListsSelected": "已选择 {selectedCount}导入列表", "CountImportListsSelected": "{selectedCount}导入列表已选中",
"DeleteSelectedDownloadClientsMessageText": "是否确实要删除count}个选定的下载客户端", "DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?",
"FreeSpace": "剩余空间", "FreeSpace": "剩余空间",
"Implementation": "执行", "Implementation": "执行",
"LastDuration": "上一次用时", "LastDuration": "上一次用时",
@@ -989,7 +989,7 @@
"ApplyTagsHelpTextHowToApplyAuthors": "如何将标签应用到选定的作者", "ApplyTagsHelpTextHowToApplyAuthors": "如何将标签应用到选定的作者",
"AutomaticAdd": "自动添加", "AutomaticAdd": "自动添加",
"BypassIfHighestQualityHelpText": "当发布版本在质量配置文件中具有最高启用质量时,跳过延迟", "BypassIfHighestQualityHelpText": "当发布版本在质量配置文件中具有最高启用质量时,跳过延迟",
"DeleteSelectedImportListsMessageText": "是否确实要删除{count}个选定的导入列表", "DeleteSelectedImportListsMessageText": "您确定要删除选定的{count}导入列表吗?",
"MinimumCustomFormatScoreHelpText": "跳过首选协议延迟所需的最低自定义格式分数", "MinimumCustomFormatScoreHelpText": "跳过首选协议延迟所需的最低自定义格式分数",
"NoDownloadClientsFound": "找不到下载客户端", "NoDownloadClientsFound": "找不到下载客户端",
"NoCutoffUnmetItems": "没有未满足的截止项目", "NoCutoffUnmetItems": "没有未满足的截止项目",
@@ -997,11 +997,11 @@
"RemoveFailedDownloads": "删除失败的下载", "RemoveFailedDownloads": "删除失败的下载",
"TotalSpace": "总空间", "TotalSpace": "总空间",
"DashOrSpaceDashDependingOnName": "破折号或空格破折号取决于名字", "DashOrSpaceDashDependingOnName": "破折号或空格破折号取决于名字",
"CountIndexersSelected": "已选择 {selectedCount}索引器", "CountIndexersSelected": "{selectedCount}索引器已选中",
"DeleteConditionMessageText": "您确定要删除条件 '{name}' 吗?", "DeleteConditionMessageText": "您确定要删除条件{name}吗?",
"DeleteFormat": "删除格式", "DeleteFormat": "删除格式",
"DownloadClientTagHelpText": "仅对具有至少一个匹配标签的作者使用此下载客户端。留空以供所有作者使用。", "DownloadClientTagHelpText": "仅对具有至少一个匹配标签的作者使用此下载客户端。留空以供所有作者使用。",
"DeleteSelectedIndexersMessageText": "是否确实要删除count}个选定的索引器", "DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?",
"Events": "事件", "Events": "事件",
"Location": "位置", "Location": "位置",
"ManageLists": "管理列表", "ManageLists": "管理列表",
@@ -1009,7 +1009,7 @@
"ManageIndexers": "管理索引器", "ManageIndexers": "管理索引器",
"ManageImportLists": "管理导入列表", "ManageImportLists": "管理导入列表",
"ManageDownloadClients": "管理下载客户端", "ManageDownloadClients": "管理下载客户端",
"RemotePathMappingsInfo": "远程路径映射很少需要,如果{app}和你的下载客户端在同一个系统上,最好匹配你的路径。更多信息请参阅[wiki]({wikiLink})。", "RemotePathMappingsInfo": "很少需要远程路径映射,如果{app}和你的下载客户端在同一个系统上,最好匹配你的路径。有关更多信息请参阅[wiki]({wikiink})。",
"Bookshelf": "书架", "Bookshelf": "书架",
"ApplyChanges": "应用更改", "ApplyChanges": "应用更改",
"Activity": "活动", "Activity": "活动",
@@ -1018,5 +1018,8 @@
"AllResultsAreHiddenByTheAppliedFilter": "根据过滤条件所有结果已隐藏", "AllResultsAreHiddenByTheAppliedFilter": "根据过滤条件所有结果已隐藏",
"LastWriteTime": "最后写入时间", "LastWriteTime": "最后写入时间",
"LastExecution": "上一次执行", "LastExecution": "上一次执行",
"Library": "库" "Library": "库",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{0}设置为删除已完成的下载。这可能导致在{1}可以导入下载之前从您的客户端删除下载。",
"OnAuthorAddedHelpText": "作者添加时",
"OnAuthorAdded": "作者添加时"
} }
+2 -2
View File
@@ -471,14 +471,14 @@ namespace NzbDrone.Core.MediaFiles
output.Add("Media Format", Tuple.Create(Media, other.Media)); output.Add("Media Format", Tuple.Create(Media, other.Media));
} }
if (Date != other.Date) if (Date?.Date != other.Date?.Date)
{ {
var oldValue = Date.HasValue ? Date.Value.ToString("yyyy-MM-dd") : null; var oldValue = Date.HasValue ? Date.Value.ToString("yyyy-MM-dd") : null;
var newValue = other.Date.HasValue ? other.Date.Value.ToString("yyyy-MM-dd") : null; var newValue = other.Date.HasValue ? other.Date.Value.ToString("yyyy-MM-dd") : null;
output.Add("Date", Tuple.Create(oldValue, newValue)); output.Add("Date", Tuple.Create(oldValue, newValue));
} }
if (OriginalReleaseDate != other.OriginalReleaseDate) if (OriginalReleaseDate?.Date != other.OriginalReleaseDate?.Date)
{ {
// Id3v2.3 tags can only store the year, not the full date // Id3v2.3 tags can only store the year, not the full date
if (OriginalReleaseDate.HasValue && if (OriginalReleaseDate.HasValue &&
@@ -507,12 +507,16 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
private List<Book> MapBulkBook(BulkBookResource resource) private List<Book> MapBulkBook(BulkBookResource resource)
{ {
var authors = resource.Authors.Select(MapAuthorMetadata).ToDictionary(x => x.ForeignAuthorId, x => x);
var series = resource.Series.Select(MapSeries).ToList();
var books = new List<Book>(); var books = new List<Book>();
if (resource == null)
{
return books;
}
var authors = resource.Authors.Select(MapAuthorMetadata).ToDictionary(x => x.ForeignAuthorId, x => x);
var series = resource.Series.Select(MapSeries).ToList();
foreach (var work in resource.Works) foreach (var work in resource.Works)
{ {
var book = MapBook(work); var book = MapBook(work);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Apprise namespace NzbDrone.Core.Notifications.Apprise
{ {
@@ -27,6 +28,11 @@ namespace NzbDrone.Core.Notifications.Apprise
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Boxcar namespace NzbDrone.Core.Notifications.Boxcar
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Boxcar
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -110,6 +110,19 @@ namespace NzbDrone.Core.Notifications.CustomScript
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }
public override void OnAuthorAdded(Author author)
{
var environmentVariables = new StringDictionary();
environmentVariables.Add("Readarr_EventType", "AuthorAdded");
environmentVariables.Add("Readarr_Author_Id", author.Id.ToString());
environmentVariables.Add("Readarr_Author_Name", author.Metadata.Value.Name);
environmentVariables.Add("Readarr_Author_Path", author.Path);
environmentVariables.Add("Readarr_Author_GRId", author.Metadata.Value.ForeignAuthorId);
ExecuteScript(environmentVariables);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
var author = deleteMessage.Author; var author = deleteMessage.Author;
@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books; using NzbDrone.Core.Books;
@@ -70,6 +71,28 @@ namespace NzbDrone.Core.Notifications.Discord
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnAuthorAdded(Author author)
{
var attachments = new List<Embed>
{
new Embed
{
Title = author.Name,
Fields = new List<DiscordField>()
{
new DiscordField()
{
Name = "Links",
Value = string.Join(" / ", author.Metadata.Value.Links.Select(link => $"[{link.Name}]({link.Url})"))
}
},
}
};
var payload = CreatePayload($"Author Added", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
var attachments = new List<Embed> var attachments = new List<Embed>
@@ -8,6 +8,7 @@ using MimeKit;
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http.Dispatchers; using NzbDrone.Common.Http.Dispatchers;
using NzbDrone.Core.Books;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
namespace NzbDrone.Core.Notifications.Email namespace NzbDrone.Core.Notifications.Email
@@ -43,6 +44,13 @@ namespace NzbDrone.Core.Notifications.Email
SendEmail(Settings, BOOK_DOWNLOADED_TITLE_BRANDED, body, false, paths); SendEmail(Settings, BOOK_DOWNLOADED_TITLE_BRANDED, body, false, paths);
} }
public override void OnAuthorAdded(Author author)
{
var body = $"{author.Name} added to library.";
SendEmail(Settings, AUTHOR_ADDED_TITLE_BRANDED, body);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
var body = deleteMessage.Message; var body = deleteMessage.Message;
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Gotify namespace NzbDrone.Core.Notifications.Gotify
{ {
@@ -29,6 +30,11 @@ namespace NzbDrone.Core.Notifications.Gotify
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -12,6 +12,7 @@ namespace NzbDrone.Core.Notifications
void OnGrab(GrabMessage grabMessage); void OnGrab(GrabMessage grabMessage);
void OnReleaseImport(BookDownloadMessage message); void OnReleaseImport(BookDownloadMessage message);
void OnRename(Author author, List<RenamedBookFile> renamedFiles); void OnRename(Author author, List<RenamedBookFile> renamedFiles);
void OnAuthorAdded(Author author);
void OnAuthorDelete(AuthorDeleteMessage deleteMessage); void OnAuthorDelete(AuthorDeleteMessage deleteMessage);
void OnBookDelete(BookDeleteMessage deleteMessage); void OnBookDelete(BookDeleteMessage deleteMessage);
void OnBookFileDelete(BookFileDeleteMessage deleteMessage); void OnBookFileDelete(BookFileDeleteMessage deleteMessage);
@@ -25,6 +26,7 @@ namespace NzbDrone.Core.Notifications
bool SupportsOnReleaseImport { get; } bool SupportsOnReleaseImport { get; }
bool SupportsOnUpgrade { get; } bool SupportsOnUpgrade { get; }
bool SupportsOnRename { get; } bool SupportsOnRename { get; }
bool SupportsOnAuthorAdded { get; }
bool SupportsOnAuthorDelete { get; } bool SupportsOnAuthorDelete { get; }
bool SupportsOnBookDelete { get; } bool SupportsOnBookDelete { get; }
bool SupportsOnBookFileDelete { get; } bool SupportsOnBookFileDelete { get; }
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Join namespace NzbDrone.Core.Notifications.Join
{ {
@@ -27,6 +28,11 @@ namespace NzbDrone.Core.Notifications.Join
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE_BRANDED, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITlE_BRANDED, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITlE_BRANDED, deleteMessage.Message, Settings);
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Mailgun namespace NzbDrone.Core.Notifications.Mailgun
{ {
@@ -29,6 +30,11 @@ namespace NzbDrone.Core.Notifications.Mailgun
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, downloadMessage.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, downloadMessage.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Notifications.Webhook; using NzbDrone.Core.Notifications.Webhook;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@@ -30,6 +31,11 @@ namespace NzbDrone.Core.Notifications.Notifiarr
_proxy.SendNotification(BuildOnReleaseImportPayload(message), Settings); _proxy.SendNotification(BuildOnReleaseImportPayload(message), Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(BuildOnAuthorAdded(author), Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(BuildOnAuthorDelete(deleteMessage), Settings); _proxy.SendNotification(BuildOnAuthorDelete(deleteMessage), Settings);
@@ -1,4 +1,5 @@
using System.Net.Http; using System.Net.Http;
using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.Notifications.Webhook; using NzbDrone.Core.Notifications.Webhook;
@@ -14,10 +15,12 @@ namespace NzbDrone.Core.Notifications.Notifiarr
{ {
private const string URL = "https://notifiarr.com"; private const string URL = "https://notifiarr.com";
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly Logger _logger;
public NotifiarrProxy(IHttpClient httpClient) public NotifiarrProxy(IHttpClient httpClient, Logger logger)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_logger = logger;
} }
public void SendNotification(WebhookPayload payload, NotifiarrSettings settings) public void SendNotification(WebhookPayload payload, NotifiarrSettings settings)
@@ -47,12 +50,17 @@ namespace NzbDrone.Core.Notifications.Notifiarr
switch ((int)responseCode) switch ((int)responseCode)
{ {
case 401: case 401:
_logger.Warn("HTTP 401 - API key is invalid");
throw new NotifiarrException("API key is invalid"); throw new NotifiarrException("API key is invalid");
case 400: case 400:
throw new NotifiarrException("Unable to send notification. Ensure Readarr Integration is enabled & assigned a channel on Notifiarr"); // 400 responses shouldn't be treated as an actual error because it's a misconfiguration
// between Readarr and Notifiarr for a specific event, but shouldn't stop all events.
_logger.Warn("HTTP 400 - Unable to send notification. Ensure Readarr Integration is enabled & assigned a channel on Notifiarr");
break;
case 502: case 502:
case 503: case 503:
case 504: case 504:
_logger.Warn("Unable to send notification. Service Unavailable");
throw new NotifiarrException("Unable to send notification. Service Unavailable", ex); throw new NotifiarrException("Unable to send notification. Service Unavailable", ex);
case 520: case 520:
case 521: case 521:
@@ -61,6 +69,7 @@ namespace NzbDrone.Core.Notifications.Notifiarr
case 524: case 524:
throw new NotifiarrException("Cloudflare Related HTTP Error - Unable to send notification", ex); throw new NotifiarrException("Cloudflare Related HTTP Error - Unable to send notification", ex);
default: default:
_logger.Error(ex, "Unknown HTTP Error - Unable to send notification");
throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex); throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex);
} }
} }
@@ -12,6 +12,7 @@ namespace NzbDrone.Core.Notifications
{ {
protected const string BOOK_GRABBED_TITLE = "Book Grabbed"; protected const string BOOK_GRABBED_TITLE = "Book Grabbed";
protected const string BOOK_DOWNLOADED_TITLE = "Book Downloaded"; protected const string BOOK_DOWNLOADED_TITLE = "Book Downloaded";
protected const string AUTHOR_ADDED_TITLE = "Author Added";
protected const string AUTHOR_DELETED_TITLE = "Author Deleted"; protected const string AUTHOR_DELETED_TITLE = "Author Deleted";
protected const string BOOK_DELETED_TITLE = "Book Deleted"; protected const string BOOK_DELETED_TITLE = "Book Deleted";
protected const string BOOK_FILE_DELETED_TITLE = "Book File Deleted"; protected const string BOOK_FILE_DELETED_TITLE = "Book File Deleted";
@@ -23,6 +24,7 @@ namespace NzbDrone.Core.Notifications
protected const string BOOK_GRABBED_TITLE_BRANDED = "Readarr - " + BOOK_GRABBED_TITLE; protected const string BOOK_GRABBED_TITLE_BRANDED = "Readarr - " + BOOK_GRABBED_TITLE;
protected const string BOOK_DOWNLOADED_TITLE_BRANDED = "Readarr - " + BOOK_DOWNLOADED_TITLE; protected const string BOOK_DOWNLOADED_TITLE_BRANDED = "Readarr - " + BOOK_DOWNLOADED_TITLE;
protected const string AUTHOR_ADDED_TITLE_BRANDED = "Readarr - " + AUTHOR_ADDED_TITLE;
protected const string AUTHOR_DELETED_TITlE_BRANDED = "Readarr - " + AUTHOR_DELETED_TITLE; protected const string AUTHOR_DELETED_TITlE_BRANDED = "Readarr - " + AUTHOR_DELETED_TITLE;
protected const string BOOK_DELETED_TITLE_BRANDED = "Readarr - " + BOOK_DELETED_TITLE; protected const string BOOK_DELETED_TITLE_BRANDED = "Readarr - " + BOOK_DELETED_TITLE;
protected const string BOOK_FILE_DELETED_TITLE_BRANDED = "Readarr - " + BOOK_FILE_DELETED_TITLE; protected const string BOOK_FILE_DELETED_TITLE_BRANDED = "Readarr - " + BOOK_FILE_DELETED_TITLE;
@@ -57,6 +59,10 @@ namespace NzbDrone.Core.Notifications
{ {
} }
public virtual void OnAuthorAdded(Author author)
{
}
public virtual void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public virtual void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
} }
@@ -95,6 +101,7 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnGrab => HasConcreteImplementation("OnGrab"); public bool SupportsOnGrab => HasConcreteImplementation("OnGrab");
public bool SupportsOnRename => HasConcreteImplementation("OnRename"); public bool SupportsOnRename => HasConcreteImplementation("OnRename");
public bool SupportsOnAuthorAdded => HasConcreteImplementation("OnAuthorAdded");
public bool SupportsOnAuthorDelete => HasConcreteImplementation("OnAuthorDelete"); public bool SupportsOnAuthorDelete => HasConcreteImplementation("OnAuthorDelete");
public bool SupportsOnBookDelete => HasConcreteImplementation("OnBookDelete"); public bool SupportsOnBookDelete => HasConcreteImplementation("OnBookDelete");
public bool SupportsOnBookFileDelete => HasConcreteImplementation("OnBookFileDelete"); public bool SupportsOnBookFileDelete => HasConcreteImplementation("OnBookFileDelete");
@@ -8,6 +8,7 @@ namespace NzbDrone.Core.Notifications
public bool OnReleaseImport { get; set; } public bool OnReleaseImport { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnAuthorAdded { get; set; }
public bool OnAuthorDelete { get; set; } public bool OnAuthorDelete { get; set; }
public bool OnBookDelete { get; set; } public bool OnBookDelete { get; set; }
public bool OnBookFileDelete { get; set; } public bool OnBookFileDelete { get; set; }
@@ -21,6 +22,7 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnReleaseImport { get; set; } public bool SupportsOnReleaseImport { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnAuthorAdded { get; set; }
public bool SupportsOnAuthorDelete { get; set; } public bool SupportsOnAuthorDelete { get; set; }
public bool SupportsOnBookDelete { get; set; } public bool SupportsOnBookDelete { get; set; }
public bool SupportsOnBookFileDelete { get; set; } public bool SupportsOnBookFileDelete { get; set; }
@@ -32,6 +34,6 @@ namespace NzbDrone.Core.Notifications
public bool SupportsOnBookRetag { get; set; } public bool SupportsOnBookRetag { get; set; }
public bool SupportsOnApplicationUpdate { get; set; } public bool SupportsOnApplicationUpdate { get; set; }
public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnAuthorDelete || OnBookDelete || OnBookFileDelete || OnBookFileDeleteForUpgrade || OnHealthIssue || OnDownloadFailure || OnImportFailure || OnBookRetag || OnApplicationUpdate; public override bool Enable => OnGrab || OnReleaseImport || (OnReleaseImport && OnUpgrade) || OnAuthorAdded || OnAuthorDelete || OnBookDelete || OnBookFileDelete || OnBookFileDeleteForUpgrade || OnHealthIssue || OnDownloadFailure || OnImportFailure || OnBookRetag || OnApplicationUpdate;
} }
} }
@@ -14,6 +14,7 @@ namespace NzbDrone.Core.Notifications
List<INotification> OnUpgradeEnabled(bool filterBlockedNotifications = true); List<INotification> OnUpgradeEnabled(bool filterBlockedNotifications = true);
List<INotification> OnRenameEnabled(bool filterBlockedNotifications = true); List<INotification> OnRenameEnabled(bool filterBlockedNotifications = true);
List<INotification> OnHealthIssueEnabled(bool filterBlockedNotifications = true); List<INotification> OnHealthIssueEnabled(bool filterBlockedNotifications = true);
List<INotification> OnAuthorAddedEnabled(bool filterBlockedNotifications = true);
List<INotification> OnAuthorDeleteEnabled(bool filterBlockedNotifications = true); List<INotification> OnAuthorDeleteEnabled(bool filterBlockedNotifications = true);
List<INotification> OnBookDeleteEnabled(bool filterBlockedNotifications = true); List<INotification> OnBookDeleteEnabled(bool filterBlockedNotifications = true);
List<INotification> OnBookFileDeleteEnabled(bool filterBlockedNotifications = true); List<INotification> OnBookFileDeleteEnabled(bool filterBlockedNotifications = true);
@@ -81,6 +82,16 @@ namespace NzbDrone.Core.Notifications
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
} }
public List<INotification> OnAuthorAddedEnabled(bool filterBlockedNotifications = true)
{
if (filterBlockedNotifications)
{
return FilterBlockedNotifications(GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnAuthorAdded)).ToList();
}
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnAuthorAdded).ToList();
}
public List<INotification> OnAuthorDeleteEnabled(bool filterBlockedNotifications = true) public List<INotification> OnAuthorDeleteEnabled(bool filterBlockedNotifications = true)
{ {
if (filterBlockedNotifications) if (filterBlockedNotifications)
@@ -195,6 +206,7 @@ namespace NzbDrone.Core.Notifications
definition.SupportsOnReleaseImport = provider.SupportsOnReleaseImport; definition.SupportsOnReleaseImport = provider.SupportsOnReleaseImport;
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade; definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
definition.SupportsOnRename = provider.SupportsOnRename; definition.SupportsOnRename = provider.SupportsOnRename;
definition.SupportsOnAuthorAdded = provider.SupportsOnAuthorAdded;
definition.SupportsOnAuthorDelete = provider.SupportsOnAuthorDelete; definition.SupportsOnAuthorDelete = provider.SupportsOnAuthorDelete;
definition.SupportsOnBookDelete = provider.SupportsOnBookDelete; definition.SupportsOnBookDelete = provider.SupportsOnBookDelete;
definition.SupportsOnBookFileDelete = provider.SupportsOnBookFileDelete; definition.SupportsOnBookFileDelete = provider.SupportsOnBookFileDelete;
@@ -20,6 +20,7 @@ namespace NzbDrone.Core.Notifications
: IHandle<BookGrabbedEvent>, : IHandle<BookGrabbedEvent>,
IHandle<BookImportedEvent>, IHandle<BookImportedEvent>,
IHandle<AuthorRenamedEvent>, IHandle<AuthorRenamedEvent>,
IHandle<AuthorAddedEvent>,
IHandle<AuthorDeletedEvent>, IHandle<AuthorDeletedEvent>,
IHandle<BookDeletedEvent>, IHandle<BookDeletedEvent>,
IHandle<BookFileDeletedEvent>, IHandle<BookFileDeletedEvent>,
@@ -211,6 +212,26 @@ namespace NzbDrone.Core.Notifications
} }
} }
public void Handle(AuthorAddedEvent message)
{
foreach (var notification in _notificationFactory.OnAuthorAddedEnabled())
{
try
{
if (ShouldHandleAuthor(notification.Definition, message.Author))
{
notification.OnAuthorAdded(message.Author);
_notificationStatusService.RecordSuccess(notification.Definition.Id);
}
}
catch (Exception ex)
{
_notificationStatusService.RecordFailure(notification.Definition.Id);
_logger.Warn(ex, "Unable to send OnAuthorAdded notification to: " + notification.Definition.Name);
}
}
}
public void Handle(AuthorDeletedEvent message) public void Handle(AuthorDeletedEvent message)
{ {
var deleteMessage = new AuthorDeleteMessage(message.Author, message.DeleteFiles); var deleteMessage = new AuthorDeleteMessage(message.Author, message.DeleteFiles);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Ntfy namespace NzbDrone.Core.Notifications.Ntfy
{ {
@@ -27,6 +28,11 @@ namespace NzbDrone.Core.Notifications.Ntfy
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Prowl namespace NzbDrone.Core.Notifications.Prowl
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Prowl
_prowlProxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _prowlProxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_prowlProxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_prowlProxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _prowlProxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
namespace NzbDrone.Core.Notifications.PushBullet namespace NzbDrone.Core.Notifications.PushBullet
@@ -29,6 +30,11 @@ namespace NzbDrone.Core.Notifications.PushBullet
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Pushover namespace NzbDrone.Core.Notifications.Pushover
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Pushover
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.SendGrid namespace NzbDrone.Core.Notifications.SendGrid
{ {
@@ -29,6 +30,11 @@ namespace NzbDrone.Core.Notifications.SendGrid
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Signal namespace NzbDrone.Core.Notifications.Signal
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Signal
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Simplepush namespace NzbDrone.Core.Notifications.Simplepush
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Simplepush
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -70,6 +70,21 @@ namespace NzbDrone.Core.Notifications.Slack
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnAuthorAdded(Author author)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = author.Name,
}
};
var payload = CreatePayload("Author Added", attachments);
_proxy.SendPayload(payload, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
var attachments = new List<Attachment> var attachments = new List<Attachment>
@@ -41,6 +41,11 @@ namespace NzbDrone.Core.Notifications.Subsonic
Update(); Update();
} }
public override void OnAuthorAdded(Author author)
{
Notify(Settings, AUTHOR_ADDED_TITLE_BRANDED, author.Name);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
const string header = "Readarr - Author Deleted"; const string header = "Readarr - Author Deleted";
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
namespace NzbDrone.Core.Notifications.Telegram namespace NzbDrone.Core.Notifications.Telegram
{ {
@@ -26,6 +27,11 @@ namespace NzbDrone.Core.Notifications.Telegram
_proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(BOOK_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendNotification(AUTHOR_ADDED_TITLE, author.Name, Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings); _proxy.SendNotification(AUTHOR_DELETED_TITLE, deleteMessage.Message, Settings);
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using FluentValidation.Results; using FluentValidation.Results;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Books;
using NzbDrone.Core.Exceptions; using NzbDrone.Core.Exceptions;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@@ -28,6 +29,11 @@ namespace NzbDrone.Core.Notifications.Twitter
_twitterService.SendNotification($"Imported: {message.Message}", Settings); _twitterService.SendNotification($"Imported: {message.Message}", Settings);
} }
public override void OnAuthorAdded(Author author)
{
_twitterService.SendNotification($"Author added: {author.Name}", Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_twitterService.SendNotification($"Deleted: {deleteMessage.Message}", Settings); _twitterService.SendNotification($"Deleted: {deleteMessage.Message}", Settings);
@@ -35,6 +35,11 @@ namespace NzbDrone.Core.Notifications.Webhook
_proxy.SendWebhook(BuildOnRenamePayload(author, renamedFiles), Settings); _proxy.SendWebhook(BuildOnRenamePayload(author, renamedFiles), Settings);
} }
public override void OnAuthorAdded(Author author)
{
_proxy.SendWebhook(BuildOnAuthorAdded(author), Settings);
}
public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage) public override void OnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
_proxy.SendWebhook(BuildOnAuthorDelete(deleteMessage), Settings); _proxy.SendWebhook(BuildOnAuthorDelete(deleteMessage), Settings);
@@ -0,0 +1,7 @@
namespace NzbDrone.Core.Notifications.Webhook
{
public class WebhookAuthorAddedPayload : WebhookPayload
{
public WebhookAuthor Author { get; set; }
}
}
@@ -107,6 +107,16 @@ namespace NzbDrone.Core.Notifications.Webhook
}; };
} }
public WebhookAuthorAddedPayload BuildOnAuthorAdded(Author author)
{
return new WebhookAuthorAddedPayload
{
EventType = WebhookEventType.AuthorAdded,
InstanceName = _configFileProvider.InstanceName,
Author = new WebhookAuthor(author)
};
}
public WebhookAuthorDeletePayload BuildOnAuthorDelete(AuthorDeleteMessage deleteMessage) public WebhookAuthorDeletePayload BuildOnAuthorDelete(AuthorDeleteMessage deleteMessage)
{ {
return new WebhookAuthorDeletePayload return new WebhookAuthorDeletePayload
@@ -12,6 +12,7 @@ namespace NzbDrone.Core.Notifications.Webhook
Grab, Grab,
Download, Download,
Rename, Rename,
AuthorAdded,
AuthorDelete, AuthorDelete,
BookDelete, BookDelete,
BookFileDelete, BookFileDelete,
@@ -240,7 +240,7 @@ namespace NzbDrone.Core.Organizer
tokenHandlers["{Author Name}"] = m => author.Name; tokenHandlers["{Author Name}"] = m => author.Name;
tokenHandlers["{Author CleanName}"] = m => CleanTitle(author.Name); tokenHandlers["{Author CleanName}"] = m => CleanTitle(author.Name);
tokenHandlers["{Author NameThe}"] = m => TitleThe(author.Name); tokenHandlers["{Author NameThe}"] = m => TitleThe(author.Name);
tokenHandlers["{Author SortName}"] = m => author.Metadata.Value.NameLastFirst; tokenHandlers["{Author SortName}"] = m => author?.Metadata?.Value?.NameLastFirst ?? string.Empty;
tokenHandlers["{Author NameFirstCharacter}"] = m => TitleThe(author.Name).Substring(0, 1).FirstCharToUpper(); tokenHandlers["{Author NameFirstCharacter}"] = m => TitleThe(author.Name).Substring(0, 1).FirstCharToUpper();
if (author.Metadata.Value.Disambiguation != null) if (author.Metadata.Value.Disambiguation != null)
@@ -34,7 +34,8 @@ namespace NzbDrone.Core.Organizer
Metadata = new AuthorMetadata Metadata = new AuthorMetadata
{ {
Name = "The Author Name", Name = "The Author Name",
Disambiguation = "US Author" Disambiguation = "US Author",
NameLastFirst = "Last name, First name"
} }
}; };
+6 -1
View File
@@ -31,7 +31,12 @@ namespace NzbDrone.Core.Parser
public static QualityModel ParseQuality(string name, string desc = null, List<int> categories = null) public static QualityModel ParseQuality(string name, string desc = null, List<int> categories = null)
{ {
Logger.Debug("Trying to parse quality for {0}", name); Logger.Debug("Trying to parse quality for '{0}'", name);
if (name.IsNullOrWhiteSpace() && desc.IsNullOrWhiteSpace())
{
return new QualityModel { Quality = Quality.Unknown };
}
var normalizedName = name.Replace('_', ' ').Trim().ToLower(); var normalizedName = name.Replace('_', ' ').Trim().ToLower();
var result = ParseQualityModifiers(name, normalizedName); var result = ParseQualityModifiers(name, normalizedName);
@@ -19,7 +19,7 @@ namespace NzbDrone.Integration.Test.ApiTests
[Test] [Test]
public void lookup_new_author_by_goodreads_book_id() public void lookup_new_author_by_goodreads_book_id()
{ {
var author = Author.Lookup("edition:1"); var author = Author.Lookup("edition:2");
author.Should().NotBeEmpty(); author.Should().NotBeEmpty();
author.Should().Contain(c => c.AuthorName == "J.K. Rowling"); author.Should().Contain(c => c.AuthorName == "J.K. Rowling");
@@ -9,6 +9,7 @@ namespace Readarr.Api.V1.Notifications
public bool OnReleaseImport { get; set; } public bool OnReleaseImport { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnAuthorAdded { get; set; }
public bool OnAuthorDelete { get; set; } public bool OnAuthorDelete { get; set; }
public bool OnBookDelete { get; set; } public bool OnBookDelete { get; set; }
public bool OnBookFileDelete { get; set; } public bool OnBookFileDelete { get; set; }
@@ -22,6 +23,7 @@ namespace Readarr.Api.V1.Notifications
public bool SupportsOnReleaseImport { get; set; } public bool SupportsOnReleaseImport { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnAuthorAdded { get; set; }
public bool SupportsOnAuthorDelete { get; set; } public bool SupportsOnAuthorDelete { get; set; }
public bool SupportsOnBookDelete { get; set; } public bool SupportsOnBookDelete { get; set; }
public bool SupportsOnBookFileDelete { get; set; } public bool SupportsOnBookFileDelete { get; set; }
@@ -50,6 +52,7 @@ namespace Readarr.Api.V1.Notifications
resource.OnReleaseImport = definition.OnReleaseImport; resource.OnReleaseImport = definition.OnReleaseImport;
resource.OnUpgrade = definition.OnUpgrade; resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnAuthorAdded = definition.OnAuthorAdded;
resource.OnAuthorDelete = definition.OnAuthorDelete; resource.OnAuthorDelete = definition.OnAuthorDelete;
resource.OnBookDelete = definition.OnBookDelete; resource.OnBookDelete = definition.OnBookDelete;
resource.OnBookFileDelete = definition.OnBookFileDelete; resource.OnBookFileDelete = definition.OnBookFileDelete;
@@ -63,6 +66,7 @@ namespace Readarr.Api.V1.Notifications
resource.SupportsOnReleaseImport = definition.SupportsOnReleaseImport; resource.SupportsOnReleaseImport = definition.SupportsOnReleaseImport;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade; resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnAuthorAdded = definition.SupportsOnAuthorAdded;
resource.SupportsOnAuthorDelete = definition.SupportsOnAuthorDelete; resource.SupportsOnAuthorDelete = definition.SupportsOnAuthorDelete;
resource.SupportsOnBookDelete = definition.SupportsOnBookDelete; resource.SupportsOnBookDelete = definition.SupportsOnBookDelete;
resource.SupportsOnBookFileDelete = definition.SupportsOnBookFileDelete; resource.SupportsOnBookFileDelete = definition.SupportsOnBookFileDelete;
@@ -90,6 +94,7 @@ namespace Readarr.Api.V1.Notifications
definition.OnReleaseImport = resource.OnReleaseImport; definition.OnReleaseImport = resource.OnReleaseImport;
definition.OnUpgrade = resource.OnUpgrade; definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnAuthorAdded = resource.OnAuthorAdded;
definition.OnAuthorDelete = resource.OnAuthorDelete; definition.OnAuthorDelete = resource.OnAuthorDelete;
definition.OnBookDelete = resource.OnBookDelete; definition.OnBookDelete = resource.OnBookDelete;
definition.OnBookFileDelete = resource.OnBookFileDelete; definition.OnBookFileDelete = resource.OnBookFileDelete;
@@ -103,6 +108,7 @@ namespace Readarr.Api.V1.Notifications
definition.SupportsOnReleaseImport = resource.SupportsOnReleaseImport; definition.SupportsOnReleaseImport = resource.SupportsOnReleaseImport;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade; definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnAuthorAdded = resource.SupportsOnAuthorAdded;
definition.SupportsOnAuthorDelete = resource.SupportsOnAuthorDelete; definition.SupportsOnAuthorDelete = resource.SupportsOnAuthorDelete;
definition.SupportsOnBookDelete = resource.SupportsOnBookDelete; definition.SupportsOnBookDelete = resource.SupportsOnBookDelete;
definition.SupportsOnBookFileDelete = resource.SupportsOnBookFileDelete; definition.SupportsOnBookFileDelete = resource.SupportsOnBookFileDelete;
@@ -17,6 +17,8 @@ namespace Readarr.Api.V1.Profiles.Quality
ruleBuilder.SetValidator(new ItemGroupIdValidator<T>()); ruleBuilder.SetValidator(new ItemGroupIdValidator<T>());
ruleBuilder.SetValidator(new UniqueIdValidator<T>()); ruleBuilder.SetValidator(new UniqueIdValidator<T>());
ruleBuilder.SetValidator(new UniqueQualityIdValidator<T>()); ruleBuilder.SetValidator(new UniqueQualityIdValidator<T>());
ruleBuilder.SetValidator(new AllQualitiesValidator<T>());
return ruleBuilder.SetValidator(new ItemGroupNameValidator<T>()); return ruleBuilder.SetValidator(new ItemGroupNameValidator<T>());
} }
} }
@@ -151,4 +153,46 @@ namespace Readarr.Api.V1.Profiles.Quality
return true; return true;
} }
} }
public class AllQualitiesValidator<T> : PropertyValidator
{
protected override string GetDefaultMessageTemplate() => "Must contain all qualities";
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue is not IList<QualityProfileQualityItemResource> items)
{
return false;
}
var qualityIds = new HashSet<int>();
foreach (var item in items)
{
if (item.Id > 0)
{
foreach (var quality in item.Items)
{
qualityIds.Add(quality.Quality.Id);
}
}
else
{
qualityIds.Add(item.Quality.Id);
}
}
var allQualityIds = NzbDrone.Core.Qualities.Quality.All;
foreach (var quality in allQualityIds)
{
if (!qualityIds.Contains(quality.Id))
{
return false;
}
}
return true;
}
}
} }
@@ -24,6 +24,7 @@ namespace Readarr.Api.V1.Profiles.Quality
SharedValidator.RuleFor(c => c.Name).NotEmpty(); SharedValidator.RuleFor(c => c.Name).NotEmpty();
SharedValidator.RuleFor(c => c.Cutoff).ValidCutoff(); SharedValidator.RuleFor(c => c.Cutoff).ValidCutoff();
SharedValidator.RuleFor(c => c.Items).ValidItems(); SharedValidator.RuleFor(c => c.Items).ValidItems();
SharedValidator.RuleFor(c => c.FormatItems).Must(items => SharedValidator.RuleFor(c => c.FormatItems).Must(items =>
{ {
var all = _formatService.All().Select(f => f.Id).ToList(); var all = _formatService.All().Select(f => f.Id).ToList();
@@ -31,6 +32,7 @@ namespace Readarr.Api.V1.Profiles.Quality
return all.Except(ids).Empty(); return all.Except(ids).Empty();
}).WithMessage("All Custom Formats and no extra ones need to be present inside your Profile! Try refreshing your browser."); }).WithMessage("All Custom Formats and no extra ones need to be present inside your Profile! Try refreshing your browser.");
SharedValidator.RuleFor(c => c).Custom((profile, context) => SharedValidator.RuleFor(c => c).Custom((profile, context) =>
{ {
if (profile.FormatItems.Where(x => x.Score > 0).Sum(x => x.Score) < profile.MinFormatScore && if (profile.FormatItems.Where(x => x.Score > 0).Sum(x => x.Score) < profile.MinFormatScore &&
+6
View File
@@ -11553,6 +11553,9 @@
"onRename": { "onRename": {
"type": "boolean" "type": "boolean"
}, },
"onAuthorAdded": {
"type": "boolean"
},
"onAuthorDelete": { "onAuthorDelete": {
"type": "boolean" "type": "boolean"
}, },
@@ -11592,6 +11595,9 @@
"supportsOnRename": { "supportsOnRename": {
"type": "boolean" "type": "boolean"
}, },
"supportsOnAuthorAdded": {
"type": "boolean"
},
"supportsOnAuthorDelete": { "supportsOnAuthorDelete": {
"type": "boolean" "type": "boolean"
}, },
+11 -13
View File
@@ -1483,6 +1483,13 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react-lazyload@3.2.1":
version "3.2.1"
resolved "https://registry.yarnpkg.com/@types/react-lazyload/-/react-lazyload-3.2.1.tgz#6c4a015ca6770333c87295d31c32c17454fda922"
integrity sha512-LeJMJVTEGxcOLy9OFErOqNXIo506pxxDA/zgpTy8Bub508c1OS1Br4+b6jnhsOQQl4IwPPAnEDMqCnBJ9jauUw==
dependencies:
"@types/react" "*"
"@types/react-redux@^7.1.16": "@types/react-redux@^7.1.16":
version "7.1.26" version "7.1.26"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.26.tgz#84149f5614e40274bb70fcbe8f7cae6267d548b1"
@@ -5140,10 +5147,10 @@ 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" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@8.4.23: postcss@8.4.31, postcss@^8.0.0, postcss@^8.4.21, postcss@^8.4.27:
version "8.4.23" version "8.4.31"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies: dependencies:
nanoid "^3.3.6" nanoid "^3.3.6"
picocolors "^1.0.0" picocolors "^1.0.0"
@@ -5158,15 +5165,6 @@ postcss@^6.0.23:
source-map "^0.6.1" source-map "^0.6.1"
supports-color "^5.4.0" supports-color "^5.4.0"
postcss@^8.0.0, postcss@^8.4.21, postcss@^8.4.27:
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: prefix-style@2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06"