1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-22 17:04:39 -04:00

Compare commits

...

35 Commits

Author SHA1 Message Date
Qstick
d00678c1ba Bump ffprobe to 5.1.4
(cherry picked from commit e68b13940d4dd4c5fd008884d909e614521c8cee)
2023-11-11 20:04:59 +02:00
Bogdan
03df9b7f07 Add troubleshooting link when movie searches fail 2023-11-11 18:45:34 +02:00
Bogdan
3442a0ecca Bump version to 5.2.0 2023-11-10 06:24:33 +02:00
Bogdan
3376a467ca Fixed: Record status for notifications on tests 2023-11-10 05:07:29 +02:00
Servarr
1650ce17fb Automated API Docs update 2023-11-10 03:33:52 +02:00
Bogdan
2f2004faa2 New: Resolve download client by name using 'downloadClient' for pushed releases
(cherry picked from commit 0496e728dc1e21b16b9ee2fee010de9707bdff85)
2023-11-10 03:14:38 +02:00
Mark McDowall
437e2f4597 Don't store successful results for invalid providers
(cherry picked from commit de23182d593e2284972103d505e66dd8d812dfdb)
2023-11-10 03:13:27 +02:00
Bogdan
17b8605751 Simply queue item for movie details page 2023-11-09 20:53:49 +02:00
Bogdan
b2a52e52b6 Fixed: (UI) Progress bar status for searching existing movies 2023-11-09 20:53:49 +02:00
Servarr
0f5fabdfcd Automated API Docs update 2023-11-09 15:11:53 +02:00
Bogdan
6362ee9b7d Fixed: (UI) Import Lists enabled status doesn't rely on automatic add
Fixes #9375
2023-11-09 14:27:10 +02:00
Bogdan
50465fd482 New: Add enabled to manage import lists bulk 2023-11-09 14:16:03 +02:00
Bogdan
54d447d55f New: Parse VIE as Vietnamese language 2023-11-08 20:37:07 +02:00
Bogdan
50f48277e5 Don't show already imported movies as downloading in Movies index 2023-11-08 17:49:29 +02:00
Weblate
c2e206b7ac Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Baptiste Mongin <baptiste.mongin@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Javier Parada <jparada@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Ruben Lourenco <ruben.lourenco01@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-11-07 20:29:36 +02:00
Bogdan
7a46de602f Increase the wait timeout for integration tests init 2023-11-06 00:29:02 +02:00
bakerboy448
89820c1ff7 Lower log level for missing translation/culture resource (#8956)
Fixes #8150
2023-11-04 16:21:47 +02:00
Stevie Robinson
67e6e129ff Fix event ids for history custom filters 2023-11-02 00:37:54 +02:00
Bogdan
b6001238e5 Sort root folders by path in UI
Fixes #9280
2023-11-01 13:13:21 +02:00
Stevie Robinson
7bbdcc81bb Use Diacritical.Net library for TitleFirstCharacter token
(cherry picked from commit 59ea524e0ce85333779f430b867e93aae366289f)

Closes #9324
2023-11-01 13:13:21 +02:00
Stevie Robinson
3e8cbc497e Fixed: Cleanup First Character in Title when using 'TitleFirstCharacter'
(cherry picked from commit b3c691859a0841cde9bb2655c01c240cc5279d74)

Closes #9249
2023-11-01 13:13:21 +02:00
Bogdan
60d2df043b Rename instances of Profile to QualityProfile
Closes #9337
2023-11-01 13:13:21 +02:00
Mark McDowall
da41cb8840 Fixed: Blocking unknown indexers from pushed releases
(cherry picked from commit 44d8dbaac81706691124ae5f8317289f0a3e5d73)
2023-10-30 14:21:29 +02:00
Bogdan
a4b7c99d91 Fix full disk releases regex for DVDs
(cherry picked from commit aa8659eecd0a0fedd56eb1066730d1d1ec32df0d)

Closes #9346
2023-10-29 18:50:38 +02:00
Bogdan
8fb21e073b Bump version to 5.1.3 2023-10-29 10:35:11 +02:00
Stevie Robinson
dbf424d454 New: Relative path as default Sort order on Manual Import
(cherry picked from commit 6e2162ebf4b3366df540bd35ad91bd5527976728)

Closes #9344
2023-10-29 01:12:45 +03:00
Bogdan
a6dda70c0a New: Add Download Client validation for indexers
(cherry picked from commit e53b7f8c945e3597ca1719961e82540f1f01f0e9)

Closes #9338
2023-10-29 01:05:50 +03:00
Bogdan
e6fa14b1e6 Allow 0 as valid value in QualityProfileExistsValidator
(cherry picked from commit 36ca24e55a5eda859047d82855f65c401cc0b30f)
2023-10-29 00:59:16 +03:00
Bogdan
b5c0d515ee Improve UI notice for delayed queue items
(cherry picked from commit f2cae4e2b2f87924973a00431be7216296648dac)
2023-10-29 00:59:02 +03:00
Bogdan
b7aee25d0d Set proper default props for Queue details and status
(cherry picked from commit dc099a77ca9e6993d386a2b70f1aff1fed34a32b)
2023-10-29 00:58:30 +03:00
Bogdan
233b85aaf3 Sort Custom Formats by name
(cherry picked from commit e9bb1d52a72b20a58d1a672ecfa3797eda6f081a)
2023-10-29 00:58:11 +03:00
Weblate
80db9a7dd4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: ID-86 <id86dev@gmail.com>
Co-authored-by: Jordy <prive@jordyhoebergen.nl>
Co-authored-by: LeDaFeEs <leonardo.fonseca85300@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: bai0012 <baicongrui@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-10-28 22:05:58 +03:00
Bogdan
660d3d7643 Fixed: Don't reject DVDRip/DVDRemux as full DVD disk releases 2023-10-28 22:05:12 +03:00
Bogdan
d999aea36f Add missing translation in release profiles 2023-10-26 00:18:52 +03:00
Jordy
5d45f1de89 Update link to Docker instructions in readme (#9318) 2023-10-25 11:21:51 +03:00
63 changed files with 622 additions and 308 deletions

View File

@@ -2,7 +2,7 @@
[![Build Status](https://dev.azure.com/Radarr/Radarr/_apis/build/status/Radarr.Radarr?branchName=develop)](https://dev.azure.com/Radarr/Radarr/_build/latest?definitionId=1&branchName=develop)
[![Translated](https://translate.servarr.com/widgets/servarr/-/radarr/svg-badge.svg)](https://translate.servarr.com/engage/radarr/?utm_source=widget)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://wiki.servarr.com/radarr/installation#docker)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://wiki.servarr.com/radarr/installation/docker)
![Github Downloads](https://img.shields.io/github/downloads/Radarr/Radarr/total.svg)
[![Backers on Open Collective](https://opencollective.com/Radarr/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/Radarr/sponsors/badge.svg)](#sponsors)

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.1.2'
majorVersion: '5.2.0'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@@ -81,4 +81,9 @@ QueueDetails.propTypes = {
progressBar: PropTypes.node.isRequired
};
QueueDetails.defaultProps = {
trackedDownloadStatus: 'ok',
trackedDownloadState: 'downloading'
};
export default QueueDetails;

View File

@@ -2,7 +2,6 @@ import PropTypes from 'prop-types';
import React from 'react';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import { tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import QueueStatus from './QueueStatus';
import styles from './QueueStatusCell.css';
@@ -41,8 +40,8 @@ QueueStatusCell.propTypes = {
};
QueueStatusCell.defaultProps = {
trackedDownloadStatus: translate('Ok'),
trackedDownloadState: translate('Downloading')
trackedDownloadStatus: 'ok',
trackedDownloadState: 'downloading'
};
export default QueueStatusCell;

View File

@@ -1,6 +1,9 @@
import PropTypes from 'prop-types';
import React from 'react';
import Icon from 'Components/Icon';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import formatTime from 'Utilities/Date/formatTime';
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
import getRelativeDate from 'Utilities/Date/getRelativeDate';
@@ -25,11 +28,13 @@ function TimeleftCell(props) {
const time = formatTime(estimatedCompletionTime, timeFormat, { includeMinuteZero: true });
return (
<TableRowCell
className={styles.timeleft}
title={translate('DelayingDownloadUntil', { date, time })}
>
-
<TableRowCell className={styles.timeleft}>
<Tooltip
anchor={<Icon name={icons.INFO} />}
tooltip={translate('DelayingDownloadUntil', { date, time })}
kind={kinds.INVERSE}
position={tooltipPositions.TOP}
/>
</TableRowCell>
);
}
@@ -39,11 +44,13 @@ function TimeleftCell(props) {
const time = formatTime(estimatedCompletionTime, timeFormat, { includeMinuteZero: true });
return (
<TableRowCell
className={styles.timeleft}
title={translate('RetryingDownloadOn', { date, time })}
>
-
<TableRowCell className={styles.timeleft}>
<Tooltip
anchor={<Icon name={icons.INFO} />}
tooltip={translate('RetryingDownloadOn', { date, time })}
kind={kinds.INVERSE}
position={tooltipPositions.TOP}
/>
</TableRowCell>
);
}

View File

@@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import TextInput from 'Components/Form/TextInput';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
@@ -130,7 +131,12 @@ class AddNewMovie extends Component {
<div className={styles.helpText}>
{translate('FailedLoadingSearchResults')}
</div>
<div>{getErrorMessage(error)}</div>
<Alert kind={kinds.WARNING}>{getErrorMessage(error)}</Alert>
<div>
<Link to="https://wiki.servarr.com/radarr/troubleshooting#invalid-response-received-from-tmdb">
{translate('WhySearchesCouldBeFailing')}
</Link>
</div>
</div> : null
}

View File

@@ -66,6 +66,7 @@ class AddNewMovieSearchResult extends Component {
ratings,
folder,
images,
existingMovieId,
isExistingMovie,
isExclusionMovie,
isSmallScreen,
@@ -74,8 +75,7 @@ class AddNewMovieSearchResult extends Component {
monitored,
hasFile,
isAvailable,
queueStatus,
queueState,
movieFile,
runtime,
movieRuntimeFormat,
certification
@@ -120,13 +120,13 @@ class AddNewMovieSearchResult extends Component {
{
isExistingMovie &&
<MovieIndexProgressBar
movieId={existingMovieId}
movieFile={movieFile}
monitored={monitored}
hasFile={hasFile}
status={status}
width={posterWidth}
detailedProgressBar={true}
queueStatus={queueStatus}
queueState={queueState}
isAvailable={isAvailable}
/>
}
@@ -278,6 +278,7 @@ AddNewMovieSearchResult.propTypes = {
ratings: PropTypes.object.isRequired,
folder: PropTypes.string.isRequired,
images: PropTypes.arrayOf(PropTypes.object).isRequired,
existingMovieId: PropTypes.number,
isExistingMovie: PropTypes.bool.isRequired,
isExclusionMovie: PropTypes.bool.isRequired,
isSmallScreen: PropTypes.bool.isRequired,
@@ -286,9 +287,8 @@ AddNewMovieSearchResult.propTypes = {
monitored: PropTypes.bool.isRequired,
hasFile: PropTypes.bool.isRequired,
isAvailable: PropTypes.bool.isRequired,
movieFile: PropTypes.object,
colorImpairedMode: PropTypes.bool,
queueStatus: PropTypes.string,
queueState: PropTypes.string,
runtime: PropTypes.number.isRequired,
movieRuntimeFormat: PropTypes.string.isRequired,
certification: PropTypes.string

View File

@@ -10,17 +10,15 @@ function createMapStateToProps() {
createExistingMovieSelector(),
createExclusionMovieSelector(),
createDimensionsSelector(),
(state) => state.queue.details.items,
(state, { internalId }) => internalId,
(isExistingMovie, isExclusionMovie, dimensions, queueItems, internalId) => {
const firstQueueItem = queueItems.find((q) => q.movieId === internalId && internalId > 0);
(state) => state.settings.ui.item.movieRuntimeFormat,
(isExistingMovie, isExclusionMovie, dimensions, internalId, movieRuntimeFormat) => {
return {
existingMovieId: internalId,
isExistingMovie,
isExclusionMovie,
isSmallScreen: dimensions.isSmallScreen,
queueStatus: firstQueueItem ? firstQueueItem.status : null,
queueState: firstQueueItem ? firstQueueItem.trackedDownloadState : null
movieRuntimeFormat
};
}
);

View File

@@ -5,12 +5,13 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { addRootFolder, deleteRootFolder, fetchRootFolders } from 'Store/Actions/rootFolderActions';
import createRootFoldersSelector from 'Store/Selectors/createRootFoldersSelector';
import createSystemStatusSelector from 'Store/Selectors/createSystemStatusSelector';
import ImportMovieSelectFolder from './ImportMovieSelectFolder';
function createMapStateToProps() {
return createSelector(
(state) => state.rootFolders,
createRootFoldersSelector(),
createSystemStatusSelector(),
(rootFolders, systemStatus) => {
return {

View File

@@ -1,40 +1,10 @@
import ModelBase from 'App/ModelBase';
import Language from 'Language/Language';
import { QualityModel } from 'Quality/Quality';
import CustomFormat from 'typings/CustomFormat';
import Queue from 'typings/Queue';
import AppSectionState, {
AppSectionFilterState,
AppSectionItemState,
Error,
} from './AppSectionState';
export interface StatusMessage {
title: string;
messages: string[];
}
export interface Queue extends ModelBase {
languages: Language[];
quality: QualityModel;
customFormats: CustomFormat[];
size: number;
title: string;
sizeleft: number;
timeleft: string;
estimatedCompletionTime: string;
status: string;
trackedDownloadStatus: string;
trackedDownloadState: string;
statusMessages: StatusMessage[];
errorMessage: string;
downloadId: string;
protocol: string;
downloadClient: string;
outputPath: string;
movieHasFile: boolean;
movieId?: number;
}
export interface QueueDetailsAppState extends AppSectionState<Queue> {
params: unknown;
}

View File

@@ -23,19 +23,19 @@ const EVENT_TYPE_OPTIONS = [
},
},
{
id: 5,
id: 6,
get name() {
return translate('Deleted');
},
},
{
id: 6,
id: 8,
get name() {
return translate('Renamed');
},
},
{
id: 7,
id: 9,
get name() {
return translate('Ignored');
},

View File

@@ -3,6 +3,7 @@ import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { addRootFolder } from 'Store/Actions/rootFolderActions';
import createRootFoldersSelector from 'Store/Selectors/createRootFoldersSelector';
import translate from 'Utilities/String/translate';
import RootFolderSelectInput from './RootFolderSelectInput';
@@ -10,7 +11,7 @@ const ADD_NEW_KEY = 'addNew';
function createMapStateToProps() {
return createSelector(
(state) => state.rootFolders,
createRootFoldersSelector(),
(state, { value }) => value,
(state, { includeMissingValue }) => includeMissingValue,
(state, { includeNoChange }) => includeNoChange,

View File

@@ -286,7 +286,7 @@ class MovieDetails extends Component {
onMonitorTogglePress,
onRefreshPress,
onSearchPress,
queueItems,
queueItem,
movieRuntimeFormat
} = this.props;
@@ -544,7 +544,7 @@ class MovieDetails extends Component {
hasMovieFiles={hasMovieFiles}
monitored={monitored}
isAvailable={isAvailable}
queueItem={(queueItems.length > 0) ? queueItems[0] : null}
queueItem={queueItem}
/>
</span>
</InfoLabel>
@@ -830,7 +830,7 @@ MovieDetails.propTypes = {
onRefreshPress: PropTypes.func.isRequired,
onSearchPress: PropTypes.func.isRequired,
onGoToMovie: PropTypes.func.isRequired,
queueItems: PropTypes.arrayOf(PropTypes.object),
queueItem: PropTypes.object,
movieRuntimeFormat: PropTypes.string.isRequired
};

View File

@@ -145,6 +145,8 @@ function createMapStateToProps() {
return acc;
}, []);
const queueItem = queueItems.find((item) => item.movieId === movie.id);
return {
...movie,
alternateTitles,
@@ -165,7 +167,7 @@ function createMapStateToProps() {
nextMovie,
isSmallScreen: dimensions.isSmallScreen,
isSidebarVisible,
queueItems,
queueItem,
movieRuntimeFormat
};
}

View File

@@ -8,7 +8,6 @@ import translate from 'Utilities/String/translate';
import styles from './MovieStatusLabel.css';
function getMovieStatus(hasFile, isMonitored, isAvailable, queueItem = false) {
if (queueItem) {
const queueStatus = queueItem.status;
const queueState = queueItem.trackedDownloadStatus;
@@ -116,8 +115,4 @@ MovieStatusLabel.propTypes = {
colorImpairedMode: PropTypes.bool
};
MovieStatusLabel.defaultProps = {
title: ''
};
export default MovieStatusLabel;

View File

@@ -11,7 +11,10 @@ function createMovieQueueDetailsSelector(movieId: number) {
(queueItems) => {
return queueItems.reduce(
(acc: MovieQueueDetails, item) => {
if (item.movieId !== movieId) {
if (
item.trackedDownloadState === 'imported' ||
item.movieId !== movieId
) {
return acc;
}

View File

@@ -74,9 +74,15 @@ class ImportList extends Component {
<div className={styles.enabled}>
{
enabled &&
enabled ?
<Label kind={kinds.SUCCESS}>
{translate('Enabled')}
</Label> :
<Label
kind={kinds.DISABLED}
outline={true}
>
{translate('Disabled')}
</Label>
}
@@ -86,16 +92,6 @@ class ImportList extends Component {
{translate('Auto')}
</Label>
}
{
!enabled && !enableAuto &&
<Label
kind={kinds.DISABLED}
outline={true}
>
{translate('Disabled')}
</Label>
}
</div>
<div className={styles.enabled}>

View File

@@ -12,6 +12,7 @@ import translate from 'Utilities/String/translate';
import styles from './ManageImportListsEditModalContent.css';
interface SavePayload {
enabled?: boolean;
enableAuto?: boolean;
qualityProfileId?: number;
rootFolderPath?: string;
@@ -25,7 +26,7 @@ interface ManageImportListsEditModalContentProps {
const NO_CHANGE = 'noChange';
const autoAddOptions = [
const enableOptions = [
{
key: NO_CHANGE,
get value() {
@@ -52,6 +53,7 @@ function ManageImportListsEditModalContent(
) {
const { importListIds, onSavePress, onModalClose } = props;
const [enabled, setEnabled] = useState(NO_CHANGE);
const [enableAuto, setEnableAuto] = useState(NO_CHANGE);
const [qualityProfileId, setQualityProfileId] = useState<string | number>(
NO_CHANGE
@@ -62,6 +64,11 @@ function ManageImportListsEditModalContent(
let hasChanges = false;
const payload: SavePayload = {};
if (enabled !== NO_CHANGE) {
hasChanges = true;
payload.enabled = enabled === 'enabled';
}
if (enableAuto !== NO_CHANGE) {
hasChanges = true;
payload.enableAuto = enableAuto === 'enabled';
@@ -82,11 +89,21 @@ function ManageImportListsEditModalContent(
}
onModalClose();
}, [enableAuto, qualityProfileId, rootFolderPath, onSavePress, onModalClose]);
}, [
enabled,
enableAuto,
qualityProfileId,
rootFolderPath,
onSavePress,
onModalClose,
]);
const onInputChange = useCallback(
({ name, value }: { name: string; value: string }) => {
switch (name) {
case 'enabled':
setEnabled(value);
break;
case 'enableAuto':
setEnableAuto(value);
break;
@@ -110,6 +127,18 @@ function ManageImportListsEditModalContent(
<ModalHeader>{translate('EditSelectedImportLists')}</ModalHeader>
<ModalBody>
<FormGroup>
<FormLabel>{translate('Enabled')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="enabled"
value={enabled}
values={enableOptions}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('AutomaticAdd')}</FormLabel>
@@ -117,7 +146,7 @@ function ManageImportListsEditModalContent(
type={inputTypes.SELECT}
name="enableAuto"
value={enableAuto}
values={autoAddOptions}
values={enableOptions}
onChange={onInputChange}
/>
</FormGroup>

View File

@@ -58,6 +58,12 @@ const COLUMNS = [
isSortable: true,
isVisible: true,
},
{
name: 'enabled',
label: () => translate('Enabled'),
isSortable: true,
isVisible: true,
},
{
name: 'enableAuto',
label: () => translate('AutomaticAdd'),

View File

@@ -1,5 +1,6 @@
.name,
.tags,
.enabled,
.enableAuto,
.qualityProfileId,
.rootFolderPath,
@@ -7,4 +8,4 @@
composes: cell from '~Components/Table/Cells/TableRowCell.css';
word-break: break-all;
}
}

View File

@@ -2,6 +2,7 @@
// Please do not change this file!
interface CssExports {
'enableAuto': string;
'enabled': string;
'implementation': string;
'name': string;
'qualityProfileId': string;

View File

@@ -7,6 +7,7 @@ import TableRow from 'Components/Table/TableRow';
import TagListConnector from 'Components/TagListConnector';
import { createQualityProfileSelectorForHook } from 'Store/Selectors/createQualityProfileSelector';
import { SelectStateInputProps } from 'typings/props';
import translate from 'Utilities/String/translate';
import styles from './ManageImportListsModalRow.css';
interface ManageImportListsModalRowProps {
@@ -16,6 +17,7 @@ interface ManageImportListsModalRowProps {
qualityProfileId: number;
implementation: string;
tags: number[];
enabled: boolean;
enableAuto: boolean;
columns: Column[];
isSelected?: boolean;
@@ -30,6 +32,7 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
rootFolderPath,
qualityProfileId,
implementation,
enabled,
enableAuto,
tags,
onSelectedChange,
@@ -63,15 +66,19 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
</TableRowCell>
<TableRowCell className={styles.qualityProfileId}>
{qualityProfile?.name ?? 'None'}
{qualityProfile?.name ?? translate('None')}
</TableRowCell>
<TableRowCell className={styles.rootFolderPath}>
{rootFolderPath}
</TableRowCell>
<TableRowCell className={styles.enabled}>
{enabled ? translate('Yes') : translate('No')}
</TableRowCell>
<TableRowCell className={styles.enableAuto}>
{enableAuto ? 'Yes' : 'No'}
{enableAuto ? translate('Yes') : translate('No')}
</TableRowCell>
<TableRowCell className={styles.tags}>

View File

@@ -28,8 +28,8 @@ export const defaultState = {
isReprocessing: false,
error: null,
items: [],
sortKey: 'quality',
sortDirection: sortDirections.DESCENDING,
sortKey: 'relativePath',
sortDirection: sortDirections.ASCENDING,
recentFolders: [],
importMode: 'chooseImportMode',
sortPredicates: {

View File

@@ -12,6 +12,7 @@ export interface Field {
interface ImportList extends ModelBase {
enable: boolean;
enabled: boolean;
enableAuto: boolean;
qualityProfileId: number;
rootFolderPath: string;

View File

@@ -0,0 +1,43 @@
import ModelBase from 'App/ModelBase';
import Language from 'Language/Language';
import { QualityModel } from 'Quality/Quality';
import CustomFormat from 'typings/CustomFormat';
export type QueueTrackedDownloadStatus = 'ok' | 'warning' | 'error';
export type QueueTrackedDownloadState =
| 'downloading'
| 'importPending'
| 'importing'
| 'imported'
| 'failedPending'
| 'failed'
| 'ignored';
export interface StatusMessage {
title: string;
messages: string[];
}
interface Queue extends ModelBase {
languages: Language[];
quality: QualityModel;
customFormats: CustomFormat[];
size: number;
title: string;
sizeleft: number;
timeleft: string;
estimatedCompletionTime: string;
status: string;
trackedDownloadStatus: QueueTrackedDownloadStatus;
trackedDownloadState: QueueTrackedDownloadState;
statusMessages: StatusMessage[];
errorMessage: string;
downloadId: string;
protocol: string;
downloadClient: string;
outputPath: string;
movieHasFile: boolean;
movieId?: number;
}
export default Queue;

View File

@@ -86,5 +86,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
_remoteMovie.Release.Title = title;
Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse();
}
[TestCase("Series Title EP50 USLT NTSC DVDRemux DD2.0")]
[TestCase("Series.Title.S01.NTSC.DVDRip.DD2.0.x264-PLAiD")]
public void should_return_true_if_dvdrip(string title)
{
_remoteMovie.Release.Title = title;
Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue();
}
}
}

View File

@@ -68,5 +68,16 @@ namespace NzbDrone.Core.Test.IndexerTests
VerifyNoUpdate();
}
[Test]
public void should_not_record_failure_for_unknown_provider()
{
Subject.RecordFailure(0);
Mocker.GetMock<IIndexerStatusRepository>()
.Verify(v => v.FindByProviderId(1), Times.Never);
VerifyNoUpdate();
}
}
}

View File

@@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.Localization
localizedString.Should().Be("Langue de l'IU");
ExceptionVerification.ExpectedErrors(1);
ExceptionVerification.ExpectedErrors(0);
}
[Test]
@@ -46,7 +46,7 @@ namespace NzbDrone.Core.Test.Localization
localizedString.Should().Be("UI Language");
ExceptionVerification.ExpectedErrors(1);
ExceptionVerification.ExpectedErrors(0);
}
[Test]

View File

@@ -37,6 +37,12 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
[TestCase("The Mist", "M", "The Mist")]
[TestCase("A", "A", "A")]
[TestCase("30 Rock", "3", "30 Rock")]
[TestCase("The '80s Greatest", "8", "The '80s Greatest")]
[TestCase("좀비버스", "좀", "좀비버스")]
[TestCase("¡Mucha Lucha!", "M", "¡Mucha Lucha!")]
[TestCase(".hack", "H", "hack")]
[TestCase("Ütopya", "U", "Ütopya")]
[TestCase("Æon Flux", "A", "Æon Flux")]
public void should_get_expected_folder_name_back(string title, string parent, string child)
{
_movie.Title = title;

View File

@@ -219,6 +219,7 @@ namespace NzbDrone.Core.Test.ParserTests
}
[TestCase("Movie.Title.1994.Vietnamese.1080p.XviD-LOL")]
[TestCase("Movie.Title.1994.VIE.1080p.XviD-LOL")]
public void should_parse_language_vietnamese(string postTitle)
{
var result = Parser.Parser.ParseMovieTitle(postTitle, true);

View File

@@ -162,7 +162,7 @@ namespace NzbDrone.Core.CustomFormats
}
}
return matches;
return matches.OrderBy(x => x.Name).ToList();
}
private static List<CustomFormat> ParseCustomFormat(MovieFile movieFile, Movie movie, List<CustomFormat> allCustomFormats)

View File

@@ -13,7 +13,7 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
{
new Regex(@"(?:dis[ck])(?:[-_. ]\d+[-_. ])(?:(?:(?:480|720|1080|2160)[ip]|)[-_. ])?(?:Blu\-?ray)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"(?:(?:480|720|1080|2160)[ip]|)[-_. ](?:full)[-_. ](?:Blu\-?ray)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new Regex(@"(?:\d?x?M?DVD-?[R59])", RegexOptions.Compiled | RegexOptions.IgnoreCase)
new Regex(@"(?:\d?x?M?DVD-?[R59])(?:[ ._]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
};
private static readonly string[] _dvdContainerTypes = new[] { "vob", "iso" };

View File

@@ -27,21 +27,21 @@ namespace NzbDrone.Core.IndexerSearch
private readonly IMakeDownloadDecision _makeDownloadDecision;
private readonly IMovieService _movieService;
private readonly IMovieTranslationService _movieTranslationService;
private readonly IQualityProfileService _profileService;
private readonly IQualityProfileService _qualityProfileService;
private readonly Logger _logger;
public ReleaseSearchService(IIndexerFactory indexerFactory,
IMakeDownloadDecision makeDownloadDecision,
IMovieService movieService,
IMovieTranslationService movieTranslationService,
IQualityProfileService profileService,
IQualityProfileService qualityProfileService,
Logger logger)
{
_indexerFactory = indexerFactory;
_makeDownloadDecision = makeDownloadDecision;
_movieService = movieService;
_movieTranslationService = movieTranslationService;
_profileService = profileService;
_qualityProfileService = qualityProfileService;
_logger = logger;
}
@@ -75,7 +75,7 @@ namespace NzbDrone.Core.IndexerSearch
InteractiveSearch = interactiveSearch
};
var wantedLanguages = _profileService.GetAcceptableLanguages(movie.QualityProfileId);
var wantedLanguages = _qualityProfileService.GetAcceptableLanguages(movie.QualityProfileId);
var translations = _movieTranslationService.GetAllTranslationsForMovieMetadata(movie.MovieMetadataId);
var queryTranslations = new List<string>

View File

@@ -1049,5 +1049,11 @@
"ClickToChangeReleaseGroup": "Kliknutím změníte skupinu vydání",
"ChooseImportMode": "Vyberte mód importu",
"CloneAutoTag": "Klonovat automatické značky",
"CloneCondition": "Klonovat podmínku"
"CloneCondition": "Klonovat podmínku",
"From": "Od",
"ImportListMultipleMissingRoots": "Několik kořenových adresářů chybí pro seznamy importu: {0}",
"DiscordUrlInSlackNotification": "Máte nastaveny Discord notifikace v režimu Slack. Nastavte je do režimu Discord pro lepší funkcionalitu. Postižené notifikace: {0}",
"AnnouncedMsg": "Film je oznámen",
"IndexerDownloadClientHelpText": "Zvolte, který klient pro stahování bude použit pro zachytávání z toho indexeru",
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {0}"
}

View File

@@ -373,6 +373,7 @@
"EnableInteractiveSearchHelpText": "Will be used when interactive search is used",
"EnableInteractiveSearchHelpTextWarning": "Search is not supported with this indexer",
"EnableMediaInfoHelpText": "Extract video information such as resolution, runtime and codec information from files. This requires Radarr to read parts of the file which may cause high disk or network activity during scans.",
"EnableProfile": "Enable Profile",
"EnableRSS": "Enable RSS",
"EnableSSL": "Enable SSL",
"EnableSslHelpText": " Requires restart running as administrator to take effect",
@@ -1326,6 +1327,7 @@
"WhatsNew": "What's new?",
"WhitelistedHardcodedSubsHelpText": "Subtitle tags set here will not be considered hardcoded",
"WhitelistedSubtitleTags": "Whitelisted Subtitle Tags",
"WhySearchesCouldBeFailing": "Click here to find out why searches could be failing",
"Wiki": "Wiki",
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
"Year": "Year",

View File

@@ -365,7 +365,7 @@
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Las películas eliminadas del disco son automáticamente desmonitorizadas en Radarr",
"AutoRedownloadFailedHelpText": "Buscar e intentar descargar automáticamente una versión diferente",
"Automatic": "Automático",
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Radarr",
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder {appName}",
"Authentication": "Autenticación",
"AsAllDayHelpText": "Los eventos aparecerán como eventos del día entero en su calendario",
"ApiKey": "Clave de API",
@@ -644,10 +644,10 @@
"DownloadClientUnavailable": "El gestor de descargas no está disponible",
"DeleteTagMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
"DeleteRestrictionHelpText": "Seguro que quieres eliminar esta restricción?",
"DeleteNotificationMessageText": "Seguro que quieres elminiar la notificación '{0}'?",
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{0}'?",
"DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{0}'?",
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
"DeleteNotificationMessageText": "¿Seguro que quieres eliminiar la notificación '{name}'?",
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?",
"DeleteDownloadClientMessageText": "¿Seguro que quieres eliminar el cliente de descargas '{name}'?",
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"Cutoff": "Requisito",
"ClickToChangeMovie": "Clic para cambiar película",
"CheckDownloadClientForDetails": "comprobar el gestor de descargas para más detalles",
@@ -718,7 +718,7 @@
"ErrorLoadingContents": "Error al cargar los contenidos",
"DownloadedButNotMonitored": "Descargada (No monitoreada)",
"DownloadedAndMonitored": "Descargada y Monitoreada",
"CouldNotFindResults": "No se pudieron encontrar resultados para '{0}'",
"CouldNotFindResults": "No se pudieron encontrar resultados para '{term}'",
"CantFindMovie": "Por qué no puedo encontrar mi película?",
"ApplyTagsHelpTextHowToApplyMovies": "Cómo añadir etiquetas a las películas seleccionadas",
"UILanguageHelpTextWarning": "Recargar el Navegador",
@@ -791,7 +791,7 @@
"RequiredRestrictionHelpText": "El comunicado debe contener al menos uno de estos términos (no distingue entre mayúsculas y minúsculas)",
"Announced": "Anunciado",
"BuiltIn": "Construido en",
"CalendarOptions": "Opciones de calendario",
"CalendarOptions": "Opciones de Calendario",
"CertValidationNoLocal": "Deshabilitado para direcciones locales",
"ChmodFolder": "Carpeta chmod",
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
@@ -803,7 +803,7 @@
"DeletedMsg": "La película se eliminó de TMDb",
"DeleteMovieFolderLabel": "Eliminar carpeta de películas",
"DockerUpdater": "actualice el contenedor de la ventana acoplable para recibir la actualización",
"AllMoviesInPathHaveBeenImported": "Se han importado todas las películas de {0}",
"AllMoviesInPathHaveBeenImported": "Se han importado todas las películas de {path}",
"AllResultsHiddenFilter": "Todos los resultados están ocultos por el filtro aplicado",
"Always": "Siempre",
"AptUpdater": "Use apt para instalar la actualización",
@@ -948,7 +948,7 @@
"Today": "Hoy",
"TorrentDelayTime": "Retraso de Torrent: {0}",
"TorrentsDisabled": "Torrents deshabilitados",
"Trace": "Trace",
"Trace": "Rastro",
"Trailer": "Trailer",
"Trakt": "Trakt",
"Trigger": "Desencadenar",
@@ -1060,7 +1060,7 @@
"RefreshMonitoredIntervalHelpText": "Cada cuánto actualizar las descargas monitoreadeas desde los clientes de descarga, mínimo 1 minuto",
"SearchOnAddCollectionHelpText": "Buscar películas en esta colección cuando se añada a la biblioteca",
"TotalMovies": "Películas Totales",
"CollectionsSelectedInterp": "{0} Colecciones Seleccionadas",
"CollectionsSelectedInterp": "{0} Colección(es) seleccionada(s)",
"EditCollection": "Editar Colección",
"MonitorCollection": "Monitorear Colección",
"MonitoredCollectionHelpText": "Monitorear para que las películas de esta colección se añadan automáticamente a la biblioteca",
@@ -1089,14 +1089,14 @@
"ShowOverview": "Presentación",
"SettingsTheme": "Tema",
"PreferredProtocol": "Protocolo preferido",
"EditMovies": "Editar peliculas",
"EditMovies": "Editar peliculas",
"EditSelectedMovies": "Editar Peliculas Seleccionadas",
"ShowCinemaReleaseHelpText": "Mostrar la fecha de lanzamiento debajo del cartel",
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
"DeleteDelayProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{name}'?",
"DeleteFormatMessageText": "¿Está seguro de que desea eliminar la etiqueta de formato {0}?",
"DeleteImportListExclusionMessageText": "Estás seguro de que quieres borrar esta exclusión de lista de importación?",
"RemoveSelectedItemQueueMessageText": "¿Está seguro de que desea eliminar el {0} elemento {1} de la cola?",
@@ -1104,7 +1104,7 @@
"ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?",
"ResetDefinitionTitlesHelpText": "Restablecer los títulos y valores de las definiciones",
"ResetQualityDefinitionsMessageText": "¿Está seguro de que desea restablecer las definiciones de calidad?",
"ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas",
"ApplyTagsHelpTextAdd": "Añadir: Añadir las etiquetas la lista existente de etiquetas",
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados",
"ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas",
"ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)",
@@ -1130,7 +1130,7 @@
"ListRefreshInterval": "Intervalo de Refresco de Lista",
"ImportUsingScript": "Importar Script de Uso",
"ImportScriptPath": "Importar Ruta de Script",
"CountIndexersSelected": "{0} indexador(es) seleccionado(s)",
"CountIndexersSelected": "{count} indexador(es) seleccionado(s)",
"DeleteCondition": "Eliminar Condición",
"Implementation": "Implementación",
"MoveAutomatically": "Mover Automáticamente",
@@ -1139,8 +1139,8 @@
"CloneAutoTag": "Clonar Etiquetado Automático",
"CloneCondition": "Clonar Condición",
"DeleteAutoTag": "Eliminar Etiquetado Automático",
"DeleteAutoTagHelpText": "¿Está seguro de querer eliminar el etiquetado automático '{0}'?",
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {0} cliente(s) de descarga seleccionado(s)?",
"DeleteAutoTagHelpText": "¿Está seguro de querer eliminar el etiquetado automático '{name}'?",
"DeleteSelectedDownloadClientsMessageText": "¿Estas seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?",
"EditAutoTag": "Editar Etiquetado Automático",
"EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados",
"EditSelectedIndexers": "Editar Indexadores Seleccionados",
@@ -1148,10 +1148,10 @@
"ManageIndexers": "Gestionar Indexadores",
"Loading": "Cargando",
"IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.",
"CountImportListsSelected": "{0} lista(s) de importación seleccionada(s)",
"CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)",
"CountImportListsSelected": "{count} lista(s) de importación seleccionada(s)",
"CountDownloadClientsSelected": "{count} cliente(s) de descarga seleccionado(s)",
"DeleteRootFolder": "Eliminar Carpeta Raíz",
"DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{0}'?",
"DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{path}'?",
"DeleteSelectedImportLists": "Eliminar Lista(s) de Importación",
"ListWillRefreshEveryInterp": "La lista será refrescada cada {0}",
"VideoDynamicRange": "Video de Rango Dinámico",
@@ -1169,5 +1169,29 @@
"AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación esté habilitada. Opcionalmente puede desactivar la autenticación desde una dirección local.",
"AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no están soportadas directamente cuando se utiliza el mecanismo de actualización de Docker. Tendrá que actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
"AppUpdated": "{appName} Actualizada",
"AudioLanguages": "Idiomas de Audio"
"AudioLanguages": "Idiomas de Audio",
"AddImportListImplementation": "Añadir lista de importación - {implementationName}",
"AddIndexerImplementation": "Añadir Indexador - {implementationName}",
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
"Default": "Por defecto",
"BlocklistLoadError": "No se han podido cargar las bloqueadas",
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
"CustomFormatJson": "Formato JSON personalizado",
"BypassDelayIfAboveCustomFormatScore": "Omitir si está por encima de la puntuación del formato personalizado",
"AutoRedownloadFailed": "La descarga ha fallado",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "La búsqueda automática para intentar descargar una versión diferente cuando en la búsqueda interactiva se obtiene una versión fallida",
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y necesitará ser recargada para restaurar su funcionalidad.",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado",
"AutoRedownloadFailedFromInteractiveSearch": "Fallo al volver a descargar desde la búsqueda interactiva",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Puntuación mínima de formato personalizado",
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Puntuación mínima de formato personalizado necesaria para evitar el retraso del protocolo preferido",
"ConnectionLostReconnect": "Radarr intentará conectarse automáticamente, o haz clic en el botón de recarga abajo.",
"DefaultNameCopiedProfile": "{name} - Copia",
"DefaultNameCopiedSpecification": "{name} - Copia",
"DelayingDownloadUntil": "Retrasar la descarga hasta {date} a {time}",
"DeleteImportList": "Eliminar Lista(s) de Importación",
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes necesitará recargar {appName}",
"DeleteSelectedIndexersMessageText": "Seguro que quieres eliminar {count} indexer seleccionado(s)?"
}

View File

@@ -1332,5 +1332,6 @@
"InteractiveSearchResultsFailedErrorMessage": "La recherche a échoué car il s'agit d'un {message}. Essayez d'actualiser les informations sur le film et vérifiez que les informations nécessaires sont présentes avant de lancer une nouvelle recherche.",
"MovieDownloadFailedTooltip": "Le téléchargement du film a échoué",
"MovieDownloadIgnoredTooltip": "Téléchargement de film ignoré",
"SkipRedownloadHelpText": "Empêche Radarr d'essayer de télécharger une version alternative pour cet élément"
"SkipRedownloadHelpText": "Empêche Radarr d'essayer de télécharger une version alternative pour cet élément",
"QueueFilterHasNoItems": "Le filtre de file d'attente sélectionné ne contient aucun élément"
}

View File

@@ -1130,5 +1130,7 @@
"AddConnectionImplementation": "Voeg connectie toe - {implementationName}",
"AddDownloadClientImplementation": "Voeg Downloadclient toe - {implementationName}",
"AddIndexerImplementation": "Indexeerder toevoegen - {implementationName}",
"DeleteQualityProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?"
"DeleteQualityProfileMessageText": "Bent u zeker dat u het kwaliteitsprofiel {name} wilt verwijderen?",
"AppUpdated": "{appName} is geüpdatet",
"AppUpdatedVersion": "{appName} is geüpdatet naar versie '{version}', om de laatste wijzigingen door te voeren moet je mogelijk {appName} herstarten"
}

View File

@@ -1,6 +1,6 @@
{
"Peers": "Elementos",
"AppDataLocationHealthCheckMessage": "Não foi possível atualizar para prevenir apagar a AppData durante a atualização",
"AppDataLocationHealthCheckMessage": "Não foi possível actualizar para prevenir apagar a AppData durante a actualização",
"Year": "Ano",
"Week": "Semana",
"Warn": "Avisar",
@@ -298,7 +298,7 @@
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Filmes eliminados do disco deixam automaticamente de ser monitorados no Radarr",
"AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
"Automatic": "Automático",
"AuthenticationMethodHelpText": "Solicitar Nome de Usuário e Senha para acessar o {appName}",
"AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao {appName}",
"Authentication": "Autenticação",
"AsAllDayHelpText": "Eventos aparecerão como eventos de dia inteiro em seu calendário",
"ApplyTags": "Aplicar etiquetas",
@@ -439,14 +439,14 @@
"DeleteBackup": "Eliminar cópia de segurança",
"DelayProfile": "Perfil de atraso",
"DBMigration": "Migração da base de dados",
"CutoffHelpText": "Quando esta qualidade for alcançada, o Radarr não transferirá mais filmes",
"CutoffFormatScoreHelpText": "Quando esta pontuação de formato personalizado for alcançada, o Radarr não transferirá mais filmes",
"CutoffHelpText": "Quando esta qualidade for atingida, o Radarr deixará de transferir filmes depois de a pontuação de corte do formato personalizado ser atingida ou ultrapassada",
"CutoffFormatScoreHelpText": "Assim que o limite de qualidade for atingido ou ultrapassado e esta pontuação de formato personalizado for atingida, o Radarr deixará de obter ou importar actualizações para esses filmes",
"CustomFormatsSettings": "Definições de formatos personalizados",
"CreateGroup": "Criar grupo",
"CreateEmptyMovieFoldersHelpText": "Criar pastas ausentes para filmes durante a análise do disco",
"CreateEmptyMovieFolders": "Criar pastas vazias para filmes",
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, bloqueios de ficheiros podem impedir a renomeação de ficheiros que ainda estão sendo provisionados. Você pode temporariamente desativar o provisionamento e utilizar a função de renomeação do Radarr como uma solução alternativa.",
"CopyUsingHardlinksHelpText": "Usar ligações fixas (Hardlinks) ao tentar copiar ficheiros de torrents que ainda estão em modo de semeio",
"CopyUsingHardlinksHelpText": "Os hardlinks permitem que o Radarr importe torrents de propagação para a pasta de filmes sem ocupar espaço extra no disco ou copiar todo o conteúdo do ficheiro. Os hardlinks só funcionarão se a origem e o destino estiverem no mesmo volume",
"ConnectSettings": "Definições de ligação",
"Conditions": "Condições",
"ColonReplacementFormatHelpText": "Mude a forma como o Radarr lida com a substituição de dois-pontos",
@@ -472,7 +472,7 @@
"BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas",
"BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente",
"Cutoff": "Limite",
"CouldNotFindResults": "Nenhum resultado encontrado para \"{0}\"",
"CouldNotFindResults": "Nenhum resultado encontrado para \"{term}\"",
"ClientPriority": "Prioridade do cliente",
"ClickToChangeMovie": "Clique para mudar o filme",
"CheckDownloadClientForDetails": "verifique o cliente de transferências para obter mais detalhes",
@@ -508,7 +508,7 @@
"IndexerPriority": "Prioridade do indexador",
"ForMoreInformationOnTheIndividualIndexers": "Para obter mais informações sobre cada indexador, clique nos botões de informação.",
"EnableInteractiveSearchHelpTextWarning": "Este indexador não suporta pesquisas",
"DeleteIndexerMessageText": "Tem a certeza que quer eliminar o indexador \"{0}\"?",
"DeleteIndexerMessageText": "Tem a certeza de que pretende eliminar o indexador '{name}'?",
"AddIndexer": "Adicionar indexador",
"UsenetDelayHelpText": "Tempo, em minutos, para aguardar antes de capturar uma versão de Usenet",
"ShowCutoffUnmetIconHelpText": "Mostrar ícone para ficheiros quando o limite não tiver sido alcançado",
@@ -584,12 +584,12 @@
"MovieAlreadyExcluded": "Filme já eliminado",
"ExcludeMovie": "Eliminar filme",
"Excluded": "Eliminado",
"Exception": "Exceção",
"Exception": "Excepção",
"ErrorLoadingContents": "Erro ao carregar conteúdo",
"EnableInteractiveSearchHelpText": "Será utilizado ao realizar uma pesquisa interativa",
"EnableAutomaticSearchHelpTextWarning": "Será utilizado ao realizar uma pesquisa interativa",
"EnableAutomaticSearchHelpText": "Será utilizado ao realizar pesquisas automáticas através da IU ou pelo Radarr",
"DownloadWarning": "Alerta de transferência: {0}",
"DownloadWarning": "Alerta de transferência: {warningMessage}",
"DownloadPropersAndRepacksHelpTextWarning": "Utilize formatos personalizados para atualizações automáticas para Propers/Repacks",
"PreferredSize": "Tamanho preferido",
"DownloadPropersAndRepacksHelpText2": "Utilize \"Não preferir\" para ordenar por pontuação de formato personalizado, em vez de Propers/Repacks",
@@ -601,11 +601,11 @@
"DownloadedAndMonitored": "Transferido (Monitorado)",
"DownloadClientUnavailable": "O cliente de transferências está indisponível",
"Disabled": "Desativado",
"DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{0}\"?",
"DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{label}\"?",
"DeleteRestrictionHelpText": "Tem certeza de que quer eliminar esta restrição?",
"DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{0}\"?",
"DeleteDownloadClientMessageText": "Tem a certeza que quer eliminar o cliente de transferências \"{0}\"?",
"DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{0}\"?",
"DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{name}\"?",
"DeleteDownloadClientMessageText": "Tem a certeza que quer eliminar o cliente de transferências \"{name}\"?",
"DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{name}\"?",
"RenameMoviesHelpText": "O Radarr utilizará o nome atual do ficheiro se a renomeação estiver desativada",
"IncludeRecommendationsHelpText": "Incluir filmes recomendados pelo Radarr na vista de descobrimento",
"YouCanAlsoSearch": "Você também pode pesquisar utilizando o ID do TMDb ou do IMDb de um filme, p. ex. \"tmdb:71663\"",
@@ -676,7 +676,7 @@
"ProxyBypassFilterHelpText": "Utilizar \",\" como separador e \"*.\" como caráter universal para subdomínios",
"Proper": "Correta",
"MovieInfoLanguage": "Idioma das informações do filme",
"MaintenanceRelease": "Versão de manutenção: correção de bugs e outras melhorias. Veja o Github Commit History para obter mais detalhes",
"MaintenanceRelease": "Versão de manutenção: reparações de erros e outras melhorias. Consulte o Histórico de Commits do Github para saber mais",
"TorrentDelay": "Atraso para torrents",
"UsenetDelay": "Atraso para Usenet",
"UnableToLoadDelayProfiles": "Não foi possível carregar os perfis de atraso",
@@ -871,7 +871,7 @@
"DeleteHeader": "Eliminar - {0}",
"DeleteMovieFolderHelpText": "Elimine a pasta do filme e seu conteúdo",
"DeleteSelectedMovie": "Eliminar filme(s) selecionado(s)",
"DeleteTheMovieFolder": "A pasta do filme \"{0}\" e todo o seu conteúdo serão eliminados.",
"DeleteTheMovieFolder": "A pasta de filmes '{path}' e todo o seu conteúdo serão eliminados.",
"Discord": "Discord",
"Donations": "Doações",
"DoneEditingGroups": "Edição de grupos terminada",
@@ -1111,8 +1111,8 @@
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados",
"ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas",
"ApplyTagsHelpTextReplace": "Substituir: mudar as etiquetas pelas adicionadas (deixe em branco para limpar todas as etiquetas)",
"DeleteConditionMessageText": "Tem a certeza que quer eliminar a etiqueta \"{0}\"?",
"DeleteCustomFormatMessageText": "Tem a certeza que quer eliminar a pasta raiz \"{0}\"?",
"DeleteConditionMessageText": "Tem a certeza de que pretende eliminar a condição '{name}'?",
"DeleteCustomFormatMessageText": "Tem a certeza de que pretende eliminar o formato personalizado '{name}'?",
"DeleteSelectedDownloadClients": "Eliminar cliente de transferências",
"DeleteSelectedImportLists": "Eliminar lista de importação",
"AddAutoTag": "Adicionar Etiqueta Automática",
@@ -1135,5 +1135,59 @@
"AuthenticationMethod": "Método de Autenticação",
"AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido",
"AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha",
"AuthenticationRequiredUsernameHelpTextWarning": "Insira um novo Nome de Usuário"
"AuthenticationRequiredUsernameHelpTextWarning": "Insira um novo Nome de Usuário",
"DeleteSelectedDownloadClientsMessageText": "Tem a certeza de que pretende eliminar o(s) cliente(s) de transferência selecionado(s)?",
"DeleteSelectedIndexersMessageText": "Tem a certeza de que pretende eliminar {count} indexador(es) selecionado(s)?",
"DeleteRootFolderMessageText": "Tem a certeza de que pretende eliminar a pasta de raiz '{path}'?",
"DeleteRootFolder": "Eliminar a Pasta Raiz",
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados",
"EditSelectedImportLists": "Editar Listas de Importação Selecionadas",
"CountIndexersSelected": "{count} indexador(es) selecionado(s)",
"AutoTaggingNegateHelpText": "Se marcada, a regra de etiqueta automática não será aplicada se esta condição {implementationName} corresponder.",
"CloneAutoTag": "Clonar Etiqueta Automática",
"EditAutoTag": "Editar Etiqueta Automática",
"CloneCondition": "Clonar Condição",
"DeleteCondition": "Eliminar Condição",
"CountDownloadClientsSelected": "{count} cliente(s) de transferência selecionado(s)",
"CountImportListsSelected": "{count} importar lista(s) selecionada(s)",
"Default": "Predefinição",
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}",
"AutoTaggingRequiredHelpText": "Esta condição {0} tem de corresponder para que a regra de marcação automática seja aplicada. Caso contrário, uma única correspondência {0} é suficiente.",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Ativar o desvio quando a versão tem uma pontuação superior à pontuação mínima configurada para o formato personalizado",
"EditImportListImplementation": "Editar Lista de Importação - {implementationName}",
"AutoRedownloadFailed": "Falha na transferência",
"AutoRedownloadFailedFromInteractiveSearch": "Falha na transferência a partir da Pesquisa interactiva",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Procurar automaticamente e tentar transferir uma versão diferente quando a versão falhada foi obtida a partir da pesquisa interactiva",
"AutomaticUpdatesDisabledDocker": "As actualizações automáticas não são diretamente suportadas quando se utiliza o mecanismo de atualização do Docker. Terá de atualizar a imagem do contentor fora de {appName} ou utilizar um script",
"BypassDelayIfAboveCustomFormatScore": "Ignorar se estiver acima da pontuação de formato personalizado",
"ConnectionLostReconnect": "O Radarr tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.",
"ConnectionLostToBackend": "O Radarr perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.",
"DeleteQualityProfileMessageText": "Tem a certeza de que pretende eliminar o perfil de qualidade '{name}'?",
"DeleteSelectedImportListsMessageText": "Tem a certeza de que pretende eliminar a(s) lista(s) de importação selecionada(s)?",
"DeleteSelectedMovieFilesHelpText": "Tem a certeza de que pretende apagar os ficheiros de filmes seleccionados?",
"DeletedReasonManual": "O ficheiro foi eliminado através da IU",
"DeletedReasonMissingFromDisk": "O Radarr não conseguiu encontrar o ficheiro no disco, pelo que o ficheiro foi desvinculado do filme na base de dados",
"DeletedReasonUpgrade": "O ficheiro foi eliminado para importar uma atualização",
"DisabledForLocalAddresses": "Desativado para Endereços Locais",
"DownloadClientsLoadError": "Não foi possível carregar os clientes de transferências",
"DownloadIgnored": "Transferência Ignorada",
"EditConditionImplementation": "Editar Condição - {implementationName}",
"EditConnectionImplementation": "Editar Notificação - {implementationName}",
"EditDownloadClientImplementation": "Editar Cliente de Transferência - {implementationName}",
"EditIndexerImplementation": "Editar Indexador - {implementationName}",
"Complete": "Completo",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Pontuação mínima de formato personalizado",
"BlocklistLoadError": "Não foi possível carregar a lista de bloqueio",
"BlocklistReleaseHelpText": "Impede o Radarr de capturar automaticamente estes ficheiros novamente",
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Pontuação Mínima do Formato Personalizado necessária para contornar o atraso do protocolo preferido",
"CustomFormatJson": "Formato personalizado JSON",
"DefaultNameCopiedProfile": "{name} - Copiar",
"DefaultNameCopiedSpecification": "{name} - Copiar",
"DelayingDownloadUntil": "Atraso da transferência até {date} a {time}",
"DeleteAutoTag": "Eliminar Etiqueta Automática",
"DeleteAutoTagHelpText": "Tem a certeza de que pretende eliminar a etiqueta automática \"{name}\"?",
"DeleteImportList": "Eliminar Lista de Importação",
"DeleteImportListMessageText": "Tem a certeza de que pretende eliminar a lista '{name}'?",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de descarregamento {0} está definido para remover descarregamentos concluídos. Isto pode fazer com que as transferências sejam removidas do seu cliente antes de {1} as poder importar.",
"AppUpdated": "{appName} Atualizado"
}

View File

@@ -4,18 +4,18 @@
"Languages": "Idiomas",
"LanguageHelpText": "Idioma das versões",
"Language": "Idioma",
"KeyboardShortcuts": "Atalhos do Teclado",
"KeyboardShortcuts": "Atalhos de teclado",
"KeepAndUnmonitorMovie": "Manter e não monitorar filme",
"InvalidFormat": "Formato Inválido",
"InvalidFormat": "Formato inválido",
"Interval": "Intervalo",
"InteractiveSearch": "Pesquisa Interativa",
"InteractiveImport": "Importação Interativa",
"InteractiveSearch": "Pesquisa interativa",
"InteractiveImport": "Importação interativa",
"InstallLatest": "Instalar mais recente",
"Info": "Info",
"Info": "Informações",
"IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}",
"IndexerStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas",
"IndexersSettingsSummary": "Indexadores e restrições de lançamento",
"IndexerSettings": "Configurações do Indexador",
"IndexerSettings": "Configurações do indexador",
"IndexerSearchCheckNoInteractiveMessage": "Nenhum indexador disponível com a Pesquisa interativa habilitada, o Radarr não fornecerá nenhum resultado de pesquisa interativa",
"IndexerSearchCheckNoAvailableIndexersMessage": "Todos os indexadores com capacidade de pesquisa estão temporariamente indisponíveis devido a erros recentes do indexador",
"IndexerSearchCheckNoAutomaticMessage": "Nenhum indexador disponível com a Pesquisa automática habilitada, o Radarr não fornecerá nenhum resultado de pesquisa automática",
@@ -81,8 +81,8 @@
"HardlinkCopyFiles": "Criar hardlink/Copiar arquivos",
"Group": "Grupo",
"GrabSelected": "Obter selecionado",
"GrabReleaseMessageText": "O Radarr não conseguiu determinar a qual filme este lançamento está relacionado. O Radarr pode não conseguir importar automaticamente este lançamento. Quer obter \"{0}\"?",
"GrabRelease": "Capturar Versão",
"GrabReleaseMessageText": "O Radarr não conseguiu determinar para qual filme é este lançamento. O Radarr pode não conseguir importar automaticamente este lançamento. Deseja obter \"{0}\"?",
"GrabRelease": "Obter lançamento",
"Grabbed": "Obtido",
"Grab": "Obter",
"GoToInterp": "Ir para {0}",
@@ -101,7 +101,7 @@
"Folders": "Pastas",
"FolderMoveRenameWarning": "Isso também renomeará a pasta do filme de acordo com o formato para pastas de filmes nas configurações.",
"Folder": "Pasta",
"FocusSearchBox": "Selecionar caixa de pesquisa",
"FocusSearchBox": "Selecionar a caixa de pesquisa",
"Fixed": "Corrigido",
"FirstDayOfWeek": "Primeiro dia da semana",
"FilterPlaceHolder": "Pesquisar filmes",
@@ -197,7 +197,7 @@
"Disabled": "Desabilitado",
"DigitalRelease": "Versão Digital",
"Details": "Detalhes",
"DetailedProgressBarHelpText": "Mostrar texto em barra de progresso",
"DetailedProgressBarHelpText": "Mostrar texto na barra de progresso",
"DetailedProgressBar": "Barra de progresso detalhada",
"DestinationRelativePath": "Caminho de destino relativo",
"DestinationPath": "Caminho de destino",
@@ -278,7 +278,7 @@
"ColonReplacementFormatHelpText": "Alterar como o Radarr lida com a substituição de dois-pontos",
"ColonReplacement": "Substituto para dois-pontos",
"Collection": "Coleção",
"CloseCurrentModal": "Fechar modal atual",
"CloseCurrentModal": "Fechar pop-up atual",
"Close": "Fechar",
"CloneProfile": "Clonar perfil",
"CloneIndexer": "Clonar indexador",
@@ -353,7 +353,7 @@
"AlreadyInYourLibrary": "Já está na sua biblioteca",
"MonitorMovie": "Monitorar filme",
"MonitoredStatus": "Monitorado/Status",
"MonitoredOnly": "Somente monitorado",
"MonitoredOnly": "Somente monitorados",
"MonitoredHelpText": "Baixar filme se disponível",
"Monitored": "Monitorado",
"Monitor": "Monitorar",
@@ -366,38 +366,38 @@
"MinutesNinety": "90 minutos: {0}",
"MinutesHundredTwenty": "120 minutos: {0}",
"Minutes": "Minutos",
"MinimumLimits": "Limites Mínimos",
"MinimumLimits": "Limites mínimos",
"MinimumFreeSpaceWhenImportingHelpText": "Impedir a importação se deixar menos do que esta quantidade de espaço em disco disponível",
"MinimumFreeSpace": "Espaço Livre Mínimo",
"MinimumCustomFormatScore": "Pontuação Mínima de Formato Personalizado",
"MinimumAgeHelpText": "Somente Usenet: Idade mínima em minutos dos NZBs antes de serem capturados. Use isso para dar aos novos lançamentos tempo para se propagar para seu provedor usenet.",
"MinimumAge": "Idade Miníma",
"MinimumFreeSpace": "Mínimo de espaço livre",
"MinimumCustomFormatScore": "Pontuação mínima de formato personalizado",
"MinimumAgeHelpText": "Somente Usenet: idade mínima, em minutos, dos NZBs antes de serem capturados. Use isso para dar aos novos lançamentos tempo para se propagar para seu provedor de Usenet.",
"MinimumAge": "Idade miníma",
"MinimumAvailability": "Disponibilidade mínima",
"MinFormatScoreHelpText": "Pontuação mínima de formato personalizado permitida para download",
"MinAvailability": "Disponibilidade mínina",
"MetadataSettingsSummary": "Criar arquivos de metadados quando os filmes são importados ou atualizados",
"MetadataSettingsSummary": "Criar arquivos de metadados ao importar ou atualizar filmes",
"Metadata": "Metadados",
"MetadataSettings": "Configurações de Metadados",
"MetadataSettings": "Configurações de metadados",
"Message": "Mensagem",
"MegabytesPerMinute": "Megabytes por minuto",
"Medium": "Médio",
"MediaManagementSettingsSummary": "Configurações de nomenclatura e gerenciamento de arquivos",
"MediaManagement": "Gerenciamento de mídia",
"MediaManagementSettings": "Configurações de Gerenciamento de Mídia",
"MediaManagementSettings": "Configurações de gerenciamento de mídia",
"MediaInfo": "Informações da mídia",
"Mechanism": "Mecanismo",
"MaximumSizeHelpText": "Tamanho máximo para uma liberação a ser capturada em MB. Defina como zero para definir como ilimitado",
"MaximumSize": "Tamanho Máximo",
"MaximumLimits": "Limites Máximos",
"MaximumSizeHelpText": "Tamanho máximo, em MB, para obter um lançamento. Zero significa ilimitado",
"MaximumSize": "Tamanho máximo",
"MaximumLimits": "Limites máximos",
"Max": "Máx.",
"MassMovieSearch": "Pesquisar filmes em massa",
"MarkAsFailed": "Marcar como Falha",
"MarkAsFailed": "Marcar como falha",
"MarkAsFailedMessageText": "Tem certeza que deseja marcar \"{0}\" como falhado?",
"MappedDrivesRunningAsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as Perguntas frequentes para saber mais",
"ManualImportSelectQuality": " Importação manual - Selecionar qualidade",
"ManualImportSelectMovie": "Importação manual - Selecionar filme",
"ManualImportSelectLanguage": "Importação manual - Selecionar idioma",
"ManualImport": "Importação Manual",
"ManualImport": "Importação manual",
"Manual": "Manual",
"MaintenanceRelease": "Versão de manutenção: correções de bugs e outros aprimoramentos. Consulte o Histórico de Commit do Github para obter mais detalhes",
"LowerCase": "Minúsculas",
@@ -405,8 +405,8 @@
"LookingForReleaseProfiles1": "Procurando pelos perfis de versões? Tente",
"Logs": "Registros",
"LogOnly": "Somente log",
"LogLevelTraceHelpTextWarning": "O registro de rastreamento deve ser ativado apenas temporariamente",
"LogLevel": "Nível de Registro",
"LogLevelTraceHelpTextWarning": "O registro em log deve ser habilitado apenas temporariamente",
"LogLevel": "Nível de registro",
"LogFiles": "Arquivos de registro",
"Location": "Localização",
"Local": "Local",
@@ -497,21 +497,21 @@
"Movie": "Filme",
"MoveFolders2": "Deseja mover os arquivos de filmes de \"{0}\" para \"{1}\"?",
"MoveFolders1": "Deseja mover as pastas de filmes para \"{0}\"?",
"MoveFiles": "Mover Arquivos",
"MoveFiles": "Mover arquivos",
"MountCheckMessage": "A montagem que contém um caminho de filme é montada somente para leitura: ",
"MoreInfo": "Mais informações",
"MoreDetails": "Mais detalhes",
"MoreControlCFText": "Quer mais controle sobre quais downloads são preferidos? Adicione um",
"Months": "Meses",
"Min": "Mín.",
"Logging": "Registrando",
"Logging": "Registro em log",
"NegateHelpText": "Se marcado, o formato personalizado não será aplicado se esta condição {0} corresponder.",
"Negated": "Negado",
"Negate": "Negar",
"NamingSettings": "Configurações de Nomes",
"NamingSettings": "Configurações de nomenclatura",
"Name": "Nome",
"MustNotContain": "Não Deve Conter",
"MustContain": "Deve Conter",
"MustNotContain": "Não deve conter",
"MustContain": "Deve conter",
"MultiLanguage": "Vários idiomas",
"View": "Exibir",
"Week": "Semana",
@@ -520,17 +520,17 @@
"Wiki": "Wiki",
"Year": "Ano",
"YesCancel": "Sim, Cancelar",
"YesMoveFiles": "Sim, Mover os Arquivos",
"YesMoveFiles": "Sim, mova os arquivos",
"YouCanAlsoSearch": "Você também pode pesquisar usando TMDb ID ou IMDb ID de um filme. Por exemplo: `tmdb: 71663`",
"NoMatchFound": "Nenhum resultado encontrado!",
"NoLogFiles": "Nenhum arquivo de registro",
"NoListRecommendations": "Não foram encontrados itens da lista ou recomendações. Para começar, adicione um novo filme, importe alguns existentes ou adicione uma lista.",
"NoLinks": "Sem Links",
"NoLimitForAnyRuntime": "Sem limite para qualquer tempo de execução",
"NoLinks": "Sem links",
"NoLimitForAnyRuntime": "Sem limite para qualquer duração",
"NoLeaveIt": "Não, deixe",
"NoHistory": "Não há histórico",
"NoEventsFound": "Não foram encontrados eventos",
"NoChanges": "Sem Alterações",
"NoChanges": "Sem alterações",
"NoChange": "Sem alteração",
"NoBackupsAreAvailable": "Não há backups disponíveis",
"NoAltTitle": "Nenhum título alternativo.",
@@ -666,7 +666,7 @@
"SettingsRemotePathMappingLocalPathHelpText": "Caminho que o Radarr deve usar para acessar o caminho remoto localmente",
"SettingsRemotePathMappingHostHelpText": "O mesmo host que você especificou para o Cliente de download remoto",
"SettingsRemotePathMappingLocalPath": "Caminho local",
"SettingsLongDateFormat": "Formato longo da data",
"SettingsLongDateFormat": "Formato longo de data",
"SettingsFirstDayOfWeek": "Primeiro dia da semana",
"Settings": "Configurações",
"SetTags": "Definir tags",
@@ -697,7 +697,7 @@
"ScriptPath": "Caminho do Script",
"Score": "Pontuação",
"Scheduled": "Programado",
"SaveSettings": "Salvar Configurações",
"SaveSettings": "Salvar configurações",
"SaveChanges": "Salvar Mudanças",
"Save": "Salvar",
"Runtime": "Duração",
@@ -722,7 +722,7 @@
"RescanAfterRefreshHelpTextWarning": "O Radarr não detectará automaticamente as alterações nos arquivos se não estiver definido como \"Sempre\"",
"RescanAfterRefreshHelpText": "Verificar novamente a pasta de filmes após atualizar o filme",
"RequiredRestrictionPlaceHolder": "Adicionar nova restrição",
"RequiredRestrictionHelpText": "A versão deve conter pelo menos um desses termos (não diferencia maiúsculas de minúsculas)",
"RequiredRestrictionHelpText": "O lançamento deve conter pelo menos um desses termos (sem distinção entre maiúsculas e minúsculas)",
"Required": "Necessário",
"ReplaceIllegalCharactersHelpText": "Substituir caracteres ilegais. Se desmarcada, o Radarr irá removê-los",
"ReplaceIllegalCharacters": "Substituir Caracteres Ilegais",
@@ -866,7 +866,7 @@
"OrganizeConfirm": "Tem certeza de que deseja organizar todos os arquivos no(s) {count} filme(s) selecionado(s)?",
"Organize": "Organizar",
"Options": "Opções",
"OpenThisModal": "Abrir este modal",
"OpenThisModal": "Abrir este pop-up",
"OpenBrowserOnStart": "Abrir navegador ao iniciar",
"OnUpgradeHelpText": "Ao atualizar",
"OnRenameHelpText": "Ao renomear",
@@ -888,10 +888,10 @@
"NotAvailable": "Indisponível",
"NoTagsHaveBeenAddedYet": "Nenhuma tag foi adicionada ainda",
"NoResultsFound": "Nenhum resultado encontrado",
"None": "Vazio",
"None": "Nenhum",
"NoMoviesExist": "Nenhum filme encontrado. Para começar, adicione um novo filme ou importe alguns existentes.",
"NoMoveFilesSelf": " Não, eu mesmo moverei os arquivos",
"NoMinimumForAnyRuntime": "Sem mínimo para qualquer tempo de execução",
"NoMinimumForAnyRuntime": "Sem mínimo para qualquer duração",
"ReplaceWithSpaceDashSpace": "Substituir com Espaço, Traço e Espaço",
"ReplaceWithSpaceDash": "Substituir por Espaço e Traço",
"ReplaceWithDash": "Substituir por Traço",
@@ -913,7 +913,7 @@
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.",
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.",
"UpdateAutomaticallyHelpText": "Baixe e instale atualizações automaticamente. Você ainda poderá instalar a partir do Sistema: Atualizações",
"UpdateAll": "Atualizar tudo",
"UpdateAll": "Atualizar Tudo",
"UnselectAll": "Deselecionar Todos",
"UnsavedChanges": "Alterações Não Salvas",
"Unreleased": "Inédito",
@@ -939,10 +939,10 @@
"UnableToLoadMovies": "Não foi possível carregar os filmes",
"UnableToLoadMetadata": "Não foi possível carregar os metadados",
"UnableToLoadMediaManagementSettings": "Não foi possível carregar as configurações de gerenciamento de mídia",
"UnableToLoadManualImportItems": "Não foi possível carregar os itens de importação manual",
"UnableToLoadManualImportItems": "Não foi possível carregar itens de importação manual",
"UnableToLoadLists": "Não foi possível carregar as listas",
"UnableToLoadListOptions": "Não foi possível carregar as opções de lista",
"UnableToLoadListExclusions": "Não foi possível carregar as exclusões de listas",
"UnableToLoadListExclusions": "Não foi possível carregar as exclusões de lista",
"UnableToLoadIndexers": "Não foi possível carregar os indexadores",
"UnableToLoadIndexerOptions": "Não foi possível carregar as opções do indexador",
"UnableToLoadGeneralSettings": "Não foi possível carregar as configurações gerais",
@@ -962,7 +962,7 @@
"SettingsEnableColorImpairedMode": "Habilitar modo para daltonismo",
"LastDuration": "Última Duração",
"Trace": "Traço",
"ImportNotForDownloads": "Não use para importar downloads de seu cliente. Isso se aplica apenas a bibliotecas organizadas existentes, e não para arquivos não classificados.",
"ImportNotForDownloads": "Não use para importar downloads de seu cliente. Isso se aplica apenas a bibliotecas organizadas existentes, e não a arquivos desorganizados.",
"ImportLibrary": "Importar biblioteca",
"DefaultCase": "Minúscula ou maiúscula padrão",
"ChooseAnotherFolder": "Escolha outra pasta",
@@ -1014,7 +1014,7 @@
"RemoveFromBlocklist": "Remover da lista de bloqueio",
"BlocklistReleases": "Lançamentos na lista de bloqueio",
"RemoveSelectedItems": "Remover itens selecionados",
"IndexerTagHelpText": "Usar este indexador apenas para filmes com pelo menos uma etiqueta correspondente. Deixe em branco para usar em todos os filmes.",
"IndexerTagHelpText": "Usar este indexador apenas para filmes com pelo menos uma tag correspondente. Deixe em branco para usar com todos os filmes.",
"RemoveSelectedItem": "Remover item selecionado",
"RemoveFailed": "Falha na remoção",
"RemoveCompleted": "Remoção Concluída",
@@ -1024,7 +1024,7 @@
"DiscordUrlInSlackNotification": "Você tem uma notificação do Discord configurado como uma notificação do Slack. Definir isso como uma notificação do Discord para melhor funcionalidade. Com efeito, notificações são: {0}",
"AnnouncedMsg": "Filme foi anunciado",
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para baixar deste indexador",
"LocalPath": "Caminho Local",
"LocalPath": "Caminho local",
"ManualImportSetReleaseGroup": "Importar Manual - Definir Grupo de Lançamento",
"SelectLanguages": "Selecione os Idiomas",
"SelectReleaseGroup": "Selecionar Grupo do Lançamento",
@@ -1050,7 +1050,7 @@
"Database": "Banco de dados",
"RefreshMonitoredIntervalHelpText": "Com que frequência atualizar downloads monitorados de clientes de download, no mínimo 1 minuto",
"RssSyncHelpText": "Intervalo em minutos. Defina como zero para desabilitar (isso interromperá todas as capturas de liberação automática)",
"InstanceName": "Nome da Instância",
"InstanceName": "Nome da instância",
"InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog",
"AllCollectionsHiddenDueToFilter": "Todos os filmes estão ocultos devido ao filtro aplicado.",
"Collections": "Coleções",
@@ -1092,7 +1092,7 @@
"DownloadClientSortingCheckMessage": "O cliente de download {0} tem classificação {1} habilitada para a categoria do Radarr. Você deve desativar a classificação em seu cliente de download para evitar problemas de importação.",
"File": "Arquivo",
"StopSelecting": "Parar Seleção",
"UpdateFiltered": "Atualização filtrada",
"UpdateFiltered": "Atualização Filtrada",
"EditMovies": "Editar Filmes",
"EditSelectedMovies": "Editar Filmes Selecionados",
"RecycleBinUnableToWriteHealthCheck": "Não é possível gravar na pasta da lixeira configurada: {0}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o Radarr",
@@ -1113,7 +1113,7 @@
"ScriptImportPathHelpText": "O caminho para o script a ser usado para importar",
"UseScriptImportHelpText": "Copiar arquivos para importar usando um script (p. ex. para transcodificação)",
"DeleteRemotePathMapping": "Excluir mapeamento de caminho remoto",
"NoHistoryBlocklist": "Sem histórico na lista de bloqueio",
"NoHistoryBlocklist": "Não há lista de bloqueio no histórico",
"DeleteConditionMessageText": "Tem certeza de que deseja excluir a condição '{name}'?",
"DeleteImportListExclusionMessageText": "Tem certeza de que deseja excluir esta exclusão da lista de importação?",
"DeleteRemotePathMappingMessageText": "Tem certeza de que deseja excluir este mapeamento de caminho remoto?",
@@ -1168,18 +1168,18 @@
"TestParsing": "Análise de teste",
"SkipRedownload": "Ignorar o Redownload",
"SkipRedownloadHelpText": "Evita que o Radarr tente baixar uma versão alternativa para este item",
"MoveAutomatically": "Mover Automaticamente",
"MoveAutomatically": "Mover automaticamente",
"AddAutoTag": "Adicionar Tag Automática",
"AddCondition": "Adicionar condição",
"AddCondition": "Adicionar Condição",
"AutoTaggingNegateHelpText": "se marcado, a regra de marcação automática não será aplicada se esta condição {0} corresponder.",
"RemoveTagsAutomatically": "Remover tags automaticamente",
"AutoTagging": "Marcação automática",
"RemoveTagsAutomatically": "Remover Tags Automaticamente",
"AutoTagging": "Tagging Automática",
"AutoTaggingRequiredHelpText": "Esta condição {0} deve corresponder para que a regra de marcação automática seja aplicada. Caso contrário, uma única correspondência {0} é suficiente.",
"CloneAutoTag": "Clonar tag automática",
"DeleteAutoTag": "Excluir tag automática",
"CloneAutoTag": "Clonar Tag Automática",
"DeleteAutoTag": "Excluir Tag Automática",
"DeleteAutoTagHelpText": "Tem certeza de que deseja excluir a tag automática '{name}'?",
"EditAutoTag": "Editar tag automática",
"RemoveTagsAutomaticallyHelpText": "Remova tags automaticamente se as condições não forem atendidas",
"EditAutoTag": "Editar Tag Automática",
"RemoveTagsAutomaticallyHelpText": "Remover tags automaticamente se as condições não forem encontradas",
"UnableToLoadAutoTagging": "Não foi possível carregar a marcação automática",
"DeleteRootFolder": "Excluir pasta raiz",
"DeleteRootFolderMessageText": "Tem certeza de que deseja excluir a pasta raiz '{path}'?",
@@ -1228,7 +1228,7 @@
"Default": "Padrão",
"DownloadClientsLoadError": "Não foi possível carregar os clientes de download",
"IMDbId": "Id do IMDb",
"ManualGrab": "Baixar Manualmente",
"ManualGrab": "Obter manualmente",
"OverrideAndAddToDownloadQueue": "Substituir e adicionar à fila de download",
"OverrideGrabModalTitle": "Substituir e Baixar - {title}",
"OverrideGrabNoLanguage": "Pelo menos um idioma deve ser selecionado",
@@ -1240,11 +1240,11 @@
"False": "Falso",
"InteractiveImportLoadError": "Não foi possível carregar itens de importação manual",
"InteractiveImportNoFilesFound": "Nenhum arquivo de vídeo foi encontrado na pasta selecionada",
"InteractiveImportNoImportMode": "Um modo de importação deve ser selecionado",
"InteractiveImportNoLanguage": "O idioma deve ser escolhido para cada arquivo selecionado",
"InteractiveImportNoImportMode": "Defina um modo de importação",
"InteractiveImportNoLanguage": "Defina um idioma para cada arquivo selecionado",
"InteractiveImportNoMovie": "O filme deve ser escolhido para cada arquivo selecionado",
"InteractiveImportNoQuality": "A qualidade deve ser escolhida para cada arquivo selecionado",
"InteractiveSearchResultsFailedErrorMessage": "A pesquisa falhou porque é {message}. Tente atualizar as informações do filme e verifique se as informações necessárias estão presentes antes de pesquisar novamente.",
"InteractiveImportNoQuality": "Defina a qualidade para cada arquivo selecionado",
"InteractiveSearchResultsFailedErrorMessage": "A pesquisa falhou porque {message}. Tente atualizar as informações do filme e verifique se as informações necessárias estão presentes antes de pesquisar novamente.",
"LanguagesLoadError": "Não foi possível carregar os idiomas",
"MovieSearchResultsLoadError": "Não foi possível carregar os resultados desta pesquisa de filmes. Tente mais tarde",
"ParseModalUnableToParse": "Não foi possível analisar o título fornecido, tente novamente.",
@@ -1258,9 +1258,9 @@
"SelectLanguageModalTitle": "{modalTitle} - Selecione o Idioma",
"SetReleaseGroupModalTitle": "{modalTitle} - Definir Grupo de Lançamento",
"True": "Verdadeiro",
"HealthMessagesInfoBox": "Você pode encontrar mais informações sobre a causa dessas mensagens de verificação de integridade clicando no link da wiki (ícone do livro) no final da linha ou verificando seus [logs]({link}). Se tiver dificuldade em interpretar essas mensagens, você pode entrar em contato com nosso suporte, nos links abaixo.",
"HealthMessagesInfoBox": "Para saber mais sobre a causa dessas mensagens de verificação de integridade, clique no link da wiki (ícone de livro) no final da linha ou verifique os [logs]({link}). Se tiver dificuldade em interpretar essas mensagens, entre em contato com nosso suporte nos links abaixo.",
"DefaultNameCopiedProfile": "{name} - Cópia",
"InvalidUILanguage": "Sua IU está configurada com um idioma inválido, corrija-a e salve suas configurações",
"InvalidUILanguage": "A interface está configurada com um idioma inválido, corrija-o e salve as configurações",
"AuthenticationMethod": "Método de autenticação",
"AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido",
"AuthenticationRequiredPasswordHelpTextWarning": "Digite uma nova senha",
@@ -1296,7 +1296,7 @@
"FormatAgeMinutes": "minutos",
"FormatDateTime": "{formattedDate} {formattedTime}",
"FormatRuntimeHours": "{hours}h",
"FormatRuntimeMinutes": "{minutes}m",
"FormatRuntimeMinutes": "{minutes} m",
"FormatShortTimeSpanHours": "{hours} hora(s)",
"FormatShortTimeSpanMinutes": "{minutes} minuto(s)",
"FormatShortTimeSpanSeconds": "{seconds} segundo(s)",
@@ -1333,5 +1333,6 @@
"AutoRedownloadFailedFromInteractiveSearch": "Falha no Novo Download pela Pesquisa Interativa",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Procure e tente baixar automaticamente uma versão diferente quando a versão com falha for obtida pela pesquisa interativa",
"AutoRedownloadFailed": "Falha no Novo Download",
"QueueFilterHasNoItems": "O filtro de fila selecionado não tem itens"
"QueueFilterHasNoItems": "O filtro de fila selecionado não possui itens",
"EnableProfile": "Habilitar Perfil"
}

View File

@@ -81,7 +81,7 @@
"BackupIntervalHelpText": "自动备份时间间隔",
"BackupFolderHelpText": "相对路径将在Radarr的AppData目录下",
"Backup": "备份",
"AuthenticationMethodHelpText": "需要用户名和密码以访问{appName}",
"AuthenticationMethodHelpText": "需要用户名和密码以访问 {appName}",
"Authentication": "认证",
"AudioInfo": "音频信息",
"AddRemotePathMapping": "添加远程目录映射",
@@ -99,7 +99,7 @@
"AddRootFolder": "添加根目录",
"AddQualityProfile": "添加质量配置",
"AddNewTmdbIdMessage": "您还可以使用电影的TMDb Id进行搜索。例如 'tmdb:71663'",
"UpdateAll": "全部更新",
"UpdateAll": "更新全部",
"AllMoviesHiddenDueToFilter": "根据应用的过滤项已隐藏全部的电影。",
"AllFiles": "全部文件",
"All": "全部",
@@ -121,7 +121,7 @@
"Username": "用户名",
"UseProxy": "使用代理",
"UpperCase": "大写字母",
"UnselectAll": "全不选",
"UnselectAll": "取消选择全部",
"UnsavedChanges": "未保存更改",
"Unreleased": "未发布",
"Unmonitored": "未监控",
@@ -131,7 +131,7 @@
"UnableToLoadUISettings": "无法加载UI设置",
"UnableToLoadTheCalendar": "无法加载日历",
"UnableToLoadTags": "无法加载标签",
"ShowSizeOnDisk": "显示占用磁盘体积",
"ShowSizeOnDisk": "显示已用空间",
"ShowRatings": "显示评分",
"ShowPath": "显示路径",
"ShownClickToHide": "显示,点击隐藏",
@@ -139,7 +139,7 @@
"ShowMovieInformation": "显示影片信息",
"ShowMonitored": "显示监控中的歌曲",
"ShowGenres": "显示风格",
"ShowDateAdded": "显示添加日期",
"ShowDateAdded": "显示加入时间",
"ShowCertification": "显示分级",
"ShowAsAllDayEvents": "作为全天事件显示",
"ShowAdvanced": "显示高级",
@@ -219,7 +219,7 @@
"RefreshMovie": "刷新影片",
"RefreshLists": "刷新列表",
"RefreshInformationAndScanDisk": "刷新信息并扫描磁盘",
"RefreshAndScan": "刷新&扫描",
"RefreshAndScan": "刷新扫描",
"Refresh": "刷新",
"RecyclingBinCleanup": "清理回收站",
"RecyclingBin": "回收站",
@@ -476,7 +476,7 @@
"Trigger": "触发器",
"Trailer": "预告片",
"TotalSpace": "总空间",
"TotalFileSize": "文件体积",
"TotalFileSize": "文件总大小",
"Tomorrow": "明天",
"Today": "今天",
"Titles": "标题",
@@ -530,11 +530,11 @@
"Agenda": "日程表",
"AfterManualRefresh": "在手动更新之后",
"AddToDownloadQueue": "添加到下载队列",
"AddListExclusion": "添加排除列表",
"AddListExclusion": "添加列表例外",
"AddingTag": "添加标签",
"AddImportExclusionHelpText": "防止列表中的电影被添加到 Radarr 中",
"AddExclusion": "添加排除",
"AddedToDownloadQueue": "已添加到下载队列",
"AddedToDownloadQueue": "已加入下载队列",
"Added": "已添加",
"Actions": "动作",
"IMDb": "IMDb",
@@ -700,7 +700,7 @@
"UseHardlinksInsteadOfCopy": "使用硬链接代替复制",
"RecycleBinHelpText": "影片文件会被移动到回收站以替代永久删除",
"TableOptions": "表格选项",
"UpdateSelected": "更新选",
"UpdateSelected": "更新选择的内容",
"ShowUnknownMovieItems": "显示未知影片条目",
"RenameMoviesHelpText": "如果重命名未启用Radarr会使用现有文件名",
"TorrentsDisabled": "Torrents关闭",
@@ -742,7 +742,7 @@
"Trace": "追踪",
"UpdateCheckUINotWritableMessage": "无法安装升级,因为用户“{1}”不可写入界面文件夹“{0}”。",
"ShowMonitoredHelpText": "在海报下显示监控状态",
"PosterSize": "海报尺寸",
"PosterSize": "海报大小",
"SubfolderWillBeCreatedAutomaticallyInterp": "影片文件夹会被自动创建",
"Queued": "队列中",
"WhatsNew": "什么是新的?",
@@ -752,21 +752,21 @@
"Posters": "海报",
"Medium": "中",
"Tags": "标签",
"OverviewOptions": "概选项",
"OverviewOptions": "概选项",
"ShowStudio": "显示工作室",
"ShowSearch": "显示搜索按钮",
"ShowSearch": "显示搜索",
"Sort": "排序",
"PhysicalReleaseDate": "碟片版发布日期",
"View": "查看",
"Studio": "工作室",
"Overview": "概",
"Overview": "概",
"RelativePath": "相对路径",
"Large": "大",
"StandardMovieFormat": "标准影片格式",
"QualityCutoffHasNotBeenMet": "影片还未满足质量配置",
"UISettingsSummary": "日历、日期和色弱模式选项",
"Scheduled": "计划中",
"ShowQualityProfile": "显示媒体质量配置",
"ShowQualityProfile": "显示质量配置文件",
"IndexerRssHealthCheckNoAvailableIndexers": "由于索引器错误所有支持rss的索引器暂时不可用",
"KeepAndUnmonitorMovie": "保持不监控影片",
"RadarrSupportsAnyIndexer": "Radarr支持任何使用Newznab标准的搜刮器以及下面列出的其他搜刮器。",
@@ -783,8 +783,8 @@
"SettingsShowRelativeDatesHelpText": "显示相对日期(今天昨天等)或绝对日期",
"ReleaseStatus": "发布状态",
"RecentFolders": "现有文件夹",
"ShowSearchHelpText": "在选项中显示搜索",
"PreviewRename": "预览重命名",
"ShowSearchHelpText": "悬停时显示搜索按钮",
"PreviewRename": "重命名预览",
"ForMoreInformationOnTheIndividualIndexers": "有关更多索引器的详细信息,请单击信息按钮。",
"ForMoreInformationOnTheIndividualImportListsClinkOnTheInfoButtons": "有关更多导入列表的详细信息请单击info按钮。",
"ForMoreInformationOnTheIndividualDownloadClients": "若需要查看有关下载客户端的详细信息,请点击“更多信息”按钮。",
@@ -1092,10 +1092,10 @@
"File": "文件",
"MovieMatchType": "电影匹配类型",
"Loading": "加载中",
"StopSelecting": "停止选",
"StopSelecting": "停止选",
"ThereWasAnErrorLoadingThisItem": "加载此项目时出错",
"ThereWasAnErrorLoadingThisPage": "加载此页时出错",
"UpdateFiltered": "更新过滤",
"UpdateFiltered": "更新过滤的内容",
"EditMovies": "编辑电影",
"EditSelectedMovies": "编辑选定的电影",
"RecycleBinUnableToWriteHealthCheck": "无法写入配置的回收站文件夹:{0}。确保此路径存在并且可由运行Radarr的用户写入",
@@ -1176,7 +1176,7 @@
"AddIndexerImplementation": "添加索引器 - {implementationName}",
"AddConnection": "添加连接",
"AddConnectionImplementation": "添加连接- {implementationName}",
"AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName}现在需要启用身份验证。您可以选择禁用本地地址的身份验证。",
"AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName} 现在需要启用身份验证。您可以禁用本地地址的身份验证。",
"CloneAutoTag": "复制自动标签",
"DeleteAutoTagHelpText": "你确定要删除 “{name}” 自动标签吗?",
"DeleteAutoTag": "删除自动标签",
@@ -1190,9 +1190,9 @@
"EditAutoTag": "编辑自动标签",
"AudioLanguages": "音频语言",
"DeleteImportList": "删除导入的列表",
"DisabledForLocalAddresses": "对局域网内禁用",
"AuthenticationRequired": "需要证",
"AuthenticationRequiredHelpText": "更改需要身份验证的请求。除非您了解风险,否则请勿更改。",
"DisabledForLocalAddresses": "在本地地址上禁用",
"AuthenticationRequired": "需要身份验证",
"AuthenticationRequiredHelpText": "更改身份验证的请求。除非您了解风险,否则请勿更改。",
"AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)",
"BypassDelayIfAboveCustomFormatScore": "若高于自定义格式分数则绕过",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "最小自定义格式分数",
@@ -1200,14 +1200,14 @@
"DeleteImportListMessageText": "您确定要删除列表 “{name}” 吗?",
"AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。",
"AuthenticationMethod": "认证方式",
"CustomFormatJson": "自定义格式 JSON",
"CustomFormatJson": "自定义格式JSON",
"DefaultNameCopiedProfile": "{name} - 复制",
"DefaultNameCopiedSpecification": "{name} - 复制",
"BlocklistLoadError": "无法加载黑名单",
"BlocklistReleaseHelpText": "阻止Radarr再次自动获取此版本",
"AuthenticationMethodHelpTextWarning": "请选择有效的证方式",
"AuthenticationRequiredPasswordHelpTextWarning": "输入新密码",
"AuthenticationRequiredUsernameHelpTextWarning": "输入新用户名",
"AuthenticationMethodHelpTextWarning": "请选择一个有效的身份验证方式",
"AuthenticationRequiredPasswordHelpTextWarning": "输入新密码",
"AuthenticationRequiredUsernameHelpTextWarning": "输入新用户名",
"BypassDelayIfAboveCustomFormatScoreHelpText": "当发布版本的评分高于配置的最小自定义格式评分时,跳过延时",
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "绕过首选协议延迟所需的最小自定义格式分数",
"ParseModalHelpTextDetails": "Radarr将尝试解析标题并向您显示有关它的详细信息",
@@ -1274,21 +1274,21 @@
"DeleteSelectedMovieFilesHelpText": "您确定要删除选定的电影文件吗?",
"False": "否",
"VideoDynamicRange": "视频动态范围",
"OrganizeLoadError": "读取预告片错误",
"OrganizeModalHeader": "整理&重命名",
"OrganizeLoadError": "载入预览时出错",
"OrganizeModalHeader": "整理重命名",
"OrganizeNamingPattern": "命名规则: ` {standardMovieFormat}`",
"OrganizeNothingToRename": "成功!我的工作已完成,没有文件要重命名。",
"OrganizeNothingToRename": "重命名成功!已没有需要重命名的文件。",
"OrganizeRelativePaths": "所有路径都相对于: `{path}`",
"OrganizeRenamingDisabled": "重命名禁用,没有东西可以重命名",
"OrganizeRenamingDisabled": "重命名禁用,无需重命名",
"OverrideAndAddToDownloadQueue": "覆盖并添加到下载队列",
"OverrideGrabModalTitle": "覆盖并抓取 - {title}",
"OverrideGrabNoQuality": "必须选择质量",
"ParseModalUnableToParse": "无法解析提供的标题,请再试一次。",
"ParseModalUnableToParse": "无法解析提供的标题,请重试。",
"QualitiesLoadError": "无法加载质量",
"ReleaseProfiles": "发行版概要",
"ReleaseProfilesLoadError": "无法加载发行版概要",
"RemoveSelectedBlocklistMessageText": "你确定你想从过滤清单中删除选中的项目吗?",
"SelectDownloadClientModalTitle": "{modalTitle} -选择下载客户端",
"SelectDownloadClientModalTitle": "{modalTitle} - 选择下载客户端",
"SetReleaseGroupModalTitle": "{modalTitle} - 设置发布组",
"ShowRottenTomatoesRating": "显示番茄评分",
"ShowRottenTomatoesRatingHelpText": "在海报下显示番茄评分",
@@ -1300,7 +1300,7 @@
"Umask": "掩码",
"Unknown": "未知",
"UnknownEventTooltip": "未知事件",
"OverrideGrabNoLanguage": "必须选择至少一种语言",
"OverrideGrabNoLanguage": "选择至少一种语言",
"PendingDownloadClientUnavailable": "挂起 - 下载客户端不可用",
"QueueLoadError": "加载队列失败",
"RemotePathMappingsInfo": "很少需要远程路径映射,如果{app}和你的下载客户端在同一个系统上,最好匹配你的路径。有关更多信息,请参阅[wiki]({wikiink})。",
@@ -1329,8 +1329,9 @@
"OverrideGrabNoMovie": "必须选择电影",
"RetryingDownloadOn": "于 {date} {time} 重试下载",
"Or": "或",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{0}设置为删除已完成的下载。这可能导致在{1}可以导入下载之前从您的客户端删除下载。",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端 {0} 已被设置为删除已完成的下载。这可能导致在 {1} 导入之前,已下载的文件会被从您的客户端中移除。",
"AutoRedownloadFailed": "重新下载失败",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "当从交互式搜索中获取失败的版本时,自动搜索并尝试下载其他版本",
"AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索中重新下载失败"
"AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索中重新下载失败",
"QueueFilterHasNoItems": "选定的队列过滤器没有项目"
}

View File

@@ -148,7 +148,7 @@ namespace NzbDrone.Core.Localization
{
if (!File.Exists(resourcePath))
{
_logger.Error("Missing translation/culture resource: {0}", resourcePath);
_logger.Trace("Missing translation/culture resource: {0}", resourcePath);
return;
}

View File

@@ -16,18 +16,18 @@ namespace NzbDrone.Core.Movies
public class MovieCutoffService : IMovieCutoffService
{
private readonly IMovieRepository _movieRepository;
private readonly IQualityProfileService _profileService;
private readonly IQualityProfileService _qualityProfileService;
public MovieCutoffService(IMovieRepository movieRepository, IQualityProfileService profileService, Logger logger)
public MovieCutoffService(IMovieRepository movieRepository, IQualityProfileService qualityProfileService, Logger logger)
{
_movieRepository = movieRepository;
_profileService = profileService;
_qualityProfileService = qualityProfileService;
}
public PagingSpec<Movie> MoviesWhereCutoffUnmet(PagingSpec<Movie> pagingSpec)
{
var qualitiesBelowCutoff = new List<QualitiesBelowCutoff>();
var profiles = _profileService.All();
var profiles = _qualityProfileService.All();
// Get all items less than the cutoff
foreach (var profile in profiles)

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FluentValidation.Results;
using NLog;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.ThingiProvider;
@@ -192,5 +193,26 @@ namespace NzbDrone.Core.Notifications
definition.SupportsOnApplicationUpdate = provider.SupportsOnApplicationUpdate;
definition.SupportsOnManualInteractionRequired = provider.SupportsOnManualInteractionRequired;
}
public override ValidationResult Test(NotificationDefinition definition)
{
var result = base.Test(definition);
if (definition.Id == 0)
{
return result;
}
if (result == null || result.IsValid)
{
_notificationStatusService.RecordSuccess(definition.Id);
}
else
{
_notificationStatusService.RecordFailure(definition.Id);
}
return result;
}
}
}

View File

@@ -5,6 +5,8 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Diacritical;
using DryIoc.ImTools;
using NLog;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions;
@@ -220,6 +222,23 @@ namespace NzbDrone.Core.Organizer
return TitlePrefixRegex.Replace(title, "$2, $1$3");
}
public static string TitleFirstCharacter(string title)
{
if (char.IsLetterOrDigit(title[0]))
{
return title.Substring(0, 1).ToUpper().RemoveDiacritics()[0].ToString();
}
// Try the second character if the first was non alphanumeric
if (char.IsLetterOrDigit(title[1]))
{
return title.Substring(1, 1).ToUpper().RemoveDiacritics()[0].ToString();
}
// Default to "_" if no alphanumeric character can be found in the first 2 positions
return "_";
}
public static string CleanFileName(string name, bool replace = true, ColonReplacementFormat colonReplacement = ColonReplacementFormat.Delete)
{
var colonReplacementFormat = colonReplacement.GetFormatString();
@@ -248,7 +267,7 @@ namespace NzbDrone.Core.Organizer
tokenHandlers["{Movie Title}"] = m => GetLanguageTitle(movie, m.CustomFormat);
tokenHandlers["{Movie CleanTitle}"] = m => CleanTitle(GetLanguageTitle(movie, m.CustomFormat));
tokenHandlers["{Movie TitleThe}"] = m => TitleThe(movie.Title);
tokenHandlers["{Movie TitleFirstCharacter}"] = m => TitleThe(GetLanguageTitle(movie, m.CustomFormat)).Substring(0, 1).FirstCharToUpper();
tokenHandlers["{Movie TitleFirstCharacter}"] = m => TitleFirstCharacter(TitleThe(GetLanguageTitle(movie, m.CustomFormat)));
tokenHandlers["{Movie OriginalTitle}"] = m => movie.MovieMetadata.Value.OriginalTitle ?? string.Empty;
tokenHandlers["{Movie CleanOriginalTitle}"] = m => CleanTitle(movie.MovieMetadata.Value.OriginalTitle ?? string.Empty);

View File

@@ -31,7 +31,8 @@ namespace NzbDrone.Core.Parser
(?<ukrainian>(?:(?:\dx)?UKR))|
(?<spanish>\b(?:español|castellano)\b)|
(?<latvian>\bLV\b)|
(?<telugu>\btel\b)",
(?<telugu>\btel\b)|
(?<vietnamese>\bVIE\b)",
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
private static readonly Regex CaseSensitiveLanguageRegex = new Regex(@"(?:(?i)(?<!SUB[\W|_|^]))(?:(?<lithuanian>\bLT\b)|
@@ -347,6 +348,11 @@ namespace NzbDrone.Core.Parser
{
languages.Add(Language.Telugu);
}
if (match.Groups["vietnamese"].Success)
{
languages.Add(Language.Vietnamese);
}
}
if (!languages.Any())

View File

@@ -4,11 +4,12 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.143" />
<PackageReference Include="Diacritical.Net" Version="1.0.4" />
<PackageReference Include="Equ" Version="2.3.0" />
<PackageReference Include="MailKit" Version="3.6.0" />
<PackageReference Include="Npgsql" Version="7.0.4" />
<PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" />
<PackageReference Include="Servarr.FFprobe" Version="5.1.2.106" />
<PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" />
<PackageReference Include="System.Memory" Version="4.5.5" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.21" />

View File

@@ -59,6 +59,11 @@ namespace NzbDrone.Core.ThingiProvider.Status
public virtual void RecordSuccess(int providerId)
{
if (providerId <= 0)
{
return;
}
lock (_syncRoot)
{
var status = GetProviderStatus(providerId);
@@ -79,6 +84,11 @@ namespace NzbDrone.Core.ThingiProvider.Status
protected virtual void RecordFailure(int providerId, TimeSpan minimumBackOff, bool escalate)
{
if (providerId <= 0)
{
return;
}
lock (_syncRoot)
{
var status = GetProviderStatus(providerId);

View File

@@ -0,0 +1,27 @@
using FluentValidation.Validators;
using NzbDrone.Core.Download;
namespace NzbDrone.Core.Validation
{
public class DownloadClientExistsValidator : PropertyValidator
{
private readonly IDownloadClientFactory _downloadClientFactory;
public DownloadClientExistsValidator(IDownloadClientFactory downloadClientFactory)
{
_downloadClientFactory = downloadClientFactory;
}
protected override string GetDefaultMessageTemplate() => "Download Client does not exist";
protected override bool IsValid(PropertyValidatorContext context)
{
if (context?.PropertyValue == null || (int)context.PropertyValue == 0)
{
return true;
}
return _downloadClientFactory.Exists((int)context.PropertyValue);
}
}
}

View File

@@ -1,27 +0,0 @@
using FluentValidation.Validators;
using NzbDrone.Core.Profiles.Qualities;
namespace NzbDrone.Core.Validation
{
public class ProfileExistsValidator : PropertyValidator
{
private readonly IQualityProfileService _profileService;
public ProfileExistsValidator(IQualityProfileService profileService)
{
_profileService = profileService;
}
protected override string GetDefaultMessageTemplate() => "QualityProfile does not exist";
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null)
{
return true;
}
return _profileService.Exists((int)context.PropertyValue);
}
}
}

View File

@@ -0,0 +1,27 @@
using FluentValidation.Validators;
using NzbDrone.Core.Profiles.Qualities;
namespace NzbDrone.Core.Validation
{
public class QualityProfileExistsValidator : PropertyValidator
{
private readonly IQualityProfileService _qualityProfileService;
public QualityProfileExistsValidator(IQualityProfileService qualityProfileService)
{
_qualityProfileService = qualityProfileService;
}
protected override string GetDefaultMessageTemplate() => "Quality Profile does not exist";
protected override bool IsValid(PropertyValidatorContext context)
{
if (context?.PropertyValue == null || (int)context.PropertyValue == 0)
{
return true;
}
return _qualityProfileService.Exists((int)context.PropertyValue);
}
}
}

View File

@@ -11,7 +11,7 @@ namespace NzbDrone.Integration.Test.ApiTests
{
private void GivenExistingMovie()
{
WaitForCompletion(() => Profiles.All().Count > 0);
WaitForCompletion(() => QualityProfiles.All().Count > 0);
foreach (var title in new[] { "The Dark Knight", "Pulp Fiction" })
{

View File

@@ -48,7 +48,7 @@ namespace NzbDrone.Integration.Test
protected override void InitializeTestTarget()
{
// Make sure tasks have been initialized so the config put below doesn't cause errors
WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("RssSync"));
WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("RssSync"), 20000);
Indexers.Post(new Radarr.Api.V3.Indexers.IndexerResource
{

View File

@@ -46,7 +46,7 @@ namespace NzbDrone.Integration.Test
public LogsClient Logs;
public ClientBase<NamingConfigResource> NamingConfig;
public NotificationClient Notifications;
public ClientBase<QualityProfileResource> Profiles;
public ClientBase<QualityProfileResource> QualityProfiles;
public ReleaseClient Releases;
public ClientBase<RootFolderResource> RootFolders;
public MovieClient Movies;
@@ -108,7 +108,7 @@ namespace NzbDrone.Integration.Test
Logs = new LogsClient(RestClient, ApiKey);
NamingConfig = new ClientBase<NamingConfigResource>(RestClient, ApiKey, "config/naming");
Notifications = new NotificationClient(RestClient, ApiKey);
Profiles = new ClientBase<QualityProfileResource>(RestClient, ApiKey);
QualityProfiles = new ClientBase<QualityProfileResource>(RestClient, ApiKey);
Releases = new ReleaseClient(RestClient, ApiKey);
RootFolders = new ClientBase<RootFolderResource>(RestClient, ApiKey);
Movies = new MovieClient(RestClient, ApiKey);
@@ -303,10 +303,10 @@ namespace NzbDrone.Integration.Test
return result.MovieFile;
}
public QualityProfileResource EnsureProfileCutoff(int profileId, Quality cutoff, bool upgradeAllowed)
public QualityProfileResource EnsureQualityProfileCutoff(int profileId, Quality cutoff, bool upgradeAllowed)
{
var needsUpdate = false;
var profile = Profiles.Get(profileId);
var profile = QualityProfiles.Get(profileId);
if (profile.Cutoff != cutoff.Id)
{
@@ -322,7 +322,7 @@ namespace NzbDrone.Integration.Test
if (needsUpdate)
{
profile = Profiles.Put(profile);
profile = QualityProfiles.Put(profile);
}
return profile;

View File

@@ -5,6 +5,7 @@ namespace Radarr.Api.V3.ImportLists
{
public class ImportListBulkResource : ProviderBulkResource<ImportListBulkResource>
{
public bool? Enabled { get; set; }
public bool? EnableAuto { get; set; }
public string RootFolderPath { get; set; }
public int? QualityProfileId { get; set; }
@@ -21,6 +22,7 @@ namespace Radarr.Api.V3.ImportLists
existingDefinitions.ForEach(existing =>
{
existing.Enabled = resource.Enabled ?? existing.Enabled;
existing.EnableAuto = resource.EnableAuto ?? existing.EnableAuto;
existing.RootFolderPath = resource.RootFolderPath ?? existing.RootFolderPath;
existing.QualityProfileId = resource.QualityProfileId ?? existing.QualityProfileId;

View File

@@ -12,13 +12,13 @@ namespace Radarr.Api.V3.ImportLists
public static readonly ImportListResourceMapper ResourceMapper = new ();
public static readonly ImportListBulkResourceMapper BulkResourceMapper = new ();
public ImportListController(IImportListFactory importListFactory, ProfileExistsValidator profileExistsValidator)
public ImportListController(IImportListFactory importListFactory, QualityProfileExistsValidator qualityProfileExistsValidator)
: base(importListFactory, "importlist", ResourceMapper, BulkResourceMapper)
{
SharedValidator.RuleFor(c => c.RootFolderPath).IsValidPath();
SharedValidator.RuleFor(c => c.MinimumAvailability).NotNull();
SharedValidator.RuleFor(c => c.QualityProfileId).ValidId();
SharedValidator.RuleFor(c => c.QualityProfileId).SetValidator(profileExistsValidator);
SharedValidator.RuleFor(c => c.QualityProfileId).SetValidator(qualityProfileExistsValidator);
}
}
}

View File

@@ -1,4 +1,5 @@
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Validation;
using Radarr.Http;
namespace Radarr.Api.V3.Indexers
@@ -9,9 +10,10 @@ namespace Radarr.Api.V3.Indexers
public static readonly IndexerResourceMapper ResourceMapper = new ();
public static readonly IndexerBulkResourceMapper BulkResourceMapper = new ();
public IndexerController(IndexerFactory indexerFactory)
public IndexerController(IndexerFactory indexerFactory, DownloadClientExistsValidator downloadClientExistsValidator)
: base(indexerFactory, "indexer", ResourceMapper, BulkResourceMapper)
{
SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator);
}
}
}

View File

@@ -21,6 +21,7 @@ namespace Radarr.Api.V3.Indexers
private readonly IMakeDownloadDecision _downloadDecisionMaker;
private readonly IProcessDownloadDecisions _downloadDecisionProcessor;
private readonly IIndexerFactory _indexerFactory;
private readonly IDownloadClientFactory _downloadClientFactory;
private readonly Logger _logger;
private static readonly object PushLock = new object();
@@ -28,6 +29,7 @@ namespace Radarr.Api.V3.Indexers
public ReleasePushController(IMakeDownloadDecision downloadDecisionMaker,
IProcessDownloadDecisions downloadDecisionProcessor,
IIndexerFactory indexerFactory,
IDownloadClientFactory downloadClientFactory,
IQualityProfileService qualityProfileService,
Logger logger)
: base(qualityProfileService)
@@ -35,6 +37,7 @@ namespace Radarr.Api.V3.Indexers
_downloadDecisionMaker = downloadDecisionMaker;
_downloadDecisionProcessor = downloadDecisionProcessor;
_indexerFactory = indexerFactory;
_downloadClientFactory = downloadClientFactory;
_logger = logger;
PostValidator.RuleFor(s => s.Title).NotEmpty();
@@ -57,6 +60,8 @@ namespace Radarr.Api.V3.Indexers
ResolveIndexer(info);
var downloadClientId = ResolveDownloadClientId(release);
DownloadDecision decision;
lock (PushLock)
@@ -65,12 +70,12 @@ namespace Radarr.Api.V3.Indexers
decision = decisions.FirstOrDefault();
_downloadDecisionProcessor.ProcessDecision(decision, release.DownloadClientId).GetAwaiter().GetResult();
_downloadDecisionProcessor.ProcessDecision(decision, downloadClientId).GetAwaiter().GetResult();
}
if (decision?.RemoteMovie.ParsedMovieInfo == null)
{
throw new ValidationException(new List<ValidationFailure> { new ValidationFailure("Title", "Unable to parse", release.Title) });
throw new ValidationException(new List<ValidationFailure> { new ("Title", "Unable to parse", release.Title) });
}
return MapDecisions(new[] { decision });
@@ -110,5 +115,26 @@ namespace Radarr.Api.V3.Indexers
_logger.Debug("Push Release {0} not associated with an indexer.", release.Title);
}
}
private int? ResolveDownloadClientId(ReleaseResource release)
{
var downloadClientId = release.DownloadClientId.GetValueOrDefault();
if (downloadClientId == 0 && release.DownloadClient.IsNotNullOrWhiteSpace())
{
var downloadClient = _downloadClientFactory.All().FirstOrDefault(v => v.Name.EqualsIgnoreCase(release.DownloadClient));
if (downloadClient != null)
{
_logger.Debug("Push Release {0} associated with download client {1} - {2}.", release.Title, downloadClientId, release.DownloadClient);
return downloadClient.Id;
}
_logger.Debug("Push Release {0} not associated with known download client {1}.", release.Title, release.DownloadClient);
}
return release.DownloadClientId;
}
}
}

View File

@@ -61,6 +61,9 @@ namespace Radarr.Api.V3.Indexers
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public int? DownloadClientId { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string DownloadClient { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool? ShouldOverride { get; set; }
}

View File

@@ -66,7 +66,7 @@ namespace Radarr.Api.V3.Movies
MovieAncestorValidator moviesAncestorValidator,
RecycleBinValidator recycleBinValidator,
SystemFolderValidator systemFolderValidator,
ProfileExistsValidator profileExistsValidator,
QualityProfileExistsValidator qualityProfileExistsValidator,
MovieFolderAsRootFolderValidator movieFolderAsRootFolderValidator,
Logger logger)
: base(signalRBroadcaster)
@@ -94,7 +94,7 @@ namespace Radarr.Api.V3.Movies
.SetValidator(systemFolderValidator)
.When(s => !s.Path.IsNullOrWhiteSpace());
SharedValidator.RuleFor(s => s.QualityProfileId).SetValidator(profileExistsValidator);
SharedValidator.RuleFor(s => s.QualityProfileId).SetValidator(qualityProfileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath)

View File

@@ -14,12 +14,12 @@ namespace Radarr.Api.V3.Profiles.Quality
[V3ApiController]
public class QualityProfileController : RestController<QualityProfileResource>
{
private readonly IQualityProfileService _profileService;
private readonly IQualityProfileService _qualityProfileService;
private readonly ICustomFormatService _formatService;
public QualityProfileController(IQualityProfileService profileService, ICustomFormatService formatService)
public QualityProfileController(IQualityProfileService qualityProfileService, ICustomFormatService formatService)
{
_profileService = profileService;
_qualityProfileService = qualityProfileService;
_formatService = formatService;
SharedValidator.RuleFor(c => c.Name).NotEmpty();
@@ -50,14 +50,14 @@ namespace Radarr.Api.V3.Profiles.Quality
public ActionResult<QualityProfileResource> Create(QualityProfileResource resource)
{
var model = resource.ToModel();
model = _profileService.Add(model);
model = _qualityProfileService.Add(model);
return Created(model.Id);
}
[RestDeleteById]
public void DeleteProfile(int id)
{
_profileService.Delete(id);
_qualityProfileService.Delete(id);
}
[RestPutById]
@@ -65,20 +65,20 @@ namespace Radarr.Api.V3.Profiles.Quality
{
var model = resource.ToModel();
_profileService.Update(model);
_qualityProfileService.Update(model);
return Accepted(model.Id);
}
protected override QualityProfileResource GetResourceById(int id)
{
return _profileService.Get(id).ToResource();
return _qualityProfileService.Get(id).ToResource();
}
[HttpGet]
public List<QualityProfileResource> GetAll()
{
return _profileService.All().ToResource();
return _qualityProfileService.All().ToResource();
}
}
}

View File

@@ -7,17 +7,17 @@ namespace Radarr.Api.V3.Profiles.Quality
[V3ApiController("qualityprofile/schema")]
public class QualityProfileSchemaController : Controller
{
private readonly IQualityProfileService _profileService;
private readonly IQualityProfileService _qualityProfileService;
public QualityProfileSchemaController(IQualityProfileService profileService)
public QualityProfileSchemaController(IQualityProfileService qualityProfileService)
{
_profileService = profileService;
_qualityProfileService = qualityProfileService;
}
[HttpGet]
public QualityProfileResource GetSchema()
{
var qualityProfile = _profileService.GetDefaultProfile(string.Empty);
var qualityProfile = _qualityProfileService.GetDefaultProfile(string.Empty);
return qualityProfile.ToResource();
}

View File

@@ -10074,6 +10074,10 @@
"applyTags": {
"$ref": "#/components/schemas/ApplyTags"
},
"enabled": {
"type": "boolean",
"nullable": true
},
"enableAuto": {
"type": "boolean",
"nullable": true
@@ -12566,6 +12570,10 @@
"format": "int32",
"nullable": true
},
"downloadClient": {
"type": "string",
"nullable": true
},
"shouldOverride": {
"type": "boolean",
"nullable": true