Compare commits

...

22 Commits

Author SHA1 Message Date
bakerboy448
749684e24a New: Indexer Messaging and Error Improvements
(cherry picked from commit 3b505d8734dcbe3fa53acba7f94f1361151e6a44)
2023-06-19 16:12:15 +03:00
Bogdan
3a0ca45aa9 Fix sorting queue items by size 2023-06-18 15:00:49 +03:00
Bogdan
595efd498e Close database connections in housekeeping tasks
Co-authored-by: ferencmarkizay <ferencmarkizay@gmail.com>
2023-06-18 15:00:11 +03:00
Bogdan
dea1060d61 Bump version to 0.2.0 2023-06-18 07:18:42 +03:00
Weblate
f6049b8bf2 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 100.0% (942 of 942 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translation: Servarr/Readarr
2023-06-18 04:53:21 +03:00
Bogdan
53ced38221 New: Improved page loading errors
Closes #2605
2023-06-17 00:51:10 +03:00
Tristan Kennedy
3a3cf8511e Added padding to search tab to maintain visual consistancy
(cherry picked from commit 55ef505d740a9aadc7f161274006e150b0d9cf8f)
2023-06-17 00:50:55 +03:00
Servarr
9ec913337d Automated API Docs update [skip ci] 2023-06-15 13:26:07 +03:00
Weblate
9a2120ae92 Update translation files [skip ci]
Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Norwegian Bokmål) [skip ci]

