mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-14 20:55:01 -04:00
Compare commits
18 Commits
v5.1.0.817
...
db-calls-l
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
200be6451a | ||
|
|
b279984bd7 | ||
|
|
3f6f4fc65f | ||
|
|
3e5089719c | ||
|
|
ec69dfaabb | ||
|
|
aa13a40bad | ||
|
|
9b458812f1 | ||
|
|
1bdc48a889 | ||
|
|
e5d479a162 | ||
|
|
9a50fcb82a | ||
|
|
f2357e0b60 | ||
|
|
0591d05c3b | ||
|
|
299d50d56c | ||
|
|
7d3c01114b | ||
|
|
70376af70b | ||
|
|
9ef031bd9e | ||
|
|
3a9b276c43 | ||
|
|
aabf209a07 |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '5.1.0'
|
||||
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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
@@ -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,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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
|
||||
};
|
||||
|
||||
@@ -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
|
||||
),
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -7,8 +7,6 @@ using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.ImportListTests
|
||||
@@ -36,10 +34,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
_listMovies = Builder<ImportListMovie>.CreateListOfSize(5)
|
||||
.Build().ToList();
|
||||
|
||||
Mocker.GetMock<ISearchForNewMovie>()
|
||||
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<MovieMetadata>()))
|
||||
.Returns<MovieMetadata>(m => new MovieMetadata { TmdbId = m.TmdbId });
|
||||
}
|
||||
|
||||
private void GivenList(int id, bool enabled, bool enabledAuto, ImportListFetchResult fetchResult)
|
||||
@@ -135,9 +129,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeFalse();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -149,9 +140,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeTrue();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), listId), Times.Never());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -166,9 +154,6 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeTrue();
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Verify(v => v.SyncMoviesForList(It.IsAny<List<ImportListMovie>>(), passedListId), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.ImportLists;
|
||||
using NzbDrone.Core.ImportLists.ImportExclusions;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
@@ -59,8 +60,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
_importListFetch = new ImportListFetchResult
|
||||
{
|
||||
Movies = _list1Movies,
|
||||
AnyFailure = false,
|
||||
SyncedLists = 1
|
||||
AnyFailure = false
|
||||
};
|
||||
|
||||
_commandAll = new ImportListSyncCommand
|
||||
@@ -84,6 +84,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.MovieExists(It.IsAny<Movie>()))
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
.Setup(v => v.MovieExists(It.IsAny<Movie>()))
|
||||
.Returns(false);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
.Setup(v => v.AllMovieTmdbIds())
|
||||
.Returns(new List<int>());
|
||||
@@ -91,6 +95,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Setup(v => v.Fetch())
|
||||
.Returns(_importListFetch);
|
||||
|
||||
Mocker.GetMock<ISearchForNewMovie>()
|
||||
.Setup(v => v.MapMovieToTmdbMovie(It.IsAny<MovieMetadata>()))
|
||||
.Returns<MovieMetadata>(m => new MovieMetadata { TmdbId = m.TmdbId });
|
||||
}
|
||||
|
||||
private void GivenListFailure()
|
||||
@@ -100,7 +108,8 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
|
||||
private void GivenNoListSync()
|
||||
{
|
||||
_importListFetch.SyncedLists = 0;
|
||||
_importListFetch.SyncedLists = new List<int>();
|
||||
_importListFetch.SyncedWithoutFailure = new List<int>();
|
||||
}
|
||||
|
||||
private void GivenCleanLevel(string cleanLevel)
|
||||
@@ -114,6 +123,9 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
{
|
||||
var importListDefinition = new ImportListDefinition { Id = id, EnableAuto = enabledAuto };
|
||||
|
||||
_importListFetch.SyncedLists.Add(id);
|
||||
_importListFetch.SyncedWithoutFailure.Add(id);
|
||||
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.Get(id))
|
||||
.Returns(importListDefinition);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -5,9 +5,6 @@ using System.Threading.Tasks;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Common.TPL;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
@@ -21,26 +18,14 @@ namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
private readonly IImportListFactory _importListFactory;
|
||||
private readonly IImportListStatusService _importListStatusService;
|
||||
private readonly IImportListMovieService _listMovieService;
|
||||
private readonly ISearchForNewMovie _movieSearch;
|
||||
private readonly IProvideMovieInfo _movieInfoService;
|
||||
private readonly IMovieMetadataService _movieMetadataService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public FetchAndParseImportListService(IImportListFactory importListFactory,
|
||||
IImportListStatusService importListStatusService,
|
||||
IImportListMovieService listMovieService,
|
||||
ISearchForNewMovie movieSearch,
|
||||
IProvideMovieInfo movieInfoService,
|
||||
IMovieMetadataService movieMetadataService,
|
||||
Logger logger)
|
||||
{
|
||||
_importListFactory = importListFactory;
|
||||
_importListStatusService = importListStatusService;
|
||||
_listMovieService = listMovieService;
|
||||
_movieSearch = movieSearch;
|
||||
_movieInfoService = movieInfoService;
|
||||
_movieMetadataService = movieMetadataService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -101,21 +86,17 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
if (!importListReports.AnyFailure)
|
||||
{
|
||||
var alreadyMapped = result.Movies.Where(x => importListReports.Movies.Any(r => r.TmdbId == x.TmdbId));
|
||||
var listMovies = MapMovieReports(importListReports.Movies.Where(x => result.Movies.All(r => r.TmdbId != x.TmdbId))).Where(x => x.TmdbId > 0).ToList();
|
||||
var listMovies = importListReports.Movies;
|
||||
|
||||
listMovies.AddRange(alreadyMapped);
|
||||
listMovies = listMovies.DistinctBy(x => x.TmdbId).ToList();
|
||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||
|
||||
result.Movies.AddRange(listMovies);
|
||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
||||
|
||||
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
result.SyncedLists++;
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
result.SyncedLists.Add(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -129,9 +110,17 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
Task.WaitAll(taskList.ToArray());
|
||||
|
||||
foreach (var list in importLists)
|
||||
{
|
||||
if (result.SyncedLists.Contains(list.Definition.Id))
|
||||
{
|
||||
_importListStatusService.UpdateListSyncStatus(list.Definition.Id);
|
||||
}
|
||||
}
|
||||
|
||||
result.Movies = result.Movies.DistinctBy(r => new { r.TmdbId, r.ImdbId, r.Title }).ToList();
|
||||
|
||||
_logger.Debug("Found {0} total reports from {1} lists", result.Movies.Count, result.SyncedLists);
|
||||
_logger.Debug("Found {0} total reports from {1} lists", result.Movies.Count, result.SyncedLists.Count);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -160,19 +149,19 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
if (!importListReports.AnyFailure)
|
||||
{
|
||||
var listMovies = MapMovieReports(importListReports.Movies)
|
||||
.Where(x => x.TmdbId > 0)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
var listMovies = importListReports.Movies;
|
||||
|
||||
listMovies.ForEach(m => m.ListId = importList.Definition.Id);
|
||||
|
||||
result.Movies.AddRange(listMovies);
|
||||
_listMovieService.SyncMoviesForList(listMovies, importList.Definition.Id);
|
||||
|
||||
result.SyncedWithoutFailure.Add(importList.Definition.Id);
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
|
||||
result.SyncedLists.Add(importList.Definition.Id);
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
@@ -187,32 +176,5 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<ImportListMovie> MapMovieReports(IEnumerable<ImportListMovie> reports)
|
||||
{
|
||||
var mappedMovies = reports.Select(m => _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = m.Title, TmdbId = m.TmdbId, ImdbId = m.ImdbId, Year = m.Year }))
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
|
||||
_movieMetadataService.UpsertMany(mappedMovies);
|
||||
|
||||
var mappedListMovies = new List<ImportListMovie>();
|
||||
|
||||
foreach (var movieMeta in mappedMovies)
|
||||
{
|
||||
var mappedListMovie = new ImportListMovie();
|
||||
|
||||
if (movieMeta != null)
|
||||
{
|
||||
mappedListMovie.MovieMetadata = movieMeta;
|
||||
mappedListMovie.MovieMetadataId = movieMeta.Id;
|
||||
}
|
||||
|
||||
mappedListMovies.Add(mappedListMovie);
|
||||
}
|
||||
|
||||
return mappedListMovies;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,14 @@ namespace NzbDrone.Core.ImportLists
|
||||
public ImportListFetchResult()
|
||||
{
|
||||
Movies = new List<ImportListMovie>();
|
||||
SyncedLists = new List<int>();
|
||||
SyncedWithoutFailure = new List<int>();
|
||||
}
|
||||
|
||||
public List<ImportListMovie> Movies { get; set; }
|
||||
public bool AnyFailure { get; set; }
|
||||
public int SyncedLists { get; set; }
|
||||
public List<int> SyncedLists { get; set; }
|
||||
public List<int> SyncedWithoutFailure { get; set; }
|
||||
}
|
||||
|
||||
public abstract class ImportListBase<TSettings> : IImportList
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.ImportLists.ImportExclusions;
|
||||
using NzbDrone.Core.ImportLists.ImportListMovies;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.MetadataSource;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
@@ -17,6 +18,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
private readonly IImportListFactory _importListFactory;
|
||||
private readonly IFetchAndParseImportList _listFetcherAndParser;
|
||||
private readonly IMovieService _movieService;
|
||||
private readonly IMovieMetadataService _movieMetadataService;
|
||||
private readonly ISearchForNewMovie _movieSearch;
|
||||
private readonly IAddMovieService _addMovieService;
|
||||
private readonly IConfigService _configService;
|
||||
private readonly IImportExclusionsService _exclusionService;
|
||||
@@ -25,6 +28,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
public ImportListSyncService(IImportListFactory importListFactory,
|
||||
IFetchAndParseImportList listFetcherAndParser,
|
||||
IMovieService movieService,
|
||||
IMovieMetadataService movieMetadataService,
|
||||
ISearchForNewMovie movieSearch,
|
||||
IAddMovieService addMovieService,
|
||||
IConfigService configService,
|
||||
IImportExclusionsService exclusionService,
|
||||
@@ -34,6 +39,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
_importListFactory = importListFactory;
|
||||
_listFetcherAndParser = listFetcherAndParser;
|
||||
_movieService = movieService;
|
||||
_movieMetadataService = movieMetadataService;
|
||||
_movieSearch = movieSearch;
|
||||
_addMovieService = addMovieService;
|
||||
_exclusionService = exclusionService;
|
||||
_listMovieService = listMovieService;
|
||||
@@ -52,17 +59,17 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
var listItemsResult = _listFetcherAndParser.Fetch();
|
||||
|
||||
if (listItemsResult.SyncedLists == 0)
|
||||
if (listItemsResult.SyncedLists.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ProcessListItems(listItemsResult);
|
||||
|
||||
if (!listItemsResult.AnyFailure)
|
||||
{
|
||||
CleanLibrary();
|
||||
}
|
||||
|
||||
ProcessListItems(listItemsResult);
|
||||
}
|
||||
|
||||
private void SyncList(ImportListDefinition definition)
|
||||
@@ -125,7 +132,25 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
private void ProcessListItems(ImportListFetchResult listFetchResult)
|
||||
{
|
||||
listFetchResult.Movies = listFetchResult.Movies.DistinctBy(x =>
|
||||
var allMappedMovies = new List<ImportListMovie>();
|
||||
|
||||
// Sync ListMovies table for Discovery view and Cleaning task
|
||||
foreach (var listId in listFetchResult.SyncedWithoutFailure)
|
||||
{
|
||||
var listMovies = listFetchResult.Movies.Where(x => x.ListId == listId);
|
||||
var alreadyMapped = allMappedMovies.Where(x => listMovies.Any(r => r.TmdbId == x.TmdbId));
|
||||
var mappedListMovies = MapMovieReports(listMovies.Where(x => allMappedMovies.All(r => r.TmdbId != x.TmdbId)).ToList()).Where(x => x.TmdbId > 0).ToList();
|
||||
|
||||
mappedListMovies.AddRange(alreadyMapped);
|
||||
mappedListMovies = mappedListMovies.DistinctBy(x => x.TmdbId).ToList();
|
||||
mappedListMovies.ForEach(m => m.ListId = listId);
|
||||
|
||||
allMappedMovies.AddRange(mappedListMovies);
|
||||
|
||||
_listMovieService.SyncMoviesForList(mappedListMovies, listId);
|
||||
}
|
||||
|
||||
allMappedMovies = allMappedMovies.DistinctBy(x =>
|
||||
{
|
||||
if (x.TmdbId != 0)
|
||||
{
|
||||
@@ -140,7 +165,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
return x.Title;
|
||||
}).ToList();
|
||||
|
||||
var listedMovies = listFetchResult.Movies.ToList();
|
||||
var listedMovies = allMappedMovies;
|
||||
|
||||
var importExclusions = _exclusionService.GetAllExclusions();
|
||||
var dbMovies = _movieService.AllMovieTmdbIds();
|
||||
@@ -168,6 +193,33 @@ namespace NzbDrone.Core.ImportLists
|
||||
}
|
||||
}
|
||||
|
||||
private List<ImportListMovie> MapMovieReports(IEnumerable<ImportListMovie> reports)
|
||||
{
|
||||
var mappedMovies = reports.Select(m => _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = m.Title, TmdbId = m.TmdbId, ImdbId = m.ImdbId, Year = m.Year }))
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
|
||||
_movieMetadataService.UpsertMany(mappedMovies);
|
||||
|
||||
var mappedListMovies = new List<ImportListMovie>();
|
||||
|
||||
foreach (var movieMeta in mappedMovies)
|
||||
{
|
||||
var mappedListMovie = new ImportListMovie();
|
||||
|
||||
if (movieMeta != null)
|
||||
{
|
||||
mappedListMovie.MovieMetadata = movieMeta;
|
||||
mappedListMovie.MovieMetadataId = movieMeta.Id;
|
||||
}
|
||||
|
||||
mappedListMovies.Add(mappedListMovie);
|
||||
}
|
||||
|
||||
return mappedListMovies;
|
||||
}
|
||||
|
||||
public void Execute(ImportListSyncCommand message)
|
||||
{
|
||||
if (message.DefinitionId.HasValue)
|
||||
|
||||
@@ -881,6 +881,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",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
@@ -741,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",
|
||||
@@ -817,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)",
|
||||
@@ -829,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",
|
||||
@@ -1080,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",
|
||||
@@ -1101,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"
|
||||
}
|
||||
|
||||
@@ -801,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",
|
||||
@@ -567,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",
|
||||
@@ -653,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",
|
||||
@@ -767,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",
|
||||
@@ -835,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",
|
||||
@@ -878,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",
|
||||
@@ -933,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",
|
||||
@@ -944,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",
|
||||
@@ -964,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",
|
||||
@@ -1001,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",
|
||||
@@ -1038,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",
|
||||
@@ -1058,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",
|
||||
@@ -1080,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",
|
||||
@@ -1106,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?",
|
||||
@@ -1170,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?",
|
||||
@@ -1196,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",
|
||||
@@ -1251,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,23 +1261,23 @@
|
||||
"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á configurada com um idioma inválido, corrija-a e salve suas configurações",
|
||||
"AuthenticationMethod": "Método de Autenticação",
|
||||
"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",
|
||||
@@ -1318,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.",
|
||||
@@ -1329,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"
|
||||
}
|
||||
|
||||
@@ -575,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.",
|
||||
@@ -851,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",
|
||||
@@ -1104,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"
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"DeleteSelectedMovie": "删除选择的电影",
|
||||
"DeleteQualityProfile": "删除质量配置",
|
||||
"DeleteNotification": "删除消息推送",
|
||||
"DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?",
|
||||
"DeleteNotificationMessageText": "您确定要删除通知“{name}”吗?",
|
||||
"DeleteMovieFolderLabel": "删除电影目录",
|
||||
"DeleteMovieFolderHelpText": "删除电影目录及其内容",
|
||||
"DBMigration": "数据库迁移版本",
|
||||
@@ -31,7 +31,7 @@
|
||||
"CloneIndexer": "复制索引器",
|
||||
"CloneCustomFormat": "复制自定义命名格式",
|
||||
"ClientPriority": "客户端优先级",
|
||||
"DeleteIndexerMessageText": "您确定要删除索引器 “{name}” 吗?",
|
||||
"DeleteIndexerMessageText": "您确定要删除索引器“{name}”吗?",
|
||||
"DeleteIndexer": "删除索引器",
|
||||
"DeleteFilesLabel": "删除 {0} 电影文件",
|
||||
"DeleteHeader": "删除 - {0}",
|
||||
@@ -51,7 +51,7 @@
|
||||
"DelayProfiles": "延迟配置",
|
||||
"Debug": "调试",
|
||||
"CustomFormat": "自定义命名格式",
|
||||
"CustomFilters": "自定义过滤",
|
||||
"CustomFilters": "自定义过滤器",
|
||||
"CreateEmptyMovieFoldersHelpText": "硬盘扫描过程中创建缺失的电影目录",
|
||||
"CouldNotFindResults": "找不到 '{term}' 的任何结果",
|
||||
"CopyToClipboard": "复制到剪贴板",
|
||||
@@ -154,7 +154,7 @@
|
||||
"SetTags": "设置标签",
|
||||
"SetPermissions": "设定权限",
|
||||
"SendAnonymousUsageData": "发送匿名使用数据",
|
||||
"SelectQuality": "选择质量",
|
||||
"SelectQuality": "选择品质",
|
||||
"SelectMovie": "选择影片",
|
||||
"SelectLanguage": "选择语言",
|
||||
"SelectFolder": "选择文件夹",
|
||||
@@ -320,7 +320,7 @@
|
||||
"Links": "链接",
|
||||
"InteractiveSearch": "手动搜索",
|
||||
"InvalidFormat": "格式不合法",
|
||||
"KeyboardShortcuts": "键盘快捷键",
|
||||
"KeyboardShortcuts": "快捷键",
|
||||
"Language": "语言",
|
||||
"LanguageHelpText": "版本语言",
|
||||
"Languages": "语言",
|
||||
@@ -390,7 +390,7 @@
|
||||
"EventType": "事件类型",
|
||||
"Events": "事件",
|
||||
"ErrorRestoringBackup": "恢复备份错误",
|
||||
"ErrorLoadingContents": "读取内容错误",
|
||||
"ErrorLoadingContents": "加载内容出错",
|
||||
"Ended": "已完结",
|
||||
"Error": "错误",
|
||||
"EnableSslHelpText": " 重启生效",
|
||||
@@ -447,7 +447,7 @@
|
||||
"Columns": "列",
|
||||
"ColonReplacement": "替换冒号",
|
||||
"Collection": "集",
|
||||
"ClickToChangeQuality": "点击修改质量",
|
||||
"ClickToChangeQuality": "点击更改质量",
|
||||
"ClickToChangeMovie": "点击修改影片",
|
||||
"UnableToLoadRootFolders": "无法加载根目录",
|
||||
"UnableToLoadRemotePathMappings": "无法加载远程路径映射",
|
||||
@@ -504,7 +504,7 @@
|
||||
"SkipFreeSpaceCheck": "跳过剩余空间检查",
|
||||
"SizeOnDisk": "占用磁盘体积",
|
||||
"Size": "大小",
|
||||
"Shutdown": "关闭",
|
||||
"Shutdown": "关机",
|
||||
"ShowYear": "显示年份",
|
||||
"ShowTitleHelpText": "在海报下显示电影标题",
|
||||
"ShowTitle": "显示标题",
|
||||
@@ -682,7 +682,7 @@
|
||||
"ProcessingFolders": "处理文件夹中",
|
||||
"SetPermissionsLinuxHelpTextWarning": "如果您不确定这些设置的作用,请不要更改它们。",
|
||||
"Reason": "季",
|
||||
"RemoveFilter": "移除过滤条件",
|
||||
"RemoveFilter": "移除过滤器",
|
||||
"ShowCutoffUnmetIconHelpText": "终止监控条件未满足前为文件显示图标",
|
||||
"UI": "UI界面",
|
||||
"ReadTheWikiForMoreInformation": "查阅Wiki获得更多信息",
|
||||
@@ -732,8 +732,8 @@
|
||||
"UpgradeUntilThisQualityIsMetOrExceeded": "升级直到影片质量超出或者满足",
|
||||
"SettingsWeekColumnHeader": "日期格式",
|
||||
"ShowQualityProfileHelpText": "在海报下方显示媒体质量配置",
|
||||
"ReleaseRejected": "版本被拒绝",
|
||||
"UnmappedFilesOnly": "未映射的文件",
|
||||
"ReleaseRejected": "发布被拒绝",
|
||||
"UnmappedFilesOnly": "仅限未映射的文件",
|
||||
"Quality": "媒体质量",
|
||||
"TheLogLevelDefault": "默认的日志等级为“Info”,可以被修改在",
|
||||
"RestartReloadNote": "注意:Radarr将在恢复过程中自动重启并重新加载UI。",
|
||||
@@ -757,7 +757,7 @@
|
||||
"ShowSearch": "显示搜索按钮",
|
||||
"Sort": "排序",
|
||||
"PhysicalReleaseDate": "碟片版发布日期",
|
||||
"View": "视图",
|
||||
"View": "查看",
|
||||
"Studio": "工作室",
|
||||
"Overview": "概述",
|
||||
"RelativePath": "相对路径",
|
||||
@@ -951,7 +951,7 @@
|
||||
"GrabReleaseMessageText": "Radarr无法确定这个发布版本是哪部电影,Radarr可能无法自动导入此版本,你想要获取“{0}”吗?",
|
||||
"FeatureRequests": "功能建议",
|
||||
"Extension": "扩展",
|
||||
"Discord": "Discord",
|
||||
"Discord": "分歧",
|
||||
"CustomFormatUnknownConditionOption": "未知的条件“{1}”的选项“{0}”",
|
||||
"Retention": "保留",
|
||||
"ChmodGroupHelpText": "组名称或GID。对于远程文件系统请使用GID。",
|
||||
@@ -977,7 +977,7 @@
|
||||
"OnUpgrade": "升级中",
|
||||
"OnMovieDelete": "电影删除时",
|
||||
"Reddit": "Reddit",
|
||||
"More": "更多的",
|
||||
"More": "更多",
|
||||
"Download": "下载",
|
||||
"DownloadClientCheckDownloadingToRoot": "下载客户端{0}将下载内容放在根文件夹{1}中。您不应该下载到根文件夹。",
|
||||
"DeleteFileLabel": "删除 {0} 电影文件",
|
||||
@@ -1018,7 +1018,7 @@
|
||||
"RemoveDownloadsAlert": "移除设置被移至上表中的单个下载客户端设置。",
|
||||
"RemoveFailed": "删除失败",
|
||||
"AnnouncedMsg": "电影已公布",
|
||||
"ClickToChangeReleaseGroup": "点击修改发布组",
|
||||
"ClickToChangeReleaseGroup": "单击更改发布组",
|
||||
"Auto": "自动",
|
||||
"Duration": "时长",
|
||||
"Filters": "过滤器",
|
||||
@@ -1032,7 +1032,7 @@
|
||||
"Never": "永不",
|
||||
"SelectLanguages": "选择语言",
|
||||
"SelectReleaseGroup": "选择发布组",
|
||||
"SetReleaseGroup": "设定发布组",
|
||||
"SetReleaseGroup": "设置发布组",
|
||||
"SizeLimit": "尺寸限制",
|
||||
"Started": "已开始",
|
||||
"Waiting": "等待",
|
||||
@@ -1054,7 +1054,7 @@
|
||||
"Collections": "集合",
|
||||
"AllCollectionsHiddenDueToFilter": "由于应用了过滤器,所有集合都被隐藏。",
|
||||
"CollectionsSelectedInterp": "已选择 {0} 个集合",
|
||||
"ChooseImportMode": "选择导入模式",
|
||||
"ChooseImportMode": "选择导入方式",
|
||||
"EditCollection": "编辑集合",
|
||||
"MonitorCollection": "监视集合",
|
||||
"MonitorMovies": "监控电影",
|
||||
@@ -1172,10 +1172,10 @@
|
||||
"AddCondition": "添加条件",
|
||||
"AutoTagging": "自动标记",
|
||||
"DeleteRootFolder": "删除根目录",
|
||||
"AddDownloadClientImplementation": "添加下载客户端 - {implementationName}",
|
||||
"AddDownloadClientImplementation": "添加下载客户端- {implementationName}",
|
||||
"AddIndexerImplementation": "添加索引器 - {implementationName}",
|
||||
"AddConnection": "添加连接",
|
||||
"AddConnectionImplementation": "添加集合 - {implementationName}",
|
||||
"AddConnectionImplementation": "添加连接- {implementationName}",
|
||||
"AuthenticationRequiredWarning": "为了防止未经身份验证的远程访问,{appName}现在需要启用身份验证。您可以选择禁用本地地址的身份验证。",
|
||||
"CloneAutoTag": "复制自动标签",
|
||||
"DeleteAutoTagHelpText": "你确定要删除 “{name}” 自动标签吗?",
|
||||
@@ -1183,7 +1183,7 @@
|
||||
"DeleteRootFolderMessageText": "你确定要删除根目录 “{path}” 吗?",
|
||||
"AddConditionImplementation": "添加条件 - {implementationName}",
|
||||
"AddImportList": "添加导入列表",
|
||||
"AddImportListImplementation": "添加导入列表 - {implementationName}",
|
||||
"AddImportListImplementation": "添加导入列表- {implementationName}",
|
||||
"AutoTaggingNegateHelpText": "如果选中,当 {0} 条件匹配时,自动标记不会应用。",
|
||||
"Default": "默认",
|
||||
"DownloadClientsLoadError": "无法加载下载客户端",
|
||||
@@ -1196,7 +1196,7 @@
|
||||
"AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)",
|
||||
"BypassDelayIfAboveCustomFormatScore": "若高于自定义格式分数则绕过",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "最小自定义格式分数",
|
||||
"DeleteQualityProfileMessageText": "你确定要删除质量配置 “{name}” 吗?",
|
||||
"DeleteQualityProfileMessageText": "您确定要删除质量配置“{name}”吗?",
|
||||
"DeleteImportListMessageText": "您确定要删除列表 “{name}” 吗?",
|
||||
"AutoTaggingRequiredHelpText": "这个{0}条件必须匹配自动标记规则才能应用。否则,一个{0}匹配就足够了。",
|
||||
"AuthenticationMethod": "认证方式",
|
||||
@@ -1216,9 +1216,9 @@
|
||||
"DeletedReasonManual": "文件已通过 UI 删除",
|
||||
"DeletedReasonUpgrade": "升级时删除原文件",
|
||||
"DownloadIgnored": "忽略下载",
|
||||
"EditConditionImplementation": "编辑条件 - {implementationName}",
|
||||
"EditConditionImplementation": "编辑条件- {implementationName}",
|
||||
"EditConnectionImplementation": "编辑通知 - {implementationName}",
|
||||
"EditImportListImplementation": "编辑导入列表 - {implementationName}",
|
||||
"EditImportListImplementation": "编辑导入列表- {implementationName}",
|
||||
"FormatAgeDay": "天",
|
||||
"FormatAgeDays": "天",
|
||||
"FormatAgeHour": "小时",
|
||||
@@ -1251,8 +1251,8 @@
|
||||
"ConnectionLostReconnect": "{appName} 将会尝试自动连接,您也可以点击下方的重新加载。",
|
||||
"ConnectionLostToBackend": "{appName}失去了与后端的连接,需要重新加载以恢复功能。",
|
||||
"DeletedReasonMissingFromDisk": "Radarr无法在磁盘上找到该文件,因此该文件已与数据库中的影片解除链接",
|
||||
"EditDownloadClientImplementation": "编辑下载客户端 - {implementationName}",
|
||||
"EditIndexerImplementation": "编辑索引器 - {implementationName}",
|
||||
"EditDownloadClientImplementation": "编辑下载客户端- {implementationName}",
|
||||
"EditIndexerImplementation": "编辑索引器- {implementationName}",
|
||||
"GrabId": "抓取ID",
|
||||
"HealthMessagesInfoBox": "您可以通过单击行尾的wiki链接(图书图标)或检查[日志]({link})来查找有关这些运行状况检查消息原因的更多信息。如果你在理解这些信息方面有困难,你可以通过下面的链接联系我们的支持。",
|
||||
"IMDbId": "IMDb Id",
|
||||
@@ -1261,9 +1261,9 @@
|
||||
"MovieGrabbedHistoryTooltip": "从{indexer}获取电影并发送到{downloadClient}",
|
||||
"IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。",
|
||||
"FullColorEvents": "全彩事件",
|
||||
"InteractiveImportNoFilesFound": "在所选文件夹中没有找到视频文件",
|
||||
"InteractiveImportNoImportMode": "必须选择导入方式",
|
||||
"InteractiveImportLoadError": "无法加载手动导入项",
|
||||
"InteractiveImportNoFilesFound": "在所选文件夹中找不到视频文件",
|
||||
"InteractiveImportNoImportMode": "必须选择导入模式",
|
||||
"InteractiveImportLoadError": "无法加载手动导入项目",
|
||||
"InteractiveImportNoLanguage": "必须为每个选定的文件选择语言",
|
||||
"InteractiveImportNoQuality": "必须为每个选定的文件选择质量",
|
||||
"InteractiveSearchResultsFailedErrorMessage": "搜索失败,因为它的{message}。尝试刷新电影信息,并在再次搜索之前验证是否存在必要的信息。",
|
||||
@@ -1289,14 +1289,14 @@
|
||||
"ReleaseProfilesLoadError": "无法加载发行版概要",
|
||||
"RemoveSelectedBlocklistMessageText": "你确定你想从过滤清单中删除选中的项目吗?",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} -选择下载客户端",
|
||||
"SetReleaseGroupModalTitle": "{modalTitle} - 设定发布组",
|
||||
"SetReleaseGroupModalTitle": "{modalTitle} - 设置发布组",
|
||||
"ShowRottenTomatoesRating": "显示番茄评分",
|
||||
"ShowRottenTomatoesRatingHelpText": "在海报下显示番茄评分",
|
||||
"ShowTmdbRating": "显示TMDb评分",
|
||||
"TableOptionsButton": "表格选项按钮",
|
||||
"TablePageSize": "页面大小",
|
||||
"TablePageSizeMaximum": "页面大小不得超过{maximumValue}",
|
||||
"TablePageSizeMinimum": "页面大小必须至少为{minimumValue}",
|
||||
"TablePageSizeMaximum": "页面大小不得超过 {maximumValue}",
|
||||
"TablePageSizeMinimum": "页面大小必须至少为 {minimumValue}",
|
||||
"Umask": "掩码",
|
||||
"Unknown": "未知",
|
||||
"UnknownEventTooltip": "未知事件",
|
||||
@@ -1317,7 +1317,7 @@
|
||||
"RemoveQueueItem": "删除- {sourceTitle}",
|
||||
"RemoveQueueItemConfirmation": "您确定要从队列中删除'{sourceTitle}'吗?",
|
||||
"RemoveTagsAutomatically": "自动删除标签",
|
||||
"SelectFolderModalTitle": "{modalTitle} -选择文件夹",
|
||||
"SelectFolderModalTitle": "{modalTitle} - 选择文件夹",
|
||||
"SelectDropdown": "选择...",
|
||||
"SelectLanguageModalTitle": "{modalTitle} - 选择语言",
|
||||
"SubtitleLanguages": "字幕语言",
|
||||
@@ -1329,5 +1329,8 @@
|
||||
"OverrideGrabNoMovie": "必须选择电影",
|
||||
"RetryingDownloadOn": "于 {date} {time} 重试下载",
|
||||
"Or": "或",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{0}设置为删除已完成的下载。这可能导致在{1}可以导入下载之前从您的客户端删除下载。"
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{0}设置为删除已完成的下载。这可能导致在{1}可以导入下载之前从您的客户端删除下载。",
|
||||
"AutoRedownloadFailed": "重新下载失败",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "当从交互式搜索中获取失败的版本时,自动搜索并尝试下载其他版本",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "从交互式搜索中重新下载失败"
|
||||
}
|
||||
|
||||
@@ -155,6 +155,11 @@ namespace NzbDrone.Core.Movies
|
||||
movieMetadata.CollectionTitle = newCollection.Title;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
movieMetadata.CollectionTmdbId = 0;
|
||||
movieMetadata.CollectionTitle = null;
|
||||
}
|
||||
|
||||
movieMetadata.AlternativeTitles = _titleService.UpdateTitles(movieInfo.AlternativeTitles, movieMetadata);
|
||||
_movieTranslationService.UpdateTranslations(movieInfo.Translations, movieMetadata);
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.2.3" />
|
||||
<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="MonoTorrent" Version="2.0.7" />
|
||||
<PackageReference Include="System.Text.Json" Version="6.0.8" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace Radarr.Api.V3.History
|
||||
|
||||
[HttpGet]
|
||||
[Produces("application/json")]
|
||||
public PagingResource<HistoryResource> GetHistory([FromQuery] PagingRequestResource paging, bool includeMovie, int? eventType, string downloadId)
|
||||
public PagingResource<HistoryResource> GetHistory([FromQuery] PagingRequestResource paging, bool includeMovie, int? eventType, string downloadId, [FromQuery] int[] movieIds = null, [FromQuery] int[] languages = null, [FromQuery] int[] quality = null)
|
||||
{
|
||||
var pagingResource = new PagingResource<HistoryResource>(paging);
|
||||
var pagingSpec = pagingResource.MapToPagingSpec<HistoryResource, MovieHistory>("date", SortDirection.Descending);
|
||||
@@ -77,16 +77,23 @@ namespace Radarr.Api.V3.History
|
||||
pagingSpec.FilterExpressions.Add(h => h.DownloadId == downloadId);
|
||||
}
|
||||
|
||||
return pagingSpec.ApplyToPage(_historyService.Paged, h => MapToResource(h, includeMovie));
|
||||
if (movieIds != null && movieIds.Any())
|
||||
{
|
||||
pagingSpec.FilterExpressions.Add(h => movieIds.Contains(h.MovieId));
|
||||
}
|
||||
|
||||
return pagingSpec.ApplyToPage(h => _historyService.Paged(pagingSpec, languages, quality), h => MapToResource(h, includeMovie));
|
||||
}
|
||||
|
||||
[HttpGet("since")]
|
||||
[Produces("application/json")]
|
||||
public List<HistoryResource> GetHistorySince(DateTime date, MovieHistoryEventType? eventType = null, bool includeMovie = false)
|
||||
{
|
||||
return _historyService.Since(date, eventType).Select(h => MapToResource(h, includeMovie)).ToList();
|
||||
}
|
||||
|
||||
[HttpGet("movie")]
|
||||
[Produces("application/json")]
|
||||
public List<HistoryResource> GetMovieHistory(int movieId, MovieHistoryEventType? eventType = null, bool includeMovie = false)
|
||||
{
|
||||
return _historyService.GetByMovieId(movieId, eventType).Select(h => MapToResource(h, includeMovie)).ToList();
|
||||
|
||||
@@ -9,6 +9,7 @@ using NzbDrone.Core.Datastore.Events;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Download.Pending;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Languages;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Profiles.Qualities;
|
||||
@@ -130,15 +131,15 @@ namespace Radarr.Api.V3.Queue
|
||||
|
||||
[HttpGet]
|
||||
[Produces("application/json")]
|
||||
public PagingResource<QueueResource> GetQueue([FromQuery] PagingRequestResource paging, bool includeUnknownMovieItems = false, bool includeMovie = false)
|
||||
public PagingResource<QueueResource> GetQueue([FromQuery] PagingRequestResource paging, bool includeUnknownMovieItems = false, bool includeMovie = false, [FromQuery] int[] movieIds = null, DownloadProtocol? protocol = null, [FromQuery] int[] languages = null, int? quality = null)
|
||||
{
|
||||
var pagingResource = new PagingResource<QueueResource>(paging);
|
||||
var pagingSpec = pagingResource.MapToPagingSpec<QueueResource, NzbDrone.Core.Queue.Queue>("timeleft", SortDirection.Ascending);
|
||||
|
||||
return pagingSpec.ApplyToPage((spec) => GetQueue(spec, includeUnknownMovieItems), (q) => MapToResource(q, includeMovie));
|
||||
return pagingSpec.ApplyToPage((spec) => GetQueue(spec, movieIds?.ToHashSet(), protocol, languages?.ToHashSet(), quality, includeUnknownMovieItems), (q) => MapToResource(q, includeMovie));
|
||||
}
|
||||
|
||||
private PagingSpec<NzbDrone.Core.Queue.Queue> GetQueue(PagingSpec<NzbDrone.Core.Queue.Queue> pagingSpec, bool includeUnknownMovieItems)
|
||||
private PagingSpec<NzbDrone.Core.Queue.Queue> GetQueue(PagingSpec<NzbDrone.Core.Queue.Queue> pagingSpec, HashSet<int> movieIds, DownloadProtocol? protocol, HashSet<int> languages, int? quality, bool includeUnknownMovieItems)
|
||||
{
|
||||
var ascending = pagingSpec.SortDirection == SortDirection.Ascending;
|
||||
var orderByFunc = GetOrderByFunc(pagingSpec);
|
||||
@@ -146,7 +147,36 @@ namespace Radarr.Api.V3.Queue
|
||||
var queue = _queueService.GetQueue();
|
||||
var filteredQueue = includeUnknownMovieItems ? queue : queue.Where(q => q.Movie != null);
|
||||
var pending = _pendingReleaseService.GetPendingQueue();
|
||||
var fullQueue = filteredQueue.Concat(pending).ToList();
|
||||
|
||||
var hasMovieIdFilter = movieIds.Any();
|
||||
var hasLanguageFilter = languages.Any();
|
||||
var fullQueue = filteredQueue.Concat(pending).Where(q =>
|
||||
{
|
||||
var include = true;
|
||||
|
||||
if (hasMovieIdFilter)
|
||||
{
|
||||
include &= q.Movie != null && movieIds.Contains(q.Movie.Id);
|
||||
}
|
||||
|
||||
if (include && protocol.HasValue)
|
||||
{
|
||||
include &= q.Protocol == protocol.Value;
|
||||
}
|
||||
|
||||
if (include && hasLanguageFilter)
|
||||
{
|
||||
include &= q.Languages.Any(l => languages.Contains(l.Id));
|
||||
}
|
||||
|
||||
if (include && quality.HasValue)
|
||||
{
|
||||
include &= q.Quality.Quality.Id == quality.Value;
|
||||
}
|
||||
|
||||
return include;
|
||||
}).ToList();
|
||||
|
||||
IOrderedEnumerable<NzbDrone.Core.Queue.Queue> ordered;
|
||||
|
||||
if (pagingSpec.SortKey == "timeleft")
|
||||
|
||||
@@ -2500,6 +2500,39 @@
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "movieIds",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "languages",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "quality",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
@@ -2550,14 +2583,6 @@
|
||||
"200": {
|
||||
"description": "Success",
|
||||
"content": {
|
||||
"text/plain": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
},
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
@@ -2565,14 +2590,6 @@
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
},
|
||||
"text/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2613,14 +2630,6 @@
|
||||
"200": {
|
||||
"description": "Success",
|
||||
"content": {
|
||||
"text/plain": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
},
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
@@ -2628,14 +2637,6 @@
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
},
|
||||
"text/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/HistoryResource"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6746,6 +6747,43 @@
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "movieIds",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "protocol",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/DownloadProtocol"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "languages",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "quality",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
|
||||
Reference in New Issue
Block a user