mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-03-05 13:40:08 -05:00
Compare commits
14 Commits
v1.14.2.43
...
v1.14.3.43
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0a8d22e84 | ||
|
|
50c6f15e12 | ||
|
|
2e3a95f389 | ||
|
|
3d52096eb4 | ||
|
|
e981cacbda | ||
|
|
218371a318 | ||
|
|
30fd7c8c2a | ||
|
|
96d2d61fa0 | ||
|
|
17ff86aaea | ||
|
|
7f8c1ace14 | ||
|
|
dc0edb7bc1 | ||
|
|
2ac996c9f9 | ||
|
|
2ebabd69b5 | ||
|
|
b3738f1602 |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '1.14.2'
|
||||
majorVersion: '1.14.3'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
|
||||
@@ -12,7 +12,6 @@ export interface CommandBody {
|
||||
lastStartTime: string;
|
||||
trigger: string;
|
||||
suppressMessages: boolean;
|
||||
seriesId?: number;
|
||||
}
|
||||
|
||||
interface Command extends ModelBase {
|
||||
|
||||
@@ -24,16 +24,20 @@ function createMapStateToProps() {
|
||||
if (includeNoChange) {
|
||||
values.unshift({
|
||||
key: 'noChange',
|
||||
value: translate('NoChange'),
|
||||
disabled: true
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
isDisabled: true
|
||||
});
|
||||
}
|
||||
|
||||
if (includeMixed) {
|
||||
values.unshift({
|
||||
key: 'mixed',
|
||||
value: '(Mixed)',
|
||||
disabled: true
|
||||
get value() {
|
||||
return `(${translate('Mixed')})`;
|
||||
},
|
||||
isDisabled: true
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import SelectInput from './SelectInput';
|
||||
|
||||
const availabilityOptions = [
|
||||
{ key: 'announced', value: 'Announced' },
|
||||
{ key: 'inCinemas', value: 'In Cinemas' },
|
||||
{ key: 'released', value: 'Released' },
|
||||
{ key: 'preDB', value: 'PreDB' }
|
||||
];
|
||||
|
||||
function AvailabilitySelectInput(props) {
|
||||
const values = [...availabilityOptions];
|
||||
|
||||
const {
|
||||
includeNoChange,
|
||||
includeMixed
|
||||
} = props;
|
||||
|
||||
if (includeNoChange) {
|
||||
values.unshift({
|
||||
key: 'noChange',
|
||||
value: 'No Change',
|
||||
disabled: true
|
||||
});
|
||||
}
|
||||
|
||||
if (includeMixed) {
|
||||
values.unshift({
|
||||
key: 'mixed',
|
||||
value: '(Mixed)',
|
||||
disabled: true
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<SelectInput
|
||||
{...props}
|
||||
values={values}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
AvailabilitySelectInput.propTypes = {
|
||||
includeNoChange: PropTypes.bool.isRequired,
|
||||
includeMixed: PropTypes.bool.isRequired
|
||||
};
|
||||
|
||||
AvailabilitySelectInput.defaultProps = {
|
||||
includeNoChange: false,
|
||||
includeMixed: false
|
||||
};
|
||||
|
||||
export default AvailabilitySelectInput;
|
||||
@@ -5,7 +5,6 @@ import { inputTypes, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AppProfileSelectInputConnector from './AppProfileSelectInputConnector';
|
||||
import AutoCompleteInput from './AutoCompleteInput';
|
||||
import AvailabilitySelectInput from './AvailabilitySelectInput';
|
||||
import CaptchaInputConnector from './CaptchaInputConnector';
|
||||
import CardigannCaptchaInputConnector from './CardigannCaptchaInputConnector';
|
||||
import CheckInput from './CheckInput';
|
||||
@@ -37,9 +36,6 @@ function getComponent(type) {
|
||||
case inputTypes.AUTO_COMPLETE:
|
||||
return AutoCompleteInput;
|
||||
|
||||
case inputTypes.AVAILABILITY_SELECT:
|
||||
return AvailabilitySelectInput;
|
||||
|
||||
case inputTypes.CAPTCHA:
|
||||
return CaptchaInputConnector;
|
||||
|
||||
|
||||
17
frontend/src/Helpers/Hooks/useModalOpenState.ts
Normal file
17
frontend/src/Helpers/Hooks/useModalOpenState.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
export default function useModalOpenState(
|
||||
initialState: boolean
|
||||
): [boolean, () => void, () => void] {
|
||||
const [isOpen, setOpen] = useState(initialState);
|
||||
|
||||
const setModalOpen = useCallback(() => {
|
||||
setOpen(true);
|
||||
}, [setOpen]);
|
||||
|
||||
const setModalClosed = useCallback(() => {
|
||||
setOpen(false);
|
||||
}, [setOpen]);
|
||||
|
||||
return [isOpen, setModalOpen, setModalClosed];
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
export const AUTO_COMPLETE = 'autoComplete';
|
||||
export const APP_PROFILE_SELECT = 'appProfileSelect';
|
||||
export const AVAILABILITY_SELECT = 'availabilitySelect';
|
||||
export const CAPTCHA = 'captcha';
|
||||
export const CARDIGANNCAPTCHA = 'cardigannCaptcha';
|
||||
export const CHECK = 'check';
|
||||
@@ -27,7 +26,6 @@ export const TAG_SELECT = 'tagSelect';
|
||||
export const all = [
|
||||
AUTO_COMPLETE,
|
||||
APP_PROFILE_SELECT,
|
||||
AVAILABILITY_SELECT,
|
||||
CAPTCHA,
|
||||
CARDIGANNCAPTCHA,
|
||||
CHECK,
|
||||
|
||||
@@ -36,7 +36,7 @@ const enableOptions = [
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
isDisabled: true,
|
||||
},
|
||||
{
|
||||
key: 'true',
|
||||
|
||||
@@ -30,7 +30,7 @@ const syncLevelOptions = [
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
isDisabled: true,
|
||||
},
|
||||
{
|
||||
key: ApplicationSyncLevel.Disabled,
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Card from 'Components/Card';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import Icon from 'Components/Icon';
|
||||
import PageSectionContent from 'Components/Page/PageSectionContent';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AddDownloadClientModal from './AddDownloadClientModal';
|
||||
import DownloadClient from './DownloadClient';
|
||||
@@ -59,48 +60,59 @@ class DownloadClients extends Component {
|
||||
} = this.state;
|
||||
|
||||
return (
|
||||
<FieldSet legend={translate('DownloadClients')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('DownloadClientsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.downloadClients}>
|
||||
{
|
||||
items.map((item) => {
|
||||
return (
|
||||
<DownloadClient
|
||||
key={item.id}
|
||||
{...item}
|
||||
onConfirmDeleteDownloadClient={onConfirmDeleteDownloadClient}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
<Card
|
||||
className={styles.addDownloadClient}
|
||||
onPress={this.onAddDownloadClientPress}
|
||||
>
|
||||
<div className={styles.center}>
|
||||
<Icon
|
||||
name={icons.ADD}
|
||||
size={45}
|
||||
/>
|
||||
</div>
|
||||
</Card>
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('ProwlarrDownloadClientsAlert')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('ProwlarrDownloadClientsInAppOnlyAlert')}
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
<AddDownloadClientModal
|
||||
isOpen={isAddDownloadClientModalOpen}
|
||||
onModalClose={this.onAddDownloadClientModalClose}
|
||||
/>
|
||||
<FieldSet legend={translate('DownloadClients')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('DownloadClientsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.downloadClients}>
|
||||
{
|
||||
items.map((item) => {
|
||||
return (
|
||||
<DownloadClient
|
||||
key={item.id}
|
||||
{...item}
|
||||
onConfirmDeleteDownloadClient={onConfirmDeleteDownloadClient}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
<EditDownloadClientModalConnector
|
||||
isOpen={isEditDownloadClientModalOpen}
|
||||
onModalClose={this.onEditDownloadClientModalClose}
|
||||
/>
|
||||
</PageSectionContent>
|
||||
</FieldSet>
|
||||
<Card
|
||||
className={styles.addDownloadClient}
|
||||
onPress={this.onAddDownloadClientPress}
|
||||
>
|
||||
<div className={styles.center}>
|
||||
<Icon
|
||||
name={icons.ADD}
|
||||
size={45}
|
||||
/>
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<AddDownloadClientModal
|
||||
isOpen={isAddDownloadClientModalOpen}
|
||||
onModalClose={this.onAddDownloadClientModalClose}
|
||||
/>
|
||||
|
||||
<EditDownloadClientModalConnector
|
||||
isOpen={isEditDownloadClientModalOpen}
|
||||
onModalClose={this.onEditDownloadClientModalClose}
|
||||
/>
|
||||
</PageSectionContent>
|
||||
</FieldSet>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ const enableOptions = [
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
isDisabled: true,
|
||||
},
|
||||
{
|
||||
key: 'enabled',
|
||||
|
||||
@@ -10,15 +10,6 @@
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.commandName {
|
||||
display: inline-block;
|
||||
min-width: 220px;
|
||||
}
|
||||
|
||||
.userAgent {
|
||||
color: #b0b0b0;
|
||||
}
|
||||
|
||||
.queued,
|
||||
.started,
|
||||
.ended {
|
||||
|
||||
@@ -2,14 +2,12 @@
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'actions': string;
|
||||
'commandName': string;
|
||||
'duration': string;
|
||||
'ended': string;
|
||||
'queued': string;
|
||||
'started': string;
|
||||
'trigger': string;
|
||||
'triggerContent': string;
|
||||
'userAgent': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
|
||||
@@ -1,279 +0,0 @@
|
||||
import moment from 'moment';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Icon from 'Components/Icon';
|
||||
import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import formatDate from 'Utilities/Date/formatDate';
|
||||
import formatDateTime from 'Utilities/Date/formatDateTime';
|
||||
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
|
||||
import titleCase from 'Utilities/String/titleCase';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './QueuedTaskRow.css';
|
||||
|
||||
function getStatusIconProps(status, message) {
|
||||
const title = titleCase(status);
|
||||
|
||||
switch (status) {
|
||||
case 'queued':
|
||||
return {
|
||||
name: icons.PENDING,
|
||||
title
|
||||
};
|
||||
|
||||
case 'started':
|
||||
return {
|
||||
name: icons.REFRESH,
|
||||
isSpinning: true,
|
||||
title
|
||||
};
|
||||
|
||||
case 'completed':
|
||||
return {
|
||||
name: icons.CHECK,
|
||||
kind: kinds.SUCCESS,
|
||||
title: message === 'Completed' ? title : `${title}: ${message}`
|
||||
};
|
||||
|
||||
case 'failed':
|
||||
return {
|
||||
name: icons.FATAL,
|
||||
kind: kinds.DANGER,
|
||||
title: `${title}: ${message}`
|
||||
};
|
||||
|
||||
default:
|
||||
return {
|
||||
name: icons.UNKNOWN,
|
||||
title
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function getFormattedDates(props) {
|
||||
const {
|
||||
queued,
|
||||
started,
|
||||
ended,
|
||||
showRelativeDates,
|
||||
shortDateFormat
|
||||
} = props;
|
||||
|
||||
if (showRelativeDates) {
|
||||
return {
|
||||
queuedAt: moment(queued).fromNow(),
|
||||
startedAt: started ? moment(started).fromNow() : '-',
|
||||
endedAt: ended ? moment(ended).fromNow() : '-'
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
queuedAt: formatDate(queued, shortDateFormat),
|
||||
startedAt: started ? formatDate(started, shortDateFormat) : '-',
|
||||
endedAt: ended ? formatDate(ended, shortDateFormat) : '-'
|
||||
};
|
||||
}
|
||||
|
||||
class QueuedTaskRow extends Component {
|
||||
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
constructor(props, context) {
|
||||
super(props, context);
|
||||
|
||||
this.state = {
|
||||
...getFormattedDates(props),
|
||||
isCancelConfirmModalOpen: false
|
||||
};
|
||||
|
||||
this._updateTimeoutId = null;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.setUpdateTimer();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
const {
|
||||
queued,
|
||||
started,
|
||||
ended
|
||||
} = this.props;
|
||||
|
||||
if (
|
||||
queued !== prevProps.queued ||
|
||||
started !== prevProps.started ||
|
||||
ended !== prevProps.ended
|
||||
) {
|
||||
this.setState(getFormattedDates(this.props));
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this._updateTimeoutId) {
|
||||
this._updateTimeoutId = clearTimeout(this._updateTimeoutId);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Control
|
||||
|
||||
setUpdateTimer() {
|
||||
this._updateTimeoutId = setTimeout(() => {
|
||||
this.setState(getFormattedDates(this.props));
|
||||
this.setUpdateTimer();
|
||||
}, 30000);
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onCancelPress = () => {
|
||||
this.setState({
|
||||
isCancelConfirmModalOpen: true
|
||||
});
|
||||
};
|
||||
|
||||
onAbortCancel = () => {
|
||||
this.setState({
|
||||
isCancelConfirmModalOpen: false
|
||||
});
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
trigger,
|
||||
commandName,
|
||||
queued,
|
||||
started,
|
||||
ended,
|
||||
status,
|
||||
duration,
|
||||
message,
|
||||
clientUserAgent,
|
||||
longDateFormat,
|
||||
timeFormat,
|
||||
onCancelPress
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
queuedAt,
|
||||
startedAt,
|
||||
endedAt,
|
||||
isCancelConfirmModalOpen
|
||||
} = this.state;
|
||||
|
||||
let triggerIcon = icons.QUICK;
|
||||
|
||||
if (trigger === 'manual') {
|
||||
triggerIcon = icons.INTERACTIVE;
|
||||
} else if (trigger === 'scheduled') {
|
||||
triggerIcon = icons.SCHEDULED;
|
||||
}
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<TableRowCell className={styles.trigger}>
|
||||
<span className={styles.triggerContent}>
|
||||
<Icon
|
||||
name={triggerIcon}
|
||||
title={titleCase(trigger)}
|
||||
/>
|
||||
|
||||
<Icon
|
||||
{...getStatusIconProps(status, message)}
|
||||
/>
|
||||
</span>
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<span className={styles.commandName}>
|
||||
{commandName}
|
||||
</span>
|
||||
{
|
||||
clientUserAgent ?
|
||||
<span className={styles.userAgent} title={translate('UserAgentProvidedByTheAppThatCalledTheAPI')}>
|
||||
from: {clientUserAgent}
|
||||
</span> :
|
||||
null
|
||||
}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.queued}
|
||||
title={formatDateTime(queued, longDateFormat, timeFormat)}
|
||||
>
|
||||
{queuedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.started}
|
||||
title={formatDateTime(started, longDateFormat, timeFormat)}
|
||||
>
|
||||
{startedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.ended}
|
||||
title={formatDateTime(ended, longDateFormat, timeFormat)}
|
||||
>
|
||||
{endedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.duration}>
|
||||
{formatTimeSpan(duration)}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.actions}
|
||||
>
|
||||
{
|
||||
status === 'queued' &&
|
||||
<IconButton
|
||||
title={translate('RemovedFromTaskQueue')}
|
||||
name={icons.REMOVE}
|
||||
onPress={this.onCancelPress}
|
||||
/>
|
||||
}
|
||||
</TableRowCell>
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isCancelConfirmModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('Cancel')}
|
||||
message={translate('CancelPendingTask')}
|
||||
confirmLabel={translate('YesCancel')}
|
||||
cancelLabel={translate('NoLeaveIt')}
|
||||
onConfirm={onCancelPress}
|
||||
onCancel={this.onAbortCancel}
|
||||
/>
|
||||
</TableRow>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
QueuedTaskRow.propTypes = {
|
||||
trigger: PropTypes.string.isRequired,
|
||||
commandName: PropTypes.string.isRequired,
|
||||
queued: PropTypes.string.isRequired,
|
||||
started: PropTypes.string,
|
||||
ended: PropTypes.string,
|
||||
status: PropTypes.string.isRequired,
|
||||
duration: PropTypes.string,
|
||||
message: PropTypes.string,
|
||||
clientUserAgent: PropTypes.string,
|
||||
showRelativeDates: PropTypes.bool.isRequired,
|
||||
shortDateFormat: PropTypes.string.isRequired,
|
||||
longDateFormat: PropTypes.string.isRequired,
|
||||
timeFormat: PropTypes.string.isRequired,
|
||||
onCancelPress: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default QueuedTaskRow;
|
||||
238
frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx
Normal file
238
frontend/src/System/Tasks/Queued/QueuedTaskRow.tsx
Normal file
@@ -0,0 +1,238 @@
|
||||
import moment from 'moment';
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { CommandBody } from 'Commands/Command';
|
||||
import Icon from 'Components/Icon';
|
||||
import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import useModalOpenState from 'Helpers/Hooks/useModalOpenState';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import { cancelCommand } from 'Store/Actions/commandActions';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import formatDate from 'Utilities/Date/formatDate';
|
||||
import formatDateTime from 'Utilities/Date/formatDateTime';
|
||||
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
|
||||
import titleCase from 'Utilities/String/titleCase';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import QueuedTaskRowNameCell from './QueuedTaskRowNameCell';
|
||||
import styles from './QueuedTaskRow.css';
|
||||
|
||||
function getStatusIconProps(status: string, message: string | undefined) {
|
||||
const title = titleCase(status);
|
||||
|
||||
switch (status) {
|
||||
case 'queued':
|
||||
return {
|
||||
name: icons.PENDING,
|
||||
title,
|
||||
};
|
||||
|
||||
case 'started':
|
||||
return {
|
||||
name: icons.REFRESH,
|
||||
isSpinning: true,
|
||||
title,
|
||||
};
|
||||
|
||||
case 'completed':
|
||||
return {
|
||||
name: icons.CHECK,
|
||||
kind: kinds.SUCCESS,
|
||||
title: message === 'Completed' ? title : `${title}: ${message}`,
|
||||
};
|
||||
|
||||
case 'failed':
|
||||
return {
|
||||
name: icons.FATAL,
|
||||
kind: kinds.DANGER,
|
||||
title: `${title}: ${message}`,
|
||||
};
|
||||
|
||||
default:
|
||||
return {
|
||||
name: icons.UNKNOWN,
|
||||
title,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function getFormattedDates(
|
||||
queued: string,
|
||||
started: string | undefined,
|
||||
ended: string | undefined,
|
||||
showRelativeDates: boolean,
|
||||
shortDateFormat: string
|
||||
) {
|
||||
if (showRelativeDates) {
|
||||
return {
|
||||
queuedAt: moment(queued).fromNow(),
|
||||
startedAt: started ? moment(started).fromNow() : '-',
|
||||
endedAt: ended ? moment(ended).fromNow() : '-',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
queuedAt: formatDate(queued, shortDateFormat),
|
||||
startedAt: started ? formatDate(started, shortDateFormat) : '-',
|
||||
endedAt: ended ? formatDate(ended, shortDateFormat) : '-',
|
||||
};
|
||||
}
|
||||
|
||||
interface QueuedTimes {
|
||||
queuedAt: string;
|
||||
startedAt: string;
|
||||
endedAt: string;
|
||||
}
|
||||
|
||||
export interface QueuedTaskRowProps {
|
||||
id: number;
|
||||
trigger: string;
|
||||
commandName: string;
|
||||
queued: string;
|
||||
started?: string;
|
||||
ended?: string;
|
||||
status: string;
|
||||
duration?: string;
|
||||
message?: string;
|
||||
body: CommandBody;
|
||||
clientUserAgent?: string;
|
||||
}
|
||||
|
||||
export default function QueuedTaskRow(props: QueuedTaskRowProps) {
|
||||
const {
|
||||
id,
|
||||
trigger,
|
||||
commandName,
|
||||
queued,
|
||||
started,
|
||||
ended,
|
||||
status,
|
||||
duration,
|
||||
message,
|
||||
body,
|
||||
clientUserAgent,
|
||||
} = props;
|
||||
|
||||
const dispatch = useDispatch();
|
||||
const { longDateFormat, shortDateFormat, showRelativeDates, timeFormat } =
|
||||
useSelector(createUISettingsSelector());
|
||||
|
||||
const updateTimeTimeoutId = useRef<ReturnType<typeof setTimeout> | null>(
|
||||
null
|
||||
);
|
||||
const [times, setTimes] = useState<QueuedTimes>(
|
||||
getFormattedDates(
|
||||
queued,
|
||||
started,
|
||||
ended,
|
||||
showRelativeDates,
|
||||
shortDateFormat
|
||||
)
|
||||
);
|
||||
|
||||
const [
|
||||
isCancelConfirmModalOpen,
|
||||
openCancelConfirmModal,
|
||||
closeCancelConfirmModal,
|
||||
] = useModalOpenState(false);
|
||||
|
||||
const handleCancelPress = useCallback(() => {
|
||||
dispatch(cancelCommand({ id }));
|
||||
}, [id, dispatch]);
|
||||
|
||||
useEffect(() => {
|
||||
updateTimeTimeoutId.current = setTimeout(() => {
|
||||
setTimes(
|
||||
getFormattedDates(
|
||||
queued,
|
||||
started,
|
||||
ended,
|
||||
showRelativeDates,
|
||||
shortDateFormat
|
||||
)
|
||||
);
|
||||
}, 30000);
|
||||
|
||||
return () => {
|
||||
if (updateTimeTimeoutId.current) {
|
||||
clearTimeout(updateTimeTimeoutId.current);
|
||||
}
|
||||
};
|
||||
}, [queued, started, ended, showRelativeDates, shortDateFormat, setTimes]);
|
||||
|
||||
const { queuedAt, startedAt, endedAt } = times;
|
||||
|
||||
let triggerIcon = icons.QUICK;
|
||||
|
||||
if (trigger === 'manual') {
|
||||
triggerIcon = icons.INTERACTIVE;
|
||||
} else if (trigger === 'scheduled') {
|
||||
triggerIcon = icons.SCHEDULED;
|
||||
}
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<TableRowCell className={styles.trigger}>
|
||||
<span className={styles.triggerContent}>
|
||||
<Icon name={triggerIcon} title={titleCase(trigger)} />
|
||||
|
||||
<Icon {...getStatusIconProps(status, message)} />
|
||||
</span>
|
||||
</TableRowCell>
|
||||
|
||||
<QueuedTaskRowNameCell
|
||||
commandName={commandName}
|
||||
body={body}
|
||||
clientUserAgent={clientUserAgent}
|
||||
/>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.queued}
|
||||
title={formatDateTime(queued, longDateFormat, timeFormat)}
|
||||
>
|
||||
{queuedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.started}
|
||||
title={formatDateTime(started, longDateFormat, timeFormat)}
|
||||
>
|
||||
{startedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell
|
||||
className={styles.ended}
|
||||
title={formatDateTime(ended, longDateFormat, timeFormat)}
|
||||
>
|
||||
{endedAt}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.duration}>
|
||||
{formatTimeSpan(duration)}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.actions}>
|
||||
{status === 'queued' && (
|
||||
<IconButton
|
||||
title={translate('RemovedFromTaskQueue')}
|
||||
name={icons.REMOVE}
|
||||
onPress={openCancelConfirmModal}
|
||||
/>
|
||||
)}
|
||||
</TableRowCell>
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isCancelConfirmModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('Cancel')}
|
||||
message={translate('CancelPendingTask')}
|
||||
confirmLabel={translate('YesCancel')}
|
||||
cancelLabel={translate('NoLeaveIt')}
|
||||
onConfirm={handleCancelPress}
|
||||
onCancel={closeCancelConfirmModal}
|
||||
/>
|
||||
</TableRow>
|
||||
);
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { cancelCommand } from 'Store/Actions/commandActions';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import QueuedTaskRow from './QueuedTaskRow';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createUISettingsSelector(),
|
||||
(uiSettings) => {
|
||||
return {
|
||||
showRelativeDates: uiSettings.showRelativeDates,
|
||||
shortDateFormat: uiSettings.shortDateFormat,
|
||||
longDateFormat: uiSettings.longDateFormat,
|
||||
timeFormat: uiSettings.timeFormat
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function createMapDispatchToProps(dispatch, props) {
|
||||
return {
|
||||
onCancelPress() {
|
||||
dispatch(cancelCommand({
|
||||
id: props.id
|
||||
}));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export default connect(createMapStateToProps, createMapDispatchToProps)(QueuedTaskRow);
|
||||
@@ -0,0 +1,8 @@
|
||||
.commandName {
|
||||
display: inline-block;
|
||||
min-width: 220px;
|
||||
}
|
||||
|
||||
.userAgent {
|
||||
color: #b0b0b0;
|
||||
}
|
||||
8
frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts
vendored
Normal file
8
frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'commandName': string;
|
||||
'userAgent': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
32
frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx
Normal file
32
frontend/src/System/Tasks/Queued/QueuedTaskRowNameCell.tsx
Normal file
@@ -0,0 +1,32 @@
|
||||
import React from 'react';
|
||||
import { CommandBody } from 'Commands/Command';
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './QueuedTaskRowNameCell.css';
|
||||
|
||||
export interface QueuedTaskRowNameCellProps {
|
||||
commandName: string;
|
||||
body: CommandBody;
|
||||
clientUserAgent?: string;
|
||||
}
|
||||
|
||||
export default function QueuedTaskRowNameCell(
|
||||
props: QueuedTaskRowNameCellProps
|
||||
) {
|
||||
const { commandName, clientUserAgent } = props;
|
||||
|
||||
return (
|
||||
<TableRowCell>
|
||||
<span className={styles.commandName}>{commandName}</span>
|
||||
|
||||
{clientUserAgent ? (
|
||||
<span
|
||||
className={styles.userAgent}
|
||||
title={translate('TaskUserAgentTooltip')}
|
||||
>
|
||||
{translate('From')}: {clientUserAgent}
|
||||
</span>
|
||||
) : null}
|
||||
</TableRowCell>
|
||||
);
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import QueuedTaskRowConnector from './QueuedTaskRowConnector';
|
||||
|
||||
const columns = [
|
||||
{
|
||||
name: 'trigger',
|
||||
label: '',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'commandName',
|
||||
label: () => translate('Name'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'queued',
|
||||
label: () => translate('Queued'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'started',
|
||||
label: () => translate('Started'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'ended',
|
||||
label: () => translate('Ended'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'duration',
|
||||
label: () => translate('Duration'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
isVisible: true
|
||||
}
|
||||
];
|
||||
|
||||
function QueuedTasks(props) {
|
||||
const {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
items
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<FieldSet legend={translate('Queue')}>
|
||||
{
|
||||
isFetching && !isPopulated &&
|
||||
<LoadingIndicator />
|
||||
}
|
||||
|
||||
{
|
||||
isPopulated &&
|
||||
<Table
|
||||
columns={columns}
|
||||
>
|
||||
<TableBody>
|
||||
{
|
||||
items.map((item) => {
|
||||
return (
|
||||
<QueuedTaskRowConnector
|
||||
key={item.id}
|
||||
{...item}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
</TableBody>
|
||||
</Table>
|
||||
}
|
||||
</FieldSet>
|
||||
);
|
||||
}
|
||||
|
||||
QueuedTasks.propTypes = {
|
||||
isFetching: PropTypes.bool.isRequired,
|
||||
isPopulated: PropTypes.bool.isRequired,
|
||||
items: PropTypes.array.isRequired
|
||||
};
|
||||
|
||||
export default QueuedTasks;
|
||||
74
frontend/src/System/Tasks/Queued/QueuedTasks.tsx
Normal file
74
frontend/src/System/Tasks/Queued/QueuedTasks.tsx
Normal file
@@ -0,0 +1,74 @@
|
||||
import React, { useEffect } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import AppState from 'App/State/AppState';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import { fetchCommands } from 'Store/Actions/commandActions';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import QueuedTaskRow from './QueuedTaskRow';
|
||||
|
||||
const columns = [
|
||||
{
|
||||
name: 'trigger',
|
||||
label: '',
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'commandName',
|
||||
label: () => translate('Name'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'queued',
|
||||
label: () => translate('Queued'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'started',
|
||||
label: () => translate('Started'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'ended',
|
||||
label: () => translate('Ended'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'duration',
|
||||
label: () => translate('Duration'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
isVisible: true,
|
||||
},
|
||||
];
|
||||
|
||||
export default function QueuedTasks() {
|
||||
const dispatch = useDispatch();
|
||||
const { isFetching, isPopulated, items } = useSelector(
|
||||
(state: AppState) => state.commands
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
dispatch(fetchCommands());
|
||||
}, [dispatch]);
|
||||
|
||||
return (
|
||||
<FieldSet legend={translate('Queue')}>
|
||||
{isFetching && !isPopulated && <LoadingIndicator />}
|
||||
|
||||
{isPopulated && (
|
||||
<Table columns={columns}>
|
||||
<TableBody>
|
||||
{items.map((item) => {
|
||||
return <QueuedTaskRow key={item.id} {...item} />;
|
||||
})}
|
||||
</TableBody>
|
||||
</Table>
|
||||
)}
|
||||
</FieldSet>
|
||||
);
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { fetchCommands } from 'Store/Actions/commandActions';
|
||||
import QueuedTasks from './QueuedTasks';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
(state) => state.commands,
|
||||
(commands) => {
|
||||
return commands;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const mapDispatchToProps = {
|
||||
dispatchFetchCommands: fetchCommands
|
||||
};
|
||||
|
||||
class QueuedTasksConnector extends Component {
|
||||
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
componentDidMount() {
|
||||
this.props.dispatchFetchCommands();
|
||||
}
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
return (
|
||||
<QueuedTasks
|
||||
{...this.props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
QueuedTasksConnector.propTypes = {
|
||||
dispatchFetchCommands: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default connect(createMapStateToProps, mapDispatchToProps)(QueuedTasksConnector);
|
||||
@@ -2,7 +2,7 @@ import React from 'react';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import QueuedTasksConnector from './Queued/QueuedTasksConnector';
|
||||
import QueuedTasks from './Queued/QueuedTasks';
|
||||
import ScheduledTasksConnector from './Scheduled/ScheduledTasksConnector';
|
||||
|
||||
function Tasks() {
|
||||
@@ -10,7 +10,7 @@ function Tasks() {
|
||||
<PageContent title={translate('Tasks')}>
|
||||
<PageContentBody>
|
||||
<ScheduledTasksConnector />
|
||||
<QueuedTasksConnector />
|
||||
<QueuedTasks />
|
||||
</PageContentBody>
|
||||
</PageContent>
|
||||
);
|
||||
|
||||
@@ -3,13 +3,16 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
|
||||
<!-- Chrome, Safari, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#e66001" />
|
||||
<!-- Windows Phone -->
|
||||
<meta name="msapplication-navbutton-color" content="#3a3f51" />
|
||||
<meta name="msapplication-navbutton-color" content="#464b51" />
|
||||
<!-- Android/Apple Phone -->
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
|
||||
<meta name="description" content="Prowlarr" />
|
||||
|
||||
|
||||
@@ -3,13 +3,16 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
|
||||
<!-- Chrome, Safari, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#e66001" />
|
||||
<!-- Windows Phone -->
|
||||
<meta name="msapplication-navbutton-color" content="#464b51" />
|
||||
<!-- Android/Apple Phone -->
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
|
||||
<meta name="description" content="Prowlarr (Preview)" />
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"lint": "eslint --config frontend/.eslintrc.js --ignore-path frontend/.eslintignore frontend/",
|
||||
"lint-fix": "yarn lint --fix",
|
||||
"stylelint-linux": "stylelint $(find frontend -name '*.css') --config frontend/.stylelintrc",
|
||||
"stylelint-windows": "stylelint frontend/**/*.css --config frontend/.stylelintrc",
|
||||
"stylelint-windows": "stylelint \"frontend/**/*.css\" --config frontend/.stylelintrc",
|
||||
"check-modules": "are-you-es5 check . -r"
|
||||
},
|
||||
"repository": "https://github.com/Prowlarr/Prowlarr",
|
||||
|
||||
@@ -308,14 +308,15 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
||||
{
|
||||
return Settings.TvDirectory.TrimStart('/');
|
||||
}
|
||||
else if (Settings.Category.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var destDir = GetDefaultDir();
|
||||
|
||||
var destDir = GetDefaultDir();
|
||||
|
||||
if (destDir.IsNotNullOrWhiteSpace() && Settings.Category.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
return $"{destDir.TrimEnd('/')}/{Settings.Category}";
|
||||
}
|
||||
|
||||
return null;
|
||||
return destDir.TrimEnd('/');
|
||||
}
|
||||
|
||||
protected override string AddFromTorrentLink(TorrentInfo release, string hash, string torrentLink)
|
||||
|
||||
@@ -274,14 +274,15 @@ namespace NzbDrone.Core.Download.Clients.DownloadStation
|
||||
{
|
||||
return Settings.TvDirectory.TrimStart('/');
|
||||
}
|
||||
else if (Settings.Category.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var destDir = GetDefaultDir();
|
||||
|
||||
var destDir = GetDefaultDir();
|
||||
|
||||
if (destDir.IsNotNullOrWhiteSpace() && Settings.Category.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
return $"{destDir.TrimEnd('/')}/{Settings.Category}";
|
||||
}
|
||||
|
||||
return null;
|
||||
return destDir.TrimEnd('/');
|
||||
}
|
||||
|
||||
protected override string AddFromLink(ReleaseInfo release)
|
||||
|
||||
@@ -137,11 +137,11 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
|
||||
if (directoryInfo.Exists)
|
||||
{
|
||||
var files = directoryInfo.GetFiles($"*.yml", options);
|
||||
var files = directoryInfo.GetFiles("*.yml", options);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
_logger.Debug("Loading definition " + file.FullName);
|
||||
_logger.Debug("Loading definition {0}", file.FullName);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -158,9 +158,9 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
|
||||
indexerList.Add(definition);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error($"Error while parsing Cardigann definition {file.FullName}\n{e}");
|
||||
_logger.Error(ex, "Error while parsing Cardigann definition {0}", file.FullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,7 +188,8 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
if (files.Any())
|
||||
{
|
||||
var file = files.First();
|
||||
_logger.Trace("Loading Cardigann definition " + file.FullName);
|
||||
_logger.Trace("Loading Cardigann definition {0}", file.FullName);
|
||||
|
||||
try
|
||||
{
|
||||
var definitionString = File.ReadAllText(file.FullName);
|
||||
@@ -196,9 +197,9 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
|
||||
return CleanIndexerDefinition(definition);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error($"Error while parsing Cardigann definition {file.FullName}\n{e}");
|
||||
_logger.Error(ex, "Error while parsing Cardigann definition {0}", file.FullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -206,7 +207,7 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
var dbDefs = _versionService.All();
|
||||
|
||||
//Check to ensure it's in versioned defs before we go to web
|
||||
if (dbDefs.Count > 0 && !dbDefs.Any(x => x.File == fileKey))
|
||||
if (dbDefs.Count > 0 && dbDefs.All(x => x.File != fileKey))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(fileKey));
|
||||
}
|
||||
@@ -217,9 +218,10 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
|
||||
private CardigannDefinition GetHttpDefinition(string id)
|
||||
{
|
||||
var req = new HttpRequest($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/{id}");
|
||||
var response = _httpClient.Get(req);
|
||||
var request = new HttpRequest($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/{id}");
|
||||
var response = _httpClient.Get(request);
|
||||
var definition = _deserializer.Deserialize<CardigannDefinition>(response.Content);
|
||||
|
||||
return CleanIndexerDefinition(definition);
|
||||
}
|
||||
|
||||
@@ -289,7 +291,7 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
EnsureDefinitionsFolder();
|
||||
|
||||
var definitionsFolder = Path.Combine(startupFolder, "Definitions");
|
||||
var saveFile = Path.Combine(definitionsFolder, $"indexers.zip");
|
||||
var saveFile = Path.Combine(definitionsFolder, "indexers.zip");
|
||||
|
||||
_httpClient.DownloadFile($"https://indexers.prowlarr.com/{DEFINITION_BRANCH}/{DEFINITION_VERSION}/package.zip", saveFile);
|
||||
|
||||
|
||||
@@ -352,7 +352,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
[FieldDefinition(7, Label = "IndexerBeyondHDSettingsRewindOnly", Type = FieldType.Checkbox, HelpText = "IndexerBeyondHDSettingsRewindOnlyHelpText")]
|
||||
public bool RewindOnly { get; set; }
|
||||
|
||||
[FieldDefinition(8, Label = "IndexerBeyondHDSettingsSearchTypes", Type = FieldType.TagSelect, SelectOptions = typeof(BeyondHDSearchType), HelpText = "IndexerBeyondHDSettingsSearchTypesHelpText", Advanced = true)]
|
||||
[FieldDefinition(8, Label = "IndexerBeyondHDSettingsSearchTypes", Type = FieldType.Select, SelectOptions = typeof(BeyondHDSearchType), HelpText = "IndexerBeyondHDSettingsSearchTypesHelpText", Advanced = true)]
|
||||
public IEnumerable<int> SearchTypes { get; set; }
|
||||
|
||||
public override NzbDroneValidationResult Validate()
|
||||
|
||||
@@ -1467,27 +1467,27 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories);
|
||||
return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories);
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
|
||||
{
|
||||
return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories);
|
||||
return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories);
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
|
||||
{
|
||||
return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories, searchCriteria.Season ?? 0);
|
||||
return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories, searchCriteria.Season ?? 0);
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
|
||||
{
|
||||
return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories);
|
||||
return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories);
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
|
||||
{
|
||||
return GetPageableRequests(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories);
|
||||
return GetPageableRequests(searchCriteria.SearchTerm, searchCriteria.Categories);
|
||||
}
|
||||
|
||||
private IndexerPageableRequestChain GetPageableRequests(string searchTerm, int[] categories, int season = 0)
|
||||
@@ -1525,8 +1525,10 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
}
|
||||
else
|
||||
{
|
||||
// use the normal search
|
||||
// replace any space, special char, etc. with % (wildcard)
|
||||
searchString = new Regex("[^a-zA-Zа-яА-ЯёЁ0-9]+").Replace(searchString, "%");
|
||||
searchString = searchString.Replace("-", " ");
|
||||
|
||||
if (season != 0)
|
||||
{
|
||||
searchString += " Сезон: " + season;
|
||||
|
||||
@@ -29,8 +29,6 @@ namespace NzbDrone.Core.Indexers
|
||||
public int AppProfileId { get; set; }
|
||||
public LazyLoaded<AppSyncProfile> AppProfile { get; set; }
|
||||
|
||||
public IndexerStatus Status { get; set; }
|
||||
|
||||
public List<SettingsField> ExtraFields { get; set; } = new List<SettingsField>();
|
||||
public List<SettingsField> ExtraFields { get; set; } = new ();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,10 +55,10 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
MapCardigannDefinition(definition);
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Skip indexer if we fail in Cardigann mapping
|
||||
_logger.Debug("Indexer '{0}' has no definition", definition.Name);
|
||||
_logger.Debug(ex, "Indexer '{0}' has no definition", definition.Name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,9 +78,9 @@
|
||||
"UILanguage": "UI-sprog",
|
||||
"Custom": "Brugerdefinerede",
|
||||
"TagsSettingsSummary": "Se alle tags og hvordan de bruges. Ubrugte tags kan fjernes",
|
||||
"Test": "Prøve",
|
||||
"TestAll": "Test alle",
|
||||
"TestAllClients": "Test alle klienter",
|
||||
"Test": "Afprøv",
|
||||
"TestAll": "Afprøv alle",
|
||||
"TestAllClients": "Afprøv alle klienter",
|
||||
"Type": "Type",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "Kunne ikke tilføje en ny indekser. Prøv igen.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Kan ikke tilføje en ny underretning, prøv igen.",
|
||||
@@ -92,7 +92,7 @@
|
||||
"SetTags": "Indstil tags",
|
||||
"YesCancel": "Ja, Annuller",
|
||||
"AcceptConfirmationModal": "Accepter bekræftelsesmodal",
|
||||
"AddIndexer": "Tilføj indeksør",
|
||||
"AddIndexer": "Tilføj indekser",
|
||||
"AnalyticsEnabledHelpText": "Send anonym brugs- og fejlinformation til {appName}s servere. Dette inkluderer information om din browser, hvilke af {appName}s WebUI-sider du bruger, fejlrapportering, samt OS- og runtime-version. Vi bruger disse oplysninger til at prioritere funktioner og fejlrettelser.",
|
||||
"Backups": "Sikkerhedskopier",
|
||||
"BypassProxyForLocalAddresses": "Bypass-proxy til lokale adresser",
|
||||
@@ -315,7 +315,7 @@
|
||||
"HistoryCleanupDaysHelpTextWarning": "Filer i papirkurven, der er ældre end det valgte antal dage, renses automatisk",
|
||||
"OnGrab": "ved hentning",
|
||||
"OnHealthIssue": "Om sundhedsspørgsmål",
|
||||
"TestAllIndexers": "Test alle indeksører",
|
||||
"TestAllIndexers": "Afprøv alle indeks",
|
||||
"GrabReleases": "Hent udgivelse",
|
||||
"Link": "Links",
|
||||
"MappedDrivesRunningAsService": "Tilsluttede netværksdrev er ikke tilgængelige, når programmet kører som en Windows-tjeneste. Se FAQ'en for mere information",
|
||||
@@ -375,5 +375,7 @@
|
||||
"AddConnection": "Tilføj forbindelse",
|
||||
"EditConnectionImplementation": "Tilføj forbindelse - {implementationName}",
|
||||
"AddApplicationImplementation": "Tilføj forbindelse - {implementationName}",
|
||||
"AddIndexerImplementation": "Tilføj betingelse - {implementationName}"
|
||||
"AddIndexerImplementation": "Tilføj betingelse - {implementationName}",
|
||||
"ApplyChanges": "Anvend ændringer",
|
||||
"AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}"
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"AudioSearch": "Audio Suche",
|
||||
"Auth": "Authentifizierung",
|
||||
"Authentication": "Authentifizierung",
|
||||
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.",
|
||||
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
|
||||
"Automatic": "Automatisch",
|
||||
"AutomaticSearch": "Automatische Suche",
|
||||
"Backup": "Sicherung",
|
||||
@@ -53,7 +53,7 @@
|
||||
"BookSearch": "Buch Suche",
|
||||
"BookSearchTypes": "Buch-Suchtypen",
|
||||
"Branch": "Branch",
|
||||
"BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}",
|
||||
"BranchUpdate": "Branch, der verwendet werden soll, um {appName} zu updaten",
|
||||
"BranchUpdateMechanism": "Git-Branch für den externen Updateablauf",
|
||||
"BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen",
|
||||
"Cancel": "Abbrechen",
|
||||
@@ -533,7 +533,7 @@
|
||||
"AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen",
|
||||
"DefaultNameCopiedProfile": "{Name} – Kopieren",
|
||||
"DefaultNameCopiedProfile": "{name} – Kopieren",
|
||||
"AuthenticationMethod": "Authentifizierungsmethode",
|
||||
"Clone": "Klonen",
|
||||
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
|
||||
@@ -545,5 +545,6 @@
|
||||
"EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}",
|
||||
"CountApplicationsSelected": "{count} Ausgewählte Sammlung(en)",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden",
|
||||
"ManageClients": "Verwalte Clienten"
|
||||
"ManageClients": "Verwalte Clienten",
|
||||
"BlackholeFolderHelpText": "Ordner, in dem {appName} die Datei {extension} speichert"
|
||||
}
|
||||
|
||||
@@ -515,7 +515,7 @@
|
||||
"EditConnectionImplementation": "Προσθήκη",
|
||||
"EditApplicationImplementation": "Προσθήκη",
|
||||
"AddApplicationImplementation": "Προσθήκη",
|
||||
"AddConnectionImplementation": "Προσθήκη",
|
||||
"AddConnectionImplementation": "Προσθήκη - {implementationName}",
|
||||
"AddIndexerImplementation": "Προσθήκη",
|
||||
"EditIndexerProxyImplementation": "Προσθήκη",
|
||||
"CountApplicationsSelected": "Επιλέχθηκαν {0} συλλογές"
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
"DisabledUntil": "Disabled Until",
|
||||
"Discord": "Discord",
|
||||
"Docker": "Docker",
|
||||
"Donate": "Donate",
|
||||
"Donations": "Donations",
|
||||
"DownloadClient": "Download Client",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Aria2 location",
|
||||
@@ -447,9 +448,11 @@
|
||||
"MappedDrivesRunningAsService": "Mapped network drives are not available when running as a Windows Service. Please see the FAQ for more information",
|
||||
"MassEditor": "Mass Editor",
|
||||
"Mechanism": "Mechanism",
|
||||
"Menu": "Menu",
|
||||
"Message": "Message",
|
||||
"MinimumSeeders": "Minimum Seeders",
|
||||
"MinimumSeedersHelpText": "Minimum seeders required by the Application for the indexer to grab",
|
||||
"Mixed": "Mixed",
|
||||
"Mode": "Mode",
|
||||
"More": "More",
|
||||
"MoreInfo": "More Info",
|
||||
@@ -521,6 +524,8 @@
|
||||
"Privacy": "Privacy",
|
||||
"Private": "Private",
|
||||
"Protocol": "Protocol",
|
||||
"ProwlarrDownloadClientsAlert": "If you intend to do searches directly within {appName}, you need to add Download Clients. Otherwise, you do not need to add them here. For searches from your Apps, the download clients configured there are used instead.",
|
||||
"ProwlarrDownloadClientsInAppOnlyAlert": "Download clients are for {appName} in-app searches only and do not sync to apps. There are no plans to add any such functionality.",
|
||||
"ProwlarrSupportsAnyDownloadClient": "{appName} supports any of the download clients listed below.",
|
||||
"ProwlarrSupportsAnyIndexer": "{appName} supports many indexers in addition to any indexer that uses the Newznab/Torznab standard using 'Generic Newznab' (for usenet) or 'Generic Torznab' (for torrents). Search & Select your indexer from below.",
|
||||
"Proxies": "Proxies",
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"Clear": "Borrar",
|
||||
"BackupNow": "Hacer copia de seguridad ahora",
|
||||
"Backup": "Copia de seguridad",
|
||||
"AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar",
|
||||
"AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar",
|
||||
"Analytics": "Analíticas",
|
||||
"All": "Todo",
|
||||
"About": "Acerca de",
|
||||
@@ -31,7 +31,7 @@
|
||||
"UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".",
|
||||
"UpdateCheckStartupNotWritableMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' no tiene permisos de escritura para el usuario '{1}'.",
|
||||
"UnselectAll": "Deseleccionar Todo",
|
||||
"UnselectAll": "Desmarcar todo",
|
||||
"UI": "UI",
|
||||
"Tasks": "Tareas",
|
||||
"Tags": "Etiquetas",
|
||||
@@ -39,15 +39,15 @@
|
||||
"Style": "Estilo",
|
||||
"Status": "Estado",
|
||||
"Sort": "Ordenar",
|
||||
"ShowAdvanced": "Mostrar Avanzado",
|
||||
"ShowAdvanced": "Mostrar avanzado",
|
||||
"Settings": "Ajustes",
|
||||
"SetTags": "Poner Etiquetas",
|
||||
"SelectAll": "Seleccionar Todas",
|
||||
"SetTags": "Establecer etiquetas",
|
||||
"SelectAll": "Seleccionar todo",
|
||||
"Security": "Seguridad",
|
||||
"Search": "Buscar",
|
||||
"Scheduled": "Programado",
|
||||
"SaveChanges": "Guardar Cambios",
|
||||
"RestoreBackup": "Recuperar Backup",
|
||||
"SaveChanges": "Guardar cambios",
|
||||
"RestoreBackup": "Restaurar copia de seguridad",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de {appName}, no recibirás actualizaciones",
|
||||
"Refresh": "Actualizar",
|
||||
"Queue": "Cola",
|
||||
@@ -66,7 +66,7 @@
|
||||
"Added": "Añadido",
|
||||
"Actions": "Acciones",
|
||||
"UISettingsSummary": "Fecha, idioma, y opciones de color deteriorado",
|
||||
"TagsSettingsSummary": "Ver todas las etiquetas y cómo se usan. Las etiquetas no utilizadas se pueden eliminar",
|
||||
"TagsSettingsSummary": "Vea todas las etiquetas y cómo se usan. Las etiquetas sin usar pueden ser eliminadas",
|
||||
"Size": "Tamaño",
|
||||
"ReleaseStatus": "Estado del Estreno",
|
||||
"Protocol": "Protocolo",
|
||||
@@ -86,10 +86,10 @@
|
||||
"Type": "Tipo",
|
||||
"Title": "Título",
|
||||
"Time": "Tiempo",
|
||||
"TestAll": "Testear Todo",
|
||||
"Test": "Test",
|
||||
"TestAll": "Probar todo",
|
||||
"Test": "Prueba",
|
||||
"TableOptionsColumnsMessage": "Escoger qué columnas son visibles y en que orden aparecerán",
|
||||
"TableOptions": "Opciones de Tabla",
|
||||
"TableOptions": "Opciones de tabla",
|
||||
"Source": "Fuente",
|
||||
"Shutdown": "Apagar",
|
||||
"Seeders": "Semillas",
|
||||
@@ -115,16 +115,16 @@
|
||||
"Apply": "Aplicar",
|
||||
"Age": "Antigüedad",
|
||||
"SystemTimeCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido",
|
||||
"UnsavedChanges": "Cambios no guardados",
|
||||
"ShowSearchHelpText": "Mostrar botón de búsqueda al pasar el cursor por encima",
|
||||
"ShowSearch": "Mostrar Búsqueda",
|
||||
"UnsavedChanges": "Cambios sin guardar",
|
||||
"ShowSearchHelpText": "Muestra el botón de búsqueda al pasar por encima",
|
||||
"ShowSearch": "Mostrar búsqueda",
|
||||
"SettingsTimeFormat": "Formato de Hora",
|
||||
"SettingsShowRelativeDatesHelpText": "Mostrar fechas relativas (Hoy/Ayer/etc) o absolutas",
|
||||
"SettingsShowRelativeDates": "Mostrar Fechas Relativas",
|
||||
"SettingsShortDateFormat": "Formato Corto de Fecha",
|
||||
"SettingsLongDateFormat": "Formato Largo de Fecha",
|
||||
"PendingChangesStayReview": "Permanecer y revisar cambios",
|
||||
"PendingChangesMessage": "Hay cambios sin salvar, estás seguro de que quieres salir de esta página?",
|
||||
"PendingChangesStayReview": "Quedarse y revisar cambios",
|
||||
"PendingChangesMessage": "Tienes cambios sin guardar. ¿Estás seguro que quieres salir de esta página?",
|
||||
"PendingChangesDiscardChanges": "Descartar cambios y salir",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Estilo modificado para permitir que usuarios con problemas de color distingan mejor la información codificada por colores",
|
||||
"SettingsEnableColorImpairedMode": "Activar Modo De Color Degradado",
|
||||
@@ -160,45 +160,45 @@
|
||||
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de {appName}. Esto incluye información sobre su navegador, qué páginas de {appName} WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
||||
"YesCancel": "Sí, Cancelar",
|
||||
"Version": "Versión",
|
||||
"Username": "Nombre de usuario",
|
||||
"UseProxy": "Usar el Proxy",
|
||||
"Username": "Usuario",
|
||||
"UseProxy": "Usar proxy",
|
||||
"Usenet": "Usenet",
|
||||
"UrlBaseHelpText": "Para soporte de reverse proxy, vacio por defecto",
|
||||
"UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío",
|
||||
"URLBase": "URL Base",
|
||||
"Uptime": "Tiempo de actividad",
|
||||
"UpdateScriptPathHelpText": "Ruta del script propio que toma el paquete de actualización y se encarga del proceso de actualización restante",
|
||||
"UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización",
|
||||
"UpdateMechanismHelpText": "Usar el actualizador incorporado de {appName} o un script",
|
||||
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Se podrán instalar desde Sistema: Actualizaciones también",
|
||||
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
|
||||
"UnableToLoadTags": "No se pueden cargar las Etiquetas",
|
||||
"UnableToLoadNotifications": "No se pueden cargar las Notificaciones",
|
||||
"DownloadClientsLoadError": "No se puden cargar los gestores de descargas",
|
||||
"UISettings": "Ajustes del UI",
|
||||
"Torrents": "Torrents",
|
||||
"TestAllClients": "Comprobar Todos los Gestores",
|
||||
"TestAllClients": "Probar todos los clientes",
|
||||
"TagsHelpText": "Se aplica a películas con al menos una etiqueta coincidente",
|
||||
"SuggestTranslationChange": "Sugerir un cambio en la traducción",
|
||||
"StartupDirectory": "Directorio de Arranque",
|
||||
"SSLPort": "Puerto SSL",
|
||||
"SSLCertPath": "Ruta del Certificado SSL",
|
||||
"SSLCertPassword": "Contraseña del Certificado SSL",
|
||||
"SendAnonymousUsageData": "Enviar Datos de Uso Anónimamente",
|
||||
"ScriptPath": "Ruta del Script",
|
||||
"SendAnonymousUsageData": "Enviar datos de uso anónimos",
|
||||
"ScriptPath": "Ruta del script",
|
||||
"Retention": "Retención",
|
||||
"Result": "Resultado",
|
||||
"RestartRequiredHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
"RestartRequiredHelpTextWarning": "Requiere reiniciar para que tenga efecto",
|
||||
"RestartProwlarr": "Reiniciar {appName}",
|
||||
"RestartNow": "Reiniciar Ahora",
|
||||
"ResetAPIKey": "Reajustar API",
|
||||
"RestartNow": "Reiniciar ahora",
|
||||
"ResetAPIKey": "Restablecer clave API",
|
||||
"Reset": "Reiniciar",
|
||||
"RemoveFilter": "Eliminar filtro",
|
||||
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
|
||||
"RefreshMovie": "Actualizar película",
|
||||
"ReadTheWikiForMoreInformation": "Lee la Wiki para más información",
|
||||
"ProxyUsernameHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.",
|
||||
"ProxyType": "Tipo de Proxy",
|
||||
"ProxyPasswordHelpText": "Tienes que introducir tu nombre de usuario y contraseña sólo si son requeridos. Si no, déjalos vacios.",
|
||||
"ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como wildcard para subdominios",
|
||||
"PortNumber": "Número de Puerto",
|
||||
"ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
|
||||
"ProxyType": "Tipo de proxy",
|
||||
"ProxyPasswordHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
|
||||
"ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como comodín para subdominios",
|
||||
"PortNumber": "Número de puerto",
|
||||
"Port": "Puerto",
|
||||
"Password": "Contraseña",
|
||||
"PageSizeHelpText": "Número de elementos por página",
|
||||
@@ -224,12 +224,12 @@
|
||||
"EnableAutomaticSearch": "Habilitar Búsqueda Automática",
|
||||
"ConnectSettings": "Conectar Ajustes",
|
||||
"BindAddress": "Dirección de Ligado",
|
||||
"OpenBrowserOnStart": "Abrir navegador al arrancar",
|
||||
"OpenBrowserOnStart": "Abrir navegador al inicio",
|
||||
"OnHealthIssueHelpText": "En Problema de Salud",
|
||||
"TagCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso",
|
||||
"SSLCertPathHelpText": "Ruta al archivo pfx",
|
||||
"SSLCertPasswordHelpText": "Contraseña para el archivo pfx",
|
||||
"RssIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer",
|
||||
"RssIsNotSupportedWithThisIndexer": "RSS no está soportado con este indexador",
|
||||
"RemovingTag": "Eliminando etiqueta",
|
||||
"Manual": "Manual",
|
||||
"LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente",
|
||||
@@ -248,7 +248,7 @@
|
||||
"UnableToLoadUISettings": "No se han podido cargar los ajustes de UI",
|
||||
"UnableToLoadHistory": "No se ha podido cargar la historia",
|
||||
"UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales",
|
||||
"UnableToLoadBackups": "No se han podido cargar las copias de seguridad",
|
||||
"UnableToLoadBackups": "No se pudo cargar las copias de seguridad",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.",
|
||||
@@ -299,7 +299,7 @@
|
||||
"Presets": "Preajustes",
|
||||
"Rss": "RSS",
|
||||
"Today": "Hoy",
|
||||
"Tomorrow": "mañana",
|
||||
"Tomorrow": "Mañana",
|
||||
"Torrent": "Torrents",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.",
|
||||
"Wiki": "Wiki",
|
||||
@@ -321,10 +321,10 @@
|
||||
"HistoryCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática",
|
||||
"HistoryCleanupDaysHelpTextWarning": "Los archivos en la papelera de reciclaje más antiguos que el número de días seleccionado serán limpiados automáticamente",
|
||||
"OnGrab": "Al Capturar lanzamiento",
|
||||
"OnHealthIssue": "En Problema de Salud",
|
||||
"TestAllIndexers": "Comprobar Todos los Indexers",
|
||||
"OnHealthIssue": "Al haber un problema de salud",
|
||||
"TestAllIndexers": "Probar todos los indexadores",
|
||||
"NotificationTriggersHelpText": "Selecciona qué eventos deberían disparar esta notificación",
|
||||
"OnApplicationUpdate": "Al Actualizar La Aplicación",
|
||||
"OnApplicationUpdate": "Al actualizar la aplicación",
|
||||
"OnApplicationUpdateHelpText": "Al Actualizar La Aplicación",
|
||||
"AddRemoveOnly": "Sólo añadir y eliminar",
|
||||
"AddedToDownloadClient": "Descarga añadida al cliente",
|
||||
@@ -422,7 +422,7 @@
|
||||
"DisabledForLocalAddresses": "Deshabilitado para Direcciones Locales",
|
||||
"External": "Externo",
|
||||
"None": "Ninguno",
|
||||
"ResetAPIKeyMessageText": "¿Está seguro de que desea restablecer su clave API?",
|
||||
"ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?",
|
||||
"EditIndexerProxyImplementation": "Editar Proxy de Indexador - { implementationName}",
|
||||
"AppUpdated": "{appName} Actualizado",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}",
|
||||
@@ -614,5 +614,12 @@
|
||||
"IndexerSettingsPasskey": "Clave de Acceso",
|
||||
"BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file",
|
||||
"CustomFilter": "Filtros personalizados",
|
||||
"LabelIsRequired": "Se requiere etiqueta"
|
||||
"LabelIsRequired": "Se requiere etiqueta",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Guardar archivos magnet",
|
||||
"TorrentBlackholeTorrentFolder": "Carpeta de torrent",
|
||||
"UseSsl": "Usar SSL",
|
||||
"UsenetBlackholeNzbFolder": "Carpeta Nzb",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "Guarda el enlace magnet si no hay ningún archivo .torrent disponible (útil solo si el cliente de descarga soporta magnets guardados en un archivo)",
|
||||
"SecretToken": "Token secreto",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Guardar extensión de archivos magnet"
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
"Refresh": "Päivitä",
|
||||
"RefreshMovie": "Päivitä elokuva",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.",
|
||||
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.",
|
||||
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii in uudelleenkäynnistyksen.",
|
||||
"Result": "Tulos",
|
||||
"Settings": "Asetukset",
|
||||
"SettingsLongDateFormat": "Pitkän päiväyksen esitys",
|
||||
@@ -56,7 +56,6 @@
|
||||
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.",
|
||||
"Enable": "Käytä",
|
||||
"UI": "Käyttöliittymä",
|
||||
"UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.",
|
||||
"Usenet": "Usenet",
|
||||
"BackupNow": "Varmuuskopioi nyt",
|
||||
"NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä",
|
||||
@@ -71,7 +70,7 @@
|
||||
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
|
||||
"ApplyTags": "Tunnistetoimenpide",
|
||||
"Authentication": "Tunnistautuminen",
|
||||
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
|
||||
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana",
|
||||
"BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.",
|
||||
"Close": "Sulje",
|
||||
"DeleteNotification": "Poista ilmoitus",
|
||||
@@ -168,7 +167,7 @@
|
||||
"Size": "Koko",
|
||||
"Sort": "Järjestys",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.",
|
||||
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.",
|
||||
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää",
|
||||
"UnableToLoadHistory": "Historian lataus epäonnistui.",
|
||||
"UnableToLoadNotifications": "Virhe ladattaessa kytköksiä",
|
||||
"UnableToLoadTags": "Tunnisteiden lataus ei onnistu",
|
||||
@@ -227,7 +226,7 @@
|
||||
"BeforeUpdate": "Ennen päivitystä",
|
||||
"BindAddress": "Sidososoite",
|
||||
"Branch": "Haara",
|
||||
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.",
|
||||
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara",
|
||||
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
|
||||
"BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi",
|
||||
"Cancel": "Peruuta",
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour",
|
||||
"Analytics": "Statistiques",
|
||||
"All": "Tout",
|
||||
"About": "À propos",
|
||||
"About": "Tagalog",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs : {0}",
|
||||
"SetTags": "Définir des étiquettes",
|
||||
@@ -146,7 +146,7 @@
|
||||
"ApplyTags": "Appliquer les étiquettes",
|
||||
"AppDataDirectory": "Dossier AppData",
|
||||
"ApiKey": "Clé API",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de {appName}. Cela inclut des informations sur votre navigateur, quelle page {appName} WebUI vous utilisez, les rapports d'erreurs, ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs aux serveurs de {appName}. Cela inclut des informations sur votre navigateur, les pages de l'interface Web de {appName} que vous utilisez, les rapports d'erreurs ainsi que le système d'exploitation et la version d'exécution. Nous utiliserons ces informations pour prioriser les fonctionnalités et les corrections de bugs.",
|
||||
"IgnoredAddresses": "Adresses ignorées",
|
||||
"Hostname": "Nom d'hôte",
|
||||
"GeneralSettings": "Réglages généraux",
|
||||
@@ -162,13 +162,13 @@
|
||||
"DeleteNotification": "Supprimer la notification",
|
||||
"DeleteDownloadClient": "Supprimer le client de téléchargement",
|
||||
"DeleteBackup": "Supprimer la sauvegarde",
|
||||
"DatabaseMigration": "Migration de la base de données",
|
||||
"DatabaseMigration": "Migration des bases de données",
|
||||
"ConnectSettings": "Paramètres de connexion",
|
||||
"BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de {appName}",
|
||||
"BackupFolderHelpText": "Les chemins d'accès relatifs se trouvent dans le répertoire AppData de {appName}",
|
||||
"IllRestartLater": "Je redémarrerai plus tard",
|
||||
"CancelPendingTask": "Êtes-vous sur de vouloir annuler cette tâche en attente ?",
|
||||
"BranchUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur",
|
||||
"BranchUpdate": "Branche à utiliser pour mettre {appName} à jour",
|
||||
"BranchUpdate": "Branche à utiliser pour mettre à jour {appName}",
|
||||
"BeforeUpdate": "Avant la mise à jour",
|
||||
"DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?",
|
||||
"DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?",
|
||||
@@ -222,7 +222,7 @@
|
||||
"TagsHelpText": "S'applique aux indexeurs avec au moins une étiquette correspondante",
|
||||
"StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous",
|
||||
"NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant",
|
||||
"IndexerFlags": "Indicateurs d'indexeur",
|
||||
"IndexerFlags": "Drapeaux de l'indexeur",
|
||||
"DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette '{label}' ?",
|
||||
"UISettings": "Paramètres UI",
|
||||
"UILanguageHelpTextWarning": "Rechargement du navigateur requis",
|
||||
@@ -302,7 +302,7 @@
|
||||
"SettingsFilterSentryEvents": "Filtrer les événements d'analyse",
|
||||
"SettingsConsoleLogLevel": "Niveau de journalisation de la console",
|
||||
"SearchIndexers": "Recherche indexeurs",
|
||||
"IndexerRss": "Indexeur Rss",
|
||||
"IndexerRss": "Indexeur RSS",
|
||||
"IndexerQuery": "Requête indexeur",
|
||||
"IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à {appName}",
|
||||
"IndexerHealthCheckNoIndexers": "Aucun indexeur activé, {appName} ne renverra pas de résultats de recherche",
|
||||
@@ -345,7 +345,7 @@
|
||||
"Donations": "Dons",
|
||||
"Enabled": "Activé",
|
||||
"Grabs": "Complétés",
|
||||
"Id": "Id",
|
||||
"Id": "ID",
|
||||
"Presets": "Préconfigurations",
|
||||
"Privacy": "Visibilité",
|
||||
"Query": "Requête",
|
||||
@@ -482,7 +482,7 @@
|
||||
"Author": "Auteur",
|
||||
"AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)",
|
||||
"IndexerFailureRate": "Taux d'échec de l'indexeur",
|
||||
"Label": "Libellé",
|
||||
"Label": "Étiquette",
|
||||
"More": "Plus",
|
||||
"Publisher": "Éditeur",
|
||||
"Season": "Saison",
|
||||
@@ -593,9 +593,9 @@
|
||||
"ActiveIndexers": "Indexeurs actifs",
|
||||
"ActiveApps": "Applications actives",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur",
|
||||
"Clone": "Cloner",
|
||||
"Clone": "Dupliquer",
|
||||
"PackSeedTime": "Temps de Seed",
|
||||
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes",
|
||||
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes. Si aucune étiquette n'est listée ici, aucun indexeur ne sera empêché de se synchroniser en raison de ses étiquettes.",
|
||||
"OnHealthRestored": "Sur la santé restaurée",
|
||||
"OnHealthRestoredHelpText": "Sur la santé restaurée",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
|
||||
@@ -605,5 +605,139 @@
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Disposition du contenu",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Utiliser la disposition du contenu configurée par qBittorrent, la disposition originale du torrent ou toujours créer un sous-dossier (qBittorrent 4.3.2+)",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2",
|
||||
"ManageClients": "Gérer les clients"
|
||||
"ManageClients": "Gérer les clients",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL json du déluge, voir {url}",
|
||||
"Destination": "Cible",
|
||||
"Directory": "Dossier",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Dossier partagé dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement par défaut de Download Station",
|
||||
"CustomFilter": "Filtre personnalisé",
|
||||
"NotificationsEmailSettingsUseEncryption": "Utiliser le cryptage",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Préférer utiliser le cryptage s'il est configuré sur le serveur, toujours utiliser le cryptage via SSL (port 465 uniquement) ou StartTLS (tout autre port) ou ne jamais utiliser le cryptage",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Clé d'accès à partir des détails de l'utilisateur",
|
||||
"NoApplicationsFound": "Aucune application trouvée",
|
||||
"IndexerAlphaRatioSettingsExcludeSceneHelpText": "Exclure les communiqués de SCENE des résultats",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "Exclure SCENE",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "Limité seulement",
|
||||
"IndexerBeyondHDSettingsRssKeyHelpText": "Clé RSS du site (trouvée dans My Security => Clé RSS)",
|
||||
"IndexerFileListSettingsUsernameHelpText": "Nom d'utilisateur du site",
|
||||
"IndexerFileListSettingsPasskeyHelpText": "Site Passkey (Il s'agit de la chaîne alphanumérique dans l'url du tracker affichée dans votre client de téléchargement)",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpTextWarning": "Doit avoir les permissions Utilisateur et Torrents",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNamesHelpText": "Rechercher des publications par nom de groupe",
|
||||
"IndexerHDBitsSettingsMediums": "Supports",
|
||||
"IndexerHDBitsSettingsMediumsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Nom d'utilisateur du site",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgent": "Cookie User-Agent",
|
||||
"IndexerIPTorrentsSettingsCookieUserAgentHelpText": "User-Agent associé au cookie utilisé par le navigateur",
|
||||
"IndexerNewznabSettingsAdditionalParametersHelpText": "Paramètres supplémentaires de Newznab",
|
||||
"IndexerNebulanceSettingsApiKeyHelpText": "Clé API à partir de Paramètres de l'utilisateur > Clés API. La clé doit avoir les permissions Liste et Téléchargement",
|
||||
"IndexerNewznabSettingsApiKeyHelpText": "Clé API du site",
|
||||
"IndexerNewznabSettingsVipExpirationHelpText": "Entrez la date (yyyy-mm-dd) pour l'expiration du VIP ou vide, {appName} notifiera 1 semaine après l'expiration du VIP",
|
||||
"IndexerRedactedSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)",
|
||||
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
|
||||
"IndexerSettingsAdditionalParameters": "Paramètres supplémentaires",
|
||||
"IndexerSettingsApiPathHelpText": "Chemin d'accès à l'api, généralement {url}",
|
||||
"IndexerSettingsApiUser": "Utilisateur de l'API",
|
||||
"IndexerSettingsAppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles",
|
||||
"IndexerSettingsFreeleechOnly": "Freeleech seulement",
|
||||
"IndexerSettingsGrabLimit": "Limite de saisie",
|
||||
"IndexerSettingsQueryLimit": "Limite de requête",
|
||||
"IndexerSettingsQueryLimitHelpText": "Le nombre de requêtes maximales tel que spécifié par l'unité respective que {appName} autorisera au site",
|
||||
"IndexerSettingsRssKey": "Clé RSS",
|
||||
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
|
||||
"IndexerSettingsSeedTime": "Temps d'envoie",
|
||||
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Clé API du site",
|
||||
"BlackholeFolderHelpText": "Dossier dans lequel {appName} stockera le fichier {extension}",
|
||||
"DefaultCategory": "Catégorie par défaut",
|
||||
"DownloadClientFloodSettingsAdditionalTags": "Étiquette supplémentaire",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute les propriétés des médias sous forme d'étiquette. Les conseils sont des exemples.",
|
||||
"DownloadClientFreeboxSettingsApiUrl": "URL DE L'API",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Définir l'URL de base de l'API Freebox avec la version de l'API, par exemple '{url}', par défaut '{defaultApiUrl}'",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit avoir toutes les étiquettes initiales. Cela permet d'éviter les conflits avec des téléchargements non apparentés.",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Ajoute d'un préfixe à l'API Flood, tel que {url}",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Port utilisé pour accéder à l'interface de la Freebox, la valeur par défaut est '{port}'",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Cette option nécessite au moins la version 16.0 de NzbGet",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Dossier Nzb",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "Le jeton de l'application récupéré lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_token')",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Nom d'hôte ou adresse IP de la Freebox, par défaut '{url}' (ne fonctionnera que si elle est sur le même réseau)",
|
||||
"DownloadClientSettingsInitialState": "État initial",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "Priorité à utiliser lors de la saisie des articles",
|
||||
"DownloadClientSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url {clientName}, tel que {url}",
|
||||
"DownloadClientSettingsUseSslHelpText": "Utiliser une connexion sécurisée lors de la connexion à {clientName}",
|
||||
"DownloadClientSettingsInitialStateHelpText": "État initial pour les torrents ajoutés à {clientName}",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement de transmission par défaut",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url rpc de {clientName}, par exemple {url}, la valeur par défaut étant '{defaultUrl}'",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
|
||||
"IndexerBeyondHDSettingsApiKeyHelpText": "Clé API du site (dans My Security => Clé API)",
|
||||
"IndexerBeyondHDSettingsRefundOnly": "Remboursement uniquement",
|
||||
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Recherche de remboursement seulement",
|
||||
"IndexerBeyondHDSettingsRewindOnly": "Rembobiner seulement",
|
||||
"IndexerBeyondHDSettingsRewindOnlyHelpText": "Recherche en arrière uniquement",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Recherche de freeleech uniquement (UL limitée)",
|
||||
"IndexerBeyondHDSettingsSearchTypesHelpText": "Sélectionnez les types de rejets qui vous intéressent. Si aucune option n'est sélectionnée, toutes les options sont utilisées.",
|
||||
"IndexerFileListSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
|
||||
"IndexerGazelleGamesSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)",
|
||||
"IndexerBeyondHDSettingsSearchTypes": "Types de recherche",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Afficher uniquement les versions freeleech",
|
||||
"IndexerHDBitsSettingsOrigins": "Origines",
|
||||
"IndexerHDBitsSettingsCodecs": "Codecs",
|
||||
"IndexerHDBitsSettingsCodecsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.",
|
||||
"IndexerHDBitsSettingsUseFilenamesHelpText": "Cochez cette option si vous souhaitez utiliser les noms de fichiers des torrents comme titres de publication",
|
||||
"IndexerNzbIndexSettingsApiKeyHelpText": "Clé API du site",
|
||||
"IndexerOrpheusSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)",
|
||||
"IndexerPassThePopcornSettingsApiKeyHelpText": "Clé API du site",
|
||||
"IndexerPassThePopcornSettingsApiUserHelpText": "Ces paramètres se trouvent dans les paramètres de sécurité de PassThePopcorn (Modifier le profil > Sécurité).",
|
||||
"IndexerSettingsGrabLimitHelpText": "Le nombre de prises maximales tel que spécifié par l'unité respective que {appName} autorisera sur le site",
|
||||
"IndexerSettingsLimitsUnit": "Limites d'unité",
|
||||
"IndexerSettingsCookie": "Cookie",
|
||||
"IndexerSettingsCookieHelpText": "Cookie du site",
|
||||
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
|
||||
"IndexerSettingsSeedRatio": "Ratio d'envoie",
|
||||
"IndexerSettingsVipExpiration": "Expiration de la carte VIP",
|
||||
"SecretToken": "Jeton secret",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Enregistrer les fichiers magnétiques",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Sauvegarde des fichiers magnétiques Extension",
|
||||
"UsenetBlackholeNzbFolder": "Dossier Nzb",
|
||||
"XmlRpcPath": "Chemin d'accès XML RPC",
|
||||
"IndexerSettingsPackSeedTimeIndexerHelpText": "Durée pendant laquelle un torrent de pack (saison ou discographie) doit être diffusé avant de s'arrêter, vide est la valeur par défaut de l'application",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "Enregistrer le lien magnétique si aucun fichier .torrent n'est disponible (utile uniquement si le client de téléchargement prend en charge les liens magnétiques enregistrés dans un fichier)",
|
||||
"IndexerId": "ID de l'indexeur",
|
||||
"DownloadClientFreeboxSettingsAppId": "ID de l'application",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Jeton d'application",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Ce dossier devra être accessible depuis XBMC",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Dossier Strm",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Les fichiers .strm contenus dans ce dossier seront importés par drone",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Premier et dernier premiers",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "État initial des torrents ajoutés à qBittorrent. Notez que les torrents forcés ne respectent pas les restrictions relatives aux seeds",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordre séquentiel",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Téléchargement dans l'ordre séquentiel (qBittorrent 4.1.0+)",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "L'activation ajoutera des torrents et des magnets à rTorrent dans un état d'arrêt. Cela peut endommager les fichiers magnétiques.",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Chemin d'url",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Chemin d'accès au point de terminaison XMLRPC, voir {url}. Il s'agit généralement de RPC2 ou de [chemin vers ruTorrent]{url2} lors de l'utilisation de ruTorrent.",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Ajout arrêté",
|
||||
"DownloadClientSettingsAddPaused": "Ajout en pause",
|
||||
"DownloadClientSettingsDefaultCategoryHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée.",
|
||||
"DownloadClientSettingsDestinationHelpText": "Spécifie manuellement la destination du téléchargement, laisser vide pour utiliser la destination par défaut",
|
||||
"IndexerGazelleGamesSettingsSearchGroupNames": "Recherche de noms de groupes",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.",
|
||||
"IndexerHDBitsSettingsUseFilenames": "Utiliser les noms de fichiers",
|
||||
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
|
||||
"IndexerSettingsApiPath": "Chemin d'accès à l'API",
|
||||
"IndexerSettingsAppsMinimumSeedersHelpText": "Nombre minimum de seeders requis par les applications pour que l'indexeur s'en saisisse, vide est la valeur par défaut du profil Sync",
|
||||
"IndexerSettingsBaseUrl": "Url de base",
|
||||
"IndexerSettingsBaseUrlHelpText": "Sélectionnez l'url de base que {appName} utilisera pour les requêtes vers le site",
|
||||
"IndexerSettingsLimitsUnitHelpText": "L'unité de temps pour le comptage des limites par indexeur",
|
||||
"IndexerSettingsPackSeedTime": "Temps de seed du pack",
|
||||
"IndexerSettingsPasskey": "Clé de passage",
|
||||
"LabelIsRequired": "L'étiquette est requise",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "L'ID de l'application donné lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_id')",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Télécharger d'abord le premier et le dernier morceau (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "Utilisez une connexion sécurisée. Voir Options -> UI Web -> 'Utiliser HTTPS au lieu de HTTP' dans qBittorrent.",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension à utiliser pour les liens magnétiques, la valeur par défaut est '.magnet'",
|
||||
"TorrentBlackholeTorrentFolder": "Dossier Torrent",
|
||||
"UseSsl": "Utiliser SSL",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeter les hachages de torrents bloqués lors de la saisie",
|
||||
"DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement facultatif dans lequel placer les téléchargements. Laisser vide pour utiliser l'emplacement par défaut de rTorrent",
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Catégorie de secours par défaut si aucune catégorie mappée n'existe pour une version. L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie."
|
||||
}
|
||||
|
||||
@@ -297,7 +297,6 @@
|
||||
"Category": "Categoria",
|
||||
"ClearHistory": "Cancella cronologia",
|
||||
"ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?",
|
||||
"Discord": "Discord",
|
||||
"Donations": "Donazioni",
|
||||
"EnableRssHelpText": "Abilita feed RSS per l'Indicizzatore",
|
||||
"HomePage": "Pagina Iniziale",
|
||||
@@ -524,5 +523,11 @@
|
||||
"EditConnectionImplementation": "Aggiungi Connessione - {implementationName}",
|
||||
"EditDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}",
|
||||
"EditIndexerImplementation": "Aggiungi indicizzatore - {implementationName}",
|
||||
"EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}"
|
||||
"EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}",
|
||||
"AdvancedSettingsShownClickToHide": "Impostazioni avanzate mostrate, clicca per nasconderle",
|
||||
"AdvancedSettingsHiddenClickToShow": "Impostazioni avanzate nascoste, clicca per mostrarle",
|
||||
"AddApplication": "Aggiungi Applicazione",
|
||||
"AddCategory": "Aggiungi Categoria",
|
||||
"ActiveApps": "App Attive",
|
||||
"ActiveIndexers": "Indicizzatori Attivi"
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
"Torrents": "급류",
|
||||
"Type": "유형",
|
||||
"DeleteApplicationMessageText": "알림 '{0}'을(를) 삭제하시겠습니까?",
|
||||
"AuthenticationMethodHelpText": "{appName}에 액세스하려면 사용자 이름 및 암호 필요",
|
||||
"AuthenticationMethodHelpText": "{appName}에 접근하려면 사용자 이름과 암호가 필요합니다",
|
||||
"BackupFolderHelpText": "상대 경로는 {appName}의 AppData 디렉토리에 있습니다.",
|
||||
"Branch": "분기",
|
||||
"BranchUpdate": "{appName} 업데이트에 사용할 분기",
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"AnalyticsEnabledHelpText": "Stuur anonieme gebruiks- en foutinformatie naar de servers van {appName}. Dit omvat informatie over uw browser, welke {appName} WebUI pagina's u gebruikt, foutrapportage en OS en runtime versie. We zullen deze informatie gebruiken om prioriteiten te stellen voor functies en het verhelpen van fouten.",
|
||||
"ApiKey": "API-sleutel",
|
||||
"ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand",
|
||||
"AppDataDirectory": "AppData folder",
|
||||
"AppDataDirectory": "AppData map",
|
||||
"AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen",
|
||||
"AppProfileInUse": "App-profiel in gebruik",
|
||||
"AppProfileSelectHelpText": "App-profielen worden gebruikt om de instellingen voor RSS, Automatisch zoeken en Interactief zoeken bij applicatiesynchronisatie te beheren",
|
||||
@@ -47,7 +47,7 @@
|
||||
"Backup": "Veiligheidskopie",
|
||||
"BackupFolderHelpText": "Relatieve paden zullen t.o.v. de {appName} AppData map bekeken worden",
|
||||
"BackupIntervalHelpText": "Tussentijd voor automatische back-up",
|
||||
"BackupNow": "Nu backup nemen",
|
||||
"BackupNow": "Back-up nu maken",
|
||||
"BackupRetentionHelpText": "Automatische veiligheidskopieën ouder dan de retentie periode zullen worden opgeruimd",
|
||||
"Backups": "Veiligheidskopieën",
|
||||
"BeforeUpdate": "Voor Update",
|
||||
@@ -96,9 +96,9 @@
|
||||
"DeleteIndexerProxy": "Indexeerproxy verwijderen",
|
||||
"DeleteIndexerProxyMessageText": "Weet u zeker dat u de proxy '{0}' wilt verwijderen?",
|
||||
"DeleteNotification": "Verwijder Notificatie",
|
||||
"DeleteNotificationMessageText": "Bent u zeker dat u de notificatie '{0}' wilt verwijderen?",
|
||||
"DeleteNotificationMessageText": "Weet je zeker dat je de notificatie ‘{name}’ wil verwijderen?",
|
||||
"DeleteTag": "Verwijder Tag",
|
||||
"DeleteTagMessageText": "Bent u zeker dat u de tag '{0}' wilt verwijderen?",
|
||||
"DeleteTagMessageText": "Weet je zeker dat je de tag '{label}' wil verwijderen?",
|
||||
"Description": "Beschrijving",
|
||||
"Details": "Details",
|
||||
"DevelopmentSettings": "Ontwikkelingsinstellingen",
|
||||
@@ -116,11 +116,11 @@
|
||||
"Edit": "Bewerk",
|
||||
"EditIndexer": "Bewerk Indexeerder",
|
||||
"EditSyncProfile": "Synchronisatieprofiel toevoegen",
|
||||
"Enable": "Activeer",
|
||||
"EnableAutomaticSearch": "Activeer Automatisch Zoeken",
|
||||
"Enable": "Inschakelen",
|
||||
"EnableAutomaticSearch": "Schakel automatisch zoeken in",
|
||||
"EnableAutomaticSearchHelpText": "Zal worden gebruikt wanneer automatische zoekopdrachten worden uitgevoerd via de gebruikersinterface of door {appName}",
|
||||
"EnableIndexer": "Indexer inschakelen",
|
||||
"EnableInteractiveSearch": "Activeer Interactief Zoeken",
|
||||
"EnableInteractiveSearch": "Schakel interactief zoeken in",
|
||||
"EnableInteractiveSearchHelpText": "Zal worden gebruikt wanneer interactief zoeken wordt gebruikt",
|
||||
"EnableRss": "RSS inschakelen",
|
||||
"EnableRssHelpText": "Rss-feed voor Indexer inschakelen",
|
||||
@@ -402,7 +402,7 @@
|
||||
"UpdateCheckStartupNotWritableMessage": "Kan de update niet installeren omdat de map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Kan de update niet installeren omdat de map '{0}' zich in een 'App Translocation' map bevindt.",
|
||||
"UpdateCheckUINotWritableMessage": "Kan de update niet installeren omdat de UI map '{0}' niet schrijfbaar is voor de gebruiker '{1}'.",
|
||||
"UpdateMechanismHelpText": "Gebruik het ingebouwde updatemechanisme of een extern script",
|
||||
"UpdateMechanismHelpText": "Gebruik de ingebouwde updater van {appName} of een script",
|
||||
"UpdateScriptPathHelpText": "Pad naar een aangepast script dat een uitgepakt updatepakket accepteert en de rest van het updateproces afhandelt",
|
||||
"Updates": "Updates",
|
||||
"Uptime": "Bedrijfstijd",
|
||||
@@ -483,5 +483,6 @@
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in",
|
||||
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen.",
|
||||
"Episode": "aflevering",
|
||||
"CountApplicationsSelected": "{count} Collectie(s) geselecteerd"
|
||||
"CountApplicationsSelected": "{count} Collectie(s) geselecteerd",
|
||||
"BlackholeFolderHelpText": "De map waarin {appName} het {extension} bestand opslaat"
|
||||
}
|
||||
|
||||
@@ -420,7 +420,7 @@
|
||||
"ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas",
|
||||
"DeleteSelectedDownloadClients": "Eliminar cliente de transferências",
|
||||
"DeleteSelectedApplicationsMessageText": "Tem a certeza que quer eliminar as {count} aplicações seleccionadas?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Tem a certeza que quer eliminar os {count} clientes de transferência seleccionados?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Tem a certeza de que pretende eliminar o(s) cliente(s) de {count} transferência selecionado(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "Tem a certeza que quer eliminar os {count} indexadores seleccionados?",
|
||||
"DownloadClientPriorityHelpText": "Priorizar múltiplos clientes de transferências. Utilizaremos round robin para clientes com a mesma prioridade.",
|
||||
"More": "Mais",
|
||||
@@ -433,8 +433,8 @@
|
||||
"Track": "Rastreio",
|
||||
"UpdateAvailable": "Nova atualização disponível",
|
||||
"Label": "Rótulo",
|
||||
"ConnectionLostReconnect": "O Radarr tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.",
|
||||
"ConnectionLostToBackend": "O Radarr perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"ConnectionLostReconnect": "O {appName} tentará ligar-se automaticamente, ou você pode clicar em Recarregar abaixo.",
|
||||
"ConnectionLostToBackend": "O {appName} perdeu a ligação com o back-end e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"WhatsNew": "O que há de novo?",
|
||||
"RecentChanges": "Mudanças recentes",
|
||||
"minutes": "Minutos",
|
||||
|
||||
@@ -739,5 +739,10 @@
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashes": "Rejeitar Hashes de Torrent Bloqueados Durante a Captura",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.",
|
||||
"CustomFilter": "Filtro Personalizado",
|
||||
"LabelIsRequired": "Rótulo é requerido"
|
||||
"LabelIsRequired": "Rótulo é requerido",
|
||||
"ProwlarrDownloadClientsInAppOnlyAlert": "Os clientes de download destinam-se apenas a pesquisas no aplicativo {appName} e não sincronizam com aplicativos. Não há planos para adicionar tal funcionalidade.",
|
||||
"ProwlarrDownloadClientsAlert": "Se você pretende fazer pesquisas diretamente em {appName}, você precisa adicionar Clientes de Download. Caso contrário, você não precisa adicioná-los aqui. Para pesquisas em seus aplicativos, os clientes de download configurados são usados.",
|
||||
"Menu": "Menu",
|
||||
"Mixed": "Misturado",
|
||||
"Donate": "Doar"
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"DeleteBackupMessageText": "Ви впевнені, що хочете видалити резервну копію '{0}'?",
|
||||
"DeleteDownloadClient": "Видалити клієнт завантаження",
|
||||
"DeleteDownloadClientMessageText": "Ви впевнені, що хочете видалити клієнт завантаження '{0}'?",
|
||||
"Authentication": "Аутентифікація",
|
||||
"Authentication": "Автентифікація",
|
||||
"Automatic": "Автоматичний",
|
||||
"AutomaticSearch": "Автоматичний пошук",
|
||||
"Backup": "Резервне копіювання",
|
||||
@@ -344,7 +344,7 @@
|
||||
"DeleteSelectedApplicationsMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||
"DeleteSelectedDownloadClients": "Видалити клієнт завантаження",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Як застосувати теги до вибраних фільмів",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Як застосувати теги до вибраних індексаторів",
|
||||
"ApplyTagsHelpTextRemove": "Видалити: видалити введені теги",
|
||||
"DeleteSelectedIndexersMessageText": "Ви впевнені, що хочете видалити тег {0} ?",
|
||||
"DownloadClientPriorityHelpText": "Надайте пріоритет кільком клієнтам завантаження. Круговий алгоритм використовується для клієнтів з таким же пріоритетом.",
|
||||
@@ -384,5 +384,9 @@
|
||||
"CountApplicationsSelected": "Вибрано колекцій: {0}",
|
||||
"Applications": "Додатки",
|
||||
"Categories": "Категорії",
|
||||
"EditDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}"
|
||||
"EditDownloadClientImplementation": "Додати клієнт завантаження - {implementationName}",
|
||||
"ApplyChanges": "Застосувати зміни",
|
||||
"AuthenticationMethod": "Метод автентифікації",
|
||||
"AuthenticationMethodHelpTextWarning": "Виберіть дійсний метод автентифікації",
|
||||
"AppUpdated": "{appName} Оновлено"
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<PackageReference Include="System.Text.Json" Version="6.0.9" />
|
||||
<PackageReference Include="MonoTorrent" Version="2.0.7" />
|
||||
<PackageReference Include="YamlDotNet" Version="13.1.1" />
|
||||
<PackageReference Include="AngleSharp" Version="1.0.6" />
|
||||
<PackageReference Include="AngleSharp" Version="1.1.2" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NzbDrone.Common\Prowlarr.Common.csproj" />
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.5" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user