Currently translated at 16.0% (151 of 942 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (942 of 942 strings)

Translated using Weblate (Turkish) [skip ci]

Currently translated at 61.6% (581 of 942 strings)

Translated using Weblate (Romanian) [skip ci]

Currently translated at 59.9% (565 of 942 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.9% (621 of 942 strings)

Translated using Weblate (Korean) [skip ci]

Currently translated at 60.9% (574 of 942 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 61.4% (579 of 942 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 61.5% (580 of 942 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 61.4% (579 of 942 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 64.0% (603 of 942 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 78.5% (740 of 942 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 88.1% (830 of 942 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 61.9% (584 of 942 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 61.6% (581 of 942 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 61.5% (580 of 942 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 61.6% (581 of 942 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 68.2% (643 of 942 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fatalicus <fatalicus@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ar/
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/da/
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/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translation: Servarr/Readarr
2023-06-15 13:16:52 +03:00
Bogdan
818d3a94d5 Add skip ci to API docs update commit 2023-06-15 13:15:37 +03:00
Bogdan
4e493b74e6 Update cleansing rules for RSS TL feed and homedir for Mac
(cherry picked from commit e5ff4aafa3f0b855fec332788e9fc490a03dfce3)

Closes #2593
2023-06-15 13:06:26 +03:00
Bogdan
c7eaf1e85c Update translations
(cherry picked from commit 26031389757f6b5270bbe5591101b08e58debb73)

Closes #2599
2023-06-15 13:02:50 +03:00
Bogdan
31fe15c911 Add HelpTextWarning support in FieldDefinition
(cherry picked from commit 0e07d54ee77d5f83716e17b6757e23f38ff73694)

Closes #2595
2023-06-15 13:00:42 +03:00
Bogdan
2c36a6c25f Require ApiKey for all actions in SonarrImport
(cherry picked from commit 19b8fbe13bf584b915a05fe9fc87622adbaee0b7)

Closes #2600
2023-06-15 12:58:43 +03:00
Bogdan
6af56f7a15 Fixed: Treat redirects as errors in Readarr Import List
(cherry picked from commit 059a156f4a34c6b9cbe139fa1973b814e8a534ae)

Closes #2601
2023-06-15 12:57:09 +03:00
Qstick
6e13191c25 Fixed: Correctly handle 302 and 303 redirects in HttpClient
(cherry picked from commit ed7c5a937f4b50fcdf819e8fe347c8c0bc6bd2e7)

(cherry picked from commit 11bd764a75d3b97117098738d3489c4b3329738f)
2023-06-14 08:13:20 +03:00
bakerboy448
921ddfc962 Fixed: Handle checkingResumeData state form qBittorrent
(cherry picked from commit 8d8a16225ff7772ccb57784f272ca31e28bb8455)
2023-06-14 08:12:58 +03:00
Weblate
22f977401a Update translation files [skip ci]
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/
Translation: Servarr/Readarr
2023-06-13 01:38:53 +03:00
Bogdan
113d9a07ef Update translations 2023-06-13 01:35:03 +03:00
Qstick
0560d65ea1 Update Remote Path Mapping delete modal title
(cherry picked from commit 18716a00516a971f7f2eb369b920266bea24fe08)

Closes #2588
Fixes #2587
2023-06-12 22:31:04 +03:00
Weblate
94ff105104 Translated using Weblate (Indonesian) [skip ci]
Currently translated at 3.7% (35 of 928 strings)

Co-authored-by: liimee <git.taaa@fedora.email>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/id/
Translation: Servarr/Readarr
2023-06-12 21:58:09 +03:00
Bogdan
9bcf258aa9 Bump version to 0.1.9 2023-06-11 09:38:16 +03:00
76 changed files with 513 additions and 260 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.1.8'
majorVersion: '0.2.0'
minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
@@ -984,7 +984,7 @@ stages:
git status
if git status | grep modified
then
git commit -am 'Automated API Docs update'
git commit -am 'Automated API Docs update [skip ci]'
git push -f --set-upstream origin api-docs
curl -X POST -H "Authorization: token ${GITHUBTOKEN}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/readarr/readarr/pulls -d '{"head":"api-docs","base":"develop","title":"Update API docs"}'
else

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import PageContent from 'Components/Page/PageContent';
@@ -161,16 +162,16 @@ class Blocklist extends Component {
{
!isAnyFetching && !!error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadBlocklist')}
</div>
</Alert>
}
{
isAllPopulated && !error && !items.length &&
<div>
<Alert kind={kinds.INFO}>
{translate('NoHistoryBlocklist')}
</div>
</Alert>
}
{
@@ -214,7 +215,7 @@ class Blocklist extends Component {
isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER}
title={translate('RemoveSelected')}
message={translate('RemoveSelectedMessageText')}
message={translate('RemoveSelectedItemBlocklistMessageText')}
confirmLabel={translate('RemoveSelected')}
onConfirm={this.onRemoveSelectedConfirmed}
onCancel={this.onConfirmRemoveModalClose}

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import FilterMenu from 'Components/Menu/FilterMenu';
import PageContent from 'Components/Page/PageContent';
@@ -11,7 +12,7 @@ import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import { align, icons } from 'Helpers/Props';
import { align, icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import HistoryRowConnector from './HistoryRowConnector';
@@ -85,9 +86,9 @@ class History extends Component {
{
!isFetchingAny && hasError &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadHistory')}
</div>
</Alert>
}
{
@@ -95,9 +96,9 @@ class History extends Component {
// wait for the books to populate because they are never coming.
isPopulated && !hasError && !items.length &&
<div>
No history found
</div>
<Alert kind={kinds.INFO}>
{translate('NoHistory')}
</Alert>
}
{

View File

@@ -1,6 +1,7 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
@@ -12,7 +13,7 @@ import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import { align, icons } from 'Helpers/Props';
import { align, icons, kinds } from 'Helpers/Props';
import getRemovedItems from 'Utilities/Object/getRemovedItems';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import translate from 'Utilities/String/translate';
@@ -233,17 +234,17 @@ class Queue extends Component {
{
!isRefreshing && hasError ?
<div>
<Alert kind={kinds.DANGER}>
{translate('FailedToLoadQueue')}
</div> :
</Alert> :
null
}
{
isAllPopulated && !hasError && !items.length ?
<div>
<Alert kind={kinds.INFO}>
{translate('QueueIsEmpty')}
</div> :
</Alert> :
null
}

View File

@@ -89,12 +89,12 @@ class RemoveQueueItemsModal extends Component {
onModalClose={this.onModalClose}
>
<ModalHeader>
Remove Selected Item{selectedCount > 1 ? 's' : ''}
{selectedCount > 1 ? translate('RemoveSelectedItems') : translate('RemoveSelectedItem')}
</ModalHeader>
<ModalBody>
<div className={styles.message}>
Are you sure you want to remove {selectedCount} item{selectedCount > 1 ? 's' : ''} from the queue?
{selectedCount > 1 ? translate('RemoveSelectedItemsQueueMessageText', selectedCount) : translate('RemoveSelectedItemQueueMessageText')}
</div>
{
@@ -118,14 +118,14 @@ class RemoveQueueItemsModal extends Component {
<FormGroup>
<FormLabel>
Add Release{selectedCount > 1 ? 's' : ''} To Blocklist
{selectedCount > 1 ? translate('BlocklistReleases') : translate('BlocklistRelease')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="blocklist"
value={blocklist}
helpText={translate('BlocklistHelpText')}
helpText={translate('BlocklistReleaseHelpText')}
onChange={this.onBlocklistChange}
/>
</FormGroup>
@@ -150,14 +150,14 @@ class RemoveQueueItemsModal extends Component {
<ModalFooter>
<Button onPress={this.onModalClose}>
Close
{translate('Close')}
</Button>
<Button
kind={kinds.DANGER}
onPress={this.onRemoveConfirmed}
>
Remove
{translate('Remove')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -1,8 +1,10 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AuthorHistoryRowConnector from './AuthorHistoryRowConnector';
@@ -70,9 +72,9 @@ class AuthorHistoryTableContent extends Component {
{
!isFetching && !!error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadHistory')}
</div>
</Alert>
}
{

View File

@@ -1,6 +1,8 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AgendaConnector from './Agenda/AgendaConnector';
import * as calendarViews from './calendarViews';
@@ -31,9 +33,9 @@ class Calendar extends Component {
{
!isFetching && !!error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadTheCalendar')}
</div>
</Alert>
}
{

View File

@@ -62,6 +62,7 @@ function ProviderFieldFormGroup(props) {
name,
label,
helpText,
helpTextWarning,
helpLink,
placeholder,
value,
@@ -95,6 +96,7 @@ function ProviderFieldFormGroup(props) {
name={name}
label={label}
helpText={helpText}
helpTextWarning={helpTextWarning}
helpLink={helpLink}
placeholder={placeholder}
value={value}
@@ -121,6 +123,7 @@ ProviderFieldFormGroup.propTypes = {
name: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
helpText: PropTypes.string,
helpTextWarning: PropTypes.string,
helpLink: PropTypes.string,
placeholder: PropTypes.string,
value: PropTypes.any,

View File

@@ -1,6 +1,8 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { kinds } from 'Helpers/Props';
function PageSectionContent(props) {
const {
@@ -17,7 +19,7 @@ function PageSectionContent(props) {
);
} else if (!isFetching && !!error) {
return (
<div>{errorMessage}</div>
<Alert kind={kinds.DANGER}>{errorMessage}</Alert>
);
} else if (isPopulated && !error) {
return (

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
@@ -92,9 +93,9 @@ class SelectQualityModalContent extends Component {
{
!isFetching && !!error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadQualities')}
</div>
</Alert>
}
{

View File

@@ -7,3 +7,9 @@
.filteredMessage {
margin-top: 10px;
}
.blankpad {
padding-top: 10px;
padding-bottom: 10px;
padding-left: 2em;
}

View File

@@ -1,6 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'blankpad': string;
'filterMenuContainer': string;
'filteredMessage': string;
}

View File

@@ -104,7 +104,7 @@ function InteractiveSearch(props) {
{
!isFetching && error ?
<div>
<div className={styles.blankpad}>
Unable to load results for this book search. Try again later
</div> :
null
@@ -112,7 +112,7 @@ function InteractiveSearch(props) {
{
!isFetching && isPopulated && !totalReleasesCount ?
<div>
<div className={styles.blankpad}>
No results found
</div> :
null
@@ -120,7 +120,7 @@ function InteractiveSearch(props) {
{
!!totalReleasesCount && isPopulated && !items.length ?
<div>
<div className={styles.blankpad}>
All results are hidden by the applied filter
</div> :
null

View File

@@ -78,7 +78,7 @@ class Specification extends Component {
<IconButton
className={styles.cloneButton}
title={translate('Clone')}
title={translate('CloneCondition')}
name={icons.CLONE}
onPress={this.onCloneSpecificationPress}
/>
@@ -92,14 +92,14 @@ class Specification extends Component {
{
negate &&
<Label kind={kinds.DANGER}>
Negated
{translate('Negated')}
</Label>
}
{
required &&
<Label kind={kinds.SUCCESS}>
Required
{translate('Required')}
</Label>
}
</div>
@@ -114,8 +114,8 @@ class Specification extends Component {
<ConfirmModal
isOpen={this.state.isDeleteSpecificationModalOpen}
kind={kinds.DANGER}
title={translate('DeleteFormat')}
message={translate('DeleteFormatMessageText', [name])}
title={translate('DeleteCondition')}
message={translate('DeleteConditionMessageText', [name])}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteSpecification}
onCancel={this.onDeleteSpecificationModalClose}

View File

@@ -1,12 +1,13 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes, sizes } from 'Helpers/Props';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function DownloadClientOptions(props) {
@@ -28,9 +29,9 @@ function DownloadClientOptions(props) {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadDownloadClientOptions')}
</div>
</Alert>
}
{

View File

@@ -88,8 +88,8 @@ class RemotePathMapping extends Component {
<ConfirmModal
isOpen={this.state.isDeleteRemotePathMappingModalOpen}
kind={kinds.DANGER}
title={translate('DeleteDelayProfile')}
message={translate('DeleteDelayProfileMessageText')}
title={translate('DeleteRemotePathMapping')}
message={translate('DeleteRemotePathMappingMessageText')}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteRemotePathMapping}
onCancel={this.onDeleteRemotePathMappingModalClose}

View File

@@ -1,6 +1,7 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import Form from 'Components/Form/Form';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ConfirmModal from 'Components/Modal/ConfirmModal';
@@ -124,9 +125,9 @@ class GeneralSettings extends Component {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadGeneralSettings')}
</div>
</Alert>
}
{

View File

@@ -1,12 +1,13 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes } from 'Helpers/Props';
import { inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function IndexerOptions(props) {
@@ -28,9 +29,9 @@ function IndexerOptions(props) {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadIndexerOptions')}
</div>
</Alert>
}
{

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
@@ -8,7 +9,7 @@ import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { inputTypes, sizes } from 'Helpers/Props';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import RemotePathMappingsConnector from 'Settings/DownloadClients/RemotePathMappings/RemotePathMappingsConnector';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
@@ -79,9 +80,9 @@ class MediaManagement extends Component {
{
!isFetching && error &&
<FieldSet legend={translate('NamingSettings')}>
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadMediaManagementSettings')}
</div>
</Alert>
</FieldSet>
}

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
@@ -7,7 +8,7 @@ import FormInputButton from 'Components/Form/FormInputButton';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes, sizes } from 'Helpers/Props';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import NamingModal from './NamingModal';
import styles from './Naming.css';
@@ -118,9 +119,9 @@ class Naming extends Component {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadNamingSettings')}
</div>
</Alert>
}
{

View File

@@ -1,12 +1,13 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes } from 'Helpers/Props';
import { inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
const writeAudioTagOptions = [
@@ -41,9 +42,9 @@ function MetadataProvider(props) {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadMetadataProviderSettings')}
</div>
</Alert>
}
{

View File

@@ -55,12 +55,12 @@ class ResetQualityDefinitionsModalContent extends Component {
onModalClose={onModalClose}
>
<ModalHeader>
Reset Quality Definitions
{translate('ResetQualityDefinitions')}
</ModalHeader>
<ModalBody>
<div className={styles.messageContainer}>
Are you sure you want to reset quality definitions?
{translate('ResetQualityDefinitionsMessageText')}
</div>
<FormGroup>
@@ -81,7 +81,7 @@ class ResetQualityDefinitionsModalContent extends Component {
<ModalFooter>
<Button onPress={onModalClose}>
Cancel
{translate('Cancel')}
</Button>
<Button
@@ -89,7 +89,7 @@ class ResetQualityDefinitionsModalContent extends Component {
onPress={this.onResetQualityDefinitionsConfirmed}
isDisabled={isResettingQualityDefinitions}
>
Reset
{translate('Reset')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import FieldSet from 'Components/FieldSet';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
@@ -8,7 +9,7 @@ import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { inputTypes } from 'Helpers/Props';
import { inputTypes, kinds } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import themes from 'Styles/Themes';
import titleCase from 'Utilities/String/titleCase';
@@ -81,9 +82,9 @@ class UISettings extends Component {
{
!isFetching && error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadUISettings')}
</div>
</Alert>
}
{

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
@@ -8,7 +9,7 @@ import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { icons } from 'Helpers/Props';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import BackupRow from './BackupRow';
import RestoreBackupModalConnector from './RestoreBackupModalConnector';
@@ -107,16 +108,16 @@ class Backups extends Component {
{
!isFetching && !!error &&
<div>
<Alert kind={kinds.DANGER}>
{translate('UnableToLoadBackups')}
</div>
</Alert>
}
{
noBackups &&
<div>
<Alert kind={kinds.INFO}>
{translate('NoBackupsAreAvailable')}
</div>
</Alert>
}
{

View File

@@ -27,35 +27,36 @@ namespace NzbDrone.Api.Test.ClientSchemaTests
var schema = SchemaBuilder.ToSchema(model);
schema.Should().Contain(c =>
c.Order == 1 && c.Name == "lastName" && c.Label == "Last Name" && c.HelpText == "Your Last Name" &&
(string)c.Value == "Poop");
schema.Should().Contain(c =>
c.Order == 0 && c.Name == "firstName" && c.Label == "First Name" && c.HelpText == "Your First Name" &&
(string)c.Value == "Bob");
schema.Should().Contain(c => c.Order == 1 && c.Name == "lastName" && c.Label == "Last Name" && c.HelpText == "Your Last Name" && c.HelpTextWarning == "Mandatory Last Name" && (string)c.Value == "Poop");
schema.Should().Contain(c => c.Order == 0 && c.Name == "firstName" && c.Label == "First Name" && c.HelpText == "Your First Name" && c.HelpTextWarning == "Mandatory First Name" && (string)c.Value == "Bob");
}
[Test]
public void schema_should_have_nested_fields()
{
var model = new NestedTestModel();
model.Name.FirstName = "Bob";
model.Name.LastName = "Poop";
var model = new NestedTestModel
{
Name =
{
FirstName = "Bob",
LastName = "Poop"
}
};
var schema = SchemaBuilder.ToSchema(model);
schema.Should().Contain(c => c.Order == 0 && c.Name == "name.firstName" && c.Label == "First Name" && c.HelpText == "Your First Name" && (string)c.Value == "Bob");
schema.Should().Contain(c => c.Order == 1 && c.Name == "name.lastName" && c.Label == "Last Name" && c.HelpText == "Your Last Name" && (string)c.Value == "Poop");
schema.Should().Contain(c => c.Order == 0 && c.Name == "name.firstName" && c.Label == "First Name" && c.HelpText == "Your First Name" && c.HelpTextWarning == "Mandatory First Name" && (string)c.Value == "Bob");
schema.Should().Contain(c => c.Order == 1 && c.Name == "name.lastName" && c.Label == "Last Name" && c.HelpText == "Your Last Name" && c.HelpTextWarning == "Mandatory Last Name" && (string)c.Value == "Poop");
schema.Should().Contain(c => c.Order == 2 && c.Name == "quote" && c.Label == "Quote" && c.HelpText == "Your Favorite Quote");
}
}
public class TestModel
{
[FieldDefinition(0, Label = "First Name", HelpText = "Your First Name")]
[FieldDefinition(0, Label = "First Name", HelpText = "Your First Name", HelpTextWarning = "Mandatory First Name")]
public string FirstName { get; set; }
[FieldDefinition(1, Label = "Last Name", HelpText = "Your Last Name")]
[FieldDefinition(1, Label = "Last Name", HelpText = "Your Last Name", HelpTextWarning = "Mandatory Last Name")]
public string LastName { get; set; }
public string Other { get; set; }

View File

@@ -10,7 +10,9 @@ namespace NzbDrone.Common.Test.InstrumentationTests
// Indexer Urls
[TestCase(@"https://iptorrents.com/torrents/rss?u=mySecret;tp=mySecret;l5;download")]
[TestCase(@"http://rss.torrentleech.org/mySecret")]
[TestCase(@"http://rss.torrentleech.org/rss/download/12345/01233210/filename.torrent")]
[TestCase(@"https://rss24h.torrentleech.org/mySecret")]
[TestCase(@"http://rss.torrentleech.org/rss/download/12345/01233210/file.name-RLSGRP.torrent")]
[TestCase(@"https://www.torrentleech.org/rss/download/12345/01233210/file.name-RLSGRP.torrent")]
[TestCase(@"http://www.bitmetv.org/rss.php?uid=mySecret&passkey=mySecret")]
[TestCase(@"https://rss.omgwtfnzbs.org/rss-search.php?catid=19,20&user=Readarr&api=mySecret&eng=1")]
[TestCase(@"https://dognzb.cr/fetch/2b51db35e1912ffc138825a12b9933d2/2b51db35e1910123321025a12b9933d2")]
@@ -44,6 +46,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
// Deluge
[TestCase(@",{""download_location"": ""C:\Users\\mySecret mySecret\\Downloads""}")]
[TestCase(@",{""download_location"": ""/home/mySecret/Downloads""}")]
[TestCase(@",{""download_location"": ""/Users/mySecret/Downloads""}")]
[TestCase(@"auth.login(""mySecret"")")]
// Download Station
@@ -56,8 +59,11 @@ namespace NzbDrone.Common.Test.InstrumentationTests
// Internal
[TestCase(@"OutputPath=/home/mySecret/Downloads")]
[TestCase(@"OutputPath=/Users/mySecret/Downloads")]
[TestCase("Hardlinking episode file: /home/mySecret/Downloads to /media/abc.mkv")]
[TestCase("Hardlinking episode file: /Users/mySecret/Downloads to /media/abc.mkv")]
[TestCase("Hardlink '/home/mySecret/Downloads/abs.mkv' to '/media/abc.mkv' failed.")]
[TestCase("Hardlink '/Users/mySecret/Downloads/abs.mkv' to '/media/abc.mkv' failed.")]
[TestCase("https://notifiarr.com/notifier.php: api=1234530f-422f-4aac-b6b3-01233210aaaa&radarr_health_issue_message=Download")]
[TestCase("/readarr/signalr/messages/negotiate?access_token=1234530f422f4aacb6b301233210aaaa&negotiateVersion=1")]
[TestCase(@"[Info] MigrationController: *** Migrating Database=readarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;Enlist=False ***")]

View File

@@ -60,8 +60,7 @@ namespace NzbDrone.Common.Http
if (request.AllowAutoRedirect && response.HasHttpRedirect)
{
var autoRedirectChain = new List<string>();
autoRedirectChain.Add(request.Url.ToString());
var autoRedirectChain = new List<string> { request.Url.ToString() };
do
{
@@ -75,6 +74,14 @@ namespace NzbDrone.Common.Http
throw new WebException($"Too many automatic redirections were attempted for {autoRedirectChain.Join(" -> ")}", WebExceptionStatus.ProtocolError);
}
// 302 or 303 should default to GET on redirect even if POST on original
if (RequestRequiresForceGet(response.StatusCode, response.Request.Method))
{
request.Method = HttpMethod.Get;
request.ContentData = null;
request.ContentSummary = null;
}
response = ExecuteRequest(request, cookieContainer);
}
while (response.HasHttpRedirect);
@@ -105,6 +112,16 @@ namespace NzbDrone.Common.Http
return response;
}
private static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMethod requestMethod)
{
return statusCode switch
{
HttpStatusCode.Moved or HttpStatusCode.Found or HttpStatusCode.MultipleChoices => requestMethod == HttpMethod.Post,
HttpStatusCode.SeeOther => requestMethod != HttpMethod.Get && requestMethod != HttpMethod.Head,
_ => false,
};
}
private HttpResponse ExecuteRequest(HttpRequest request, CookieContainer cookieContainer)
{
foreach (var interceptor in _requestInterceptors)

View File

@@ -50,6 +50,8 @@ namespace NzbDrone.Common.Http
public bool HasHttpError => (int)StatusCode >= 400;
public bool HasHttpServerError => (int)StatusCode >= 500;
public bool HasHttpRedirect => StatusCode == HttpStatusCode.Moved ||
StatusCode == HttpStatusCode.MovedPermanently ||
StatusCode == HttpStatusCode.Found ||

View File

@@ -7,56 +7,56 @@ namespace NzbDrone.Common.Instrumentation
{
public class CleanseLogMessage
{
private static readonly Regex[] CleansingRules = new[]
{
// Url
new Regex(@"(?<=\?|&|: )((?:api|auth|pass)?key|(?:access[-_]?)?token|auth|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"(?<=\?|&)[^=]*?(username|password)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"iptorrents\.com/[/a-z0-9?&;]*?(?:[?&;](u|tp)=(?<secret>[^&=;]+?))+(?= |;|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new Regex(@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
private static readonly Regex[] CleansingRules =
{
// Url
new (@"(?<=\?|&|: )((?:api|auth|pass)?key|(?:access[-_]?)?token|auth|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=\?|&)[^=]*?(username|password)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"rss(24h)?\.torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"iptorrents\.com/[/a-z0-9?&;]*?(?:[?&;](u|tp)=(?<secret>[^&=;]+?))+(?= |;|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new (@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
new Regex(@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce"),
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce"),
// Path
new Regex(@"C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"/home/(?<secret>[^/""]+?)(/|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Path
new (@"C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"/(home|Users)/(?<secret>[^/""]+?)(/|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// NzbGet
new Regex(@"""Name""\s*:\s*""[^""]*(username|password)""\s*,\s*""Value""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// NzbGet
new (@"""Name""\s*:\s*""[^""]*(username|password)""\s*,\s*""Value""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Sabnzbd
new Regex(@"""[^""]*(username|password|api_?key|nzb_key)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"""email_(account|to|from|pwd)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Sabnzbd
new (@"""[^""]*(username|password|api_?key|nzb_key)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"""email_(account|to|from|pwd)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// uTorrent
new Regex(@"\[""[a-z._]*(username|password)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"\[""(boss_key|boss_key_salt|proxy\.proxy)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// uTorrent
new (@"\[""[a-z._]*(username|password)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\[""(boss_key|boss_key_salt|proxy\.proxy)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Deluge
new Regex(@"auth.login\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Deluge
new (@"auth.login\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// BroadcastheNet
new Regex(@"""?method""?\s*:\s*""(getTorrents)"",\s*""?params""?\s*:\s*\[\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"getTorrents\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"(?<=\?|&)(authkey|torrent_pass)=(?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// BroadcastheNet
new (@"""?method""?\s*:\s*""(getTorrents)"",\s*""?params""?\s*:\s*\[\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"getTorrents\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=\?|&)(authkey|torrent_pass)=(?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Good Reads
new Regex(@"(?<=""(token|tokensecret)"":\s)""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Good Reads
new (@"(?<=""(token|tokensecret)"":\s)""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Webhooks
// Notifiarr
new Regex(@"api/v[0-9]/notification/readarr/(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Webhooks
// Notifiarr
new (@"api/v[0-9]/notification/readarr/(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Discord
new Regex(@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
};
// Discord
new (@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
};
private static readonly Regex CleanseRemoteIPRegex = new Regex(@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
public static string Cleanse(string message)
{
@@ -68,15 +68,15 @@ namespace NzbDrone.Common.Instrumentation
foreach (var regex in CleansingRules)
{
message = regex.Replace(message, m =>
{
var value = m.Value;
foreach (var capture in m.Groups["secret"].Captures.OfType<Capture>().Reverse())
{
var value = m.Value;
foreach (var capture in m.Groups["secret"].Captures.OfType<Capture>().Reverse())
{
value = value.Replace(capture.Index - m.Index, capture.Length, "(removed)");
}
value = value.Replace(capture.Index - m.Index, capture.Length, "(removed)");
}
return value;
});
return value;
});
}
message = CleanseRemoteIPRegex.Replace(message, CleanseRemoteIP);
@@ -87,7 +87,6 @@ namespace NzbDrone.Common.Instrumentation
private static string CleanseRemoteIP(Match match)
{
var group = match.Groups[1];
var valueAll = match.Value;
var valueIP = group.Value;
if (IPAddress.TryParse(valueIP, out var address) && !address.IsLocalAddress())

View File

@@ -225,6 +225,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
[TestCase("checkingDL")]
[TestCase("checkingUP")]
[TestCase("metaDL")]
[TestCase("checkingResumeData")]
public void queued_item_should_have_required_properties(string state)
{
var torrent = new QBittorrentTorrent

View File

@@ -15,6 +15,7 @@ namespace NzbDrone.Core.Annotations
public string Label { get; set; }
public string Unit { get; set; }
public string HelpText { get; set; }
public string HelpTextWarning { get; set; }
public string HelpLink { get; set; }
public FieldType Type { get; set; }
public bool Advanced { get; set; }

View File

@@ -253,6 +253,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
case "queuedDL": // queuing is enabled and torrent is queued for download
case "checkingDL": // same as checkingUP, but torrent has NOT finished downloading
case "checkingUP": // torrent has finished downloading and is being checked. Set when `recheck torrent on completion` is enabled. In the event the check fails we shouldn't treat it as completed.
case "checkingResumeData": // torrent is checking resume data on load
item.Status = DownloadItemStatus.Queued;
break;

View File

@@ -16,7 +16,7 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
public void Clean()
{
var mapper = _database.OpenConnection();
using var mapper = _database.OpenConnection();
if (_database.DatabaseType == DatabaseType.PostgreSQL)
{
@@ -31,7 +31,7 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
}
else
{
mapper.Execute(@"DELETE FROM ""PendingReleases""
mapper.Execute(@"DELETE FROM ""PendingReleases""
WHERE ""Added"" < @TwoWeeksAgo
AND ""REASON"" IN @Reasons",
new

View File

@@ -14,7 +14,7 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
public void Clean()
{
var mapper = _database.OpenConnection();
using var mapper = _database.OpenConnection();
mapper.Execute(@"DELETE FROM ""DownloadClientStatus""
WHERE ""Id"" IN (

View File

@@ -108,11 +108,11 @@ namespace NzbDrone.Core.ImportLists.Readarr
return new
{
options = devices.OrderBy(d => d.Name, StringComparer.InvariantCultureIgnoreCase)
.Select(d => new
{
Value = d.Id,
Name = d.Name
})
.Select(d => new
{
Value = d.Id,
Name = d.Name
})
};
}
@@ -123,28 +123,26 @@ namespace NzbDrone.Core.ImportLists.Readarr
return new
{
options = devices.OrderBy(d => d.Label, StringComparer.InvariantCultureIgnoreCase)
.Select(d => new
{
Value = d.Id,
Name = d.Label
})
.Select(d => new
{
Value = d.Id,
Name = d.Label
})
};
}
if (action == "getRootFolders")
{
Settings.Validate().Filter("ApiKey").ThrowOnError();
var remoteRootfolders = _readarrV1Proxy.GetRootFolders(Settings);
var remoteRootFolders = _readarrV1Proxy.GetRootFolders(Settings);
return new
{
options = remoteRootfolders.OrderBy(d => d.Path, StringComparer.InvariantCultureIgnoreCase)
.Select(d => new
{
value = d.Path,
name = d.Path
})
options = remoteRootFolders.OrderBy(d => d.Path, StringComparer.InvariantCultureIgnoreCase)
.Select(d => new
{
value = d.Path,
name = d.Path
})
};
}

View File

@@ -69,13 +69,19 @@ namespace NzbDrone.Core.ImportLists.Readarr
return new ValidationFailure("ApiKey", "API Key is invalid");
}
_logger.Error(ex, "Unable to send test message");
return new ValidationFailure("ApiKey", "Unable to send test message");
if (ex.Response.HasHttpRedirect)
{
_logger.Error(ex, "Readarr returned redirect and is invalid");
return new ValidationFailure("BaseUrl", "Readarr URL is invalid, are you missing a URL base?");
}
_logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details.");
}
catch (Exception ex)
{
_logger.Error(ex, "Unable to send test message");
return new ValidationFailure("", "Unable to send test message");
_logger.Error(ex, "Unable to connect to import list.");
return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details.");
}
return null;
@@ -90,11 +96,18 @@ namespace NzbDrone.Core.ImportLists.Readarr
var baseUrl = settings.BaseUrl.TrimEnd('/');
var request = new HttpRequestBuilder(baseUrl).Resource(resource).Accept(HttpAccept.Json)
.SetHeader("X-Api-Key", settings.ApiKey).Build();
var request = new HttpRequestBuilder(baseUrl).Resource(resource)
.Accept(HttpAccept.Json)
.SetHeader("X-Api-Key", settings.ApiKey)
.Build();
var response = _httpClient.Get(request);
if ((int)response.StatusCode >= 300)
{
throw new HttpException(response);
}
var results = JsonConvert.DeserializeObject<List<TResource>>(response.Content);
return results;

View File

@@ -2,6 +2,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Extensions;
@@ -77,6 +79,7 @@ namespace NzbDrone.Core.Indexers
{
var releases = new List<ReleaseInfo>();
var url = string.Empty;
var minimumBackoff = TimeSpan.FromHours(1);
try
{
@@ -169,8 +172,7 @@ namespace NzbDrone.Core.Indexers
}
catch (WebException webException)
{
if (webException.Status == WebExceptionStatus.NameResolutionFailure ||
webException.Status == WebExceptionStatus.ConnectFailure)
if (webException.Status is WebExceptionStatus.NameResolutionFailure or WebExceptionStatus.ConnectFailure)
{
_indexerStatusService.RecordConnectionFailure(Definition.Id);
}
@@ -180,7 +182,7 @@ namespace NzbDrone.Core.Indexers
}
if (webException.Message.Contains("502") || webException.Message.Contains("503") ||
webException.Message.Contains("timed out"))
webException.Message.Contains("504") || webException.Message.Contains("timed out"))
{
_logger.Warn("{0} server is currently unavailable. {1} {2}", this, url, webException.Message);
}
@@ -191,34 +193,29 @@ namespace NzbDrone.Core.Indexers
}
catch (TooManyRequestsException ex)
{
if (ex.RetryAfter != TimeSpan.Zero)
{
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
}
else
{
_indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
}
var retryTime = ex.RetryAfter != TimeSpan.Zero ? ex.RetryAfter : minimumBackoff;
_indexerStatusService.RecordFailure(Definition.Id, retryTime);
_logger.Warn("API Request Limit reached for {0}", this);
_logger.Warn("API Request Limit reached for {0}. Disabled for {1}", this, retryTime);
}
catch (HttpException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn("{0} {1}", this, ex.Message);
}
catch (RequestLimitReachedException ex)
{
if (ex.RetryAfter != TimeSpan.Zero)
if (ex.Response.HasHttpServerError)
{
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
_logger.Warn("Unable to connect to {0} at [{1}]. Indexer's server is unavailable. Try again later. {2}", this, url, ex.Message);
}
else
{
_indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
_logger.Warn("{0} {1}", this, ex.Message);
}
}
catch (RequestLimitReachedException ex)
{
var retryTime = ex.RetryAfter != TimeSpan.Zero ? ex.RetryAfter : minimumBackoff;
_indexerStatusService.RecordFailure(Definition.Id, retryTime);
_logger.Warn("API Request Limit reached for {0}", this);
_logger.Warn("API Request Limit reached for {0}. Disabled for {1}", this, retryTime);
}
catch (ApiKeyException)
{
@@ -238,6 +235,11 @@ namespace NzbDrone.Core.Indexers
_logger.Error(ex, "CAPTCHA token required for {0}, check indexer settings.", this);
}
}
catch (TaskCanceledException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "Unable to connect to indexer, possibly due to a timeout. {0}", url);
}
catch (IndexerException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
@@ -333,6 +335,8 @@ namespace NzbDrone.Core.Indexers
catch (RequestLimitReachedException ex)
{
_logger.Warn("Request limit reached: " + ex.Message);
return new ValidationFailure(string.Empty, "Request limit reached: " + ex.Message);
}
catch (CloudFlareCaptchaException ex)
{
@@ -357,6 +361,55 @@ namespace NzbDrone.Core.Indexers
return new ValidationFailure(string.Empty, "Unable to connect to indexer. " + ex.Message);
}
catch (HttpException ex)
{
if (ex.Response.StatusCode == HttpStatusCode.BadRequest &&
ex.Response.Content.Contains("not support the requested query"))
{
_logger.Warn(ex, "Indexer does not support the query");
return new ValidationFailure(string.Empty, "Indexer does not support the current query. Check if the categories and or searching for seasons/episodes are supported. Check the log for more details.");
}
_logger.Warn(ex, "Unable to connect to indexer");
if (ex.Response.HasHttpServerError)
{
return new ValidationFailure(string.Empty, "Unable to connect to indexer, indexer's server is unavailable. Try again later. " + ex.Message);
}
if (ex.Response.StatusCode is HttpStatusCode.Forbidden or HttpStatusCode.Unauthorized)
{
return new ValidationFailure(string.Empty, "Unable to connect to indexer, invalid credentials. " + ex.Message);
}
return new ValidationFailure(string.Empty, "Unable to connect to indexer, check the log above the ValidationFailure for more details. " + ex.Message);
}
catch (HttpRequestException ex)
{
_logger.Warn(ex, "Unable to connect to indexer");
return new ValidationFailure(string.Empty, "Unable to connect to indexer, please check your DNS settings and ensure IPv6 is working or disabled. " + ex.Message);
}
catch (TaskCanceledException ex)
{
_logger.Warn(ex, "Unable to connect to indexer");
return new ValidationFailure(string.Empty, "Unable to connect to indexer, possibly due to a timeout. Try again or check your network settings. " + ex.Message);
}
catch (WebException webException)
{
_logger.Warn("Unable to connect to indexer.");
if (webException.Status is WebExceptionStatus.NameResolutionFailure or WebExceptionStatus.ConnectFailure)
{
return new ValidationFailure(string.Empty, "Unable to connect to indexer connection failure. Check your connection to the indexer's server and DNS." + webException.Message);
}
if (webException.Message.Contains("502") || webException.Message.Contains("503") ||
webException.Message.Contains("504") || webException.Message.Contains("timed out"))
{
return new ValidationFailure(string.Empty, "Unable to connect to indexer, indexer's server is unavailable. Try again later. " + webException.Message);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to connect to indexer");

View File

@@ -121,7 +121,8 @@ namespace NzbDrone.Core.Indexers
protected virtual bool PreProcess(IndexerResponse indexerResponse)
{
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
// Server Down HTTP Errors are handled in HTTPIndexerBase so ignore them here
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK && !indexerResponse.HttpResponse.HasHttpServerError)
{
throw new IndexerException(indexerResponse, "Indexer API call resulted in an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode);
}

View File

@@ -149,7 +149,6 @@
"RemovedFromTaskQueue": "تمت إزالته من قائمة انتظار المهام",
"RemoveTagRemovingTag": "إزالة العلامة",
"RemoveTagExistingTag": "علامة موجودة",
"RemoveSelectedMessageText": "هل أنت متأكد أنك تريد إزالة العناصر المحددة من القائمة السوداء؟",
"RemoveSelected": "ازل المحدد",
"RemoveHelpTextWarning": "ستؤدي الإزالة إلى إزالة التنزيل والملف (الملفات) من عميل التنزيل.",
"RemoveFromQueue": "إزالة من قائمة الانتظار",
@@ -466,7 +465,6 @@
"Time": "زمن",
"Component": "مكون",
"Blocklist": "القائمة السوداء",
"BlocklistHelpText": "يمنع Radarr من الاستيلاء على هذا الإصدار تلقائيًا مرة أخرى",
"BlocklistRelease": "إصدار القائمة السوداء",
"ThisCannotBeCancelled": "لا يمكن إلغاء هذا بمجرد البدء دون إعادة تشغيل Radarr.",
"UnselectAll": "إلغاء تحديد الكل",
@@ -583,5 +581,14 @@
"ColonReplacement": "استبدال القولون",
"ReplaceWithDash": "استبدل بـ داش",
"ReplaceWithSpaceDash": "استبدل بـ Space Dash",
"ReplaceWithSpaceDashSpace": "استبدل بـ Space Dash Space"
"ReplaceWithSpaceDashSpace": "استبدل بـ Space Dash Space",
"DeleteRemotePathMapping": "تحرير تعيين المسار البعيد",
"BlocklistReleases": "إصدار القائمة السوداء",
"DeleteRemotePathMappingMessageText": "هل أنت متأكد أنك تريد حذف تعيين المسار البعيد هذا؟",
"Negated": "نفي",
"RemoveSelectedItemBlocklistMessageText": "هل أنت متأكد أنك تريد إزالة العناصر المحددة من القائمة السوداء؟",
"RemoveSelectedItemQueueMessageText": "هل تريد بالتأكيد إزالة {0} عنصر {1} من قائمة الانتظار؟",
"Required": "مطلوب",
"DeleteConditionMessageText": "هل أنت متأكد أنك تريد حذف العلامة \"{0}\"؟",
"RemoveSelectedItemsQueueMessageText": "هل تريد بالتأكيد إزالة {0} عنصر {1} من قائمة الانتظار؟"
}

View File

@@ -288,7 +288,6 @@
"RemoveFromQueue": "Премахване от опашката",
"RemoveHelpTextWarning": "Премахването ще премахне изтеглянето и файловете от клиента за изтегляне.",
"RemoveSelected": "Премахнете избраното",
"RemoveSelectedMessageText": "Наистина ли искате да премахнете избраните елементи от черния списък?",
"RemoveTagExistingTag": "Съществуващ маркер",
"RemoveTagRemovingTag": "Премахване на етикет",
"RemovedFromTaskQueue": "Премахнато от опашката на задачите",
@@ -582,5 +581,14 @@
"ColonReplacement": "Подмяна на дебелото черво",
"ReplaceWithDash": "Заменете с Dash",
"ReplaceWithSpaceDash": "Заменете с Space Dash",
"ReplaceWithSpaceDashSpace": "Заменете с Space Dash Space"
"ReplaceWithSpaceDashSpace": "Заменете с Space Dash Space",
"DeleteRemotePathMapping": "Редактиране на отдалечено картографиране на пътя",
"DeleteRemotePathMappingMessageText": "Наистина ли искате да изтриете това отдалечено картографиране на пътя?",
"BlocklistReleases": "Освобождаване на черния списък",
"DeleteConditionMessageText": "Наистина ли искате да изтриете маркера '{0}'?",
"RemoveSelectedItemQueueMessageText": "Наистина ли искате да премахнете {0} елемент {1} от опашката?",
"Required": "Задължително",
"Negated": "Отрицателно",
"RemoveSelectedItemBlocklistMessageText": "Наистина ли искате да премахнете избраните елементи от черния списък?",
"RemoveSelectedItemsQueueMessageText": "Наистина ли искате да премахнете {0} елемент {1} от опашката?"
}

View File

@@ -513,7 +513,6 @@
"APIKey": "Clau API",
"ApiKeyHelpTextWarning": "Cal reiniciar perquè tingui efecte",
"ApplyTagsHelpTexts1": "Com aplicar etiquetes a les pel·lícules seleccionades",
"RemoveSelectedMessageText": "Esteu segur que voleu suprimir els elements seleccionats de la llista de blocs?",
"RescanAfterRefreshHelpTextWarning": "Radarr no detectarà automàticament els canvis als fitxers quan no estigui configurat com a \"Sempre\"",
"ShowUnknownAuthorItems": "Mostra elements de pel·lícula desconeguda",
"Size": " Mida",
@@ -584,7 +583,6 @@
"BookIsDownloading": "La pel·lícula s'està baixant",
"BookIsDownloadingInterp": "La pel·lícula s'està baixant - {0}% {1}",
"Label": "Etiqueta",
"BlocklistHelpText": "Impedeix que Lidarr torni a capturar aquesta versió automàticament",
"ChooseImportMethod": "Trieu el mode d'importació",
"ClickToChangeReleaseGroup": "Feu clic per canviar el grup de llançaments",
"HardlinkCopyFiles": "Enllaç dur/Copia fitxers",

View File

@@ -293,7 +293,6 @@
"RemoveFromQueue": "Odebrat z fronty",
"RemoveHelpTextWarning": "Odebráním odstraníte stažené soubory a soubory z klienta pro stahování.",
"RemoveSelected": "Odstranit vybrané",
"RemoveSelectedMessageText": "Opravdu chcete odebrat vybrané položky z černé listiny?",
"RemoveTagExistingTag": "Stávající značka",
"RemoveTagRemovingTag": "Odebírání značky",
"RemovedFromTaskQueue": "Odebráno z fronty úkolů",
@@ -582,5 +581,14 @@
"ColonReplacement": "Výměna tlustého střeva",
"ReplaceWithDash": "Nahraďte Dash",
"ReplaceWithSpaceDashSpace": "Nahraďte Space Dash Space",
"ReplaceWithSpaceDash": "Nahraďte Space Dash"
"ReplaceWithSpaceDash": "Nahraďte Space Dash",
"DeleteRemotePathMapping": "Upravit vzdálené mapování cesty",
"DeleteRemotePathMappingMessageText": "Opravdu chcete toto vzdálené mapování cesty odstranit?",
"Negated": "Negovaný",
"BlocklistReleases": "Vydání černé listiny",
"DeleteConditionMessageText": "Opravdu chcete smazat značku „{0}“?",
"RemoveSelectedItemBlocklistMessageText": "Opravdu chcete odebrat vybrané položky z černé listiny?",
"RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"Required": "Požadované"
}

View File

@@ -290,7 +290,6 @@
"RemoveFromQueue": "Fjern fra køen",
"RemoveHelpTextWarning": "Fjernelse fjerner download og fil (er) fra download-klienten.",
"RemoveSelected": "Fjern valgte",
"RemoveSelectedMessageText": "Er du sikker på, at du vil fjerne de valgte emner fra sortlisten?",
"RemoveTagExistingTag": "Eksisterende mærke",
"RemoveTagRemovingTag": "Fjerner tag",
"RemovedFromTaskQueue": "Fjernet fra opgavekøen",
@@ -585,5 +584,14 @@
"ColonReplacement": "Udskiftning af tyktarm",
"ReplaceWithDash": "Udskift med Dash",
"ReplaceWithSpaceDash": "Udskift med Space Dash",
"ReplaceWithSpaceDashSpace": "Udskift med Space Dash Space"
"ReplaceWithSpaceDashSpace": "Udskift med Space Dash Space",
"DeleteRemotePathMapping": "Rediger kortlægning af fjernsti",
"DeleteRemotePathMappingMessageText": "Er du sikker på, at du vil slette denne kortlægning af fjernstien?",
"DeleteConditionMessageText": "Er du sikker på, at du vil slette listen '{0}'?",
"Negated": "Negeret",
"RemoveSelectedItemBlocklistMessageText": "Er du sikker på, at du vil fjerne de valgte emner fra sortlisten?",
"BlocklistReleases": "Udgivelse af sortliste",
"RemoveSelectedItemQueueMessageText": "Er du sikker på, at du vil fjerne {0} element {1} fra køen?",
"RemoveSelectedItemsQueueMessageText": "Er du sikker på, at du vil fjerne {0} element {1} fra køen?",
"Required": "Påkrævet"
}

View File

@@ -287,7 +287,6 @@
"RemoveFromQueue": "Aus der Warteschlage entfernen",
"RemoveHelpTextWarning": "Dies wird den Download und alle bereits heruntergeladenen Dateien aus dem Downloader entfernen.",
"RemoveSelected": "Auswahl entfernen",
"RemoveSelectedMessageText": "Sind sie sicher, dass die ausgewählten Einträge aus der Sperrliste entfernt werden sollen?",
"RemoveTagExistingTag": "Vorhandener Tag",
"RemoveTagRemovingTag": "Tag entfernen",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlage entfernt",
@@ -516,7 +515,6 @@
"UnableToLoadBlocklist": "Sperrliste konnte nicht geladen werden",
"ReleaseBranchCheckOfficialBranchMessage": "Zweig {0} ist kein gültiger Radarr-Release-Zweig. Sie erhalten keine Updates",
"Blocklist": "Sperrliste",
"BlocklistHelpText": "Dieses Release nicht automatisch erneut erfassen",
"BlocklistRelease": "Release sperren",
"RescanAfterRefreshHelpText": "Nach dem aktualisieren des Films, den Filmordner neu scannen",
"ShowUnknownAuthorItems": "Unzugeordente Filmeinträge anzeigen",

View File

@@ -290,7 +290,6 @@
"RemoveFromQueue": "Κατάργηση από την ουρά",
"RemoveHelpTextWarning": "Η κατάργηση θα καταργήσει τη λήψη και τα αρχεία από τον πελάτη λήψης.",
"RemoveSelected": "Αφαιρέστε τα επιλεγμένα",
"RemoveSelectedMessageText": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε τα επιλεγμένα στοιχεία από τη λίστα αποκλεισμού;",
"RemoveTagExistingTag": "Υφιστάμενη ετικέτα",
"RemoveTagRemovingTag": "Κατάργηση ετικέτας",
"RemovedFromTaskQueue": "Καταργήθηκε από την ουρά εργασιών",
@@ -590,7 +589,6 @@
"MoveFiles": "Μετακίνηση αρχείων",
"OnApplicationUpdate": "Στην ενημέρωση της εφαρμογής",
"OnApplicationUpdateHelpText": "Στην ενημέρωση της εφαρμογής",
"BlocklistHelpText": "Αποτρέπει το Radarr από το να πάρει ξανά αυτόματα αυτήν την έκδοση",
"LoadingEditionsFailed": "Η φόρτωση των εκδόσεων απέτυχε",
"ManualDownload": "Χειροκίνητη λήψη",
"MetadataConsumers": "Καταναλωτές μεταδεδομένων",

View File

@@ -64,8 +64,9 @@
"BindAddressHelpText": "Valid IP address, localhost or '*' for all interfaces",
"BindAddressHelpTextWarning": "Requires restart to take effect",
"Blocklist": "Blocklist",
"BlocklistHelpText": "Prevents Readarr from automatically grabbing these files again",
"BlocklistRelease": "Blocklist Release",
"BlocklistReleaseHelpText": "Prevents Readarr from automatically grabbing these files again",
"BlocklistReleases": "Blocklist Releases",
"Book": "Book",
"BookAvailableButMissing": "Book Available, but Missing",
"BookEditor": "Book Editor",
@@ -122,6 +123,7 @@
"ClickToChangeReleaseGroup": "Click to change release group",
"ClientPriority": "Client Priority",
"Clone": "Clone",
"CloneCondition": "Clone Condition",
"CloneCustomFormat": "Clone Custom Format",
"CloneIndexer": "Clone Indexer",
"CloneProfile": "Clone Profile",
@@ -188,6 +190,8 @@
"DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?",
"DeleteBookFile": "Delete Book File",
"DeleteBookFileMessageText": "Are you sure you want to delete {0}?",
"DeleteCondition": "Delete Condition",
"DeleteConditionMessageText": "Are you sure you want to delete condition '{0}'?",
"DeleteCustomFormat": "Delete Custom Format",
"DeleteCustomFormatMessageText": "Are you sure you want to delete the custom format '{0}'?",
"DeleteDelayProfile": "Delete Delay Profile",
@@ -213,6 +217,8 @@
"DeleteQualityProfileMessageText": "Are you sure you want to delete the quality profile '{0}'?",
"DeleteReleaseProfile": "Delete Release Profile",
"DeleteReleaseProfileMessageText": "Are you sure you want to delete this Release Profile?",
"DeleteRemotePathMapping": "Delete Remote Path Mapping",
"DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?",
"DeleteRootFolder": "Delete Root Folder",
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{0}'?",
"DeleteSelectedBookFiles": "Delete Selected Book Files",
@@ -505,6 +511,7 @@
"NameStyle": "Author Name Style",
"NamingSettings": "Naming Settings",
"NegateHelpText": "If checked, the custom format will not apply if this {0} condition matches.",
"Negated": "Negated",
"New": "New",
"NewBooks": "New Books",
"NoBackupsAreAvailable": "No backups are available",
@@ -654,7 +661,11 @@
"RemoveFromQueue": "Remove from queue",
"RemoveHelpTextWarning": "Removing will remove the download and the file(s) from the download client.",
"RemoveSelected": "Remove Selected",
"RemoveSelectedMessageText": "Are you sure you want to remove the selected items from the blocklist?",
"RemoveSelectedItem": "Remove Selected Item",
"RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?",
"RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?",
"RemoveSelectedItems": "Remove Selected Items",
"RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {0} items from the queue?",
"RemoveTagExistingTag": "Existing tag",
"RemoveTagRemovingTag": "Removing tag",
"RemovedFromTaskQueue": "Removed from task queue",
@@ -667,6 +678,7 @@
"ReplaceWithDash": "Replace with Dash",
"ReplaceWithSpaceDash": "Replace with Space Dash",
"ReplaceWithSpaceDashSpace": "Replace with Space Dash Space",
"Required": "Required",
"RequiredHelpText": "This {0} condition must match for the custom format to apply. Otherwise a single {0} match is sufficient.",
"RequiredPlaceHolder": "Add new restriction",
"RescanAfterRefreshHelpText": "Rescan the author folder after refreshing the author",
@@ -677,6 +689,8 @@
"ResetAPIKeyMessageText": "Are you sure you want to reset your API Key?",
"ResetDefinitionTitlesHelpText": "Reset definition titles as well as values",
"ResetDefinitions": "Reset Definitions",
"ResetQualityDefinitions": "Reset Quality Definitions",
"ResetQualityDefinitionsMessageText": "Are you sure you want to reset quality definitions?",
"ResetTitles": "Reset Titles",
"Restart": "Restart",
"RestartNow": "Restart Now",

View File

@@ -294,7 +294,6 @@
"RemoveFromQueue": "Eliminar de la cola",
"RemoveHelpTextWarning": "Eliminar borrará la descarga y el/los fichero(s) del gestor de descargas.",
"RemoveSelected": "Borrar Seleccionados",
"RemoveSelectedMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?",
"RemoveTagExistingTag": "Etiqueta existente",
"RemoveTagRemovingTag": "Eliminando etiqueta",
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
@@ -468,7 +467,6 @@
"Level": "Nivel",
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
"Blocklist": "Bloqueadas",
"BlocklistHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
"BlocklistRelease": "Bloquear este Estreno",
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
"SelectAll": "Seleccionar Todas",
@@ -642,5 +640,17 @@
"ColonReplacement": "Reemplazo dos puntos",
"ReplaceWithDash": "Reemplazar con Dash",
"ReplaceWithSpaceDash": "Reemplazar con Space Dash",
"ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space"
"ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space",
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
"BlocklistReleases": "Bloquear este Estreno",
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
"Negated": "Negado",
"RemoveSelectedItem": "Eliminar el elemento seleccionado",
"RemoveSelectedItemBlocklistMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?",
"RemoveSelectedItemQueueMessageText": "¿Está seguro de que desea eliminar el {0} elemento {1} de la cola?",
"RemoveSelectedItems": "Eliminar los elementos seleccionados",
"RemoveSelectedItemsQueueMessageText": "¿Estás seguro de que quieres eliminar {0} elementos de la cola?",
"Required": "Necesario",
"ResetQualityDefinitions": "Restablecer definiciones de calidad",
"ResetQualityDefinitionsMessageText": "¿Está seguro de que desea restablecer las definiciones de calidad?"
}

View File

@@ -289,7 +289,6 @@
"RemoveFromQueue": "Poista jonosta",
"RemoveHelpTextWarning": "Poistaminen poistaa latauksen ja tiedostot latausohjelmasta.",
"RemoveSelected": "Poista valitut",
"RemoveSelectedMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?",
"RemoveTagExistingTag": "Olemassa oleva tunniste",
"RemoveTagRemovingTag": "Tunniste poistetaan",
"RemovedFromTaskQueue": "Poistettu tehtäväjonosta",
@@ -478,7 +477,6 @@
"UrlBaseHelpText": "Lisää Calibren URL-osoitteeseen etuliitteen, (esim. 'http://[host]:[port]/[urlBase]').",
"Author": "Kirjailija",
"BackupIntervalHelpText": "Readarrin tietokannan ja asetusten automaattisen varmuuskopioinnin suoritusaikaväli.",
"BlocklistHelpText": "Estää julkaisun automaattisen uudelleensieppauksen.",
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.",
"WriteAudioTagsScrubHelp": "Poista olemassa olevat tagit tiedostoista säilyttäen vain Readarrin lisäämät tagit.",
"DefaultTagsHelpText": "Kansiosta löydetyille kirjailijoille oletusarvoisesti määritettävät tunnisteet.",
@@ -820,5 +818,17 @@
"ColonReplacement": "Kaksoispisteen käsittely",
"ReplaceWithDash": "Korvaus: väliviiva",
"ReplaceWithSpaceDash": "Korvaus: välilyönti-väliviiva",
"ReplaceWithSpaceDashSpace": "Korvus: välilyönti-väliviiva-välilyönti"
"ReplaceWithSpaceDashSpace": "Korvus: välilyönti-väliviiva-välilyönti",
"DeleteRemotePathMapping": "Muokkaa etäreittien kartoitusta",
"BlocklistReleases": "Lisää julkaisut estolistalle",
"DeleteConditionMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?",
"Negated": "Mitätöity",
"RemoveSelectedItem": "Poista valittu kohde",
"RemoveSelectedItemBlocklistMessageText": "Haluatko varmasti poistaa valitut kohteet estolistalta?",
"RemoveSelectedItemQueueMessageText": "Haluatko varmasti poistaa jonosta 1 kohteen?",
"RemoveSelectedItems": "Poista valitut kohteet",
"RemoveSelectedItemsQueueMessageText": "Haluatko varmasti poistaa jonosta {0} kohdetta?",
"Required": "Vaaditaan",
"ResetQualityDefinitions": "Palauta laatumääritykset",
"ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?"
}

View File

@@ -294,7 +294,6 @@
"RemoveFromQueue": "Supprimer de la file d'attente",
"RemoveHelpTextWarning": "La suppression supprimera le téléchargement et le(s) fichier(s) du client de téléchargement.",
"RemoveSelected": "Supprimer la sélection",
"RemoveSelectedMessageText": "Êtes-vous sûr de vouloir supprimer les éléments sélectionnés de la liste noire ?",
"RemoveTagExistingTag": "Tag existant",
"RemoveTagRemovingTag": "Suppression du tag",
"RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches",
@@ -478,7 +477,6 @@
"ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version Readarr valide, vous ne recevrez pas de mises à jour",
"Time": "Heure",
"Blocklist": "Liste noire",
"BlocklistHelpText": "Empêche Readarr de récupérer automatiquement ces fichiers de nouveau",
"BlocklistRelease": "Mettre cette release sur la liste noire",
"RescanAfterRefreshHelpText": "Réanalyser le dossier de l'auteur après avoir actualisé l'auteur",
"ShowUnknownAuthorItems": "Afficher les éléments avec auteur inconnu",
@@ -726,5 +724,18 @@
"ColonReplacement": "Remplacement pour le 'deux-points'",
"ReplaceWithDash": "Remplacer par Dash",
"ReplaceWithSpaceDash": "Remplacer par Space Dash",
"ReplaceWithSpaceDashSpace": "Remplacer par Space Dash Space"
"ReplaceWithSpaceDashSpace": "Remplacer par Space Dash Space",
"DeleteRemotePathMapping": "Éditer le chemin distant",
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir effacer ce chemin ?",
"BlocklistReleases": "Mettre cette release sur la liste noire",
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
"Negated": "Inversé",
"RemoveSelectedItem": "Supprimer l'élément sélectionné",
"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 ?",
"RemoveSelectedItems": "Supprimer les éléments sélectionnés",
"RemoveSelectedItemsQueueMessageText": "Êtes-vous sûr de vouloir supprimer {0} objet(s) de la file d'attente ?",
"Required": "Obligatoire",
"ResetQualityDefinitions": "Réinitialiser les définitions de qualité",
"ResetQualityDefinitionsMessageText": "Êtes-vous sûr de vouloir réinitialiser les définitions de qualité ?"
}

View File

@@ -274,7 +274,6 @@
"RemoveFromQueue": "הסר מהתור",
"RemoveHelpTextWarning": "הסרה תסיר את ההורדה ואת הקבצים מלקוח ההורדה.",
"RemoveSelected": "הסר פריטים שנבחרו",
"RemoveSelectedMessageText": "האם אתה בטוח שברצונך להסיר את הפריטים שנבחרו מהרשימה השחורה?",
"RemoveTagExistingTag": "תג קיים",
"RemoveTagRemovingTag": "הסרת התג",
"RemovedFromTaskQueue": "הוסר מתור המשימות",
@@ -554,7 +553,6 @@
"InstanceNameHelpText": "שם מופע בטאב ובשביל שם אפליקציית סיסלוג",
"RemotePathMappingCheckBadDockerPath": "אתה משתמש בדוקר; קליינט ההורדות {0} שם הורדות ב-{1} אבל הנתיב לא תקין {2}. בחן מחדש את ניתוב התיקיות והגדרות קליינט ההורדות.",
"AddList": "הוסף רשימה",
"BlocklistHelpText": "מנע מראדרר להוסיף את ההוצאה הזאת שוב",
"RemotePathMappingCheckDownloadPermissions": "ראדארר יכול לראות אבל לא לגשת לסרטים שירדו {0}. ככל הנראה בעיית הרשאות.",
"RemotePathMappingCheckFileRemoved": "הקובץ {0} הוסר תוך כדי התהליך.",
"RemotePathMappingCheckFilesBadDockerPath": "אתה משתמש בדוקר; קליינט ההורדות {0} שם הורדות ב-{1} אבל הנתיב לא תקין {2}. בחן מחדש את ניתוב התיקיות והגדרות קליינט ההורדות.",
@@ -604,5 +602,14 @@
"ColonReplacement": "החלפת המעי הגס",
"ReplaceWithDash": "החלף ב- Dash",
"ReplaceWithSpaceDash": "החלף במקף החלל",
"ReplaceWithSpaceDashSpace": "החלף במרחב מקף החלל"
"ReplaceWithSpaceDashSpace": "החלף במרחב מקף החלל",
"DeleteRemotePathMapping": "ערוך מיפוי נתיבים מרחוק",
"DeleteRemotePathMappingMessageText": "האם אתה בטוח שברצונך למחוק את מיפוי הנתיבים המרוחק הזה?",
"BlocklistReleases": "שחרור הרשימה השחורה",
"DeleteConditionMessageText": "האם אתה בטוח שברצונך למחוק את התג '{0}'?",
"Negated": "שלילי",
"Required": "נדרש",
"RemoveSelectedItemBlocklistMessageText": "האם אתה בטוח שברצונך להסיר את הפריטים שנבחרו מהרשימה השחורה?",
"RemoveSelectedItemQueueMessageText": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?",
"RemoveSelectedItemsQueueMessageText": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?"
}

View File

@@ -281,7 +281,6 @@
"RemoveFromQueue": "कतार से निकालें",
"RemoveHelpTextWarning": "हटाने से डाउनलोड और फ़ाइल को डाउनलोड क्लाइंट से निकाल दिया जाएगा।",
"RemoveSelected": "चुना हुआ हटाओ",
"RemoveSelectedMessageText": "क्या आप वाकई चयनित आइटम को ब्लैकलिस्ट से हटाना चाहते हैं?",
"RemoveTagExistingTag": "मौजूदा टैग",
"RemoveTagRemovingTag": "टैग हटाना",
"RemovedFromTaskQueue": "कार्य कतार से हटा दिया गया",
@@ -582,5 +581,13 @@
"ColonReplacement": "कोलन रिप्लेसमेंट",
"ReplaceWithDash": "डैश के साथ बदलें",
"ReplaceWithSpaceDash": "स्पेस डैश के साथ बदलें",
"ReplaceWithSpaceDashSpace": "स्पेस डैश स्पेस के साथ बदलें"
"ReplaceWithSpaceDashSpace": "स्पेस डैश स्पेस के साथ बदलें",
"DeleteRemotePathMapping": "दूरस्थ पथ मानचित्रण संपादित करें",
"BlocklistReleases": "ब्लैकलिस्ट रिलीज़",
"Negated": "नकार दिया गया",
"Required": "अपेक्षित",
"DeleteConditionMessageText": "क्या आप वाकई '{0}' सूची को हटाना चाहते हैं?",
"RemoveSelectedItemBlocklistMessageText": "क्या आप वाकई चयनित आइटम को ब्लैकलिस्ट से हटाना चाहते हैं?",
"RemoveSelectedItemQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
"RemoveSelectedItemsQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?"
}

View File

@@ -130,7 +130,6 @@
"AuthorClickToChangeBook": "Klikni za promjenu filma",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "U Radarru se automatski isključuje nadzor za filmove koji su izbrisani sa diska",
"BackupFolderHelpText": "Relativne putanje će biti unutar Radarrovog AppData direktorija",
"BlocklistHelpText": "Spriječi Radarr da automatski dohvaća ovu verziju ponovno",
"BypassIfHighestQuality": "Zaobiđi ako je Najviši Kvalitet",
"CancelMessageText": "Jeste li sigurni da želite otkazati ovaj zadatak na čekanju?",
"ChmodFolderHelpTextWarning": "Ovo jedino radi ako je korisnik koji je pokrenuo Radarr vlasnik datoteke. Bolje je osigurati da klijent za preuzimanje postavi dozvolu ispravno.",
@@ -141,7 +140,6 @@
"DeleteNotificationMessageText": "Jeste li sigurni da želite obrisati oznaku formata {0}?",
"DeleteQualityProfileMessageText": "Jeste li sigurni da želite obrisati ovaj profil odgode?",
"DeleteRootFolderMessageText": "Jeste li sigurni da želite obrisati oznaku formata {0}?",
"RemoveSelectedMessageText": "Jeste li sigurni da želite izbrisati odabrane stavke iz blok liste?",
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Grana korištena za ažuriranje Radarra",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Grana korištena od strane vanjskog mehanizma za ažuriranje",
"ColonReplacement": "Zamjena Zareza"

View File

@@ -275,7 +275,6 @@
"RemoveFromQueue": "Eltávolítás a sorból",
"RemoveHelpTextWarning": "Az eltávolítás eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.",
"RemoveSelected": "Kiválaszottak törlése",
"RemoveSelectedMessageText": "Biztosan eltávolítja a kijelölt elemeket a feketelistáról?",
"RemoveTagExistingTag": "Meglévő Címke",
"RemoveTagRemovingTag": "Címke eltávolítása",
"RemovedFromTaskQueue": "Eltávolítva a feladatsorról",
@@ -696,7 +695,6 @@
"BlocklistRelease": "Feketelistás Kiadás",
"NoHistoryBlocklist": "Nincs blokkolási előzménylista",
"Blocklist": "Feketelista",
"BlocklistHelpText": "Megakadályozza, hogy a Readarr automatikusan letöltse újra",
"RemoveFromBlocklist": "Eltávolítás a feketelistáról",
"UnableToLoadBlocklist": "Nem sikerült betölteni a feketelistát",
"Component": "Komponens",

View File

@@ -31,5 +31,7 @@
"Connections": "Koleksi",
"ExportCustomFormat": "Tambahkan Format Khusus",
"AuthorClickToChangeBook": "Klik untuk mengubah film",
"Automatic": "Otomatis"
"Automatic": "Otomatis",
"Close": "Tutup",
"Delete": "Hapus"
}

View File

@@ -295,7 +295,6 @@
"RemoveFromQueue": "Fjarlægðu úr biðröð",
"RemoveHelpTextWarning": "Fjarlæging fjarlægir niðurhalið og skrána / skrána úr niðurhalsviðskiptavininum.",
"RemoveSelected": "Fjarlægja valið",
"RemoveSelectedMessageText": "Ertu viss um að þú viljir fjarlægja valda hluti af svörtum lista?",
"RemoveTagExistingTag": "Núverandi merki",
"RemoveTagRemovingTag": "Fjarlægir merkið",
"RemovedFromTaskQueue": "Fjarlægð úr verkröð",
@@ -582,5 +581,14 @@
"ColonReplacement": "Skipt um ristil",
"ReplaceWithDash": "Skiptu um með Dash",
"ReplaceWithSpaceDash": "Skiptu um með Space Dash",
"ReplaceWithSpaceDashSpace": "Skiptu um með Space Dash Space"
"ReplaceWithSpaceDashSpace": "Skiptu um með Space Dash Space",
"DeleteRemotePathMapping": "Breyta kortlagningu fjarstígs",
"DeleteRemotePathMappingMessageText": "Ertu viss um að þú viljir eyða þessari ytri slóðakortun?",
"BlocklistReleases": "Útgáfa svartalista",
"DeleteConditionMessageText": "Ertu viss um að þú viljir eyða merkinu '{0}'?",
"Negated": "Negated",
"RemoveSelectedItemBlocklistMessageText": "Ertu viss um að þú viljir fjarlægja valda hluti af svörtum lista?",
"RemoveSelectedItemQueueMessageText": "Ertu viss um að þú viljir fjarlægja {0} hlut {1} úr biðröðinni?",
"RemoveSelectedItemsQueueMessageText": "Ertu viss um að þú viljir fjarlægja {0} hlut {1} úr biðröðinni?",
"Required": "Nauðsynlegt"
}

View File

@@ -298,7 +298,6 @@
"RemoveFromQueue": "Rimuovi dalla coda",
"RemoveHelpTextWarning": "La rimozione eliminerà il download e i file dal client di download.",
"RemoveSelected": "Rimuovi Selezionato",
"RemoveSelectedMessageText": "Sei sicuro di voler rimuovere gli elementi selezionati della blacklist?",
"RemoveTagExistingTag": "Tag esistente",
"RemoveTagRemovingTag": "Sto eliminando il tag",
"RemovedFromTaskQueue": "Rimosso dalla coda lavori",
@@ -471,7 +470,6 @@
"AddMissing": "Aggiungi mancanti",
"AddNewItem": "Aggiungi Nuovo Elemento",
"Blocklist": "Lista dei Blocchi",
"BlocklistHelpText": "Impedisci a Readarr di re-acquisire automaticamente questi file",
"BlocklistRelease": "Release in Lista dei Blocchi",
"AllowFingerprinting": "Consenti il \"Fingerprinting\"",
"AllExpandedCollapseAll": "Collassa tutto",

View File

@@ -288,7 +288,6 @@
"RemoveHelpTextWarning": "削除すると、ダウンロードとファイルがダウンロードクライアントから削除されます。",
"RemoveSelected": "削除選択",
"UpdateMechanismHelpText": "Radarrの組み込みアップデーターまたはスクリプトを使用する",
"RemoveSelectedMessageText": "選択したアイテムをブラックリストから削除してもよろしいですか?",
"RemoveTagExistingTag": "既存のタグ",
"RemoveTagRemovingTag": "タグの削除",
"RemovedFromTaskQueue": "タスクキューから削除されました",
@@ -582,5 +581,13 @@
"ColonReplacement": "結腸の置換",
"ReplaceWithDash": "ダッシュに置き換えます",
"ReplaceWithSpaceDash": "スペースダッシュに置き換えます",
"ReplaceWithSpaceDashSpace": "スペースダッシュスペースに置き換えます"
"ReplaceWithSpaceDashSpace": "スペースダッシュスペースに置き換えます",
"DeleteRemotePathMapping": "リモートパスマッピングの編集",
"Negated": "否定",
"RemoveSelectedItemBlocklistMessageText": "選択したアイテムをブラックリストから削除してもよろしいですか?",
"RemoveSelectedItemQueueMessageText": "キューから{0}アイテム{1}を削除してもよろしいですか?",
"RemoveSelectedItemsQueueMessageText": "キューから{0}アイテム{1}を削除してもよろしいですか?",
"Required": "必須",
"BlocklistReleases": "ブラックリストリリース",
"DeleteConditionMessageText": "リスト「{0}」を削除してもよろしいですか?"
}

View File

@@ -310,7 +310,6 @@
"RemoveFromQueue": "대기열에서 제거",
"RemoveHelpTextWarning": "제거하면 다운로드 클라이언트에서 다운로드 및 파일이 제거됩니다.",
"RemoveSelected": "선택된 것을 지워 라",
"RemoveSelectedMessageText": "블랙리스트에서 선택한 항목을 제거 하시겠습니까?",
"RemoveTagExistingTag": "기존 태그",
"RemoveTagRemovingTag": "태그 제거",
"RemovedFromTaskQueue": "작업 대기열에서 제거됨",
@@ -577,5 +576,11 @@
"UpgradesAllowed": "허용되는 업그레이드",
"HideAdvanced": "고급 숨기기",
"HiddenClickToShow": "숨김, 클릭하여 표시",
"ShowAdvanced": "고급보기"
"ShowAdvanced": "고급보기",
"DeleteRemotePathMapping": "원격 경로 매핑 편집",
"BlocklistReleases": "블랙리스트 릴리스",
"DeleteConditionMessageText": "'{0}' 태그를 삭제하시겠습니까?",
"RemoveSelectedItemQueueMessageText": "대기열에서 {0} 항목 {1}을 제거하시겠습니까?",
"RemoveSelectedItemBlocklistMessageText": "블랙리스트에서 선택한 항목을 제거 하시겠습니까?",
"RemoveSelectedItemsQueueMessageText": "대기열에서 {0} 항목 {1}을 제거하시겠습니까?"
}

View File

@@ -46,7 +46,6 @@
"DeleteImportListExclusionMessageText": "Er du sikker på at du vil slette denne ekskluderingen av importlister?",
"DeleteReleaseProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?",
"DeleteTagMessageText": "Er du sikker på at du vil slette formattaggen {0}?",
"RemoveSelectedMessageText": "Er du sikker på at du vil fjerne de valgte elementene fra svartelisten?",
"ResetAPIKeyMessageText": "Er du sikker på at du vil tilbakestille API -nøkkelen din?",
"ShowQualityProfile": "Legg til kvalitetsprofil",
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Gren som skal brukes til å oppdatere Radarr",
@@ -61,7 +60,6 @@
"All": "Alle",
"DeleteBackupMessageText": "Er du sikker på at du vil slette formattaggen {0}?",
"Blocklist": "Svarteliste",
"BlocklistHelpText": "Hindrer Radarr i å automatisk gripe denne utgivelsen igjen",
"BlocklistRelease": "Blacklist -utgivelse",
"AppDataLocationHealthCheckMessage": "Oppdatering vil ikke være mulig for å forhindre sletting av AppData på oppdateringen",
"CopyUsingHardlinksHelpText": "Bruk harde lenker ved forsøk på å kopiere filer fra torrents som fortsatt blir delt",
@@ -148,5 +146,10 @@
"CustomFormats": "Egendefinert format",
"BypassIfHighestQuality": "Omgå hvis høyeste kvalitet",
"Formats": "Format",
"ColonReplacement": "Kolon erstatntning"
"ColonReplacement": "Kolon erstatntning",
"20MinutesTwenty": "20 Minutter: {0}",
"AddMissing": "Legg til manglende",
"AddNewItem": "Legg til nytt item",
"45MinutesFourtyFive": "45 Minutter: {0}",
"60MinutesSixty": "60 Minutter: {0}"
}

View File

@@ -297,7 +297,6 @@
"RemoveFromQueue": "Verwijder uit wachtrij",
"RemoveHelpTextWarning": "Het verwijderen zal zowel de download als de bestanden verwijderen bij de downloader.",
"RemoveSelected": "Selectie Verwijderen",
"RemoveSelectedMessageText": "Ben je zeker dat je de geselecteerde items wil verwijderen van de uitzonderingslijst?",
"RemoveTagExistingTag": "Bestaande tag",
"RemoveTagRemovingTag": "Tag verwijderen",
"RemovedFromTaskQueue": "Verwijderd uit taken wachtrij",
@@ -486,7 +485,6 @@
"Time": "Tijd",
"Label": "Label",
"Wanted": "Gezocht",
"BlocklistHelpText": "Voorkom dat Radarr deze release nogmaals automatisch ophaalt",
"AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen",
"AddedAuthorSettings": "Auteur instellingen toegevoegd",
"AddMissing": "Voeg ontbrekende toe",

View File

@@ -299,7 +299,6 @@
"RemoveFromQueue": "Usuń z kolejki",
"RemoveHelpTextWarning": "Usunięcie spowoduje usunięcie pobierania i plików z klienta pobierania.",
"RemoveSelected": "Usuń zaznaczone",
"RemoveSelectedMessageText": "Czy na pewno chcesz usunąć wybrane elementy z czarnej listy?",
"RenameBooksHelpText": "Radarr użyje istniejącej nazwy pliku, jeśli zmiana nazwy jest wyłączona",
"Reorder": "Zmień kolejność",
"ReplaceIllegalCharacters": "Zastąp niedozwolone znaki",
@@ -568,7 +567,6 @@
"RestartRequiredHelpTextWarning": "Wymaga ponownego uruchomienia, aby odniosło skutek",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent podawany przez aplikację wywołującą API",
"AddList": "Dodaj listę",
"BlocklistHelpText": "Zapobiega ponownemu pobraniu tej wersji przez Radarr",
"RemotePathMappingCheckDownloadPermissions": "Radarr widzi film {0}, lecz nie ma do niego dostępu. Najprawdopodobniej to wynik błędu w uprawnieniach dostępu.",
"RemotePathMappingCheckFilesGenericPermissions": "Klient pobierania {0} zgłosił pliki w {1}, lecz Radarr nie widzi tego folderu. Być może musisz zmienić uprawnienia dostępu do tego folderu.",
"RemotePathMappingCheckFolderPermissions": "Radarr widzi folder {0}, lecz nie ma do niego dostępu. Prawdopodobnie to wynik błędu uprawnień dostępu.",
@@ -619,5 +617,16 @@
"ColonReplacement": "Wymiana okrężnicy",
"ReplaceWithDash": "Zastąp Dash",
"ReplaceWithSpaceDash": "Zastąp spacją Dash",
"ReplaceWithSpaceDashSpace": "Zastąp spacją Dash Space"
"ReplaceWithSpaceDashSpace": "Zastąp spacją Dash Space",
"DeleteRemotePathMapping": "Edytuj zdalne mapowanie ścieżki",
"DeleteRemotePathMappingMessageText": "Czy na pewno chcesz usunąć to mapowanie zdalnej ścieżki?",
"BlocklistReleases": "Wydanie czarnej listy",
"DeleteConditionMessageText": "Czy na pewno chcesz usunąć tag „{0}”?",
"Negated": "Zanegowane",
"RemoveSelectedItem": "Usuń wybrane",
"RemoveSelectedItemBlocklistMessageText": "Czy na pewno chcesz usunąć wybrane elementy z czarnej listy?",
"RemoveSelectedItemQueueMessageText": "Czy na pewno chcesz usunąć {0} element {1} z kolejki?",
"RemoveSelectedItems": "Usuń wybrane",
"RemoveSelectedItemsQueueMessageText": "Czy na pewno chcesz usunąć elementy ({0}) z kolejki?",
"Required": "wymagany"
}

View File

@@ -106,7 +106,6 @@
"RemoveFromQueue": "Remover da fila",
"RemoveHelpTextWarning": "Remover eliminará a transferência e o(s) ficheiro(s) do cliente de transferências.",
"RemoveSelected": "Remover selecionado(s)",
"RemoveSelectedMessageText": "Tem a certeza que quer remover os itens selecionados da lista de bloqueio?",
"RemoveTagExistingTag": "Etiqueta existente",
"RemoveTagRemovingTag": "Eliminando etiqueta",
"RemovedFromTaskQueue": "Eliminado da fila de tarefas",
@@ -693,7 +692,6 @@
"RemoveFromBlocklist": "Remover da lista de bloqueio",
"Wanted": "Desejado",
"Blocklist": "Lista de bloqueio",
"BlocklistHelpText": "Impede o Readarr de capturar automaticamente estes ficheiros novamente",
"BlocklistRelease": "Bloquear versão",
"IndexerJackettAll": "Indexadores que usam o ponto de extremidade não suportado do Jackett 'all (tudo)' : {0}",
"Duration": "Duração",

View File

@@ -296,11 +296,10 @@
"RemoveCompletedDownloadsHelpText": "Remover downloads importados do histórico do cliente de download",
"RemoveFailedDownloadsHelpText": "Remover downloads com falha do histórico do cliente de download",
"RemoveFilter": "Remover filtro",
"RemoveFromDownloadClient": "Remover do cliente de download",
"RemoveFromDownloadClient": "Remover Do Cliente de Download",
"RemoveFromQueue": "Remover da fila",
"RemoveHelpTextWarning": "Isso removerá o download e o(s) arquivo(s) do cliente de download.",
"RemoveSelected": "Remover selecionado(s)",
"RemoveSelectedMessageText": "Tem certeza de que deseja remover os itens selecionados da lista de bloqueio?",
"RemoveTagExistingTag": "Tag existente",
"RemoveTagRemovingTag": "Removendo tag",
"RemovedFromTaskQueue": "Removido da fila de tarefas",
@@ -694,9 +693,8 @@
"SeriesTotal": "Séries ({0})",
"TooManyBooks": "Livros ausentes ou muitos? Modifique ou crie um novo",
"BlocklistRelease": "Lista de Bloqueio de Lançamentos",
"NoHistoryBlocklist": "Sem histórico na lista de bloqueio",
"NoHistoryBlocklist": "Nenhum histórico na lista de bloqueio",
"Blocklist": "Lista de bloqueio",
"BlocklistHelpText": "Previne Readarr de automaticamente baixar esses arquivos novamente",
"RemoveFromBlocklist": "Remover da lista de bloqueio",
"UnableToLoadBlocklist": "Incapaz de carregar a lista de bloqueio",
"ReleaseBranchCheckOfficialBranchMessage": "Ramo {0} não é um ramo válido de lançamentos do Readarr, você não irá receber atualizações",
@@ -886,7 +884,7 @@
"ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração",
"DeleteFormat": "Excluir Formato",
"DataFutureBooks": "Monitorar livros que ainda não foram lançados",
"DeleteFormatMessageText": "Tem certeza de que deseja excluir a etiqueta de formato {0}?",
"DeleteFormatMessageText": "Tem certeza de que deseja excluir a etiqueta de formato {0} ?",
"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.",
"MinFormatScoreHelpText": "Pontuação mínima de formato personalizado permitida para download",
@@ -913,7 +911,7 @@
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas deste indexador",
"ListRefreshInterval": "Intervalo de atualização da lista",
"ListWillRefreshEveryInterp": "A lista será atualizada a cada {0}",
"ResetDefinitionTitlesHelpText": "Redefinir títulos de definição, bem como valores",
"ResetDefinitionTitlesHelpText": "Redefinir títulos da configuração, bem como valores",
"ResetDefinitions": "Redefinir Definições",
"ResetTitles": "Redefinir Títulos",
"UnableToLoadCustomFormats": "Não foi possível carregar formatos personalizados",
@@ -926,5 +924,21 @@
"ReplaceWithDash": "Substituir por traço",
"ReplaceWithSpaceDash": "Substituir com Espaço e Traço",
"SmartReplace": "Substituição Inteligente",
"ReplaceWithSpaceDashSpace": "Substituir com Espaço e Traço e Espaço"
"ReplaceWithSpaceDashSpace": "Substituir com Espaço e Traço e Espaço",
"DeleteRemotePathMapping": "Excluir Mapeamento de Caminho Remoto",
"BlocklistReleases": "Lista de Bloqueio de Lançamentos",
"CloneCondition": "Condição de Clone",
"DeleteConditionMessageText": "Tem certeza de que deseja excluir a condição '{0}'?",
"DeleteRemotePathMappingMessageText": "Tem certeza de que deseja excluir este mapeamento de caminho remoto?",
"DeleteCondition": "Excluir Condição",
"Negated": "Negado",
"RemoveSelectedItem": "Remover Item Selecionado",
"RemoveSelectedItemBlocklistMessageText": "Tem certeza de que deseja remover os itens selecionados da lista de bloqueio?",
"RemoveSelectedItems": "Remover Itens Selecionados",
"RemoveSelectedItemQueueMessageText": "Tem certeza de que deseja remover 1 item da fila?",
"RemoveSelectedItemsQueueMessageText": "Tem certeza de que deseja remover {0} itens da fila?",
"Required": "Requerido",
"ResetQualityDefinitions": "Redefinir Configurações de Qualidade",
"ResetQualityDefinitionsMessageText": "Tem certeza de que deseja redefinir as configurações de qualidade?",
"BlocklistReleaseHelpText": "Evita que o Readarr pegue automaticamente esses arquivos novamente"
}

View File

@@ -293,7 +293,6 @@
"RemoveFromQueue": "Eliminați din coadă",
"RemoveHelpTextWarning": "Eliminarea va elimina descărcarea și fișierele din clientul de descărcare.",
"RemoveSelected": "Șterge selecția",
"RemoveSelectedMessageText": "Sigur doriți să eliminați elementele selectate din lista neagră?",
"RemoveTagExistingTag": "Etichetă existentă",
"RemoveTagRemovingTag": "Se elimină eticheta",
"RemovedFromTaskQueue": "Eliminat din coada de activități",
@@ -583,5 +582,13 @@
"ReplaceWithDash": "Înlocuiți cu Dash",
"ReplaceWithSpaceDash": "Înlocuiți cu Space Dash",
"ColonReplacement": "Înlocuirea colonului",
"ReplaceWithSpaceDashSpace": "Înlocuiți cu Space Dash Space"
"ReplaceWithSpaceDashSpace": "Înlocuiți cu Space Dash Space",
"BlocklistReleases": "Lansare pe lista neagră",
"DeleteConditionMessageText": "Sigur doriți să ștergeți eticheta „{0}”?",
"DeleteRemotePathMapping": "Editați maparea căilor la distanță",
"Negated": "Negat",
"Required": "Necesar",
"RemoveSelectedItemBlocklistMessageText": "Sigur doriți să eliminați elementele selectate din lista neagră?",
"RemoveSelectedItemQueueMessageText": "Sigur doriți să eliminați {0} elementul {1} din coadă?",
"RemoveSelectedItemsQueueMessageText": "Sigur doriți să eliminați {0} elementul {1} din coadă?"
}

View File

@@ -298,7 +298,6 @@
"RemoveFromQueue": "Удалить из очереди",
"RemoveHelpTextWarning": "Удаление приведет к удалению загрузки и файла(ов) из клиента загрузки.",
"RemoveSelected": "Удалить выбранное",
"RemoveSelectedMessageText": "Удалить выбранные элементы из черного списка?",
"RemoveTagExistingTag": "Существующий тэг",
"RemoveTagRemovingTag": "Удаление тега",
"RemovedFromTaskQueue": "Удалено из очереди задач",
@@ -474,7 +473,6 @@
"UnableToLoadBlocklist": "Не удалось загрузить черный список",
"Time": "Время",
"Blocklist": "Черный список",
"BlocklistHelpText": "Запрещает Radarr автоматически получать этот релиз повторно",
"BlocklistRelease": "Релиз из черного списка",
"Disabled": "Выключено",
"Duration": "Длительность",

View File

@@ -92,7 +92,6 @@
"Indexers": "Indexery",
"MetadataProfiles": "profil metadát",
"RecyclingBin": "Kôš",
"RemoveSelectedMessageText": "Naozaj si prajete odstrániť označené položky z blocklistu?",
"Search": "Hľadať",
"UI": "UI",
"UpdateMechanismHelpText": "Použiť vstavaný Prowlarr aktualizátor alebo skript",
@@ -129,7 +128,6 @@
"RemotePathMappings": "Vzdialené mapovanie cesty",
"SettingsRemotePathMappingLocalPath": "Miestna cesta",
"Queue": "Fronta",
"BlocklistHelpText": "Zabráni Radarru, aby znova automaticky grabol toto vydanie",
"ClickToChangeReleaseGroup": "Kliknutím zmeníte skupinu vydania",
"ChooseImportMethod": "Zvoliť Import mód",
"CustomFormats": "Vlastný formát",

View File

@@ -301,7 +301,6 @@
"RemoveFromQueue": "Ta bort från kön",
"RemoveHelpTextWarning": "Om du tar bort tas nedladdningen och filen (filerna) bort från nedladdningsklienten.",
"RemoveSelected": "Radera markerade",
"RemoveSelectedMessageText": "Är du säker på att du vill ta bort de markerade objekten från blockeringslistan?",
"RemoveTagExistingTag": "Befintlig tagg",
"RemoveTagRemovingTag": "Ta bort taggen",
"RemovedFromTaskQueue": "Borttagen från uppgiftskön",
@@ -506,7 +505,6 @@
"ContinuingAllBooksDownloaded": "Fortsätter (Alla böcker nedladdade)",
"ContinuingMoreBooksAreExpected": "Fler böcker är väntade",
"NoHistoryBlocklist": "Ingen blocklista-historik",
"BlocklistHelpText": "Förhindra Readarr att automatiskt hämta denna utgåva igen",
"BlocklistRelease": "Svartlista Utgåva",
"DiscNumber": "Disk Nummer",
"LatestBook": "Senaste Bok",

View File

@@ -293,7 +293,6 @@
"RemoveFromQueue": "ลบออกจากคิว",
"RemoveHelpTextWarning": "การลบจะลบการดาวน์โหลดและไฟล์ออกจากไคลเอนต์ดาวน์โหลด",
"RemoveSelected": "ลบรายการที่เลือก",
"RemoveSelectedMessageText": "แน่ใจหรือไม่ว่าต้องการลบรายการที่เลือกออกจากบัญชีดำ?",
"RemoveTagExistingTag": "แท็กที่มีอยู่",
"RemoveTagRemovingTag": "กำลังลบแท็ก",
"RemovedFromTaskQueue": "ลบออกจากคิวงาน",

View File

@@ -293,7 +293,6 @@
"RemoveFromQueue": "Sıradan kaldır",
"RemoveHelpTextWarning": "Kaldırma, indirmeyi ve dosyaları indirme istemcisinden kaldırır.",
"RemoveSelected": "Seçilenleri Kaldır",
"RemoveSelectedMessageText": "Kara listeden seçili öğeleri kaldırmak istediğinizden emin misiniz?",
"RemoveTagExistingTag": "Mevcut etiket",
"RemoveTagRemovingTag": "Etiket kaldırılıyor",
"RemovedFromTaskQueue": "Görev kuyruğundan kaldırıldı",
@@ -473,7 +472,6 @@
"UnableToLoadBlocklist": "Kara liste yüklenemiyor",
"Wanted": "İstenenler",
"Blocklist": "Kara liste",
"BlocklistHelpText": "Radarr'ın bu sürümü otomatik olarak tekrar yakalamasını engeller",
"BlocklistRelease": "Kara Liste Yayını",
"AppDataLocationHealthCheckMessage": "Güncellemede AppData'nın silinmesini önlemek için güncelleme mümkün olmayacak",
"Filters": "Filtre",
@@ -583,5 +581,14 @@
"ColonReplacement": "Kolon Değiştirme",
"ReplaceWithDash": "Dash ile değiştir",
"ReplaceWithSpaceDash": "Space Dash ile değiştirin",
"ReplaceWithSpaceDashSpace": "Space Dash Space ile değiştirin"
"ReplaceWithSpaceDashSpace": "Space Dash Space ile değiştirin",
"DeleteRemotePathMapping": "Uzak Yol Eşlemeyi Düzenle",
"DeleteRemotePathMappingMessageText": "Bu uzak yol eşlemesini silmek istediğinizden emin misiniz?",
"BlocklistReleases": "Kara Liste Yayını",
"DeleteConditionMessageText": "'{0}' etiketini silmek istediğinizden emin misiniz?",
"Negated": "Reddedildi",
"RemoveSelectedItemBlocklistMessageText": "Kara listeden seçili öğeleri kaldırmak istediğinizden emin misiniz?",
"RemoveSelectedItemQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?",
"RemoveSelectedItemsQueueMessageText": "Sıradan {0} öğeyi {1} kaldırmak istediğinizden emin misiniz?",
"Required": "gereklidir"
}

View File

@@ -82,7 +82,6 @@
"CouldntFindAnyResultsForTerm": "Не вдалося знайти жодних результатів для '{0}'",
"CreateEmptyAuthorFolders": "Створіть порожні папки для фільмів",
"IsCutoffCutoff": "Припинення",
"RemoveSelectedMessageText": "Ви впевнені, що хочете видалити вибрані елементи зі списку блокування?",
"ShowQualityProfile": "Додати профіль якості",
"AlternateTitles": "Альтернативна назва",
"AnalyticsEnabledHelpText": "Надсилайте анонімну інформацію про використання та помилки на сервери Radarr. Це включає інформацію про ваш веб-переглядач, які сторінки Radarr WebUI ви використовуєте, звіти про помилки, а також версію ОС і часу виконання. Ми будемо використовувати цю інформацію, щоб визначити пріоритети функцій і виправлення помилок.",
@@ -93,7 +92,6 @@
"AuthorClickToChangeBook": "Натисніть, щоб змінити фільм",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Фільми, видалені з диска, автоматично не відстежуються в Radarr",
"BackupFolderHelpText": "Відносні шляхи будуть у каталозі AppData Radarr",
"BlocklistHelpText": "Забороняє Radarr знову автоматично захопити цей випуск",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Гілка, що використовується зовнішнім механізмом оновлення",
"AddList": "Додати список",
"ShowDateAdded": "Показати дату додавання",

View File

@@ -292,7 +292,6 @@
"RemoveFromQueue": "Xóa khỏi hàng đợi",
"RemoveHelpTextWarning": "Việc xóa sẽ xóa phần tải xuống và (các) tệp khỏi ứng dụng khách tải xuống.",
"RemoveSelected": "Bỏ đã chọn",
"RemoveSelectedMessageText": "Bạn có chắc chắn muốn xóa các mục đã chọn khỏi danh sách đen không?",
"RemoveTagExistingTag": "Thẻ hiện có",
"RemoveTagRemovingTag": "Xóa thẻ",
"RemovedFromTaskQueue": "Đã xóa khỏi hàng đợi tác vụ",

View File

@@ -278,7 +278,6 @@
"RemoveFromQueue": "从队列中移除",
"RemoveHelpTextWarning": "移除操作会从下载客户端中删除任务和已下载文件。",
"RemoveSelected": "移除已选",
"RemoveSelectedMessageText": "您确定要从黑名单中删除选择项吗?",
"RemoveTagExistingTag": "已有标签",
"RemoveTagRemovingTag": "移除标签",
"RemovedFromTaskQueue": "从任务队列中移除",
@@ -486,7 +485,6 @@
"Level": "等级",
"RemoveFromBlocklist": "从黑名单中移除",
"Blocklist": "阻止列表",
"BlocklistHelpText": "防止Radarr再次自动抓取此版本",
"BlocklistRelease": "黑名单版本",
"AllowFingerprinting": "允许指纹识别",
"AllExpandedCollapseAll": "收缩所有",

View File

@@ -189,6 +189,8 @@ namespace Readarr.Api.V1.Queue
return q => q.Book?.ReleaseDate ?? DateTime.MinValue;
case "quality":
return q => q.Quality;
case "size":
return q => q.Size;
case "progress":
// Avoid exploding if a download's size is 0
return q => 100 - (q.Sizeleft / Math.Max(q.Size * 100, 1));

View File

@@ -10926,6 +10926,10 @@
"type": "string",
"nullable": true
},
"helpTextWarning": {
"type": "string",
"nullable": true
},
"helpLink": {
"type": "string",
"nullable": true

View File

@@ -9,6 +9,7 @@ namespace Readarr.Http.ClientSchema
public string Label { get; set; }
public string Unit { get; set; }
public string HelpText { get; set; }
public string HelpTextWarning { get; set; }
public string HelpLink { get; set; }
public object Value { get; set; }
public string Type { get; set; }

View File

@@ -98,6 +98,7 @@ namespace Readarr.Http.ClientSchema
Label = fieldAttribute.Label,
Unit = fieldAttribute.Unit,
HelpText = fieldAttribute.HelpText,
HelpTextWarning = fieldAttribute.HelpTextWarning,
HelpLink = fieldAttribute.HelpLink,
Order = fieldAttribute.Order,
Advanced = fieldAttribute.Advanced,