mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-20 16:44:14 -04:00
Compare commits
22 Commits
v0.1.8.188
...
v0.2.0.190
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
749684e24a | ||
|
|
3a0ca45aa9 | ||
|
|
595efd498e | ||
|
|
dea1060d61 | ||
|
|
f6049b8bf2 | ||
|
|
53ced38221 | ||
|
|
3a3cf8511e | ||
|
|
9ec913337d | ||
|
|
9a2120ae92 | ||
|
|
818d3a94d5 | ||
|
|
4e493b74e6 | ||
|
|
c7eaf1e85c | ||
|
|
31fe15c911 | ||
|
|
2c36a6c25f | ||
|
|
6af56f7a15 | ||
|
|
6e13191c25 | ||
|
|
921ddfc962 | ||
|
|
22f977401a | ||
|
|
113d9a07ef | ||
|
|
0560d65ea1 | ||
|
|
94ff105104 | ||
|
|
9bcf258aa9 |
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -7,3 +7,9 @@
|
||||
.filteredMessage {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.blankpad {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'blankpad': string;
|
||||
'filterMenuContainer': string;
|
||||
'filteredMessage': string;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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 ***")]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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} من قائمة الانتظار؟"
|
||||
}
|
||||
|
||||
@@ -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} от опашката?"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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é"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -290,7 +290,6 @@
|
||||
"RemoveFromQueue": "Κατάργηση από την ουρά",
|
||||
"RemoveHelpTextWarning": "Η κατάργηση θα καταργήσει τη λήψη και τα αρχεία από τον πελάτη λήψης.",
|
||||
"RemoveSelected": "Αφαιρέστε τα επιλεγμένα",
|
||||
"RemoveSelectedMessageText": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε τα επιλεγμένα στοιχεία από τη λίστα αποκλεισμού;",
|
||||
"RemoveTagExistingTag": "Υφιστάμενη ετικέτα",
|
||||
"RemoveTagRemovingTag": "Κατάργηση ετικέτας",
|
||||
"RemovedFromTaskQueue": "Καταργήθηκε από την ουρά εργασιών",
|
||||
@@ -590,7 +589,6 @@
|
||||
"MoveFiles": "Μετακίνηση αρχείων",
|
||||
"OnApplicationUpdate": "Στην ενημέρωση της εφαρμογής",
|
||||
"OnApplicationUpdateHelpText": "Στην ενημέρωση της εφαρμογής",
|
||||
"BlocklistHelpText": "Αποτρέπει το Radarr από το να πάρει ξανά αυτόματα αυτήν την έκδοση",
|
||||
"LoadingEditionsFailed": "Η φόρτωση των εκδόσεων απέτυχε",
|
||||
"ManualDownload": "Χειροκίνητη λήψη",
|
||||
"MetadataConsumers": "Καταναλωτές μεταδεδομένων",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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?"
|
||||
}
|
||||
|
||||
@@ -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?"
|
||||
}
|
||||
|
||||
@@ -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é ?"
|
||||
}
|
||||
|
||||
@@ -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} מהתור?"
|
||||
}
|
||||
|
||||
@@ -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} को कतार से हटाना चाहते हैं?"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -31,5 +31,7 @@
|
||||
"Connections": "Koleksi",
|
||||
"ExportCustomFormat": "Tambahkan Format Khusus",
|
||||
"AuthorClickToChangeBook": "Klik untuk mengubah film",
|
||||
"Automatic": "Otomatis"
|
||||
"Automatic": "Otomatis",
|
||||
"Close": "Tutup",
|
||||
"Delete": "Hapus"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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}」を削除してもよろしいですか?"
|
||||
}
|
||||
|
||||
@@ -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}을 제거하시겠습니까?"
|
||||
}
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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ă?"
|
||||
}
|
||||
|
||||
@@ -298,7 +298,6 @@
|
||||
"RemoveFromQueue": "Удалить из очереди",
|
||||
"RemoveHelpTextWarning": "Удаление приведет к удалению загрузки и файла(ов) из клиента загрузки.",
|
||||
"RemoveSelected": "Удалить выбранное",
|
||||
"RemoveSelectedMessageText": "Удалить выбранные элементы из черного списка?",
|
||||
"RemoveTagExistingTag": "Существующий тэг",
|
||||
"RemoveTagRemovingTag": "Удаление тега",
|
||||
"RemovedFromTaskQueue": "Удалено из очереди задач",
|
||||
@@ -474,7 +473,6 @@
|
||||
"UnableToLoadBlocklist": "Не удалось загрузить черный список",
|
||||
"Time": "Время",
|
||||
"Blocklist": "Черный список",
|
||||
"BlocklistHelpText": "Запрещает Radarr автоматически получать этот релиз повторно",
|
||||
"BlocklistRelease": "Релиз из черного списка",
|
||||
"Disabled": "Выключено",
|
||||
"Duration": "Длительность",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -293,7 +293,6 @@
|
||||
"RemoveFromQueue": "ลบออกจากคิว",
|
||||
"RemoveHelpTextWarning": "การลบจะลบการดาวน์โหลดและไฟล์ออกจากไคลเอนต์ดาวน์โหลด",
|
||||
"RemoveSelected": "ลบรายการที่เลือก",
|
||||
"RemoveSelectedMessageText": "แน่ใจหรือไม่ว่าต้องการลบรายการที่เลือกออกจากบัญชีดำ?",
|
||||
"RemoveTagExistingTag": "แท็กที่มีอยู่",
|
||||
"RemoveTagRemovingTag": "กำลังลบแท็ก",
|
||||
"RemovedFromTaskQueue": "ลบออกจากคิวงาน",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "Показати дату додавання",
|
||||
|
||||
@@ -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ụ",
|
||||
|
||||
@@ -278,7 +278,6 @@
|
||||
"RemoveFromQueue": "从队列中移除",
|
||||
"RemoveHelpTextWarning": "移除操作会从下载客户端中删除任务和已下载文件。",
|
||||
"RemoveSelected": "移除已选",
|
||||
"RemoveSelectedMessageText": "您确定要从黑名单中删除选择项吗?",
|
||||
"RemoveTagExistingTag": "已有标签",
|
||||
"RemoveTagRemovingTag": "移除标签",
|
||||
"RemovedFromTaskQueue": "从任务队列中移除",
|
||||
@@ -486,7 +485,6 @@
|
||||
"Level": "等级",
|
||||
"RemoveFromBlocklist": "从黑名单中移除",
|
||||
"Blocklist": "阻止列表",
|
||||
"BlocklistHelpText": "防止Radarr再次自动抓取此版本",
|
||||
"BlocklistRelease": "黑名单版本",
|
||||
"AllowFingerprinting": "允许指纹识别",
|
||||
"AllExpandedCollapseAll": "收缩所有",
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -10926,6 +10926,10 @@
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"helpTextWarning": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
},
|
||||
"helpLink": {
|
||||
"type": "string",
|
||||
"nullable": true
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user