mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-06 13:31:28 -05:00
Compare commits
46 Commits
collection
...
v5.1.2.820
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d999aea36f | ||
|
|
5d45f1de89 | ||
|
|
3e5089719c | ||
|
|
ec69dfaabb | ||
|
|
aa13a40bad | ||
|
|
9b458812f1 | ||
|
|
1bdc48a889 | ||
|
|
e5d479a162 | ||
|
|
9a50fcb82a | ||
|
|
f2357e0b60 | ||
|
|
0591d05c3b | ||
|
|
299d50d56c | ||
|
|
7d3c01114b | ||
|
|
70376af70b | ||
|
|
9ef031bd9e | ||
|
|
3a9b276c43 | ||
|
|
aabf209a07 | ||
|
|
79c03f2fe6 | ||
|
|
9b36404071 | ||
|
|
ecfaea3885 | ||
|
|
bfbeb4c62e | ||
|
|
4b98d27f31 | ||
|
|
604d74270d | ||
|
|
15bb9139d1 | ||
|
|
32722eb704 | ||
|
|
e0c8a8f0d6 | ||
|
|
a3bb0541f0 | ||
|
|
e78bc34514 | ||
|
|
35c4538288 | ||
|
|
3981e816cd | ||
|
|
9354031571 | ||
|
|
a01328dc8c | ||
|
|
8cb6295ddc | ||
|
|
99f7d8bcf5 | ||
|
|
f13d479b88 | ||
|
|
23eb637bc3 | ||
|
|
3a786d0b9d | ||
|
|
6fb127235c | ||
|
|
5517e578b6 | ||
|
|
bced2e7b2e | ||
|
|
f7313369b5 | ||
|
|
b14e93e11f | ||
|
|
f5692d6cf1 | ||
|
|
a2d505c795 | ||
|
|
3d46bd2d8f | ||
|
|
017f272201 |
@@ -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.0.3'
|
||||
majorVersion: '5.1.2'
|
||||
minorVersion: $[counter('minorVersion', 2000)]
|
||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||
|
||||
@@ -14,6 +14,7 @@ import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptions
|
||||
import TablePager from 'Components/Table/TablePager';
|
||||
import { align, icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import HistoryFilterModal from './HistoryFilterModal';
|
||||
import HistoryRowConnector from './HistoryRowConnector';
|
||||
|
||||
class History extends Component {
|
||||
@@ -33,6 +34,7 @@ class History extends Component {
|
||||
columns,
|
||||
selectedFilterKey,
|
||||
filters,
|
||||
customFilters,
|
||||
totalRecords,
|
||||
onFilterSelect,
|
||||
onFirstPagePress,
|
||||
@@ -70,7 +72,8 @@ class History extends Component {
|
||||
alignMenu={align.RIGHT}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
filters={filters}
|
||||
customFilters={[]}
|
||||
customFilters={customFilters}
|
||||
filterModalConnectorComponent={HistoryFilterModal}
|
||||
onFilterSelect={onFilterSelect}
|
||||
/>
|
||||
</PageToolbarSection>
|
||||
@@ -144,8 +147,9 @@ History.propTypes = {
|
||||
moviesError: PropTypes.object,
|
||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
selectedFilterKey: PropTypes.string.isRequired,
|
||||
selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
|
||||
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
customFilters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
totalRecords: PropTypes.number,
|
||||
onFilterSelect: PropTypes.func.isRequired,
|
||||
onFirstPagePress: PropTypes.func.isRequired
|
||||
|
||||
@@ -4,6 +4,7 @@ import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import withCurrentPage from 'Components/withCurrentPage';
|
||||
import * as historyActions from 'Store/Actions/historyActions';
|
||||
import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector';
|
||||
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
|
||||
import History from './History';
|
||||
|
||||
@@ -11,11 +12,13 @@ function createMapStateToProps() {
|
||||
return createSelector(
|
||||
(state) => state.history,
|
||||
(state) => state.movies,
|
||||
(history, movies) => {
|
||||
createCustomFiltersSelector('history'),
|
||||
(history, movies, customFilters) => {
|
||||
return {
|
||||
isMoviesFetching: movies.isFetching,
|
||||
isMoviesPopulated: movies.isPopulated,
|
||||
moviesError: movies.error,
|
||||
customFilters,
|
||||
...history
|
||||
};
|
||||
}
|
||||
|
||||
54
frontend/src/Activity/History/HistoryFilterModal.tsx
Normal file
54
frontend/src/Activity/History/HistoryFilterModal.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import React, { useCallback } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
import FilterModal from 'Components/Filter/FilterModal';
|
||||
import { setHistoryFilter } from 'Store/Actions/historyActions';
|
||||
|
||||
function createHistorySelector() {
|
||||
return createSelector(
|
||||
(state: AppState) => state.history.items,
|
||||
(queueItems) => {
|
||||
return queueItems;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function createFilterBuilderPropsSelector() {
|
||||
return createSelector(
|
||||
(state: AppState) => state.history.filterBuilderProps,
|
||||
(filterBuilderProps) => {
|
||||
return filterBuilderProps;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
interface HistoryFilterModalProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function HistoryFilterModal(props: HistoryFilterModalProps) {
|
||||
const sectionItems = useSelector(createHistorySelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'history';
|
||||
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const dispatchSetFilter = useCallback(
|
||||
(payload: unknown) => {
|
||||
dispatch(setHistoryFilter(payload));
|
||||
},
|
||||
[dispatch]
|
||||
);
|
||||
|
||||
return (
|
||||
<FilterModal
|
||||
// TODO: Don't spread all the props
|
||||
{...props}
|
||||
sectionItems={sectionItems}
|
||||
filterBuilderProps={filterBuilderProps}
|
||||
customFilterType={customFilterType}
|
||||
dispatchSetFilter={dispatchSetFilter}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import FilterMenu from 'Components/Menu/FilterMenu';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
|
||||
@@ -21,6 +22,7 @@ import getSelectedIds from 'Utilities/Table/getSelectedIds';
|
||||
import removeOldSelectedState from 'Utilities/Table/removeOldSelectedState';
|
||||
import selectAll from 'Utilities/Table/selectAll';
|
||||
import toggleSelected from 'Utilities/Table/toggleSelected';
|
||||
import QueueFilterModal from './QueueFilterModal';
|
||||
import QueueOptionsConnector from './QueueOptionsConnector';
|
||||
import QueueRowConnector from './QueueRowConnector';
|
||||
import RemoveQueueItemsModal from './RemoveQueueItemsModal';
|
||||
@@ -153,11 +155,16 @@ class Queue extends Component {
|
||||
isMoviesPopulated,
|
||||
moviesError,
|
||||
columns,
|
||||
selectedFilterKey,
|
||||
filters,
|
||||
customFilters,
|
||||
count,
|
||||
totalRecords,
|
||||
isGrabbing,
|
||||
isRemoving,
|
||||
isRefreshMonitoredDownloadsExecuting,
|
||||
onRefreshPress,
|
||||
onFilterSelect,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
@@ -220,6 +227,15 @@ class Queue extends Component {
|
||||
iconName={icons.TABLE}
|
||||
/>
|
||||
</TableOptionsModalWrapper>
|
||||
|
||||
<FilterMenu
|
||||
alignMenu={align.RIGHT}
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
filters={filters}
|
||||
customFilters={customFilters}
|
||||
filterModalConnectorComponent={QueueFilterModal}
|
||||
onFilterSelect={onFilterSelect}
|
||||
/>
|
||||
</PageToolbarSection>
|
||||
</PageToolbar>
|
||||
|
||||
@@ -241,7 +257,11 @@ class Queue extends Component {
|
||||
{
|
||||
isAllPopulated && !hasError && !items.length ?
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('QueueIsEmpty')}
|
||||
{
|
||||
selectedFilterKey !== 'all' && count > 0 ?
|
||||
translate('QueueFilterHasNoItems') :
|
||||
translate('QueueIsEmpty')
|
||||
}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
@@ -325,13 +345,22 @@ Queue.propTypes = {
|
||||
moviesError: PropTypes.object,
|
||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
|
||||
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
customFilters: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
count: PropTypes.number.isRequired,
|
||||
totalRecords: PropTypes.number,
|
||||
isGrabbing: PropTypes.bool.isRequired,
|
||||
isRemoving: PropTypes.bool.isRequired,
|
||||
isRefreshMonitoredDownloadsExecuting: PropTypes.bool.isRequired,
|
||||
onRefreshPress: PropTypes.func.isRequired,
|
||||
onGrabSelectedPress: PropTypes.func.isRequired,
|
||||
onRemoveSelectedPress: PropTypes.func.isRequired
|
||||
onRemoveSelectedPress: PropTypes.func.isRequired,
|
||||
onFilterSelect: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
Queue.defaultProps = {
|
||||
count: 0
|
||||
};
|
||||
|
||||
export default Queue;
|
||||
|
||||
@@ -6,6 +6,7 @@ import * as commandNames from 'Commands/commandNames';
|
||||
import withCurrentPage from 'Components/withCurrentPage';
|
||||
import { executeCommand } from 'Store/Actions/commandActions';
|
||||
import * as queueActions from 'Store/Actions/queueActions';
|
||||
import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector';
|
||||
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
||||
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
|
||||
import Queue from './Queue';
|
||||
@@ -15,12 +16,16 @@ function createMapStateToProps() {
|
||||
(state) => state.movies,
|
||||
(state) => state.queue.options,
|
||||
(state) => state.queue.paged,
|
||||
(state) => state.queue.status.item,
|
||||
createCustomFiltersSelector('queue'),
|
||||
createCommandExecutingSelector(commandNames.REFRESH_MONITORED_DOWNLOADS),
|
||||
(movies, options, queue, isRefreshMonitoredDownloadsExecuting) => {
|
||||
(movies, options, queue, status, customFilters, isRefreshMonitoredDownloadsExecuting) => {
|
||||
return {
|
||||
count: options.includeUnknownMovieItems ? status.totalCount : status.count,
|
||||
isMoviesFetching: movies.isFetching,
|
||||
isMoviesPopulated: movies.isPopulated,
|
||||
moviesError: movies.error,
|
||||
customFilters,
|
||||
isRefreshMonitoredDownloadsExecuting,
|
||||
...options,
|
||||
...queue
|
||||
@@ -106,6 +111,10 @@ class QueueConnector extends Component {
|
||||
this.props.setQueueSort({ sortKey });
|
||||
};
|
||||
|
||||
onFilterSelect = (selectedFilterKey) => {
|
||||
this.props.setQueueFilter({ selectedFilterKey });
|
||||
};
|
||||
|
||||
onTableOptionChange = (payload) => {
|
||||
this.props.setQueueTableOption(payload);
|
||||
|
||||
@@ -140,6 +149,7 @@ class QueueConnector extends Component {
|
||||
onLastPagePress={this.onLastPagePress}
|
||||
onPageSelect={this.onPageSelect}
|
||||
onSortPress={this.onSortPress}
|
||||
onFilterSelect={this.onFilterSelect}
|
||||
onTableOptionChange={this.onTableOptionChange}
|
||||
onRefreshPress={this.onRefreshPress}
|
||||
onGrabSelectedPress={this.onGrabSelectedPress}
|
||||
@@ -162,6 +172,7 @@ QueueConnector.propTypes = {
|
||||
gotoQueueLastPage: PropTypes.func.isRequired,
|
||||
gotoQueuePage: PropTypes.func.isRequired,
|
||||
setQueueSort: PropTypes.func.isRequired,
|
||||
setQueueFilter: PropTypes.func.isRequired,
|
||||
setQueueTableOption: PropTypes.func.isRequired,
|
||||
clearQueue: PropTypes.func.isRequired,
|
||||
grabQueueItems: PropTypes.func.isRequired,
|
||||
|
||||
54
frontend/src/Activity/Queue/QueueFilterModal.tsx
Normal file
54
frontend/src/Activity/Queue/QueueFilterModal.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import React, { useCallback } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
import FilterModal from 'Components/Filter/FilterModal';
|
||||
import { setQueueFilter } from 'Store/Actions/queueActions';
|
||||
|
||||
function createQueueSelector() {
|
||||
return createSelector(
|
||||
(state: AppState) => state.queue.paged.items,
|
||||
(queueItems) => {
|
||||
return queueItems;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function createFilterBuilderPropsSelector() {
|
||||
return createSelector(
|
||||
(state: AppState) => state.queue.paged.filterBuilderProps,
|
||||
(filterBuilderProps) => {
|
||||
return filterBuilderProps;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
interface QueueFilterModalProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function QueueFilterModal(props: QueueFilterModalProps) {
|
||||
const sectionItems = useSelector(createQueueSelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'queue';
|
||||
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const dispatchSetFilter = useCallback(
|
||||
(payload: unknown) => {
|
||||
dispatch(setQueueFilter(payload));
|
||||
},
|
||||
[dispatch]
|
||||
);
|
||||
|
||||
return (
|
||||
<FilterModal
|
||||
// TODO: Don't spread all the props
|
||||
{...props}
|
||||
sectionItems={sectionItems}
|
||||
filterBuilderProps={filterBuilderProps}
|
||||
customFilterType={customFilterType}
|
||||
dispatchSetFilter={dispatchSetFilter}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import SortDirection from 'Helpers/Props/SortDirection';
|
||||
import { FilterBuilderProp } from './AppState';
|
||||
|
||||
export interface Error {
|
||||
responseJSON: {
|
||||
@@ -20,6 +21,10 @@ export interface PagedAppSectionState {
|
||||
pageSize: number;
|
||||
}
|
||||
|
||||
export interface AppSectionFilterState<T> {
|
||||
filterBuilderProps: FilterBuilderProp<T>[];
|
||||
}
|
||||
|
||||
export interface AppSectionSchemaState<T> {
|
||||
isSchemaFetching: boolean;
|
||||
isSchemaPopulated: boolean;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import InteractiveImportAppState from 'App/State/InteractiveImportAppState';
|
||||
import CalendarAppState from './CalendarAppState';
|
||||
import CommandAppState from './CommandAppState';
|
||||
import HistoryAppState from './HistoryAppState';
|
||||
import MovieCollectionAppState from './MovieCollectionAppState';
|
||||
import MovieFilesAppState from './MovieFilesAppState';
|
||||
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
|
||||
@@ -46,6 +47,7 @@ export interface CustomFilter {
|
||||
interface AppState {
|
||||
calendar: CalendarAppState;
|
||||
commands: CommandAppState;
|
||||
history: HistoryAppState;
|
||||
interactiveImport: InteractiveImportAppState;
|
||||
movieCollections: MovieCollectionAppState;
|
||||
movieFiles: MovieFilesAppState;
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import AppSectionState from 'App/State/AppSectionState';
|
||||
import AppSectionState, {
|
||||
AppSectionFilterState,
|
||||
} from 'App/State/AppSectionState';
|
||||
import Movie from 'Movie/Movie';
|
||||
import { FilterBuilderProp } from './AppState';
|
||||
|
||||
interface CalendarAppState extends AppSectionState<Movie> {
|
||||
filterBuilderProps: FilterBuilderProp<Movie>[];
|
||||
}
|
||||
interface CalendarAppState
|
||||
extends AppSectionState<Movie>,
|
||||
AppSectionFilterState<Movie> {}
|
||||
|
||||
export default CalendarAppState;
|
||||
|
||||
10
frontend/src/App/State/HistoryAppState.ts
Normal file
10
frontend/src/App/State/HistoryAppState.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import AppSectionState, {
|
||||
AppSectionFilterState,
|
||||
} from 'App/State/AppSectionState';
|
||||
import History from 'typings/History';
|
||||
|
||||
interface HistoryAppState
|
||||
extends AppSectionState<History>,
|
||||
AppSectionFilterState<History> {}
|
||||
|
||||
export default HistoryAppState;
|
||||
@@ -1,6 +1,8 @@
|
||||
import AppSectionState from 'App/State/AppSectionState';
|
||||
import MovieCollection from 'typings/MovieCollection';
|
||||
|
||||
type MovieCollectionAppState = AppSectionState<MovieCollection>;
|
||||
interface MovieCollectionAppState extends AppSectionState<MovieCollection> {
|
||||
itemMap: Record<number, number>;
|
||||
}
|
||||
|
||||
export default MovieCollectionAppState;
|
||||
|
||||
@@ -2,7 +2,11 @@ import ModelBase from 'App/ModelBase';
|
||||
import Language from 'Language/Language';
|
||||
import { QualityModel } from 'Quality/Quality';
|
||||
import CustomFormat from 'typings/CustomFormat';
|
||||
import AppSectionState, { AppSectionItemState, Error } from './AppSectionState';
|
||||
import AppSectionState, {
|
||||
AppSectionFilterState,
|
||||
AppSectionItemState,
|
||||
Error,
|
||||
} from './AppSectionState';
|
||||
|
||||
export interface StatusMessage {
|
||||
title: string;
|
||||
@@ -35,7 +39,9 @@ export interface QueueDetailsAppState extends AppSectionState<Queue> {
|
||||
params: unknown;
|
||||
}
|
||||
|
||||
export interface QueuePagedAppState extends AppSectionState<Queue> {
|
||||
export interface QueuePagedAppState
|
||||
extends AppSectionState<Queue>,
|
||||
AppSectionFilterState<Queue> {
|
||||
isGrabbing: boolean;
|
||||
grabError: Error;
|
||||
isRemoving: boolean;
|
||||
|
||||
@@ -42,9 +42,9 @@ function Agenda(props) {
|
||||
<div className={styles.agenda}>
|
||||
{
|
||||
items.map((item, index) => {
|
||||
const momentDate = moment(item.inCinemas);
|
||||
const momentDate = moment(item.sortDate);
|
||||
const showDate = index === 0 ||
|
||||
!moment(items[index - 1].inCinemas).isSame(momentDate, 'day');
|
||||
!moment(items[index - 1].sortDate).isSame(momentDate, 'day');
|
||||
|
||||
return (
|
||||
<AgendaEventConnector
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
}
|
||||
|
||||
@media only screen and (max-width: $breakpointSmall) {
|
||||
.event {
|
||||
.overlay {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
@@ -111,5 +111,4 @@
|
||||
.releaseIcon {
|
||||
margin-right: 20px;
|
||||
width: 25px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ class AgendaEvent extends Component {
|
||||
|
||||
<div className={styles.overlay}>
|
||||
<div className={styles.date}>
|
||||
{(showDate) ? startTime.format(longDateFormat) : null}
|
||||
{showDate ? startTime.format(longDateFormat) : null}
|
||||
</div>
|
||||
|
||||
<div className={styles.releaseIcon}>
|
||||
|
||||
@@ -23,13 +23,11 @@ function createFilterBuilderPropsSelector() {
|
||||
);
|
||||
}
|
||||
|
||||
interface SeriesIndexFilterModalProps {
|
||||
interface CalendarFilterModalProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
export default function CalendarFilterModal(
|
||||
props: SeriesIndexFilterModalProps
|
||||
) {
|
||||
export default function CalendarFilterModal(props: CalendarFilterModalProps) {
|
||||
const sectionItems = useSelector(createCalendarSelector());
|
||||
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
|
||||
const customFilterType = 'calendar';
|
||||
|
||||
@@ -21,6 +21,7 @@ function createMapStateToProps() {
|
||||
|
||||
return {
|
||||
...collection,
|
||||
movies: [...collection.movies].sort((a, b) => b.year - a.year),
|
||||
genres: Array.from(new Set(allGenres)).slice(0, 3)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ class CollectionMovie extends Component {
|
||||
const {
|
||||
id,
|
||||
title,
|
||||
status,
|
||||
overview,
|
||||
year,
|
||||
tmdbId,
|
||||
@@ -123,11 +124,11 @@ class CollectionMovie extends Component {
|
||||
|
||||
<div className={styles.overlay}>
|
||||
<div className={styles.overlayTitle}>
|
||||
{title}
|
||||
{title} {year > 0 ? `(${year})` : ''}
|
||||
</div>
|
||||
|
||||
{
|
||||
id &&
|
||||
id ?
|
||||
<div className={styles.overlayStatus}>
|
||||
<MovieIndexProgressBar
|
||||
monitored={monitored}
|
||||
@@ -138,7 +139,8 @@ class CollectionMovie extends Component {
|
||||
detailedProgressBar={detailedProgressBar}
|
||||
isAvailable={isAvailable}
|
||||
/>
|
||||
</div>
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
</div>
|
||||
</Link>
|
||||
@@ -171,6 +173,7 @@ CollectionMovie.propTypes = {
|
||||
id: PropTypes.number,
|
||||
title: PropTypes.string.isRequired,
|
||||
year: PropTypes.number.isRequired,
|
||||
status: PropTypes.string.isRequired,
|
||||
overview: PropTypes.string.isRequired,
|
||||
monitored: PropTypes.bool,
|
||||
collectionId: PropTypes.number.isRequired,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
margin: 2px 4px;
|
||||
border: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
background-color: #eee;
|
||||
background-color: var(--inputBackgroundColor);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
padding: 0 4px;
|
||||
border-left: 4px;
|
||||
border-left-style: solid;
|
||||
background-color: var(--white);
|
||||
background-color: var(--themeLightColor);
|
||||
color: var(--defaultColor);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ class CollectionMovieLabel extends Component {
|
||||
const {
|
||||
id,
|
||||
title,
|
||||
year,
|
||||
status,
|
||||
monitored,
|
||||
isAvailable,
|
||||
@@ -35,9 +36,7 @@ class CollectionMovieLabel extends Component {
|
||||
}
|
||||
|
||||
<span>
|
||||
{
|
||||
title
|
||||
}
|
||||
{title} {year > 0 ? `(${year})` : ''}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -62,6 +61,7 @@ class CollectionMovieLabel extends Component {
|
||||
CollectionMovieLabel.propTypes = {
|
||||
id: PropTypes.number,
|
||||
title: PropTypes.string.isRequired,
|
||||
year: PropTypes.number.isRequired,
|
||||
status: PropTypes.string,
|
||||
isAvailable: PropTypes.bool,
|
||||
monitored: PropTypes.bool,
|
||||
|
||||
@@ -28,7 +28,6 @@ function calculatePosterWidth(posterSize, isSmallScreen) {
|
||||
}
|
||||
|
||||
function calculateRowHeight(posterHeight, sortKey, isSmallScreen, overviewOptions) {
|
||||
|
||||
const heights = [
|
||||
overviewOptions.showPosters ? posterHeight : 75,
|
||||
isSmallScreen ? columnPaddingSmallScreen : columnPadding
|
||||
@@ -122,8 +121,8 @@ class CollectionOverviews extends Component {
|
||||
overviewOptions
|
||||
} = this.props;
|
||||
|
||||
const posterWidth = calculatePosterWidth(overviewOptions.size, isSmallScreen);
|
||||
const posterHeight = calculatePosterHeight(posterWidth);
|
||||
const posterWidth = overviewOptions.showPosters ? calculatePosterWidth(overviewOptions.size, isSmallScreen) : 0;
|
||||
const posterHeight = overviewOptions.showPosters ? calculatePosterHeight(posterWidth) : 0;
|
||||
const rowHeight = calculateRowHeight(posterHeight, sortKey, isSmallScreen, overviewOptions);
|
||||
|
||||
this.setState({
|
||||
|
||||
@@ -6,9 +6,12 @@ import { filterBuilderTypes, filterBuilderValueTypes, icons } from 'Helpers/Prop
|
||||
import BoolFilterBuilderRowValue from './BoolFilterBuilderRowValue';
|
||||
import DateFilterBuilderRowValue from './DateFilterBuilderRowValue';
|
||||
import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector';
|
||||
import HistoryEventTypeFilterBuilderRowValue from './HistoryEventTypeFilterBuilderRowValue';
|
||||
import ImportListFilterBuilderRowValueConnector from './ImportListFilterBuilderRowValueConnector';
|
||||
import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector';
|
||||
import LanguageFilterBuilderRowValue from './LanguageFilterBuilderRowValue';
|
||||
import MinimumAvailabilityFilterBuilderRowValue from './MinimumAvailabilityFilterBuilderRowValue';
|
||||
import MovieFilterBuilderRowValue from './MovieFilterBuilderRowValue';
|
||||
import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue';
|
||||
import QualityFilterBuilderRowValueConnector from './QualityFilterBuilderRowValueConnector';
|
||||
import QualityProfileFilterBuilderRowValueConnector from './QualityProfileFilterBuilderRowValueConnector';
|
||||
@@ -58,9 +61,15 @@ function getRowValueConnector(selectedFilterBuilderProp) {
|
||||
case filterBuilderValueTypes.DATE:
|
||||
return DateFilterBuilderRowValue;
|
||||
|
||||
case filterBuilderValueTypes.HISTORY_EVENT_TYPE:
|
||||
return HistoryEventTypeFilterBuilderRowValue;
|
||||
|
||||
case filterBuilderValueTypes.INDEXER:
|
||||
return IndexerFilterBuilderRowValueConnector;
|
||||
|
||||
case filterBuilderValueTypes.LANGUAGE:
|
||||
return LanguageFilterBuilderRowValue;
|
||||
|
||||
case filterBuilderValueTypes.PROTOCOL:
|
||||
return ProtocolFilterBuilderRowValue;
|
||||
|
||||
@@ -70,6 +79,9 @@ function getRowValueConnector(selectedFilterBuilderProp) {
|
||||
case filterBuilderValueTypes.QUALITY_PROFILE:
|
||||
return QualityProfileFilterBuilderRowValueConnector;
|
||||
|
||||
case filterBuilderValueTypes.MOVIE:
|
||||
return MovieFilterBuilderRowValue;
|
||||
|
||||
case filterBuilderValueTypes.RELEASE_STATUS:
|
||||
return ReleaseStatusFilterBuilderRowValue;
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import { FilterBuilderProp } from 'App/State/AppState';
|
||||
|
||||
interface FilterBuilderRowOnChangeProps {
|
||||
name: string;
|
||||
value: unknown[];
|
||||
}
|
||||
|
||||
interface FilterBuilderRowValueProps {
|
||||
filterType?: string;
|
||||
filterValue: string | number | object | string[] | number[] | object[];
|
||||
selectedFilterBuilderProp: FilterBuilderProp<unknown>;
|
||||
sectionItem: unknown[];
|
||||
onChange: (payload: FilterBuilderRowOnChangeProps) => void;
|
||||
}
|
||||
|
||||
export default FilterBuilderRowValueProps;
|
||||
@@ -1,5 +1,5 @@
|
||||
.tag {
|
||||
height: 21px;
|
||||
display: flex;
|
||||
|
||||
&.isLastTag {
|
||||
.or {
|
||||
@@ -18,4 +18,5 @@
|
||||
.or {
|
||||
margin: 0 3px;
|
||||
color: var(--themeDarkColor);
|
||||
line-height: 31px;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import styles from './FilterBuilderRowValueTag.css';
|
||||
|
||||
function FilterBuilderRowValueTag(props) {
|
||||
return (
|
||||
<span
|
||||
<div
|
||||
className={styles.tag}
|
||||
>
|
||||
<TagInputTag
|
||||
@@ -22,7 +22,7 @@ function FilterBuilderRowValueTag(props) {
|
||||
{translate('Or')}
|
||||
</div>
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import React from 'react';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import FilterBuilderRowValue from './FilterBuilderRowValue';
|
||||
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
|
||||
|
||||
const EVENT_TYPE_OPTIONS = [
|
||||
{
|
||||
id: 1,
|
||||
get name() {
|
||||
return translate('Grabbed');
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
get name() {
|
||||
return translate('Imported');
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
get name() {
|
||||
return translate('Failed');
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
get name() {
|
||||
return translate('Deleted');
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
get name() {
|
||||
return translate('Renamed');
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
get name() {
|
||||
return translate('Ignored');
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
function HistoryEventTypeFilterBuilderRowValue(
|
||||
props: FilterBuilderRowValueProps
|
||||
) {
|
||||
return <FilterBuilderRowValue {...props} tagList={EVENT_TYPE_OPTIONS} />;
|
||||
}
|
||||
|
||||
export default HistoryEventTypeFilterBuilderRowValue;
|
||||
@@ -0,0 +1,13 @@
|
||||
import React from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import createLanguagesSelector from 'Store/Selectors/createLanguagesSelector';
|
||||
import FilterBuilderRowValue from './FilterBuilderRowValue';
|
||||
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
|
||||
|
||||
function LanguageFilterBuilderRowValue(props: FilterBuilderRowValueProps) {
|
||||
const { items } = useSelector(createLanguagesSelector());
|
||||
|
||||
return <FilterBuilderRowValue {...props} tagList={items} />;
|
||||
}
|
||||
|
||||
export default LanguageFilterBuilderRowValue;
|
||||
@@ -0,0 +1,19 @@
|
||||
import React from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import Movie from 'Movie/Movie';
|
||||
import createAllMoviesSelector from 'Store/Selectors/createAllMoviesSelector';
|
||||
import sortByName from 'Utilities/Array/sortByName';
|
||||
import FilterBuilderRowValue from './FilterBuilderRowValue';
|
||||
import FilterBuilderRowValueProps from './FilterBuilderRowValueProps';
|
||||
|
||||
function MovieFilterBuilderRowValue(props: FilterBuilderRowValueProps) {
|
||||
const allMovies: Movie[] = useSelector(createAllMoviesSelector());
|
||||
|
||||
const tagList = allMovies
|
||||
.map((movie) => ({ id: movie.id, name: movie.title }))
|
||||
.sort(sortByName);
|
||||
|
||||
return <FilterBuilderRowValue {...props} tagList={tagList} />;
|
||||
}
|
||||
|
||||
export default MovieFilterBuilderRowValue;
|
||||
@@ -2,8 +2,10 @@
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-right: $formLabelRightMarginWidth;
|
||||
padding-top: 8px;
|
||||
min-height: 35px;
|
||||
text-align: end;
|
||||
font-weight: bold;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
.hasError {
|
||||
|
||||
@@ -37,6 +37,8 @@ function getType({ type, selectOptionsProviderAction }) {
|
||||
return inputTypes.OAUTH;
|
||||
case 'rootFolder':
|
||||
return inputTypes.ROOT_FOLDER_SELECT;
|
||||
case 'qualityProfile':
|
||||
return inputTypes.QUALITY_PROFILE_SELECT;
|
||||
default:
|
||||
return inputTypes.TEXT;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import React from 'react';
|
||||
import Icon from 'Components/Icon';
|
||||
import Link from 'Components/Link/Link';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ModalContent.css';
|
||||
|
||||
function ModalContent(props) {
|
||||
@@ -28,6 +29,7 @@ function ModalContent(props) {
|
||||
<Icon
|
||||
name={icons.CLOSE}
|
||||
size={18}
|
||||
title={translate('Close')}
|
||||
/>
|
||||
</Link>
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ class PageHeader extends Component {
|
||||
aria-label="Donate"
|
||||
to="https://radarr.video/donate"
|
||||
size={14}
|
||||
title={translate('Donate')}
|
||||
/>
|
||||
<IconButton
|
||||
className={styles.translate}
|
||||
|
||||
@@ -24,6 +24,7 @@ function PageHeaderActionsMenu(props) {
|
||||
<MenuButton className={styles.menuButton} aria-label="Menu Button">
|
||||
<Icon
|
||||
name={icons.INTERACTIVE}
|
||||
title={translate('Menu')}
|
||||
/>
|
||||
</MenuButton>
|
||||
|
||||
|
||||
@@ -2,10 +2,13 @@ export const BOOL = 'bool';
|
||||
export const BYTES = 'bytes';
|
||||
export const DATE = 'date';
|
||||
export const DEFAULT = 'default';
|
||||
export const HISTORY_EVENT_TYPE = 'historyEventType';
|
||||
export const INDEXER = 'indexer';
|
||||
export const LANGUAGE = 'language';
|
||||
export const PROTOCOL = 'protocol';
|
||||
export const QUALITY = 'quality';
|
||||
export const QUALITY_PROFILE = 'qualityProfile';
|
||||
export const MOVIE = 'movie';
|
||||
export const RELEASE_STATUS = 'releaseStatus';
|
||||
export const MINIMUM_AVAILABILITY = 'minimumAvailability';
|
||||
export const TAG = 'tag';
|
||||
|
||||
@@ -202,6 +202,12 @@
|
||||
.headerContent {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: 300;
|
||||
font-size: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: $breakpointLarge) {
|
||||
|
||||
@@ -44,7 +44,7 @@ import MovieCollectionLabelConnector from './../MovieCollectionLabelConnector';
|
||||
import MovieCastPostersConnector from './Credits/Cast/MovieCastPostersConnector';
|
||||
import MovieCrewPostersConnector from './Credits/Crew/MovieCrewPostersConnector';
|
||||
import MovieDetailsLinks from './MovieDetailsLinks';
|
||||
import MovieReleaseDatesConnector from './MovieReleaseDatesConnector';
|
||||
import MovieReleaseDates from './MovieReleaseDates';
|
||||
import MovieStatusLabel from './MovieStatusLabel';
|
||||
import MovieTagsConnector from './MovieTagsConnector';
|
||||
import MovieTitlesTable from './Titles/MovieTitlesTable';
|
||||
@@ -433,7 +433,7 @@ class MovieDetails extends Component {
|
||||
}
|
||||
title={translate('ReleaseDates')}
|
||||
body={
|
||||
<MovieReleaseDatesConnector
|
||||
<MovieReleaseDates
|
||||
inCinemas={inCinemas}
|
||||
physicalRelease={physicalRelease}
|
||||
digitalRelease={digitalRelease}
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Icon from 'Components/Icon';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import getRelativeDate from 'Utilities/Date/getRelativeDate';
|
||||
import styles from './MovieReleaseDates.css';
|
||||
|
||||
function MovieReleaseDates(props) {
|
||||
const {
|
||||
showRelativeDates,
|
||||
shortDateFormat,
|
||||
timeFormat,
|
||||
inCinemas,
|
||||
physicalRelease,
|
||||
digitalRelease
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
!!inCinemas &&
|
||||
<div >
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon
|
||||
name={icons.IN_CINEMAS}
|
||||
/>
|
||||
</div>
|
||||
{getRelativeDate(inCinemas, shortDateFormat, showRelativeDates, { timeFormat, timeForToday: false })}
|
||||
</div>
|
||||
}
|
||||
{
|
||||
!!digitalRelease &&
|
||||
<div >
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon
|
||||
name={icons.MOVIE_FILE}
|
||||
/>
|
||||
</div>
|
||||
{getRelativeDate(digitalRelease, shortDateFormat, showRelativeDates, { timeFormat, timeForToday: false })}
|
||||
</div>
|
||||
}
|
||||
{
|
||||
!!physicalRelease &&
|
||||
<div >
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon
|
||||
name={icons.DISC}
|
||||
/>
|
||||
</div>
|
||||
{getRelativeDate(physicalRelease, shortDateFormat, showRelativeDates, { timeFormat, timeForToday: false })}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
MovieReleaseDates.propTypes = {
|
||||
showRelativeDates: PropTypes.bool.isRequired,
|
||||
shortDateFormat: PropTypes.string.isRequired,
|
||||
longDateFormat: PropTypes.string.isRequired,
|
||||
timeFormat: PropTypes.string.isRequired,
|
||||
inCinemas: PropTypes.string,
|
||||
physicalRelease: PropTypes.string,
|
||||
digitalRelease: PropTypes.string
|
||||
};
|
||||
|
||||
export default MovieReleaseDates;
|
||||
64
frontend/src/Movie/Details/MovieReleaseDates.tsx
Normal file
64
frontend/src/Movie/Details/MovieReleaseDates.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
import React from 'react';
|
||||
import { useSelector } from 'react-redux';
|
||||
import Icon from 'Components/Icon';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import getRelativeDate from 'Utilities/Date/getRelativeDate';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './MovieReleaseDates.css';
|
||||
|
||||
interface MovieReleaseDatesProps {
|
||||
inCinemas: string;
|
||||
physicalRelease: string;
|
||||
digitalRelease: string;
|
||||
}
|
||||
|
||||
function MovieReleaseDates(props: MovieReleaseDatesProps) {
|
||||
const { inCinemas, physicalRelease, digitalRelease } = props;
|
||||
|
||||
const { showRelativeDates, shortDateFormat, timeFormat } = useSelector(
|
||||
createUISettingsSelector()
|
||||
);
|
||||
|
||||
return (
|
||||
<div>
|
||||
{inCinemas ? (
|
||||
<div title={translate('InCinemas')}>
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon name={icons.IN_CINEMAS} />
|
||||
</div>
|
||||
{getRelativeDate(inCinemas, shortDateFormat, showRelativeDates, {
|
||||
timeFormat,
|
||||
timeForToday: false,
|
||||
})}
|
||||
</div>
|
||||
) : null}
|
||||
{digitalRelease ? (
|
||||
<div title={translate('DigitalRelease')}>
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon name={icons.MOVIE_FILE} />
|
||||
</div>
|
||||
{getRelativeDate(digitalRelease, shortDateFormat, showRelativeDates, {
|
||||
timeFormat,
|
||||
timeForToday: false,
|
||||
})}
|
||||
</div>
|
||||
) : null}
|
||||
{physicalRelease ? (
|
||||
<div title={translate('PhysicalRelease')}>
|
||||
<div className={styles.dateIcon}>
|
||||
<Icon name={icons.DISC} />
|
||||
</div>
|
||||
{getRelativeDate(
|
||||
physicalRelease,
|
||||
shortDateFormat,
|
||||
showRelativeDates,
|
||||
{ timeFormat, timeForToday: false }
|
||||
)}
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default MovieReleaseDates;
|
||||
@@ -1,20 +0,0 @@
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import MovieReleaseDates from './MovieReleaseDates';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createUISettingsSelector(),
|
||||
(uiSettings) => {
|
||||
return {
|
||||
showRelativeDates: uiSettings.showRelativeDates,
|
||||
shortDateFormat: uiSettings.shortDateFormat,
|
||||
longDateFormat: uiSettings.longDateFormat,
|
||||
timeFormat: uiSettings.timeFormat
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export default connect(createMapStateToProps, null)(MovieReleaseDates);
|
||||
@@ -100,6 +100,15 @@ function MovieIndexSortMenu(props: MovieIndexSortMenuProps) {
|
||||
{translate('DigitalRelease')}
|
||||
</SortMenuItem>
|
||||
|
||||
<SortMenuItem
|
||||
name="releaseDate"
|
||||
sortKey={sortKey}
|
||||
sortDirection={sortDirection}
|
||||
onPress={onSortSelect}
|
||||
>
|
||||
{translate('ReleaseDates')}
|
||||
</SortMenuItem>
|
||||
|
||||
<SortMenuItem
|
||||
name="tmdbRating"
|
||||
sortKey={sortKey}
|
||||
|
||||
@@ -80,8 +80,12 @@ function DownloadClientOptions(props) {
|
||||
legend={translate('FailedDownloadHandling')}
|
||||
>
|
||||
<Form>
|
||||
<FormGroup size={sizes.MEDIUM}>
|
||||
<FormLabel>{translate('Redownload')}</FormLabel>
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
size={sizes.MEDIUM}
|
||||
>
|
||||
<FormLabel>{translate('AutoRedownloadFailed')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
@@ -91,7 +95,28 @@ function DownloadClientOptions(props) {
|
||||
{...settings.autoRedownloadFailed}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
settings.autoRedownloadFailed.value ?
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
size={sizes.MEDIUM}
|
||||
>
|
||||
<FormLabel>{translate('AutoRedownloadFailedFromInteractiveSearch')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="autoRedownloadFailedFromInteractiveSearch"
|
||||
helpText={translate('AutoRedownloadFailedFromInteractiveSearchHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.autoRedownloadFailedFromInteractiveSearch}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
</Form>
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('RemoveDownloadsAlert')}
|
||||
</Alert>
|
||||
|
||||
@@ -6,6 +6,8 @@ import getSectionState from 'Utilities/State/getSectionState';
|
||||
import { set, updateServerSideCollection } from '../baseActions';
|
||||
|
||||
function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter) {
|
||||
const [baseSection] = section.split('.');
|
||||
|
||||
return function(getState, payload, dispatch) {
|
||||
dispatch(set({ section, isFetching: true }));
|
||||
|
||||
@@ -25,10 +27,13 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter
|
||||
|
||||
const {
|
||||
selectedFilterKey,
|
||||
filters,
|
||||
customFilters
|
||||
filters
|
||||
} = sectionState;
|
||||
|
||||
const customFilters = getState().customFilters.items.filter((customFilter) => {
|
||||
return customFilter.type === section || customFilter.type === baseSection;
|
||||
});
|
||||
|
||||
const selectedFilters = findSelectedFilters(selectedFilterKey, filters, customFilters);
|
||||
|
||||
selectedFilters.forEach((filter) => {
|
||||
@@ -37,7 +42,8 @@ function createFetchServerSideCollectionHandler(section, url, fetchDataAugmenter
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url,
|
||||
data
|
||||
data,
|
||||
traditional: true
|
||||
}).request;
|
||||
|
||||
promise.done((response) => {
|
||||
|
||||
@@ -49,8 +49,6 @@ export const defaultState = {
|
||||
|
||||
selectedFilterKey: 'monitored',
|
||||
|
||||
customFilters: [],
|
||||
|
||||
filters: [
|
||||
{
|
||||
key: 'all',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import { createAction } from 'redux-actions';
|
||||
import Icon from 'Components/Icon';
|
||||
import { filterTypes, icons, sortDirections } from 'Helpers/Props';
|
||||
import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, icons, sortDirections } from 'Helpers/Props';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
|
||||
@@ -177,6 +177,33 @@ export const defaultState = {
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
filterBuilderProps: [
|
||||
{
|
||||
name: 'eventType',
|
||||
label: () => translate('EventType'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.HISTORY_EVENT_TYPE
|
||||
},
|
||||
{
|
||||
name: 'movieIds',
|
||||
label: () => translate('Movie'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.MOVIE
|
||||
},
|
||||
{
|
||||
name: 'quality',
|
||||
label: () => translate('Quality'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.QUALITY
|
||||
},
|
||||
{
|
||||
name: 'languages',
|
||||
label: () => translate('Languages'),
|
||||
type: filterBuilderTypes.CONTAINS,
|
||||
valueType: filterBuilderValueTypes.LANGUAGE
|
||||
}
|
||||
]
|
||||
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import _ from 'lodash';
|
||||
import moment from 'moment';
|
||||
import { createAction } from 'redux-actions';
|
||||
import { batchActions } from 'redux-batched-actions';
|
||||
import { filterTypePredicates, filterTypes, sortDirections } from 'Helpers/Props';
|
||||
@@ -240,16 +241,55 @@ export const sortPredicates = {
|
||||
return item.year || undefined;
|
||||
},
|
||||
|
||||
inCinemas: function(item) {
|
||||
return item.inCinemas || '';
|
||||
inCinemas: function(item, direction) {
|
||||
if (item.inCinemas) {
|
||||
return moment(item.inCinemas).unix();
|
||||
}
|
||||
|
||||
if (direction === sortDirections.DESCENDING) {
|
||||
return -1 * Number.MAX_VALUE;
|
||||
}
|
||||
|
||||
return Number.MAX_VALUE;
|
||||
},
|
||||
|
||||
physicalRelease: function(item) {
|
||||
return item.physicalRelease || '';
|
||||
physicalRelease: function(item, direction) {
|
||||
if (item.physicalRelease) {
|
||||
return moment(item.physicalRelease).unix();
|
||||
}
|
||||
|
||||
if (direction === sortDirections.DESCENDING) {
|
||||
return -1 * Number.MAX_VALUE;
|
||||
}
|
||||
|
||||
return Number.MAX_VALUE;
|
||||
},
|
||||
|
||||
digitalRelease: function(item) {
|
||||
return item.digitalRelease || '';
|
||||
digitalRelease: function(item, direction) {
|
||||
if (item.digitalRelease) {
|
||||
return moment(item.digitalRelease).unix();
|
||||
}
|
||||
|
||||
if (direction === sortDirections.DESCENDING) {
|
||||
return -1 * Number.MAX_VALUE;
|
||||
}
|
||||
|
||||
return Number.MAX_VALUE;
|
||||
},
|
||||
|
||||
releaseDate: function(item, direction) {
|
||||
const { inCinemas, digitalRelease, physicalRelease } = item;
|
||||
const releaseDate = digitalRelease || physicalRelease || inCinemas;
|
||||
|
||||
if (releaseDate) {
|
||||
return moment(releaseDate).unix();
|
||||
}
|
||||
|
||||
if (direction === sortDirections.DESCENDING) {
|
||||
return -1 * Number.MAX_VALUE;
|
||||
}
|
||||
|
||||
return Number.MAX_VALUE;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import React from 'react';
|
||||
import { createAction } from 'redux-actions';
|
||||
import { batchActions } from 'redux-batched-actions';
|
||||
import Icon from 'Components/Icon';
|
||||
import { icons, sortDirections } from 'Helpers/Props';
|
||||
import { filterBuilderTypes, filterBuilderValueTypes, icons, sortDirections } from 'Helpers/Props';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
|
||||
@@ -159,6 +159,43 @@ export const defaultState = {
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
}
|
||||
],
|
||||
|
||||
selectedFilterKey: 'all',
|
||||
|
||||
filters: [
|
||||
{
|
||||
key: 'all',
|
||||
label: 'All',
|
||||
filters: []
|
||||
}
|
||||
],
|
||||
|
||||
filterBuilderProps: [
|
||||
{
|
||||
name: 'movieIds',
|
||||
label: () => translate('Movie'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.MOVIE
|
||||
},
|
||||
{
|
||||
name: 'quality',
|
||||
label: () => translate('Quality'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.QUALITY
|
||||
},
|
||||
{
|
||||
name: 'languages',
|
||||
label: () => translate('Languages'),
|
||||
type: filterBuilderTypes.CONTAINS,
|
||||
valueType: filterBuilderValueTypes.LANGUAGE
|
||||
},
|
||||
{
|
||||
name: 'protocol',
|
||||
label: () => translate('Protocol'),
|
||||
type: filterBuilderTypes.EQUAL,
|
||||
valueType: filterBuilderValueTypes.PROTOCOL
|
||||
}
|
||||
]
|
||||
},
|
||||
sortPredicates: {
|
||||
@@ -173,7 +210,8 @@ export const persistState = [
|
||||
'queue.paged.pageSize',
|
||||
'queue.paged.sortKey',
|
||||
'queue.paged.sortDirection',
|
||||
'queue.paged.columns'
|
||||
'queue.paged.columns',
|
||||
'queue.paged.selectedFilterKey'
|
||||
];
|
||||
|
||||
//
|
||||
@@ -198,6 +236,7 @@ export const GOTO_NEXT_QUEUE_PAGE = 'queue/gotoQueueNextPage';
|
||||
export const GOTO_LAST_QUEUE_PAGE = 'queue/gotoQueueLastPage';
|
||||
export const GOTO_QUEUE_PAGE = 'queue/gotoQueuePage';
|
||||
export const SET_QUEUE_SORT = 'queue/setQueueSort';
|
||||
export const SET_QUEUE_FILTER = 'queue/setQueueFilter';
|
||||
export const SET_QUEUE_TABLE_OPTION = 'queue/setQueueTableOption';
|
||||
export const SET_QUEUE_OPTION = 'queue/setQueueOption';
|
||||
export const CLEAR_QUEUE = 'queue/clearQueue';
|
||||
@@ -222,6 +261,7 @@ export const gotoQueueNextPage = createThunk(GOTO_NEXT_QUEUE_PAGE);
|
||||
export const gotoQueueLastPage = createThunk(GOTO_LAST_QUEUE_PAGE);
|
||||
export const gotoQueuePage = createThunk(GOTO_QUEUE_PAGE);
|
||||
export const setQueueSort = createThunk(SET_QUEUE_SORT);
|
||||
export const setQueueFilter = createThunk(SET_QUEUE_FILTER);
|
||||
export const setQueueTableOption = createAction(SET_QUEUE_TABLE_OPTION);
|
||||
export const setQueueOption = createAction(SET_QUEUE_OPTION);
|
||||
export const clearQueue = createAction(CLEAR_QUEUE);
|
||||
@@ -268,7 +308,8 @@ export const actionHandlers = handleThunks({
|
||||
[serverSideCollectionHandlers.NEXT_PAGE]: GOTO_NEXT_QUEUE_PAGE,
|
||||
[serverSideCollectionHandlers.LAST_PAGE]: GOTO_LAST_QUEUE_PAGE,
|
||||
[serverSideCollectionHandlers.EXACT_PAGE]: GOTO_QUEUE_PAGE,
|
||||
[serverSideCollectionHandlers.SORT]: SET_QUEUE_SORT
|
||||
[serverSideCollectionHandlers.SORT]: SET_QUEUE_SORT,
|
||||
[serverSideCollectionHandlers.FILTER]: SET_QUEUE_FILTER
|
||||
},
|
||||
fetchDataAugmenter
|
||||
),
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
import { createSelector } from 'reselect';
|
||||
|
||||
function createCollectionSelector() {
|
||||
return createSelector(
|
||||
(state, { collectionId }) => collectionId,
|
||||
(state) => state.movieCollections.itemMap,
|
||||
(state) => state.movieCollections.items,
|
||||
(collectionId, itemMap, allCollections) => {
|
||||
if (allCollections && itemMap && collectionId in itemMap) {
|
||||
return allCollections[itemMap[collectionId]];
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export default createCollectionSelector;
|
||||
17
frontend/src/Store/Selectors/createCollectionSelector.ts
Normal file
17
frontend/src/Store/Selectors/createCollectionSelector.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
|
||||
function createCollectionSelector() {
|
||||
return createSelector(
|
||||
(_: AppState, { collectionId }: { collectionId: number }) => collectionId,
|
||||
(state: AppState) => state.movieCollections.itemMap,
|
||||
(state: AppState) => state.movieCollections.items,
|
||||
(collectionId, itemMap, allCollections) => {
|
||||
return allCollections && itemMap && collectionId in itemMap
|
||||
? allCollections[itemMap[collectionId]]
|
||||
: undefined;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export default createCollectionSelector;
|
||||
@@ -72,6 +72,7 @@ function getInternalLink(source) {
|
||||
function getTestLink(source, props) {
|
||||
switch (source) {
|
||||
case 'IndexerStatusCheck':
|
||||
case 'IndexerLongTermStatusCheck':
|
||||
return (
|
||||
<SpinnerIconButton
|
||||
name={icons.TEST}
|
||||
|
||||
27
frontend/src/typings/History.ts
Normal file
27
frontend/src/typings/History.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import Language from 'Language/Language';
|
||||
import { QualityModel } from 'Quality/Quality';
|
||||
import CustomFormat from './CustomFormat';
|
||||
|
||||
export type HistoryEventType =
|
||||
| 'grabbed'
|
||||
| 'downloadFolderImported'
|
||||
| 'downloadFailed'
|
||||
| 'movieFileDeleted'
|
||||
| 'movieFolderImported'
|
||||
| 'movieFileRenamed'
|
||||
| 'downloadIgnored';
|
||||
|
||||
export default interface History {
|
||||
movieId: number;
|
||||
sourceTitle: string;
|
||||
languages: Language[];
|
||||
quality: QualityModel;
|
||||
customFormats: CustomFormat[];
|
||||
customFormatScore: number;
|
||||
qualityCutoffNotMet: boolean;
|
||||
date: string;
|
||||
downloadId: string;
|
||||
eventType: HistoryEventType;
|
||||
data: unknown;
|
||||
id: number;
|
||||
}
|
||||
@@ -73,15 +73,15 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[TestCase(@"[Info] MigrationController: *** Migrating Database=radarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;token=mySecret;Enlist=False&username=mySecret;mypassword=mySecret;mypass=shouldkeep1;test_token=mySecret;password=123%@%_@!#^#@;use_password=mySecret;get_token=shouldkeep2;usetoken=shouldkeep3;passwrd=mySecret;")]
|
||||
|
||||
// Announce URLs (passkeys) Magnet & Tracker
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2f9pr04sg601233210imaveql2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2ftracker.php%2f9pr04sg601233210imaveql2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce%2f9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce.php%3fpasskey%3d9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/9pr04sg601233210imaveql2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/tracker.php/9pr04sg601233210imaveql2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce/9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce.php?passkey=9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210imaveql2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2ftracker.php%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce%2f9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce.php%3fpasskey%3d9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/tracker.php/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce/9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")]
|
||||
|
||||
// Notifiarr
|
||||
[TestCase(@"https://xxx.yyy/api/v1/notification/radarr/9pr04sg6-0123-3210-imav-eql2tyu8xyui")]
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
|
||||
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce"),
|
||||
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
// Path
|
||||
new (@"C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<PackageReference Include="SharpZipLib" Version="1.3.3" />
|
||||
<PackageReference Include="System.Text.Json" Version="6.0.8" />
|
||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.118-22" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
|
||||
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
|
||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
|
||||
@@ -72,11 +72,15 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse();
|
||||
}
|
||||
|
||||
[TestCase("How the Earth Was Made S02 Disc 1 1080i Blu-ray DTS-HD MA 2.0 AVC-TrollHD")]
|
||||
[TestCase("The Universe S03 Disc 1 1080p Blu-ray LPCM 2.0 AVC-TrollHD")]
|
||||
[TestCase("HELL ON WHEELS S02 1080P FULL BLURAY AVC DTS-HD MA 5 1")]
|
||||
[TestCase("Game.of.Thrones.S06.2016.DISC.3.BluRay.1080p.AVC.Atmos.TrueHD7.1-MTeam")]
|
||||
[TestCase("Game of Thrones S05 Disc 1 BluRay 1080p AVC Atmos TrueHD 7 1-MTeam")]
|
||||
[TestCase("Series Title S02 Disc 1 1080i Blu-ray DTS-HD MA 2.0 AVC-TrollHD")]
|
||||
[TestCase("Series Title S03 Disc 1 1080p Blu-ray LPCM 2.0 AVC-TrollHD")]
|
||||
[TestCase("SERIES TITLE S02 1080P FULL BLURAY AVC DTS-HD MA 5 1")]
|
||||
[TestCase("Series.Title.S06.2016.DISC.3.BluRay.1080p.AVC.Atmos.TrueHD7.1-MTeam")]
|
||||
[TestCase("Series Title S05 Disc 1 BluRay 1080p AVC Atmos TrueHD 7 1-MTeam")]
|
||||
[TestCase("Series Title S05 Disc 1 BluRay 1080p AVC Atmos TrueHD 7 1-MTeam")]
|
||||
[TestCase("Someone.the.Entertainer.Presents.S01.NTSC.3xDVD9.MPEG-2.DD2.0")]
|
||||
[TestCase("Series.Title.S00.The.Christmas.Special.2011.PAL.DVD5.DD2.0")]
|
||||
[TestCase("Series.of.Desire.2000.S1_D01.NTSC.DVD5")]
|
||||
public void should_return_false_if_matches_disc_format(string title)
|
||||
{
|
||||
_remoteMovie.Release.Title = title;
|
||||
|
||||
@@ -364,6 +364,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("German.Only.Movie.2021.French.1080p.BluRay.AVC-UNTAVC")]
|
||||
[TestCase("Movie.Title.2008.US.Directors.Cut.UHD.BD66.Blu-ray")]
|
||||
[TestCase("Movie.2009.Blu.ray.AVC.DTS.HD.MA.5.1")]
|
||||
[TestCase("[BD]Movie.Title.2008.2023.1080p.COMPLETE.BLURAY-RlsGrp")]
|
||||
public void should_parse_brdisk_1080p_quality(string title)
|
||||
{
|
||||
ParseAndVerifyQuality(title, QualitySource.BLURAY, false, Resolution.R1080p, Modifier.BRDISK);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Dapper" Version="2.0.143" />
|
||||
<PackageReference Include="NBuilder" Version="6.1.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.118-22" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Test.Common\Radarr.Test.Common.csproj" />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Configuration;
|
||||
@@ -30,7 +30,7 @@ namespace NzbDrone.Core.Analytics
|
||||
{
|
||||
get
|
||||
{
|
||||
var lastRecord = _historyService.Paged(new PagingSpec<MovieHistory>() { Page = 0, PageSize = 1, SortKey = "date", SortDirection = SortDirection.Descending });
|
||||
var lastRecord = _historyService.Paged(new PagingSpec<MovieHistory>() { Page = 0, PageSize = 1, SortKey = "date", SortDirection = SortDirection.Descending }, null, null);
|
||||
var monthAgo = DateTime.UtcNow.AddMonths(-1);
|
||||
|
||||
return lastRecord.Records.Any(v => v.Date > monthAgo);
|
||||
|
||||
@@ -66,7 +66,8 @@ namespace NzbDrone.Core.Annotations
|
||||
OAuth,
|
||||
Device,
|
||||
TagSelect,
|
||||
RootFolder
|
||||
RootFolder,
|
||||
QualityProfile
|
||||
}
|
||||
|
||||
public enum HiddenType
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
using FluentValidation;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
namespace NzbDrone.Core.AutoTagging.Specifications
|
||||
{
|
||||
public class QualityProfileSpecificationValidator : AbstractValidator<QualityProfileSpecification>
|
||||
{
|
||||
public QualityProfileSpecificationValidator()
|
||||
{
|
||||
RuleFor(c => c.Value).GreaterThan(0);
|
||||
}
|
||||
}
|
||||
|
||||
public class QualityProfileSpecification : AutoTaggingSpecificationBase
|
||||
{
|
||||
private static readonly QualityProfileSpecificationValidator Validator = new ();
|
||||
|
||||
public override int Order => 1;
|
||||
public override string ImplementationName => "Quality Profile";
|
||||
|
||||
[FieldDefinition(1, Label = "Quality Profile", Type = FieldType.QualityProfile)]
|
||||
public int Value { get; set; }
|
||||
|
||||
protected override bool IsSatisfiedByWithoutNegate(Movie movie)
|
||||
{
|
||||
return Value == movie.QualityProfileId;
|
||||
}
|
||||
|
||||
public override NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -190,6 +190,13 @@ namespace NzbDrone.Core.Configuration
|
||||
set { SetValue("AutoRedownloadFailed", value); }
|
||||
}
|
||||
|
||||
public bool AutoRedownloadFailedFromInteractiveSearch
|
||||
{
|
||||
get { return GetValueBoolean("AutoRedownloadFailedFromInteractiveSearch", true); }
|
||||
|
||||
set { SetValue("AutoRedownloadFailedFromInteractiveSearch", value); }
|
||||
}
|
||||
|
||||
public bool CreateEmptyMovieFolders
|
||||
{
|
||||
get { return GetValueBoolean("CreateEmptyMovieFolders", false); }
|
||||
|
||||
@@ -22,6 +22,7 @@ namespace NzbDrone.Core.Configuration
|
||||
bool EnableCompletedDownloadHandling { get; set; }
|
||||
|
||||
bool AutoRedownloadFailed { get; set; }
|
||||
bool AutoRedownloadFailedFromInteractiveSearch { get; set; }
|
||||
|
||||
// Media Management
|
||||
bool AutoUnmonitorPreviouslyDownloadedMovies { get; set; }
|
||||
|
||||
@@ -407,7 +407,7 @@ namespace NzbDrone.Core.Datastore
|
||||
return pagingSpec;
|
||||
}
|
||||
|
||||
private void AddFilters(SqlBuilder builder, PagingSpec<TModel> pagingSpec)
|
||||
protected void AddFilters(SqlBuilder builder, PagingSpec<TModel> pagingSpec)
|
||||
{
|
||||
var filters = pagingSpec.FilterExpressions;
|
||||
|
||||
|
||||
@@ -41,14 +41,16 @@ namespace NzbDrone.Core.Datastore
|
||||
|
||||
private static string GetConnectionString(string dbPath)
|
||||
{
|
||||
var connectionBuilder = new SQLiteConnectionStringBuilder();
|
||||
|
||||
connectionBuilder.DataSource = dbPath;
|
||||
connectionBuilder.CacheSize = (int)-20000;
|
||||
connectionBuilder.DateTimeKind = DateTimeKind.Utc;
|
||||
connectionBuilder.JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal;
|
||||
connectionBuilder.Pooling = true;
|
||||
connectionBuilder.Version = 3;
|
||||
var connectionBuilder = new SQLiteConnectionStringBuilder
|
||||
{
|
||||
DataSource = dbPath,
|
||||
CacheSize = (int)-20000,
|
||||
DateTimeKind = DateTimeKind.Utc,
|
||||
JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal,
|
||||
Pooling = true,
|
||||
Version = 3,
|
||||
BusyTimeout = 100
|
||||
};
|
||||
|
||||
if (OsInfo.IsOsx)
|
||||
{
|
||||
|
||||
@@ -12,7 +12,8 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
||||
private static readonly Regex[] DiscRegex = new[]
|
||||
{
|
||||
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(@"(?:(?:480|720|1080|2160)[ip]|)[-_. ](?:full)[-_. ](?:Blu\-?ray)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"(?:\d?x?M?DVD-?[R59])", RegexOptions.Compiled | RegexOptions.IgnoreCase)
|
||||
};
|
||||
|
||||
private static readonly string[] _dvdContainerTypes = new[] { "vob", "iso" };
|
||||
@@ -39,8 +40,8 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
||||
{
|
||||
if (regex.IsMatch(subject.Release.Title))
|
||||
{
|
||||
_logger.Debug("Release contains raw Bluray, rejecting.");
|
||||
return Decision.Reject("Raw Bluray release");
|
||||
_logger.Debug("Release contains raw Bluray/DVD, rejecting.");
|
||||
return Decision.Reject("Raw Bluray/DVD release");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
||||
using NzbDrone.Common.Messaging;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
using NzbDrone.Core.Languages;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.Qualities;
|
||||
|
||||
namespace NzbDrone.Core.Download
|
||||
@@ -23,5 +24,6 @@ namespace NzbDrone.Core.Download
|
||||
public TrackedDownload TrackedDownload { get; set; }
|
||||
public List<Language> Languages { get; set; }
|
||||
public bool SkipRedownload { get; set; }
|
||||
public ReleaseSourceType ReleaseSource { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Download
|
||||
{
|
||||
@@ -128,6 +130,7 @@ namespace NzbDrone.Core.Download
|
||||
private void PublishDownloadFailedEvent(List<MovieHistory> historyItems, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false)
|
||||
{
|
||||
var historyItem = historyItems.First();
|
||||
Enum.TryParse(historyItem.Data.GetValueOrDefault(MovieHistory.RELEASE_SOURCE, ReleaseSourceType.Unknown.ToString()), out ReleaseSourceType releaseSource);
|
||||
|
||||
var downloadFailedEvent = new DownloadFailedEvent
|
||||
{
|
||||
@@ -140,7 +143,8 @@ namespace NzbDrone.Core.Download
|
||||
Data = historyItem.Data,
|
||||
TrackedDownload = trackedDownload,
|
||||
Languages = historyItem.Languages,
|
||||
SkipRedownload = skipRedownload
|
||||
SkipRedownload = skipRedownload,
|
||||
ReleaseSource = releaseSource
|
||||
};
|
||||
|
||||
_eventAggregator.PublishEvent(downloadFailedEvent);
|
||||
|
||||
@@ -5,6 +5,7 @@ using NzbDrone.Core.IndexerSearch;
|
||||
using NzbDrone.Core.Messaging;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Download
|
||||
{
|
||||
@@ -38,6 +39,12 @@ namespace NzbDrone.Core.Download
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.ReleaseSource == ReleaseSourceType.InteractiveSearch && !_configService.AutoRedownloadFailedFromInteractiveSearch)
|
||||
{
|
||||
_logger.Debug("Auto redownloading failed movies from interactive search is disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.MovieId != 0)
|
||||
{
|
||||
_logger.Debug("Failed download contains a movie, searching again.");
|
||||
|
||||
@@ -7,7 +7,7 @@ using NzbDrone.Core.Movies.Events;
|
||||
namespace NzbDrone.Core.HealthCheck.Checks
|
||||
{
|
||||
[CheckOn(typeof(MovieUpdatedEvent))]
|
||||
[CheckOn(typeof(MoviesDeletedEvent), CheckOnCondition.FailedOnly)]
|
||||
[CheckOn(typeof(MoviesDeletedEvent))]
|
||||
[CheckOn(typeof(MovieRefreshCompleteEvent))]
|
||||
public class RemovedMovieCheck : HealthCheckBase, ICheckOnCondition<MovieUpdatedEvent>, ICheckOnCondition<MoviesDeletedEvent>
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Messaging;
|
||||
@@ -28,6 +29,7 @@ namespace NzbDrone.Core.HealthCheck
|
||||
private readonly IProvideHealthCheck[] _scheduledHealthChecks;
|
||||
private readonly Dictionary<Type, IEventDrivenHealthCheck[]> _eventDrivenHealthChecks;
|
||||
private readonly IEventAggregator _eventAggregator;
|
||||
private readonly Logger _logger;
|
||||
|
||||
private readonly ICached<HealthCheck> _healthCheckResults;
|
||||
private readonly HashSet<IProvideHealthCheck> _pendingHealthChecks;
|
||||
@@ -40,10 +42,12 @@ namespace NzbDrone.Core.HealthCheck
|
||||
IEventAggregator eventAggregator,
|
||||
ICacheManager cacheManager,
|
||||
IDebounceManager debounceManager,
|
||||
IRuntimeInfo runtimeInfo)
|
||||
IRuntimeInfo runtimeInfo,
|
||||
Logger logger)
|
||||
{
|
||||
_healthChecks = healthChecks.ToArray();
|
||||
_eventAggregator = eventAggregator;
|
||||
_logger = logger;
|
||||
|
||||
_healthCheckResults = cacheManager.GetCache<HealthCheck>(GetType());
|
||||
_pendingHealthChecks = new HashSet<IProvideHealthCheck>();
|
||||
@@ -88,7 +92,14 @@ namespace NzbDrone.Core.HealthCheck
|
||||
|
||||
try
|
||||
{
|
||||
var results = healthChecks.Select(c => c.Check())
|
||||
var results = healthChecks.Select(c =>
|
||||
{
|
||||
_logger.Trace("Check health -> {0}", c.GetType().Name);
|
||||
var result = c.Check();
|
||||
_logger.Trace("Check health <- {0}", c.GetType().Name);
|
||||
|
||||
return result;
|
||||
})
|
||||
.ToList();
|
||||
|
||||
foreach (var result in results)
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace NzbDrone.Core.History
|
||||
void DeleteForMovies(List<int> movieIds);
|
||||
MovieHistory MostRecentForMovie(int movieId);
|
||||
List<MovieHistory> Since(DateTime date, MovieHistoryEventType? eventType);
|
||||
PagingSpec<MovieHistory> GetPaged(PagingSpec<MovieHistory> pagingSpec, int[] languages, int[] qualities);
|
||||
}
|
||||
|
||||
public class HistoryRepository : BasicRepository<MovieHistory>, IHistoryRepository
|
||||
@@ -74,19 +75,6 @@ namespace NzbDrone.Core.History
|
||||
Delete(c => movieIds.Contains(c.MovieId));
|
||||
}
|
||||
|
||||
protected override SqlBuilder PagedBuilder() => new SqlBuilder(_database.DatabaseType)
|
||||
.Join<MovieHistory, Movie>((h, m) => h.MovieId == m.Id)
|
||||
.Join<Movie, QualityProfile>((m, p) => m.QualityProfileId == p.Id)
|
||||
.LeftJoin<Movie, MovieMetadata>((m, mm) => m.MovieMetadataId == mm.Id);
|
||||
|
||||
protected override IEnumerable<MovieHistory> PagedQuery(SqlBuilder sql) =>
|
||||
_database.QueryJoined<MovieHistory, Movie, QualityProfile>(sql, (hist, movie, profile) =>
|
||||
{
|
||||
hist.Movie = movie;
|
||||
hist.Movie.QualityProfile = profile;
|
||||
return hist;
|
||||
});
|
||||
|
||||
public MovieHistory MostRecentForMovie(int movieId)
|
||||
{
|
||||
return Query(x => x.MovieId == movieId).MaxBy(h => h.Date);
|
||||
@@ -106,5 +94,77 @@ namespace NzbDrone.Core.History
|
||||
|
||||
return PagedQuery(builder).OrderBy(h => h.Date).ToList();
|
||||
}
|
||||
|
||||
public PagingSpec<MovieHistory> GetPaged(PagingSpec<MovieHistory> pagingSpec, int[] languages, int[] qualities)
|
||||
{
|
||||
pagingSpec.Records = GetPagedRecords(PagedBuilder(pagingSpec, languages, qualities), pagingSpec, PagedQuery);
|
||||
|
||||
var countTemplate = $"SELECT COUNT(*) FROM (SELECT /**select**/ FROM \"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\" /**join**/ /**innerjoin**/ /**leftjoin**/ /**where**/ /**groupby**/ /**having**/) AS \"Inner\"";
|
||||
pagingSpec.TotalRecords = GetPagedRecordCount(PagedBuilder(pagingSpec, languages, qualities).Select(typeof(MovieHistory)), pagingSpec, countTemplate);
|
||||
|
||||
return pagingSpec;
|
||||
}
|
||||
|
||||
private SqlBuilder PagedBuilder(PagingSpec<MovieHistory> pagingSpec, int[] languages, int[] qualities)
|
||||
{
|
||||
var builder = Builder()
|
||||
.Join<MovieHistory, Movie>((h, m) => h.MovieId == m.Id)
|
||||
.Join<Movie, QualityProfile>((m, p) => m.QualityProfileId == p.Id)
|
||||
.LeftJoin<Movie, MovieMetadata>((m, mm) => m.MovieMetadataId == mm.Id);
|
||||
|
||||
AddFilters(builder, pagingSpec);
|
||||
|
||||
if (languages is { Length: > 0 })
|
||||
{
|
||||
builder.Where($"({BuildLanguageWhereClause(languages)})");
|
||||
}
|
||||
|
||||
if (qualities is { Length: > 0 })
|
||||
{
|
||||
builder.Where($"({BuildQualityWhereClause(qualities)})");
|
||||
}
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
protected override IEnumerable<MovieHistory> PagedQuery(SqlBuilder builder) =>
|
||||
_database.QueryJoined<MovieHistory, Movie, QualityProfile>(builder, (hist, movie, profile) =>
|
||||
{
|
||||
hist.Movie = movie;
|
||||
hist.Movie.QualityProfile = profile;
|
||||
return hist;
|
||||
});
|
||||
|
||||
private string BuildLanguageWhereClause(int[] languages)
|
||||
{
|
||||
var clauses = new List<string>();
|
||||
|
||||
foreach (var language in languages)
|
||||
{
|
||||
// There are 4 different types of values we should see:
|
||||
// - Not the last value in the array
|
||||
// - When it's the last value in the array and on different OSes
|
||||
// - When it was converted from a single language
|
||||
|
||||
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\".\"Languages\" LIKE '[% {language},%]'");
|
||||
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\".\"Languages\" LIKE '[% {language}' || CHAR(13) || '%]'");
|
||||
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\".\"Languages\" LIKE '[% {language}' || CHAR(10) || '%]'");
|
||||
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\".\"Languages\" LIKE '[{language}]'");
|
||||
}
|
||||
|
||||
return $"({string.Join(" OR ", clauses)})";
|
||||
}
|
||||
|
||||
private string BuildQualityWhereClause(int[] qualities)
|
||||
{
|
||||
var clauses = new List<string>();
|
||||
|
||||
foreach (var quality in qualities)
|
||||
{
|
||||
clauses.Add($"\"{TableMapping.Mapper.TableNameMapping(typeof(MovieHistory))}\".\"Quality\" LIKE '%_quality_: {quality},%'");
|
||||
}
|
||||
|
||||
return $"({string.Join(" OR ", clauses)})";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace NzbDrone.Core.History
|
||||
public interface IHistoryService
|
||||
{
|
||||
QualityModel GetBestQualityInHistory(QualityProfile profile, int movieId);
|
||||
PagingSpec<MovieHistory> Paged(PagingSpec<MovieHistory> pagingSpec);
|
||||
PagingSpec<MovieHistory> Paged(PagingSpec<MovieHistory> pagingSpec, int[] languages, int[] qualities);
|
||||
MovieHistory MostRecentForMovie(int movieId);
|
||||
MovieHistory MostRecentForDownloadId(string downloadId);
|
||||
MovieHistory Get(int historyId);
|
||||
@@ -49,9 +49,9 @@ namespace NzbDrone.Core.History
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public PagingSpec<MovieHistory> Paged(PagingSpec<MovieHistory> pagingSpec)
|
||||
public PagingSpec<MovieHistory> Paged(PagingSpec<MovieHistory> pagingSpec, int[] languages, int[] qualities)
|
||||
{
|
||||
return _historyRepository.GetPaged(pagingSpec);
|
||||
return _historyRepository.GetPaged(pagingSpec, languages, qualities);
|
||||
}
|
||||
|
||||
public MovieHistory MostRecentForMovie(int movieId)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Dapper;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
@@ -8,6 +10,7 @@ namespace NzbDrone.Core.ImportLists.ImportExclusions
|
||||
{
|
||||
bool IsMovieExcluded(int tmdbid);
|
||||
ImportExclusion GetByTmdbid(int tmdbid);
|
||||
List<int> AllExcludedTmdbIds();
|
||||
}
|
||||
|
||||
public class ImportExclusionsRepository : BasicRepository<ImportExclusion>, IImportExclusionsRepository
|
||||
@@ -26,5 +29,12 @@ namespace NzbDrone.Core.ImportLists.ImportExclusions
|
||||
{
|
||||
return Query(x => x.TmdbId == tmdbid).First();
|
||||
}
|
||||
|
||||
public List<int> AllExcludedTmdbIds()
|
||||
{
|
||||
using var conn = _database.OpenConnection();
|
||||
|
||||
return conn.Query<int>("SELECT \"TmdbId\" FROM \"ImportExclusions\"").ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace NzbDrone.Core.ImportLists.ImportExclusions
|
||||
|
||||
public List<ImportExclusion> AddExclusions(List<ImportExclusion> exclusions)
|
||||
{
|
||||
_exclusionRepository.InsertMany(exclusions);
|
||||
_exclusionRepository.InsertMany(DeDupeExclusions(exclusions));
|
||||
|
||||
return exclusions;
|
||||
}
|
||||
@@ -76,8 +76,20 @@ namespace NzbDrone.Core.ImportLists.ImportExclusions
|
||||
if (message.AddExclusion)
|
||||
{
|
||||
_logger.Debug("Adding {0} Deleted Movies to Import Exclusions", message.Movies.Count);
|
||||
_exclusionRepository.InsertMany(message.Movies.Select(m => new ImportExclusion { TmdbId = m.TmdbId, MovieTitle = m.Title, MovieYear = m.Year }).ToList());
|
||||
|
||||
var exclusions = message.Movies.Select(m => new ImportExclusion { TmdbId = m.TmdbId, MovieTitle = m.Title, MovieYear = m.Year }).ToList();
|
||||
_exclusionRepository.InsertMany(DeDupeExclusions(exclusions));
|
||||
}
|
||||
}
|
||||
|
||||
private List<ImportExclusion> DeDupeExclusions(List<ImportExclusion> exclusions)
|
||||
{
|
||||
var existingExclusions = _exclusionRepository.AllExcludedTmdbIds();
|
||||
|
||||
return exclusions
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.Where(x => !existingExclusions.Contains(x.TmdbId))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,9 +43,9 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
private void SyncAll()
|
||||
{
|
||||
if (_importListFactory.Enabled().Where(a => ((ImportListDefinition)a.Definition).EnableAuto).Empty())
|
||||
if (_importListFactory.Enabled().Empty())
|
||||
{
|
||||
_logger.Debug("No import lists with automatic add enabled, skipping sync and cleaning");
|
||||
_logger.Debug("No enabled import lists, skipping sync and cleaning");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -147,7 +147,6 @@
|
||||
"RefreshInformationAndScanDisk": "تحديث المعلومات ومسح القرص",
|
||||
"RefreshAndScan": "التحديث والمسح الضوئي",
|
||||
"Refresh": "تحديث",
|
||||
"Redownload": "إعادة التنزيل",
|
||||
"RecyclingBinCleanup": "تنظيف سلة إعادة التدوير",
|
||||
"RecyclingBin": "صندوق إعادة التدوير",
|
||||
"RecycleBinHelpText": "ستنتقل ملفات الأفلام إلى هنا عند حذفها بدلاً من حذفها نهائيًا",
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
"ReadTheWikiForMoreInformation": "Прочетете Wiki за повече информация",
|
||||
"Reason": "Причина",
|
||||
"RecyclingBinCleanup": "Почистване на кошчето за рециклиране",
|
||||
"Redownload": "Презареждане",
|
||||
"Refresh": "Обнови",
|
||||
"RefreshMovie": "Опресняване на филма",
|
||||
"RegularExpressionsCanBeTested": "Регулярните изрази могат да бъдат тествани ",
|
||||
|
||||
@@ -730,7 +730,6 @@
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament",
|
||||
"RecycleBinHelpText": "Els fitxers de pel·lícula aniran aquí quan se suprimeixin en lloc de suprimir-se permanentment",
|
||||
"RecyclingBinCleanup": "Neteja de la paperera de reciclatge",
|
||||
"Redownload": "Torna a baixar",
|
||||
"RefreshCollections": "Actualitza col·leccions",
|
||||
"RefreshInformationAndScanDisk": "Actualitza la informació i escaneja el disc",
|
||||
"RefreshLists": "Actualitza llistes",
|
||||
|
||||
@@ -315,7 +315,6 @@
|
||||
"ReadTheWikiForMoreInformation": "Další informace najdete na Wiki",
|
||||
"Reason": "Důvod",
|
||||
"RecyclingBinCleanup": "Recyklace koše Vyčištění",
|
||||
"Redownload": "Znovu stáhnout",
|
||||
"Refresh": "Obnovit",
|
||||
"RefreshMovie": "Obnovit film",
|
||||
"RegularExpressionsCanBeTested": "Regulární výrazy lze testovat ",
|
||||
|
||||
@@ -313,7 +313,6 @@
|
||||
"ReadTheWikiForMoreInformation": "Læs Wiki for mere information",
|
||||
"Reason": "Grund",
|
||||
"RecyclingBinCleanup": "Oprydning af papirkurven",
|
||||
"Redownload": "Genindlæs",
|
||||
"Refresh": "Opdater",
|
||||
"RefreshMovie": "Opdater film",
|
||||
"RegularExpressionsCanBeTested": "Regulære udtryk kan testes ",
|
||||
|
||||
@@ -461,7 +461,6 @@
|
||||
"RecycleBinHelpText": "Gelöschte Filmdateien werden hierher verschoben anstatt sie direkt endgültig zu löschen",
|
||||
"RecyclingBin": "Papierkorb",
|
||||
"RecyclingBinCleanup": "Papierkorb aufräumen",
|
||||
"Redownload": "Nochmal herunterladen",
|
||||
"RefreshInformationAndScanDisk": "Metadaten aktualisieren und Festplatte scannen",
|
||||
"RefreshMovie": "Film aktualisieren",
|
||||
"ReleaseRejected": "Release abgelehnt",
|
||||
@@ -960,7 +959,7 @@
|
||||
"AddRootFolder": "Stammordner hinzufügen",
|
||||
"AddQualityProfile": "Qualitätsprofil hinzufügen",
|
||||
"AddedToDownloadQueue": "Zur Downloadwarteschlange hinzugefügt",
|
||||
"AddDownloadClient": "Zum Downloader hinzufügen",
|
||||
"AddDownloadClient": "Downloadmanager hinzufügen",
|
||||
"AddCustomFormat": "Eigenes Format hinzufügen",
|
||||
"AddDelayProfile": "Verzögerungsprofil hinzufügen",
|
||||
"Add": "Hinzufügen",
|
||||
@@ -1170,12 +1169,14 @@
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Wie werden Tags zu ausgewählten Filmen zugeteilt",
|
||||
"DeleteRootFolderMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteRootFolder": "Stammordner löschen",
|
||||
"AddConnection": "Sammlung bearbeiten",
|
||||
"AddConnection": "Verbindung hinzufügen",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Minimum der eigenen Formate Bewertungspunkte",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
|
||||
"RemoveFromDownloadClientHelpTextWarning": "Dies wird den Download und alle bereits heruntergeladenen Dateien aus dem Downloader entfernen.",
|
||||
"DownloadClientsLoadError": "Downloader konnten nicht geladen werden",
|
||||
"IMDbId": "TMDb ID",
|
||||
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren"
|
||||
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren",
|
||||
"AddCondition": "Bedingung hinzufügen",
|
||||
"AddAutoTag": "Automatisches Tag hinzufügen"
|
||||
}
|
||||
|
||||
@@ -197,7 +197,6 @@
|
||||
"AutomaticSearch": "Αυτόματη αναζήτηση",
|
||||
"ChmodGroup": "Ομάδα chmod",
|
||||
"Queued": "Σε ουρά",
|
||||
"Redownload": "Κατεβάστε ξανά",
|
||||
"Refresh": "Φρεσκάρω",
|
||||
"RelativePath": "Σχετική διαδρομή",
|
||||
"Released": "Κυκλοφόρησε",
|
||||
|
||||
@@ -89,6 +89,9 @@
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Enter a new username",
|
||||
"AuthenticationRequiredWarning": "To prevent remote access without authentication, {appName} now requires authentication to be enabled. You can optionally disable authentication from local addresses.",
|
||||
"Auto": "Auto",
|
||||
"AutoRedownloadFailed": "Redownload Failed",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Redownload Failed from Interactive Search",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automatically search for and attempt to download a different release when failed release was grabbed from interactive search",
|
||||
"AutoRedownloadFailedHelpText": "Automatically search for and attempt to download a different release",
|
||||
"AutoTagging": "Auto Tagging",
|
||||
"AutoTaggingNegateHelpText": "If checked, the auto tagging rule will not apply if this {0} condition matches.",
|
||||
@@ -370,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",
|
||||
@@ -878,6 +882,7 @@
|
||||
"QualitySettings": "Quality Settings",
|
||||
"QualitySettingsSummary": "Quality sizes and naming",
|
||||
"Queue": "Queue",
|
||||
"QueueFilterHasNoItems": "Selected queue filter has no items",
|
||||
"QueueIsEmpty": "Queue is empty",
|
||||
"QueueLoadError": "Failed to load Queue",
|
||||
"Queued": "Queued",
|
||||
@@ -908,7 +913,6 @@
|
||||
"RecyclingBin": "Recycling Bin",
|
||||
"RecyclingBinCleanup": "Recycling Bin Cleanup",
|
||||
"Reddit": "Reddit",
|
||||
"Redownload": "Redownload",
|
||||
"Refresh": "Refresh",
|
||||
"RefreshAndScan": "Refresh & Scan",
|
||||
"RefreshCollections": "Refresh Collections",
|
||||
|
||||
@@ -479,7 +479,6 @@
|
||||
"ReleaseDates": "Fechas de Estreno",
|
||||
"RefreshMovie": "Actualizar película",
|
||||
"RefreshInformationAndScanDisk": "Actualizar la información al escanear el disco",
|
||||
"Redownload": "Volver a descargar",
|
||||
"RecyclingBinCleanup": "Limpieza de Papelera de Reciclaje",
|
||||
"RecyclingBin": "Papelera de Reciclaje",
|
||||
"RecycleBinHelpText": "Los archivos iran aquí una vez se hayan borrado en vez de ser borrados permanentemente",
|
||||
|
||||
@@ -324,7 +324,6 @@
|
||||
"AlternativeTitle": "Vaihtoehtoinen nimi",
|
||||
"Age": "Ikä",
|
||||
"RecyclingBinCleanup": "Roskakorin tyhjennys",
|
||||
"Redownload": "Lataa uudelleen",
|
||||
"RefreshMovie": "Päivitä elokuva",
|
||||
"RejectionCount": "Hylkäämisluku",
|
||||
"RelativePath": "Suhteellinen polku",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -227,7 +227,6 @@
|
||||
"ReadTheWikiForMoreInformation": "קרא את הוויקי למידע נוסף",
|
||||
"Reason": "סיבה",
|
||||
"RecyclingBinCleanup": "ניקוי סל המיחזור",
|
||||
"Redownload": "הורד מחדש",
|
||||
"Refresh": "לְרַעֲנֵן",
|
||||
"RefreshMovie": "רענן סרט",
|
||||
"RejectionCount": "ספירת דחייה",
|
||||
|
||||
@@ -442,7 +442,6 @@
|
||||
"Presets": "प्रीसेट",
|
||||
"Profiles": "प्रोफाइल",
|
||||
"Reason": "कारण",
|
||||
"Redownload": "redownload",
|
||||
"Refresh": "ताज़ा करना",
|
||||
"RefreshMovie": "फिल्म को रिफ्रेश करें",
|
||||
"Reset": "रीसेट",
|
||||
|
||||
@@ -137,9 +137,9 @@
|
||||
"CertificateValidation": "Tanúsítvány érvényesítése",
|
||||
"Cast": "Szereplők",
|
||||
"CantFindMovie": "Miért nem találom a filmemet?",
|
||||
"CancelProcessing": "Feldolgozás Megállítása",
|
||||
"CancelProcessing": "Folyamat leállítása",
|
||||
"CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?",
|
||||
"Cancel": "Vissza",
|
||||
"Cancel": "Mégse",
|
||||
"Calendar": "Naptár",
|
||||
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
|
||||
"BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat",
|
||||
@@ -148,7 +148,7 @@
|
||||
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
|
||||
"BindAddress": "Kapcsolási Cím",
|
||||
"BeforeUpdate": "Alkalmazásfrissítés előtt",
|
||||
"Backups": "Biztonsági Mentés",
|
||||
"Backups": "Biztonsági mentések",
|
||||
"BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek",
|
||||
"BackupNow": "Biztonsági Mentés Most",
|
||||
"BackupIntervalHelpText": "Időeltérés a biztonsági mentések között",
|
||||
@@ -158,7 +158,7 @@
|
||||
"AvailabilityDelay": "Elérhetőség Késleltetése",
|
||||
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "A lemezről törölt filmeket a Radarr automatikusan eltávolítja a megfigyelt filmek közül",
|
||||
"AutoRedownloadFailedHelpText": "Másik kiadás automatikus keresése és letöltése",
|
||||
"AutomaticSearch": "Automatikus Keresés",
|
||||
"AutomaticSearch": "Automatikus keresés",
|
||||
"Automatic": "Automatikus",
|
||||
"AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a Radarr szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely Radarr WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.",
|
||||
"AuthenticationMethodHelpText": "Felhasználónév és Jelszó szükséges a Radarr-hoz való hozzáféréshez",
|
||||
@@ -167,7 +167,7 @@
|
||||
"AsAllDayHelpText": "Az események egész napos eseményként jelennek meg a naptáradban",
|
||||
"ApplyTags": "Címkék alkalmazása",
|
||||
"AgeWhenGrabbed": "Kora (mikor hozzáadásra került)",
|
||||
"Age": "Kora",
|
||||
"Age": "Kor",
|
||||
"AddListExclusion": "Kizárási Lista Hozzáadása",
|
||||
"ApiKey": "API Kulcs",
|
||||
"All": "Összes",
|
||||
@@ -392,7 +392,6 @@
|
||||
"RefreshInformationAndScanDisk": "Információk frissítése és lemez átvizsgálása",
|
||||
"RefreshAndScan": "Frissítés & Keresés",
|
||||
"Refresh": "Frissítés",
|
||||
"Redownload": "Letöltés újra",
|
||||
"RecyclingBinCleanup": "Lomtár kiürítése",
|
||||
"RecyclingBin": "Lomtár",
|
||||
"RecycleBinHelpText": "A filmfájlok végleges törlés helyett ide kerülnek törléskor",
|
||||
@@ -742,7 +741,7 @@
|
||||
"Unmonitored": "Nem felügyelt",
|
||||
"UnmappedFolders": "Feltérképezetlen mappák",
|
||||
"Ungroup": "Csoport eltávolítása",
|
||||
"Unavailable": "Nem érhető el",
|
||||
"Unavailable": "Nem elérhető",
|
||||
"UnableToLoadUISettings": "Nem sikerült betölteni a felhasználói felület beállításait",
|
||||
"UnableToLoadTheCalendar": "Nem sikerült betölteni a naptárat",
|
||||
"UnableToLoadTags": "Nem sikerült betölteni a címkéket",
|
||||
@@ -818,7 +817,7 @@
|
||||
"CurrentlyInstalled": "Jelenleg telepítve",
|
||||
"Connection": "Kapcsolat",
|
||||
"CertValidationNoLocal": "Letiltva a helyi címeknél",
|
||||
"CalendarOptions": "Naptár opciók",
|
||||
"CalendarOptions": "Naptár beállítások",
|
||||
"BuiltIn": "Beépített",
|
||||
"AuthForm": "Felhasználó (Bejelentkezési oldal)",
|
||||
"AuthBasic": "Alap (Böngésző felugró ablak)",
|
||||
@@ -830,7 +829,7 @@
|
||||
"AfterManualRefresh": "A kézi frissítés után",
|
||||
"AddToDownloadQueue": "Hozzáadás a letöltési sorhoz",
|
||||
"AddRootFolder": "Gyökérmappa hozzáadása",
|
||||
"AddQualityProfile": "Minőségi profil hozzáadása",
|
||||
"AddQualityProfile": "Minőségi Profil hozzáadása",
|
||||
"AddedToDownloadQueue": "Hozzáadva a letöltési sorhoz",
|
||||
"AddDownloadClient": "Letöltőkliens hozzáadása",
|
||||
"AddDelayProfile": "Késleltetési profil hozzáadása",
|
||||
@@ -1081,7 +1080,7 @@
|
||||
"RottenTomatoesRating": "Tomato Értékelés",
|
||||
"TotalMovies": "Összes film",
|
||||
"ApplicationUrlHelpText": "Az alkalmazás külső URL-címe, beleértve a http(s)://-t, a portot és az URL-alapot",
|
||||
"ApplicationURL": "Alkalmazás URL-je",
|
||||
"ApplicationURL": "Alkalmazás URL",
|
||||
"PreferredProtocol": "Preferált protokoll",
|
||||
"SettingsTheme": "Téma",
|
||||
"SettingsThemeHelpText": "Változtasd meg az alkalmazás felhasználói felület témáját, az „Auto” téma az operációs rendszer témáját használja a Világos vagy Sötét mód beállításához. A Theme.Park ihlette",
|
||||
@@ -1102,5 +1101,10 @@
|
||||
"DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{0}' egyéni formátumot?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {0} elemet a várólistáról?",
|
||||
"RemoveSelectedItemQueueMessageText": "Biztosan el akar távolítani 1 elemet a várólistáról?",
|
||||
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban"
|
||||
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet",
|
||||
"AutomaticAdd": "Automatikus hozzáadás",
|
||||
"Unknown": "Ismeretlen",
|
||||
"UnknownEventTooltip": "Ismeretlen Esemény"
|
||||
}
|
||||
|
||||
@@ -289,7 +289,6 @@
|
||||
"RadarrCalendarFeed": "Radarr dagatalstraumur",
|
||||
"ReadTheWikiForMoreInformation": "Lestu Wiki fyrir frekari upplýsingar",
|
||||
"RecyclingBinCleanup": "Hreinsun ruslakörfu",
|
||||
"Redownload": "Endurhlaða",
|
||||
"Refresh": "Hressa",
|
||||
"RefreshMovie": "Hressa kvikmynd",
|
||||
"RelativePath": "Hlutfallsleg leið",
|
||||
|
||||
@@ -415,7 +415,6 @@
|
||||
"RegularExpressionsCanBeTested": "Le espressioni regolari possono essere testate ",
|
||||
"RefreshMovie": "Aggiorna il Film",
|
||||
"RefreshInformationAndScanDisk": "Aggiorna le informazioni e scansiona il disco",
|
||||
"Redownload": "Riscarica",
|
||||
"RecyclingBinCleanup": "Pulizia del cestino",
|
||||
"RecyclingBin": "Cestino",
|
||||
"RecycleBinHelpText": "I file dei film andranno qui quando cancellati invece che venire eliminati definitivamente",
|
||||
|
||||
@@ -268,7 +268,6 @@
|
||||
"ReadTheWikiForMoreInformation": "詳細については、Wikiをお読みください",
|
||||
"Reason": "理由",
|
||||
"RecyclingBinCleanup": "ごみ箱のクリーンアップ",
|
||||
"Redownload": "再ダウンロード",
|
||||
"Refresh": "更新",
|
||||
"RefreshMovie": "映画を更新する",
|
||||
"RegularExpressionsCanBeTested": "正規表現をテストできます ",
|
||||
|
||||
@@ -270,7 +270,6 @@
|
||||
"ReadTheWikiForMoreInformation": "자세한 내용은 Wiki를 참조하십시오.",
|
||||
"Reason": "이유",
|
||||
"RecyclingBinCleanup": "재활용 빈 정리",
|
||||
"Redownload": "다시 다운로드",
|
||||
"Refresh": "새롭게 하다",
|
||||
"RefreshMovie": "영화 새로 고침",
|
||||
"RegularExpressionsCanBeTested": "정규식을 테스트 할 수 있습니다. ",
|
||||
|
||||
@@ -512,7 +512,6 @@
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Bestanden in de prullenbak ouder dan het geselecteerde aantal dagen zullen automatisch opgeschoond worden",
|
||||
"RecyclingBin": "Prullenbak",
|
||||
"RecyclingBinCleanup": "Prullenbak Opruimen",
|
||||
"Redownload": "Opnieuw downloaden",
|
||||
"RefreshInformationAndScanDisk": "Informatie vernieuwen en schijf herscannen",
|
||||
"RefreshMovie": "Film vernieuwen",
|
||||
"ProxyType": "Proxy Type",
|
||||
|
||||
@@ -272,7 +272,6 @@
|
||||
"RadarrCalendarFeed": "Kanał kalendarza radarowego",
|
||||
"Reason": "Powód",
|
||||
"RecyclingBinCleanup": "Czyszczenie kosza na śmieci",
|
||||
"Redownload": "Pobierz ponownie",
|
||||
"Refresh": "Odświeżać",
|
||||
"RefreshMovie": "Odśwież film",
|
||||
"RegularExpressionsCanBeTested": "Można testować wyrażenia regularne ",
|
||||
|
||||
@@ -533,7 +533,6 @@
|
||||
"Remove": "Remover",
|
||||
"RefreshMovie": "Atualizar filme",
|
||||
"RefreshInformationAndScanDisk": "Atualizar informações e analisar o disco",
|
||||
"Redownload": "Transferir novamente",
|
||||
"RecyclingBinCleanup": "Limpeza da reciclagem",
|
||||
"RecyclingBin": "Reciclagem",
|
||||
"Reason": "Razão",
|
||||
@@ -802,7 +801,7 @@
|
||||
"AddCustomFormat": "Adicionar formato personalizado",
|
||||
"AddDelayProfile": "Adicionar perfil de atraso",
|
||||
"AddDownloadClient": "Adicionar cliente de transferências",
|
||||
"AllMoviesInPathHaveBeenImported": "Todos os filmes em {0} foram importados",
|
||||
"AllMoviesInPathHaveBeenImported": "Todos os filmes no {caminho} foram importados",
|
||||
"AllResultsHiddenFilter": "Todos os resultados estão ocultos pelo filtro aplicado",
|
||||
"Always": "Sempre",
|
||||
"AptUpdater": "Utilize o apt para instalar a atualização",
|
||||
|
||||
@@ -23,17 +23,17 @@
|
||||
"IndexerRssHealthCheckNoIndexers": "Nenhum indexador disponível com sincronização RSS habilitada, o Radarr não capturará novas versões automaticamente",
|
||||
"IndexerRssHealthCheckNoAvailableIndexers": "Todos os indexadores compatíveis com rss estão temporariamente indisponíveis devido a erros recentes do indexador",
|
||||
"IndexerPriorityHelpText": "Prioridade do indexador de 1 (maior) a 50 (menor). Padrão: 25. Usado quando obtendo lançamentos como um desempate para lançamentos iguais, o Radarr ainda usará todos os indexadores habilitados para Sync e pesquisa de RSS",
|
||||
"IndexerPriority": "Prioridade do Indexador",
|
||||
"IndexerPriority": "Prioridade do indexador",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas",
|
||||
"IndexerFlags": "Sinalizadores do indexador",
|
||||
"Indexer": "Indexador",
|
||||
"IncludeUnmonitored": "Incluir não monitorado",
|
||||
"IncludeUnmonitored": "Incluir não monitorados",
|
||||
"IncludeRecommendationsHelpText": "Incluir filmes recomendados pelo Radarr na exibição de descoberta",
|
||||
"IncludeRadarrRecommendations": "Incluir recomendações do Radarr",
|
||||
"IncludeHealthWarningsHelpText": "Incluir avisos de integridade",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "Incluir no formato de renomeação {Custom Formats}",
|
||||
"IncludeCustomFormatWhenRenaming": "Incluir Formato Personalizado ao Renomear",
|
||||
"IncludeCustomFormatWhenRenaming": "Incluir formato personalizado ao renomear",
|
||||
"InCinemasMsg": "O filme está nos cinemas",
|
||||
"InCinemasDate": "Data de lançamento nos cinemas",
|
||||
"InCinemas": "Nos cinemas",
|
||||
@@ -48,12 +48,12 @@
|
||||
"ImportHeader": "Importar uma biblioteca organizada existente para adicionar filmes ao Radarr",
|
||||
"ImportFailed": "Falha na importação: {sourceTitle}",
|
||||
"ImportExtraFilesHelpText": "Importar arquivos adicionais correspondentes (legendas, nfo, etc.) após importar um arquivo de filme",
|
||||
"ImportExtraFiles": "Importar Arquivos Extras",
|
||||
"ImportExtraFiles": "Importar arquivos adicionais",
|
||||
"ImportExistingMovies": "Importar filmes existentes",
|
||||
"ImportErrors": "Erros de Importação",
|
||||
"ImportedTo": "Importado Para",
|
||||
"ImportErrors": "Erros de importação",
|
||||
"ImportedTo": "Importado para",
|
||||
"Imported": "Importado",
|
||||
"ImportCustomFormat": "Importar Formato Personalizado",
|
||||
"ImportCustomFormat": "Importar formato personalizado",
|
||||
"Import": "Importar",
|
||||
"IMDb": "IMDb",
|
||||
"Images": "Imagens",
|
||||
@@ -61,26 +61,26 @@
|
||||
"IgnoredPlaceHolder": "Adicionar nova restrição",
|
||||
"IgnoredHelpText": "O lançamento será rejeitado se contiver um ou mais desses termos (não diferencia maiúsculas de minúsculas)",
|
||||
"IgnoreDeletedMovies": "Não monitorar filmes excluídos",
|
||||
"IgnoredAddresses": "Endereços Ignorados",
|
||||
"IgnoredAddresses": "Endereços ignorados",
|
||||
"Ignored": "Ignorado",
|
||||
"IconForCutoffUnmet": "Ícone para Corte Não Atendido",
|
||||
"IconForCutoffUnmet": "Ícone para limite não atendido",
|
||||
"iCalLink": "Link do iCal",
|
||||
"ICalHttpUrlHelpText": "Copie este URL em seu(s) cliente(s) ou clique para se inscrever se o seu navegador é compatível com webcal",
|
||||
"ICalFeed": "Feed do iCal",
|
||||
"HttpHttps": "HTTP(S)",
|
||||
"Hours": "Horas",
|
||||
"Hostname": "Hostname",
|
||||
"Hostname": "Nome do host",
|
||||
"Host": "Host",
|
||||
"HomePage": "Página inicial",
|
||||
"History": "Histórico",
|
||||
"HideAdvanced": "Ocultar Avançado",
|
||||
"HideAdvanced": "Ocultar opções avançadas",
|
||||
"HiddenClickToShow": "Oculto, clique para mostrar",
|
||||
"HealthNoIssues": "Nenhum problema com sua configuração",
|
||||
"Health": "Saúde",
|
||||
"HaveNotAddedMovies": "Você ainda não adicionou nenhum filme, deseja importar alguns ou todos os seus filmes primeiro?",
|
||||
"HardlinkCopyFiles": "Hardlink/Copiar Arquivos",
|
||||
"HardlinkCopyFiles": "Criar hardlink/Copiar arquivos",
|
||||
"Group": "Grupo",
|
||||
"GrabSelected": "Obter Selecionado",
|
||||
"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",
|
||||
"Grabbed": "Obtido",
|
||||
@@ -103,18 +103,18 @@
|
||||
"Folder": "Pasta",
|
||||
"FocusSearchBox": "Selecionar caixa de pesquisa",
|
||||
"Fixed": "Corrigido",
|
||||
"FirstDayOfWeek": "Primeiro Dia da Semana",
|
||||
"FirstDayOfWeek": "Primeiro dia da semana",
|
||||
"FilterPlaceHolder": "Pesquisar filmes",
|
||||
"Filter": "Filtro",
|
||||
"Files": "Arquivos",
|
||||
"FileNameTokens": "Tokens de Nome de Arquivo",
|
||||
"FileNames": "Nomes de Arquivo",
|
||||
"FileNameTokens": "Tokens de nome de arquivo",
|
||||
"FileNames": "Nomes de arquivo",
|
||||
"Filename": "Nome do arquivo",
|
||||
"FileManagement": "Gerenciamento de Arquivo",
|
||||
"FileManagement": "Gerenciamento de arquivo",
|
||||
"FileDateHelpText": "Alterar a data do arquivo ao importar/verificar novamente",
|
||||
"FeatureRequests": "Solicitação de recursos",
|
||||
"FailedToLoadMovieFromAPI": "Falha ao carregar o filme da API",
|
||||
"FailedLoadingSearchResults": "Falha ao carregar os resultados da pesquisa, tente novamente.",
|
||||
"FailedLoadingSearchResults": "Falha ao carregar os resultados da pesquisa. Tente novamente.",
|
||||
"FailedDownloadHandling": "Falha no gerenciamento de download",
|
||||
"Failed": "Falhou",
|
||||
"ExtraFileExtensionsHelpTexts2": "Exemplos: \".sub, .nfo\" ou \"sub,nfo\"",
|
||||
@@ -129,7 +129,7 @@
|
||||
"ExcludeMovie": "Filme excluído",
|
||||
"Excluded": "Excluído",
|
||||
"Exception": "Exceção",
|
||||
"EventType": "Tipo de Evento",
|
||||
"EventType": "Tipo de evento",
|
||||
"Events": "Eventos",
|
||||
"ErrorRestoringBackup": "Erro ao restaurar o backup",
|
||||
"ErrorLoadingContents": "Erro ao carregar o conteúdo",
|
||||
@@ -138,39 +138,39 @@
|
||||
"EnableSslHelpText": " Requer a reinicialização com a execução como administrador para fazer efeito",
|
||||
"EnableSSL": "Habilitar SSL",
|
||||
"EnableRSS": "Habilitar RSS",
|
||||
"EnableMediaInfoHelpText": "Extrair informações do vídeo, como resolução, duração e informações do codec de arquivos. Isso requer que o Radarr leia partes do arquivo que podem causar alta atividade no disco ou na rede durante as verificações.",
|
||||
"EnableMediaInfoHelpText": "Extraia informações do vídeo, como resolução, duração e informações do codec de arquivos. Isso requer que o Radarr leia partes do arquivo que podem causar alta atividade no disco ou na rede durante as verificações.",
|
||||
"EnableInteractiveSearchHelpTextWarning": "A pesquisa não é compatível com este indexador",
|
||||
"EnableInteractiveSearchHelpText": "Será usado quando a pesquisa interativa for usada",
|
||||
"EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa",
|
||||
"EnableInteractiveSearch": "Ativar pesquisa interativa",
|
||||
"EnableHelpText": "Habilitar criação de arquivo de metadados para este tipo de metadados",
|
||||
"EnabledHelpText": "Habilitar esta lista para uso no Radarr",
|
||||
"Enabled": "Habilitado",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importar automaticamente downloads concluídos do cliente de download",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que usuários com deficiência de cor distingam melhor as informações codificadas por cores",
|
||||
"EnableColorImpairedMode": "Habilitar Modo para Deficientes Visuais",
|
||||
"EnableAutomaticSearchHelpTextWarning": "Será usado quando a pesquisa interativa for usada",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que usuários com daltonismo distingam melhor as informações codificadas por cores",
|
||||
"EnableColorImpairedMode": "Habilitar modo para daltonismo",
|
||||
"EnableAutomaticSearchHelpTextWarning": "Será usado com a pesquisa interativa",
|
||||
"EnableAutomaticSearchHelpText": "Será usado ao realizar pesquisas automáticas pela interface ou pelo Radarr",
|
||||
"EnableAutomaticSearch": "Ativar a pesquisa automática",
|
||||
"EnableAutomaticAdd": "Habilitar Adição Automática",
|
||||
"EnableAutomaticAdd": "Habilitar adição automática",
|
||||
"EnableAutoHelpText": "Se habilitada, os filmes serão automaticamente adicionados ao Radarr a partir desta lista",
|
||||
"Enable": "Habilitar",
|
||||
"EditRestriction": "Editar Restrição",
|
||||
"EditRemotePathMapping": "Editar Mapeamento do Caminho Remoto",
|
||||
"EditQualityProfile": "Editar Perfil de Qualidade",
|
||||
"EditRestriction": "Editar restrição",
|
||||
"EditRemotePathMapping": "Editar mapeamento de caminho remoto",
|
||||
"EditQualityProfile": "Editar perfil de qualidade",
|
||||
"EditPerson": "Editar pessoa",
|
||||
"EditMovieFile": "Editar arquivo do filme",
|
||||
"EditMovie": "Editar filme",
|
||||
"EditListExclusion": "Editar Exclusão da Lista",
|
||||
"EditListExclusion": "Editar exclusão de lista",
|
||||
"Edition": "Edição",
|
||||
"EditGroups": "Editar Grupos",
|
||||
"EditDelayProfile": "Editar Perfil de Atraso",
|
||||
"EditCustomFormat": "Editar Formato Personalizado",
|
||||
"EditGroups": "Editar grupos",
|
||||
"EditDelayProfile": "Editar perfil de atraso",
|
||||
"EditCustomFormat": "Editar formato personalizado",
|
||||
"Edit": "Editar",
|
||||
"DownloadWarning": "Aviso de download: {warningMessage}",
|
||||
"DownloadPropersAndRepacksHelpTextWarning": "Use formatos personalizados para atualizações automáticas para Propers/Repacks",
|
||||
"DownloadPropersAndRepacksHelpText2": "Use \"Não preferir\" para classificar por pontuação de formato personalizado em relação a Propers/Repacks",
|
||||
"DownloadPropersAndRepacksHelpText1": "Se deve ou não atualizar automaticamente para Propers/Repacks",
|
||||
"DownloadPropersAndRepacks": "Propers e Repacks",
|
||||
"DownloadPropersAndRepacksHelpTextWarning": "Usar formatos personalizados para atualizações automáticas para propers/repacks",
|
||||
"DownloadPropersAndRepacksHelpText2": "Use \"Não preferir\" para classificar por pontuação de formato personalizado em vez de propers/repacks",
|
||||
"DownloadPropersAndRepacksHelpText1": "Se deve ou não atualizar automaticamente para propers/repacks",
|
||||
"DownloadPropersAndRepacks": "Propers e repacks",
|
||||
"Downloading": "Baixando",
|
||||
"DownloadFailed": "Falha no download",
|
||||
"DownloadedButNotMonitored": "Baixado (não monitorado)",
|
||||
@@ -180,14 +180,14 @@
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Clientes de download indisponíveis devido a falhas: {0}",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas",
|
||||
"DownloadClientsSettingsSummary": "Clientes de download, gerenciamento de download e mapeamentos de caminhos remotos",
|
||||
"DownloadClientSettings": "Configurações do Cliente de Download",
|
||||
"DownloadClientSettings": "Configurações do cliente de download",
|
||||
"DownloadClients": "Clientes de download",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Não é possível se comunicar com {0}.",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Nenhum cliente de download está disponível",
|
||||
"DownloadClient": "Cliente de Download",
|
||||
"DoNotUpgradeAutomatically": "Não Atualizar Automaticamente",
|
||||
"DownloadClient": "Cliente de download",
|
||||
"DoNotUpgradeAutomatically": "Não atualizar automaticamente",
|
||||
"DoNotPrefer": "Não preferir",
|
||||
"DoneEditingGroups": "Concluir Edição de Grupos",
|
||||
"DoneEditingGroups": "Concluir edição de grupos",
|
||||
"Donations": "Doações",
|
||||
"DockerUpdater": "atualizar o contêiner do Docker para receber a atualização",
|
||||
"Docker": "Docker",
|
||||
@@ -199,8 +199,8 @@
|
||||
"Details": "Detalhes",
|
||||
"DetailedProgressBarHelpText": "Mostrar texto em barra de progresso",
|
||||
"DetailedProgressBar": "Barra de progresso detalhada",
|
||||
"DestinationRelativePath": "Caminho Relativo de Destino",
|
||||
"DestinationPath": "Caminho de Destino",
|
||||
"DestinationRelativePath": "Caminho de destino relativo",
|
||||
"DestinationPath": "Caminho de destino",
|
||||
"DeleteTheMovieFolder": "A pasta do filme '{path}' e todo o seu conteúdo serão excluídos.",
|
||||
"DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?",
|
||||
"DeleteTag": "Excluir tag",
|
||||
@@ -208,31 +208,31 @@
|
||||
"DeleteSelectedMovie": "Excluir filme(s) selecionado(s)",
|
||||
"DeleteRestrictionHelpText": "Tem certeza de que deseja excluir esta restrição?",
|
||||
"DeleteRestriction": "Excluir restrição",
|
||||
"DeleteQualityProfile": "Excluir Perfil de Qualidade",
|
||||
"DeleteQualityProfile": "Excluir perfil de qualidade",
|
||||
"DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?",
|
||||
"DeleteNotification": "Excluir Notificação",
|
||||
"DeleteNotification": "Excluir notificação",
|
||||
"DeleteMovieFolderLabel": "Excluir pasta do filme",
|
||||
"DeleteMovieFolderHelpText": "Excluir a pasta do filme e seu conteúdo",
|
||||
"DeleteIndexerMessageText": "Tem certeza de que deseja excluir o indexador '{name}'?",
|
||||
"DeleteIndexer": "Excluir Indexador",
|
||||
"DeleteImportListExclusion": "Excluir Exclusão da Lista de Importação",
|
||||
"DeleteIndexer": "Excluir indexador",
|
||||
"DeleteImportListExclusion": "Excluir exclusão da lista de importação",
|
||||
"DeleteHeader": "Excluir: {0}",
|
||||
"DeleteFilesLabel": "Excluir {0} arquivos do filme",
|
||||
"DeleteFilesHelpText": "Excluir os arquivos e a pasta do filme",
|
||||
"DeleteFile": "Excluir arquivo",
|
||||
"DeleteEmptyFoldersHelpText": "Exclua pastas de filmes vazias durante a verificação do disco e quando os arquivos de filme forem excluídos",
|
||||
"DeleteEmptyFoldersHelpText": "Excluir as pastas de filmes vazias durante a verificação do disco e quando os arquivos de filme forem excluídos",
|
||||
"DeleteEmptyFolders": "Excluir pastas vazias",
|
||||
"DeleteDownloadClientMessageText": "Tem certeza de que deseja excluir o cliente de download '{name}'?",
|
||||
"DeleteDownloadClient": "Excluir Cliente de Download",
|
||||
"DeleteDownloadClient": "Excluir cliente de download",
|
||||
"DeletedMsg": "Filme excluído do TMDb",
|
||||
"DeleteDelayProfile": "Excluir Perfil de Atraso",
|
||||
"DeleteDelayProfile": "Excluir perfil de atraso",
|
||||
"Deleted": "Excluído",
|
||||
"DeleteCustomFormat": "Excluir formato personalizado",
|
||||
"DeleteBackupMessageText": "Tem certeza de que deseja excluir o backup '{name}'?",
|
||||
"DeleteBackup": "Excluir Backup",
|
||||
"Delete": "Excluir",
|
||||
"DelayProfiles": "Perfis de Atraso",
|
||||
"DelayProfile": "Perfil de Atraso",
|
||||
"DelayProfiles": "Perfis de atraso",
|
||||
"DelayProfile": "Perfil de atraso",
|
||||
"DefaultDelayProfile": "Este é o perfil padrão. Ele se aplica a todos os filmes que não possuem um perfil explícito.",
|
||||
"Debug": "Depuração",
|
||||
"DBMigration": "Migração de banco de dados",
|
||||
@@ -243,17 +243,17 @@
|
||||
"CutoffUnmet": "Limite não atingido",
|
||||
"CutoffHelpText": "Quando essa qualidade for atingida, o Radarr não fará mais o download de filmes depois que a pontuação de corte do formato personalizado for atingida ou excedida",
|
||||
"CutoffFormatScoreHelpText": "Uma vez que o corte de qualidade é atingido ou excedido e esta pontuação de formato personalizado é alcançada, o Radarr não irá mais capturar ou importar atualizações para esses filmes",
|
||||
"Cutoff": "Corte",
|
||||
"Cutoff": "Limite",
|
||||
"CustomFormatUnknownConditionOption": "Opção \"{0}\" desconhecida para a condição \"{1}\"",
|
||||
"CustomFormatUnknownCondition": "Condição de formato personalizado \"{0}\" desconhecida",
|
||||
"CustomFormatsSettingsSummary": "Configurações e Formatos Personalizados",
|
||||
"CustomFormatsSettings": "Configurações de Formatos Personalizados",
|
||||
"CustomFormatsSettingsSummary": "Configurações e formatos personalizados",
|
||||
"CustomFormatsSettings": "Configurações de formatos personalizados",
|
||||
"CustomFormatScore": "Pontuação do formato personalizado",
|
||||
"CustomFormats": "Formatos personalizados",
|
||||
"CustomFormatHelpText": "O Radarr pontua cada versão usando a soma das pontuações para formatos personalizados encontrados. Se uma nova versão tiver melhor pontuação, com a mesma qualidade ou melhor, o Radarr o capturará.",
|
||||
"CustomFormat": "Formato Personalizado",
|
||||
"CustomFilters": "Filtros Personalizados",
|
||||
"Custom": "Personalizar",
|
||||
"CustomFormatHelpText": "O Radarr pontua cada lançamento usando a soma das pontuações para formatos personalizados correspondentes. Se um novo lançamento tiver melhor pontuação, com a mesma qualidade ou melhor, o Radarr o obterá.",
|
||||
"CustomFormat": "Formato personalizado",
|
||||
"CustomFilters": "Filtros personalizados",
|
||||
"Custom": "Personalizado",
|
||||
"CurrentlyInstalled": "Atualmente instalado",
|
||||
"Crew": "Equipe técnica",
|
||||
"CreateGroup": "Criar grupo",
|
||||
@@ -262,28 +262,28 @@
|
||||
"CouldNotFindResults": "Não foi possível encontrar nenhum resultado para '{term}'",
|
||||
"CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, os bloqueios de arquivo podem impedir a renomeação de arquivos que estão sendo semeados. Você pode desabilitar temporariamente a semeadura e usar a função de renomeação do Radarr como uma solução alternativa.",
|
||||
"CopyUsingHardlinksHelpText": "Os hardlinks permitem que o Radarr importe torrents de propagação para a pasta do filme sem ocupar espaço extra em disco ou copiar todo o conteúdo do arquivo. Hardlinks só funcionarão se a origem e o destino estiverem no mesmo volume",
|
||||
"CopyToClipboard": "Copiar para Área de Transferência",
|
||||
"CopyUsingHardlinksHelpText": "Os hardlinks permitem que o Radarr importe torrents de propagação para a pasta do filme sem ocupar espaço adicional em disco ou copiar todo o conteúdo do arquivo. Hardlinks só funcionarão se a origem e o destino estiverem no mesmo volume",
|
||||
"CopyToClipboard": "Copiar para a área de transferência",
|
||||
"ConsideredAvailable": "Considerado disponível",
|
||||
"ConnectSettingsSummary": "Notificações, conexões com servidores/reprodutores de mídia e scripts personalizados",
|
||||
"ConnectSettings": "Configurações de Conexão",
|
||||
"ConnectSettings": "Configurações de conexão",
|
||||
"Connections": "Conexões",
|
||||
"ConnectionLost": "Conexão Perdida",
|
||||
"ConnectionLost": "Conexão perdida",
|
||||
"Connection": "Conexão",
|
||||
"Connect": "Conectar",
|
||||
"Conditions": "Condições",
|
||||
"Component": "Componente",
|
||||
"CompletedDownloadHandling": "Gerenciamento de Downloads Completos",
|
||||
"CompletedDownloadHandling": "Gerenciamento de downloads concluídos",
|
||||
"Columns": "Colunas",
|
||||
"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",
|
||||
"Close": "Fechar",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"CloneIndexer": "Clonar Indexador",
|
||||
"CloneProfile": "Clonar perfil",
|
||||
"CloneIndexer": "Clonar indexador",
|
||||
"CloneCustomFormat": "Clonar formato personalizado",
|
||||
"ClientPriority": "Prioridade do Cliente",
|
||||
"ClientPriority": "Prioridade do cliente",
|
||||
"ClickToChangeQuality": "Clique para alterar a qualidade",
|
||||
"ClickToChangeMovie": "Clique para alterar o filme",
|
||||
"ClickToChangeLanguage": "Clique para alterar o idioma",
|
||||
@@ -294,20 +294,20 @@
|
||||
"ChmodGroup": "Grupo chmod",
|
||||
"ChmodFolderHelpTextWarning": "Isso só funciona se o usuário que está executando o Radarr for o proprietário do arquivo. É melhor garantir que o cliente de download defina as permissões corretamente.",
|
||||
"ChmodFolderHelpText": "Octal, aplicado durante a importação/renomeação de pastas e arquivos de mídia (sem bits de execução)",
|
||||
"ChmodFolder": "chmod Pasta",
|
||||
"ChmodFolder": "Fazer chmod de pasta",
|
||||
"CheckForFinishedDownloadsInterval": "Verifique o intervalo de downloads concluídos",
|
||||
"CheckDownloadClientForDetails": "verifique o cliente de download para mais detalhes",
|
||||
"CheckDownloadClientForDetails": "verifique o cliente de download para saber mais",
|
||||
"ChangeHasNotBeenSavedYet": "Mudar o que não foi salvo ainda",
|
||||
"ChangeFileDate": "Alterar Data do Arquivo",
|
||||
"ChangeFileDate": "Alterar data do arquivo",
|
||||
"CertValidationNoLocal": "Desabilitado para endereços locais",
|
||||
"CertificationCountryHelpText": "Selecione o país para as certificações de filmes",
|
||||
"CertificationCountry": "País da certificação",
|
||||
"Certification": "Certificação",
|
||||
"CertificateValidationHelpText": "Altere a rigidez da validação da certificação HTTPS. Não mude a menos que você entenda os riscos.",
|
||||
"CertificateValidation": "Validação de Certificado",
|
||||
"CertificateValidation": "Validação de certificado",
|
||||
"Cast": "Elenco",
|
||||
"CantFindMovie": "Por que não consigo encontrar meu filme?",
|
||||
"CancelProcessing": "Cancelar Processamento",
|
||||
"CancelProcessing": "Cancelar processamento",
|
||||
"CancelPendingTask": "Tem certeza de que deseja cancelar essa tarefa pendente?",
|
||||
"Cancel": "Cancelar",
|
||||
"CalendarOptions": "Opções de Calendário",
|
||||
@@ -318,7 +318,7 @@
|
||||
"BranchUpdate": "Ramificação para atualização do Radarr",
|
||||
"Branch": "Ramificação",
|
||||
"BindAddressHelpText": "Endereço IP válido, localhost ou '*' para todas as interfaces",
|
||||
"BindAddress": "Fixar Endereço",
|
||||
"BindAddress": "Fixar endereço",
|
||||
"BeforeUpdate": "Antes da atualização",
|
||||
"Backups": "Backups",
|
||||
"BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente",
|
||||
@@ -329,22 +329,22 @@
|
||||
"AvailabilityDelayHelpText": "Quantidade de tempo antes ou depois da data de disponibilidade para pesquisar pelo filme",
|
||||
"AvailabilityDelay": "Atraso de disponibilidade",
|
||||
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Filmes excluídos do disco automaticamente deixam de ser monitorados no Radarr",
|
||||
"AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
|
||||
"AutomaticSearch": "Pesquisa Automática",
|
||||
"AutoRedownloadFailedHelpText": "Procurar e tentar baixar automaticamente uma versão diferente",
|
||||
"AutomaticSearch": "Pesquisa automática",
|
||||
"Automatic": "Automático",
|
||||
"AuthForm": "Formulário (Página de login)",
|
||||
"AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar {appName}",
|
||||
"AuthForm": "Formulário (página de login)",
|
||||
"AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o {appName}",
|
||||
"Authentication": "Autenticação",
|
||||
"AuthBasic": "Básico (Balão do Navegador)",
|
||||
"AudioInfo": "Info do Áudio",
|
||||
"AsAllDayHelpText": "Eventos aparecerão como eventos de dia inteiro em seu calendário",
|
||||
"AuthBasic": "Básico (pop-up do navegador)",
|
||||
"AudioInfo": "Informações do áudio",
|
||||
"AsAllDayHelpText": "Os eventos aparecerão como eventos de dia inteiro em seu calendário",
|
||||
"AptUpdater": "Use o apt para instalar a atualização",
|
||||
"ApplyTagsHelpTextHowToApplyMovies": "Como aplicar tags aos filmes selecionados",
|
||||
"ApplyTags": "Aplicar Tags",
|
||||
"Apply": "Aplicar",
|
||||
"AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização",
|
||||
"AppDataDirectory": "Diretório AppData",
|
||||
"ApiKey": "Chave API",
|
||||
"ApiKey": "Chave da API",
|
||||
"Announced": "Anunciado",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do Radarr. Isso inclui informações sobre seu navegador, quais páginas da interface Web do Radarr você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.",
|
||||
"AnalyseVideoFiles": "Analisar arquivos de vídeo",
|
||||
@@ -431,17 +431,17 @@
|
||||
"AllowHardcodedSubs": "Permitir legendas embutidas",
|
||||
"AllMoviesInPathHaveBeenImported": "Todos os filmes em {path} foram importados",
|
||||
"AllMoviesHiddenDueToFilter": "Todos os filmes estão ocultos devido ao filtro aplicado.",
|
||||
"AllFiles": "Todos os Arquivos",
|
||||
"AllFiles": "Todos os arquivos",
|
||||
"All": "Todos",
|
||||
"AgeWhenGrabbed": "Idade (quando baixado)",
|
||||
"Agenda": "Agenda",
|
||||
"Age": "Idade",
|
||||
"AfterManualRefresh": "Depois da Atualização Manual",
|
||||
"AgeWhenGrabbed": "Tempo de vida (quando obtido)",
|
||||
"Agenda": "Programação",
|
||||
"Age": "Tempo de vida",
|
||||
"AfterManualRefresh": "Após a atualização manual",
|
||||
"AddToDownloadQueue": "Adicionar à fila de download",
|
||||
"AddRootFolder": "Adicionar Pasta Raiz",
|
||||
"AddRootFolder": "Adicionar pasta raiz",
|
||||
"AddRestriction": "Adicionar restrição",
|
||||
"AddRemotePathMapping": "Adicionar Mapeamento de Caminho Remoto",
|
||||
"AddQualityProfile": "Adicionar Perfil de Qualidade",
|
||||
"AddRemotePathMapping": "Adicionar mapeamento de caminho remoto",
|
||||
"AddQualityProfile": "Adicionar perfil de qualidade",
|
||||
"AddNewTmdbIdMessage": "Você também pode pesquisar usando a ID do TMDb de um filme. Por exemplo, \"tmdb:71663\"",
|
||||
"AddNewMovie": "Adicionar novo filme",
|
||||
"AddNewMessage": "É fácil adicionar um novo filme, basta começar a digitar o nome do filme que deseja acrescentar",
|
||||
@@ -450,20 +450,20 @@
|
||||
"AddMovie": "Adicionar filme",
|
||||
"AddListExclusion": "Adicionar exclusão à lista",
|
||||
"AddingTag": "Adicionar tag",
|
||||
"AddIndexer": "Adicionar Indexador",
|
||||
"AddIndexer": "Adicionar indexador",
|
||||
"AddImportExclusionHelpText": "Impedir a adição do filme ao Radarr por listas",
|
||||
"AddExclusion": "Adicionar Exclusão",
|
||||
"AddExclusion": "Adicionar exclusão",
|
||||
"AddedToDownloadQueue": "Adicionado à fila de download",
|
||||
"Added": "Adicionado",
|
||||
"AddDownloadClient": "Adicionar Cliente de Download",
|
||||
"AddDelayProfile": "Adicionar Perfil de Atraso",
|
||||
"AddCustomFormat": "Adicionar Formato Personalizado",
|
||||
"AddDownloadClient": "Adicionar cliente de download",
|
||||
"AddDelayProfile": "Adicionar perfil de atraso",
|
||||
"AddCustomFormat": "Adicionar formato personalizado",
|
||||
"Add": "Adicionar",
|
||||
"Activity": "Atividade",
|
||||
"Actions": "Ações",
|
||||
"AcceptConfirmationModal": "Aceitar o pop-up de confirmação",
|
||||
"About": "Sobre",
|
||||
"Analytics": "Analítica",
|
||||
"Analytics": "Análises",
|
||||
"Month": "Mês",
|
||||
"MovieYearHelpText": "O ano do filme a excluir",
|
||||
"MovieYear": "Ano do filme",
|
||||
@@ -546,7 +546,6 @@
|
||||
"RetentionHelpText": "Somente Usenet: defina como zero para definir a retenção ilimitada",
|
||||
"RestartReloadNote": "Observação: o Radarr reiniciará automaticamente e recarregará a interface durante o processo de restauração.",
|
||||
"RejectionCount": "Número de rejeição",
|
||||
"Redownload": "Baixar novamente",
|
||||
"UpgradeAllowedHelpText": "Se desabilitada, as qualidades não serão atualizadas",
|
||||
"UpgradesAllowed": "Atualizações Permitidas",
|
||||
"UpgradeUntilCustomFormatScore": "Atualizar até pontuação de formato personalizado",
|
||||
@@ -568,10 +567,10 @@
|
||||
"Wanted": "Procurado",
|
||||
"WhatsNew": "O que há de novo?",
|
||||
"Yesterday": "Ontem",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tente novamente.",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de download, tente novamente.",
|
||||
"UnableToAddANewCustomFormatPleaseTryAgain": "Não foi possível adicionar um novo formato personalizado, tente novamente.",
|
||||
"UnableToAddANewConditionPleaseTryAgain": "Não foi possível adicionar uma nova condição, tente novamente.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador. Tente novamente.",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de download. Tente novamente.",
|
||||
"UnableToAddANewCustomFormatPleaseTryAgain": "Não foi possível adicionar um novo formato personalizado. Tente novamente.",
|
||||
"UnableToAddANewConditionPleaseTryAgain": "Não foi possível adicionar uma nova condição. Tente novamente.",
|
||||
"UISettings": "Configurações da interface",
|
||||
"UILanguageHelpTextWarning": "É necessário recarregar o navegador",
|
||||
"UILanguage": "Idioma da interface",
|
||||
@@ -654,7 +653,7 @@
|
||||
"ShowDateAdded": "Mostrar data de adição",
|
||||
"ShowCutoffUnmetIconHelpText": "Mostrar ícone para arquivos quando o limite não foi atingindo",
|
||||
"ShowCertification": "Mostrar certificação",
|
||||
"ShowAdvanced": "Mostrar Avançado",
|
||||
"ShowAdvanced": "Mostrar opções avançadas",
|
||||
"ShouldMonitorHelpText": "Os filmes ou coleções adicionados por esta lista devem ser adicionados como monitorados",
|
||||
"SettingsWeekColumnHeader": "Cabeçalho da coluna da semana",
|
||||
"SettingsTimeFormat": "Formato de hora",
|
||||
@@ -768,7 +767,7 @@
|
||||
"RecyclingBin": "Lixeira",
|
||||
"RecycleBinHelpText": "Arquivos de filme virão para cá quando excluídos, em vez de serem apagados permanentemente",
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Os arquivos na lixeira mais antigos do que o número de dias selecionado serão limpos automaticamente",
|
||||
"UnableToLoadBackups": "Não é possível carregar backups",
|
||||
"UnableToLoadBackups": "Não foi possível carregar os backups",
|
||||
"UnableToLoadAltTitle": "Não foi possível carregar títulos alternativos.",
|
||||
"UI": "IU",
|
||||
"Type": "Tipo",
|
||||
@@ -836,7 +835,7 @@
|
||||
"PreviewRename": "Visualizar renomeação",
|
||||
"Presets": "Definições",
|
||||
"PreferUsenet": "Preferir Usenet",
|
||||
"PreferTorrent": "Preferir Torrent",
|
||||
"PreferTorrent": "Preferir torrent",
|
||||
"PreferredSize": "Tamanho Preferido",
|
||||
"Preferred": "Preferido",
|
||||
"PreferIndexerFlagsHelpText": "Priorizar versões com sinalizadores especiais",
|
||||
@@ -879,7 +878,7 @@
|
||||
"OnHealthIssueHelpText": "Ao ter problema de integridade",
|
||||
"OnHealthIssue": "Ao Problema de Saúde",
|
||||
"OnGrabHelpText": "Ao obter",
|
||||
"OnGrab": "Ao Baixar",
|
||||
"OnGrab": "Ao obter",
|
||||
"OnDownloadHelpText": "Ao importar",
|
||||
"Ok": "Ok",
|
||||
"OAuthPopupMessage": "Os pop-ups estão bloqueados em seu navegador",
|
||||
@@ -934,7 +933,7 @@
|
||||
"UnableToLoadRemotePathMappings": "Não foi possível carregar os mapeamentos de caminho remoto",
|
||||
"UnableToLoadQualityProfiles": "Não foi possível carregar os perfis de qualidade",
|
||||
"UnableToLoadQualityDefinitions": "Não foi possível carregar as definições de qualidade",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tente novamente.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação. Tente novamente.",
|
||||
"UnableToLoadNotifications": "Não foi possível carregar as notificações",
|
||||
"UnableToLoadNamingSettings": "Não foi possível carregar as configurações de nomenclatura",
|
||||
"UnableToLoadMovies": "Não foi possível carregar os filmes",
|
||||
@@ -945,15 +944,15 @@
|
||||
"UnableToLoadListOptions": "Não foi possível carregar as opções de lista",
|
||||
"UnableToLoadListExclusions": "Não foi possível carregar as exclusões de listas",
|
||||
"UnableToLoadIndexers": "Não foi possível carregar os indexadores",
|
||||
"UnableToLoadIndexerOptions": "Não foi possível carregar as opções de indexador",
|
||||
"UnableToLoadIndexerOptions": "Não foi possível carregar as opções do indexador",
|
||||
"UnableToLoadGeneralSettings": "Não foi possível carregar as configurações gerais",
|
||||
"UnableToLoadDownloadClientOptions": "Não foi possível carregar as opções do cliente de download",
|
||||
"UnableToLoadDelayProfiles": "Não foi possível carregar os perfis de atraso",
|
||||
"UnableToLoadCustomFormats": "Não foi possível carregar os formatos personalizados",
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Não foi possível adicionar um novo mapeamento de caminho remoto, tente novamente.",
|
||||
"UnableToAddANewQualityProfilePleaseTryAgain": "Não foi possível adicionar um novo perfil de qualidade, tente novamente.",
|
||||
"UnableToAddANewListPleaseTryAgain": "Não foi possível adicionar uma nova lista, tente novamente.",
|
||||
"UnableToAddANewListExclusionPleaseTryAgain": "Não foi possível adicionar uma nova exclusão da lista, tente novamente.",
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Não foi possível adicionar um novo mapeamento de caminho remoto. Tente novamente.",
|
||||
"UnableToAddANewQualityProfilePleaseTryAgain": "Não foi possível adicionar um novo perfil de qualidade. Tente novamente.",
|
||||
"UnableToAddANewListPleaseTryAgain": "Não foi possível adicionar uma nova lista. Tente novamente.",
|
||||
"UnableToAddANewListExclusionPleaseTryAgain": "Não foi possível adicionar uma nova exclusão de lista. Tente novamente.",
|
||||
"UISettingsSummary": "Opções de calendário, data e cores prejudicadas",
|
||||
"Trigger": "Acionador",
|
||||
"Trakt": "Trakt",
|
||||
@@ -965,8 +964,8 @@
|
||||
"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.",
|
||||
"ImportLibrary": "Importar biblioteca",
|
||||
"DefaultCase": "Minúscula ou maiúscula",
|
||||
"ChooseAnotherFolder": "Escolher outra pasta",
|
||||
"DefaultCase": "Minúscula ou maiúscula padrão",
|
||||
"ChooseAnotherFolder": "Escolha outra pasta",
|
||||
"MIA": "Desaparecidos",
|
||||
"SqliteVersionCheckUpgradeRequiredMessage": "A versão {0} do SQLite instalada atualmente não é mais compatível. Atualize o SQLite para pelo menos a versão {1}.",
|
||||
"ShowCinemaRelease": "Mostrar data de lançamento no cinema",
|
||||
@@ -1002,13 +1001,13 @@
|
||||
"RemotePathMappingCheckBadDockerPath": "Você está usando o docker; cliente de download {0} coloca downloads em {1}, mas este não é um caminho {2} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.",
|
||||
"ImportListMultipleMissingRoots": "Várias pastas raiz estão ausentes para listas de importação: {0}",
|
||||
"ImportListMissingRoot": "Pasta raiz ausente para lista(s) de importação: {0}",
|
||||
"BypassDelayIfHighestQualityHelpText": "Ignorar o atraso quando o lançamento tiver a qualidade mais alta habilitada no perfil de qualidade com o protocolo preferencial",
|
||||
"BypassDelayIfHighestQualityHelpText": "Ignorar atraso quando o lançamento tiver a qualidade mais alta habilitada no perfil de qualidade com o protocolo preferido",
|
||||
"BypassDelayIfHighestQuality": "Ignorar se a qualidade é mais alta",
|
||||
"From": "de",
|
||||
"Letterboxd": "Letterboxd",
|
||||
"TaskUserAgentTooltip": "User-Agent fornecido pelo aplicativo que chamou a API",
|
||||
"NotificationTriggersHelpText": "Selecione quais eventos devem acionar esta notificação",
|
||||
"UnableToAddRootFolder": "Incapaz de adicionar pasta raiz",
|
||||
"UnableToAddRootFolder": "Não foi possível adicionar a pasta raiz",
|
||||
"Blocklisted": "Bloqueado",
|
||||
"Blocklist": "Lista de Bloqueio",
|
||||
"BlocklistRelease": "Lançamento na lista de bloqueio",
|
||||
@@ -1039,7 +1038,7 @@
|
||||
"TmdbVotes": "Votos no TMDb",
|
||||
"ImdbVotes": "Votos no IMDb",
|
||||
"IndexerJackettAll": "Indexadores usando o Jackett 'all' endpoint sem suporte: {0}",
|
||||
"Auto": "Auto",
|
||||
"Auto": "Automático",
|
||||
"Duration": "Duração",
|
||||
"List": "Lista",
|
||||
"Never": "Nunca",
|
||||
@@ -1059,7 +1058,7 @@
|
||||
"NoCollections": "Nenhum filme encontrado. Para começar, adicione um novo filme ou importe alguns existentes",
|
||||
"MovieOnly": "Somente Filme",
|
||||
"UnableToLoadCollections": "Não foi possível carregar as coleções",
|
||||
"ChooseImportMode": "Escolha o Modo de Importação",
|
||||
"ChooseImportMode": "Escolha o modo de importação",
|
||||
"CollectionsSelectedInterp": "{0} Coleção(ões) Selecionadas",
|
||||
"EditCollection": "Editar Coleção",
|
||||
"MonitorCollection": "Monitorar Coleção",
|
||||
@@ -1081,11 +1080,11 @@
|
||||
"CollectionShowPostersHelpText": "Mostrar pôsteres de itens da coleção",
|
||||
"RottenTomatoesRating": "Avaliação Tomato",
|
||||
"TotalMovies": "Total de Filmes",
|
||||
"ApplicationURL": "URL do Aplicativo",
|
||||
"ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e base da URL",
|
||||
"ApplicationURL": "URL do aplicativo",
|
||||
"ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e URL base",
|
||||
"PreferredProtocol": "Protocolo Preferido",
|
||||
"SettingsThemeHelpText": "Alterar o tema da interface do usuário do aplicativo, o tema 'Auto' usará o tema do sistema operacional para definir o modo Claro ou Escuro. Inspirado por Theme.Park",
|
||||
"ResetDefinitions": "Redefinir Definições",
|
||||
"ResetDefinitions": "Redefinir definições",
|
||||
"ResetQualityDefinitions": "Redefinir definições de qualidade",
|
||||
"ResetTitles": "Redefinir títulos",
|
||||
"SettingsTheme": "Tema",
|
||||
@@ -1107,13 +1106,13 @@
|
||||
"OnManualInteractionRequired": "Na Interação Manual Necessária",
|
||||
"OnManualInteractionRequiredHelpText": "Uma Interação Manual é Necessária",
|
||||
"ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração",
|
||||
"ImportScriptPath": "Importar Caminho do Script",
|
||||
"ImportUsingScript": "Importar Usando o Script",
|
||||
"ImportScriptPath": "Caminho para importar script",
|
||||
"ImportUsingScript": "Importar usando script",
|
||||
"RemoveCompletedDownloads": "Remover downloads concluídos",
|
||||
"RemoveFailedDownloads": "Remover downloads com falha",
|
||||
"ScriptImportPathHelpText": "O caminho para o script a ser usado para importar",
|
||||
"UseScriptImportHelpText": "Copiar arquivos para importar usando um script (ex. para transcodificação)",
|
||||
"DeleteRemotePathMapping": "Excluir Mapeamento de Caminho Remoto",
|
||||
"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",
|
||||
"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?",
|
||||
@@ -1171,22 +1170,22 @@
|
||||
"SkipRedownloadHelpText": "Evita que o Radarr tente baixar uma versão alternativa para este item",
|
||||
"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",
|
||||
"AutoTagging": "Marcação 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",
|
||||
"EditAutoTag": "Editar tag automática",
|
||||
"RemoveTagsAutomaticallyHelpText": "Remova tags automaticamente se as condições não forem atendidas",
|
||||
"UnableToLoadAutoTagging": "Não foi possível carregar a marcação automática",
|
||||
"DeleteRootFolder": "Excluir Pasta Raiz",
|
||||
"DeleteRootFolder": "Excluir pasta raiz",
|
||||
"DeleteRootFolderMessageText": "Tem certeza de que deseja excluir a pasta raiz '{path}'?",
|
||||
"RootFolderPath": "Caminho da Pasta Raiz",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.",
|
||||
"DeleteImportList": "Excluir Lista de Importação",
|
||||
"DeleteImportList": "Excluir lista de importação",
|
||||
"DeleteImportListMessageText": "Tem certeza de que deseja excluir a lista '{name}'?",
|
||||
"RemoveQueueItem": "Remover - {sourceTitle}",
|
||||
"RemoveQueueItemConfirmation": "Tem certeza de que deseja remover '{sourceTitle}' da fila?",
|
||||
@@ -1197,37 +1196,37 @@
|
||||
"ShowTmdbRating": "Mostrar Avaliação TMDb",
|
||||
"ShowTmdbRatingHelpText": "Mostrar avaliação TMDb sob o pôster",
|
||||
"DeleteQualityProfileMessageText": "Tem certeza de que deseja excluir o perfil de qualidade '{name}'?",
|
||||
"AddConditionImplementation": "Adicionar Condição - {implementationName}",
|
||||
"AddConnection": "Adicionar Conexão",
|
||||
"AddConnectionImplementation": "Adicionar Conexão - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Adicionar Cliente de Download - {implementationName}",
|
||||
"AddImportList": "Adicionar Lista de Importação",
|
||||
"AddImportListImplementation": "Adicionar Lista de importação - {implementationName}",
|
||||
"AddIndexerImplementation": "Adicionar Indexador - {implementationName}",
|
||||
"EditConditionImplementation": "Editar Condição - {implementationName}",
|
||||
"EditConnectionImplementation": "Editar Notificação - {implementationName}",
|
||||
"EditDownloadClientImplementation": "Editar Cliente de Download - {implementationName}",
|
||||
"EditImportListImplementation": "Editar Lista de Importação - {implementationName}",
|
||||
"EditIndexerImplementation": "Editar Indexador - {implementationName}",
|
||||
"AuthenticationRequired": "Autentificação Requerida",
|
||||
"AddConditionImplementation": "Adicionar condição - {implementationName}",
|
||||
"AddConnection": "Adicionar conexão",
|
||||
"AddConnectionImplementation": "Adicionar conexão - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Adicionar cliente de download - {implementationName}",
|
||||
"AddImportList": "Adicionar lista de importação",
|
||||
"AddImportListImplementation": "Adicionar lista de importação - {implementationName}",
|
||||
"AddIndexerImplementation": "Adicionar indexador - {implementationName}",
|
||||
"EditConditionImplementation": "Editar condição - {implementationName}",
|
||||
"EditConnectionImplementation": "Editar notificação - {implementationName}",
|
||||
"EditDownloadClientImplementation": "Editar cliente de download - {implementationName}",
|
||||
"EditImportListImplementation": "Editar lista de importação - {implementationName}",
|
||||
"EditIndexerImplementation": "Editar indexador - {implementationName}",
|
||||
"AuthenticationRequired": "Autenticação exigida",
|
||||
"AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.",
|
||||
"AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.",
|
||||
"BypassDelayIfAboveCustomFormatScore": "Ignorar se estiver Acima da Pontuação do Formato Personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScore": "Ignorar se estiver acima da pontuação do formato personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScoreHelpText": "Ativar ignorar quando a versão tiver uma pontuação maior que a pontuação mínima configurada do formato personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Pontuação Mínima de Formato Personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Pontuação Mínima de Formato Personalizado necessária para ignorar o atraso do protocolo preferido",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Pontuação mínima de formato personalizado",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Pontuação mínima de formato personalizado necessária para ignorar o atraso do protocolo preferido",
|
||||
"RemoveFromDownloadClientHelpTextWarning": "A remoção removerá o download e o(s) arquivo(s) do cliente de download.",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Todas as notificações estão indisponíveis devido a falhas",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}",
|
||||
"AutomaticUpdatesDisabledDocker": "As atualizações automáticas não têm suporte direto ao usar o mecanismo de atualização do Docker. Você precisará atualizar a imagem do contêiner fora de {appName} ou usar um script",
|
||||
"RemotePathMappingsInfo": "Raramente são necessários mapeamentos de caminho remoto, se {app} e seu cliente de download estiverem no mesmo sistema, é melhor combinar seus caminhos. Para obter mais informações, consulte o [wiki]({wikiLink}).",
|
||||
"DisabledForLocalAddresses": "Desativado para Endereços Locais",
|
||||
"AudioLanguages": "Idiomas do Áudio",
|
||||
"DisabledForLocalAddresses": "Desabilitado para endereços locais",
|
||||
"AudioLanguages": "Idiomas do áudio",
|
||||
"SubtitleLanguages": "Idiomas das Legendas",
|
||||
"TableOptionsButton": "Botão de Opções de Tabela",
|
||||
"VideoDynamicRange": "Faixa Dinâmica de Vídeo",
|
||||
"Default": "Padrão",
|
||||
"DownloadClientsLoadError": "Não foi possível carregar clientes de download",
|
||||
"DownloadClientsLoadError": "Não foi possível carregar os clientes de download",
|
||||
"IMDbId": "Id do IMDb",
|
||||
"ManualGrab": "Baixar Manualmente",
|
||||
"OverrideAndAddToDownloadQueue": "Substituir e adicionar à fila de download",
|
||||
@@ -1252,7 +1251,7 @@
|
||||
"Parse": "Analisar",
|
||||
"ParseModalErrorParsing": "Erro ao analisar, tente novamente.",
|
||||
"ParseModalHelpText": "Insira um título de lançamento na entrada acima",
|
||||
"ParseModalHelpTextDetails": "Radarr tentará analisar o título e mostrar detalhes sobre ele",
|
||||
"ParseModalHelpTextDetails": "O Radarr tentará analisar o título e mostrar detalhes sobre ele",
|
||||
"QualitiesLoadError": "Não foi possível carregar qualidades",
|
||||
"SelectDropdown": "Selecionar...",
|
||||
"SelectFolderModalTitle": "{modalTitle} - Selecione a Pasta",
|
||||
@@ -1261,24 +1260,24 @@
|
||||
"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.",
|
||||
"DefaultNameCopiedProfile": "{name} - Cópia",
|
||||
"InvalidUILanguage": "Sua IU está definida com um idioma inválido, corrija-a e salve suas configurações",
|
||||
"AuthenticationMethod": "Método de Autenticação",
|
||||
"InvalidUILanguage": "Sua IU está configurada com um idioma inválido, corrija-a e salve suas configurações",
|
||||
"AuthenticationMethod": "Método de autenticação",
|
||||
"AuthenticationMethodHelpTextWarning": "Selecione um método de autenticação válido",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Insira uma nova senha",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Digite uma nova senha",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Digite um novo nome de usuário",
|
||||
"DefaultNameCopiedSpecification": "{name} - Cópia",
|
||||
"FullColorEvents": "Eventos em Cores",
|
||||
"FullColorEventsHelpText": "Estilo alterado para colorir todo o evento com a cor do status, em vez de apenas a borda esquerda. Não se aplica à Agenda",
|
||||
"FullColorEvents": "Eventos em cores",
|
||||
"FullColorEventsHelpText": "Estilo alterado para colorir todo o evento com a cor do status, em vez de apenas a borda esquerda. Não se aplica à Programação",
|
||||
"Unknown": "Desconhecido",
|
||||
"UnknownEventTooltip": "Evento desconhecido",
|
||||
"DeletedReasonManual": "O arquivo foi excluído por meio da IU",
|
||||
"DeletedReasonManual": "O arquivo foi excluído por meio da interface",
|
||||
"FormatAgeDay": "dia",
|
||||
"MovieDownloadFailedTooltip": "Falha no download do filme",
|
||||
"MovieDownloadIgnoredTooltip": "Download do Filme Ignorado",
|
||||
"NoHistoryFound": "Nenhum histórico encontrado",
|
||||
"QueueLoadError": "Falha ao carregar a fila",
|
||||
"BlocklistLoadError": "Não foi possível carregar a lista de bloqueio",
|
||||
"BlocklistReleaseHelpText": "Impede que o Radarr pegue automaticamente esta versão novamente",
|
||||
"BlocklistReleaseHelpText": "Impede que o Radarr obtenha automaticamente este lançamento novamente",
|
||||
"CustomFormatJson": "JSON do formato personalizado",
|
||||
"DelayingDownloadUntil": "Atrasando o download até {date} às {time}",
|
||||
"DeletedReasonUpgrade": "O arquivo foi excluído para importar uma atualização",
|
||||
@@ -1319,7 +1318,7 @@
|
||||
"RemoveSelectedBlocklistMessageText": "Tem certeza de que deseja remover os itens selecionados da lista de bloqueio?",
|
||||
"ShowUnknownMovieItemsHelpText": "Mostrar itens sem filme na fila. Isso pode incluir filmes removidos ou qualquer outra coisa na categoria do Radarr",
|
||||
"TablePageSizeMaximum": "O tamanho da página não pode exceder {maximumValue}",
|
||||
"AppUpdated": "{appName} Atualizado",
|
||||
"AppUpdated": "{appName} atualizado",
|
||||
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`. Para obter as alterações mais recentes, você precisará recarregar {appName}",
|
||||
"ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.",
|
||||
"ConnectionLostToBackend": "{appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
@@ -1330,5 +1329,9 @@
|
||||
"OrganizeRelativePaths": "Todos os caminhos são relativos a: `{path}`",
|
||||
"OrganizeRenamingDisabled": "A renomeação está desativada, nada para renomear",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los.",
|
||||
"Umask": "Desmascarar"
|
||||
"Umask": "Desmascarar",
|
||||
"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"
|
||||
}
|
||||
|
||||
@@ -533,7 +533,6 @@
|
||||
"Local": "Local",
|
||||
"MovieYear": "Anul filmului",
|
||||
"RecyclingBinCleanup": "Curățarea coșului de reciclare",
|
||||
"Redownload": "Redescărcați",
|
||||
"RefreshMovie": "Reîmprospătați filmul",
|
||||
"MovieYearHelpText": "Anul filmului de exclus",
|
||||
"MustContain": "Trebuie sa contina",
|
||||
@@ -576,7 +575,7 @@
|
||||
"Posters": "Afise",
|
||||
"PosterSize": "Dimensiunea posterului",
|
||||
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Filmele șterse de pe disc sunt automat monitorizate în Radarr",
|
||||
"TimeFormat": "Format de timp",
|
||||
"TimeFormat": "Format ora",
|
||||
"AddListExclusion": "Adăugați excluderea listei",
|
||||
"AnalyseVideoFiles": "Analizați fișierele video",
|
||||
"AnalyticsEnabledHelpText": "Trimiteți informații anonime privind utilizarea și erorile către serverele Radarr. Aceasta include informații despre browserul dvs., ce pagini WebUI Radarr utilizați, raportarea erorilor, precum și sistemul de operare și versiunea de execuție. Vom folosi aceste informații pentru a acorda prioritate caracteristicilor și remedierilor de erori.",
|
||||
@@ -852,7 +851,7 @@
|
||||
"SettingsShortDateFormat": "Format scurt de dată",
|
||||
"SettingsShowRelativeDates": "Afișați datele relative",
|
||||
"SettingsShowRelativeDatesHelpText": "Afișați datele relative (Azi / Ieri / etc) sau absolute",
|
||||
"SettingsTimeFormat": "Format de timp",
|
||||
"SettingsTimeFormat": "Format ora",
|
||||
"SettingsWeekColumnHeader": "Antetul coloanei săptămânii",
|
||||
"SettingsWeekColumnHeaderHelpText": "Afișat deasupra fiecărei coloane când săptămâna este vizualizarea activă",
|
||||
"ShouldMonitorHelpText": "Dacă este activată, filmele adăugate de această listă sunt adăugate și monitorizate",
|
||||
@@ -1105,5 +1104,6 @@
|
||||
"AddConnectionImplementation": "Adăugați conexiune - {implementationName}",
|
||||
"AddDownloadClientImplementation": "Adăugați client de descărcare - {implementationName}",
|
||||
"AddIndexerImplementation": "Adăugați Indexator - {implementationName}",
|
||||
"Umask": "Umask"
|
||||
"Umask": "Umask",
|
||||
"AppUpdated": "{appName} actualizat"
|
||||
}
|
||||
|
||||
@@ -367,7 +367,6 @@
|
||||
"RefreshInformationAndScanDisk": "Обновить информацию и просканировать диск",
|
||||
"RefreshAndScan": "Обновить & сканировать",
|
||||
"Refresh": "Обновить",
|
||||
"Redownload": "Перезакачать",
|
||||
"RecyclingBinCleanup": "Очистка мусорной корзины",
|
||||
"RecyclingBin": "Мусорная корзина",
|
||||
"RecycleBinHelpText": "Файлы фильмов будут попадать сюда при удалении",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user