mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-22 17:04:39 -04:00
Compare commits
35 Commits
db-calls-l
...
v5.2.0.825
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d00678c1ba | ||
|
|
03df9b7f07 | ||
|
|
3442a0ecca | ||
|
|
3376a467ca | ||
|
|
1650ce17fb | ||
|
|
2f2004faa2 | ||
|
|
437e2f4597 | ||
|
|
17b8605751 | ||
|
|
b2a52e52b6 | ||
|
|
0f5fabdfcd | ||
|
|
6362ee9b7d | ||
|
|
50465fd482 | ||
|
|
54d447d55f | ||
|
|
50f48277e5 | ||
|
|
c2e206b7ac | ||
|
|
7a46de602f | ||
|
|
89820c1ff7 | ||
|
|
67e6e129ff | ||
|
|
b6001238e5 | ||
|
|
7bbdcc81bb | ||
|
|
3e8cbc497e | ||
|
|
60d2df043b | ||
|
|
da41cb8840 | ||
|
|
a4b7c99d91 | ||
|
|
8fb21e073b | ||
|
|
dbf424d454 | ||
|
|
a6dda70c0a | ||
|
|
e6fa14b1e6 | ||
|
|
b5c0d515ee | ||
|
|
b7aee25d0d | ||
|
|
233b85aaf3 | ||
|
|
80db9a7dd4 | ||
|
|
660d3d7643 | ||
|
|
d999aea36f | ||
|
|
5d45f1de89 |
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://dev.azure.com/Radarr/Radarr/_build/latest?definitionId=1&branchName=develop)
|
||||
[](https://translate.servarr.com/engage/radarr/?utm_source=widget)
|
||||
[](https://wiki.servarr.com/radarr/installation#docker)
|
||||
[](https://wiki.servarr.com/radarr/installation/docker)
|
||||

|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
@@ -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)'
|
||||
|
||||
@@ -81,4 +81,9 @@ QueueDetails.propTypes = {
|
||||
progressBar: PropTypes.node.isRequired
|
||||
};
|
||||
|
||||
QueueDetails.defaultProps = {
|
||||
trackedDownloadStatus: 'ok',
|
||||
trackedDownloadState: 'downloading'
|
||||
};
|
||||
|
||||
export default QueueDetails;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -58,6 +58,12 @@ const COLUMNS = [
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enabled',
|
||||
label: () => translate('Enabled'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableAuto',
|
||||
label: () => translate('AutomaticAdd'),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'enableAuto': string;
|
||||
'enabled': string;
|
||||
'implementation': string;
|
||||
'name': string;
|
||||
'qualityProfileId': string;
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -12,6 +12,7 @@ export interface Field {
|
||||
|
||||
interface ImportList extends ModelBase {
|
||||
enable: boolean;
|
||||
enabled: boolean;
|
||||
enableAuto: boolean;
|
||||
qualityProfileId: number;
|
||||
rootFolderPath: string;
|
||||
|
||||
43
frontend/src/typings/Queue.ts
Normal file
43
frontend/src/typings/Queue.ts
Normal 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;
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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" };
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)?"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "选定的队列过滤器没有项目"
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" })
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user