mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-13 20:44:52 -04:00
Compare commits
36 Commits
v4.6.3.751
...
v4.7.0.758
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8fd4e41c85 | ||
|
|
8984fd735b | ||
|
|
3321123043 | ||
|
|
23a13b5c23 | ||
|
|
304a07e23f | ||
|
|
1e0ec4aefb | ||
|
|
5c46c75ce7 | ||
|
|
1c26dd4aca | ||
|
|
6fae00f51c | ||
|
|
653ef0a501 | ||
|
|
e606ff05a4 | ||
|
|
dd3ac26604 | ||
|
|
122d0056ea | ||
|
|
fe41aada06 | ||
|
|
bd1844030d | ||
|
|
148ee5983d | ||
|
|
372d15ecf3 | ||
|
|
b95431500d | ||
|
|
3da72f54ef | ||
|
|
7cfff20cad | ||
|
|
d3895dec8f | ||
|
|
690bab3264 | ||
|
|
986128e100 | ||
|
|
dda0885f91 | ||
|
|
7e218a886d | ||
|
|
77cde138dc | ||
|
|
239109e3dd | ||
|
|
4804eb0769 | ||
|
|
60a55dfdac | ||
|
|
cd82865303 | ||
|
|
439adb4ac6 | ||
|
|
fd0ff78791 | ||
|
|
cbae355402 | ||
|
|
fed98a648f | ||
|
|
e1c5656cff | ||
|
|
e3f88e1711 |
4
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
4
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -76,7 +76,7 @@ body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
|
||||
description: Trace logs are generally required for all bug reports
|
||||
description: Trace logs are generally required for all bug reports and contain `trace`. Info logs are invalid for bug reports and do not contain `debug` nor `trace`
|
||||
options:
|
||||
- label: I have followed the steps in the wiki link above and provided the required trace logs that are relevant and show this issue.
|
||||
- label: I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
|
||||
required: true
|
||||
|
||||
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '4.6.3'
|
||||
majorVersion: '4.7.0'
|
||||
minorVersion: $[counter('minorVersion', 2000)]
|
||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||
@@ -363,7 +363,7 @@ stages:
|
||||
- bash: |
|
||||
echo "Uploading source maps to sentry"
|
||||
curl -sL https://sentry.io/get-cli/ | bash
|
||||
RELEASENAME="${RADARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
|
||||
RELEASENAME="Radarr@${RADARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
|
||||
sentry-cli releases new --finalize -p radarr -p radarr-ui -p radarr-update "${RELEASENAME}"
|
||||
sentry-cli releases -p radarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
|
||||
sentry-cli releases set-commits --auto "${RELEASENAME}"
|
||||
|
||||
@@ -28,7 +28,7 @@ function createMapStateToProps() {
|
||||
qualityProfileId: collection.qualityProfileId,
|
||||
minimumAvailability: collection.minimumAvailability,
|
||||
searchForMovie: collection.searchOnAdd,
|
||||
tags: []
|
||||
tags: collection.tags || []
|
||||
};
|
||||
|
||||
const {
|
||||
|
||||
@@ -2,17 +2,12 @@ import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import createAllMoviesSelector from 'Store/Selectors/createAllMoviesSelector';
|
||||
import createCollectionSelector from 'Store/Selectors/createCollectionSelector';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createCollectionSelector(),
|
||||
createAllMoviesSelector(),
|
||||
(
|
||||
collection,
|
||||
allMovies
|
||||
) => {
|
||||
(collection) => {
|
||||
// If a movie is deleted this selector may fire before the parent
|
||||
// selecors, which will result in an undefined movie, if that happens
|
||||
// we want to return early here and again in the render function to avoid
|
||||
@@ -22,21 +17,11 @@ function createMapStateToProps() {
|
||||
return {};
|
||||
}
|
||||
|
||||
let allGenres = [];
|
||||
let libraryMovies = 0;
|
||||
|
||||
collection.movies.forEach((movie) => {
|
||||
allGenres = allGenres.concat(movie.genres);
|
||||
|
||||
if (allMovies.find((libraryMovie) => libraryMovie.tmdbId === movie.tmdbId)) {
|
||||
libraryMovies++;
|
||||
}
|
||||
});
|
||||
const allGenres = collection.movies.flatMap((movie) => movie.genres);
|
||||
|
||||
return {
|
||||
...collection,
|
||||
genres: Array.from(new Set(allGenres)).slice(0, 3),
|
||||
missingMovies: collection.movies.length - libraryMovies
|
||||
genres: Array.from(new Set(allGenres)).slice(0, 3)
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
@@ -50,6 +50,7 @@ class EditCollectionModalContent extends Component {
|
||||
minimumAvailability,
|
||||
// Id,
|
||||
rootFolderPath,
|
||||
tags,
|
||||
searchOnAdd
|
||||
} = item;
|
||||
|
||||
@@ -126,6 +127,17 @@ class EditCollectionModalContent extends Component {
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('Tags')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
onChange={onInputChange}
|
||||
{...tags}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SearchOnAdd')}</FormLabel>
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ function createMapStateToProps() {
|
||||
qualityProfileId: collection.qualityProfileId,
|
||||
minimumAvailability: collection.minimumAvailability,
|
||||
rootFolderPath: collection.rootFolderPath,
|
||||
tags: collection.tags,
|
||||
searchOnAdd: collection.searchOnAdd
|
||||
};
|
||||
|
||||
|
||||
@@ -28,6 +28,14 @@ function CollectionSortMenu(props) {
|
||||
>
|
||||
{translate('Title')}
|
||||
</SortMenuItem>
|
||||
<SortMenuItem
|
||||
name="missingMovies"
|
||||
sortKey={sortKey}
|
||||
sortDirection={sortDirection}
|
||||
onPress={onSortSelect}
|
||||
>
|
||||
{translate('Missing')}
|
||||
</SortMenuItem>
|
||||
</MenuContent>
|
||||
</SortMenu>
|
||||
);
|
||||
|
||||
@@ -580,7 +580,7 @@ EnhancedSelectInput.propTypes = {
|
||||
className: PropTypes.string,
|
||||
disabledClassName: PropTypes.string,
|
||||
name: PropTypes.string.isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.number)]).isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).isRequired,
|
||||
values: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
isDisabled: PropTypes.bool.isRequired,
|
||||
isFetching: PropTypes.bool.isRequired,
|
||||
|
||||
@@ -303,6 +303,7 @@ class MovieDetails extends Component {
|
||||
selectedTabIndex
|
||||
} = this.state;
|
||||
|
||||
const fanartUrl = getFanartUrl(images);
|
||||
const marqueeWidth = isSmallScreen ? titleWidth : (titleWidth - 150);
|
||||
|
||||
return (
|
||||
@@ -361,9 +362,11 @@ class MovieDetails extends Component {
|
||||
<div className={styles.header}>
|
||||
<div
|
||||
className={styles.backdrop}
|
||||
style={{
|
||||
backgroundImage: `url(${getFanartUrl(images)})`
|
||||
}}
|
||||
style={
|
||||
fanartUrl ?
|
||||
{ backgroundImage: `url(${fanartUrl})` } :
|
||||
null
|
||||
}
|
||||
>
|
||||
<div className={styles.backdropOverlay} />
|
||||
</div>
|
||||
|
||||
@@ -203,7 +203,7 @@ function EditMoviesModalContent(props: EditMoviesModalContentProps) {
|
||||
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
|
||||
|
||||
<Button onPress={onSavePressWrapper}>
|
||||
{translate('Apply Changes')}
|
||||
{translate('ApplyChanges')}
|
||||
</Button>
|
||||
</div>
|
||||
</ModalFooter>
|
||||
|
||||
@@ -170,7 +170,7 @@ function ManageDownloadClientsEditModalContent(
|
||||
<div>
|
||||
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
|
||||
|
||||
<Button onPress={save}>{translate('Apply Changes')}</Button>
|
||||
<Button onPress={save}>{translate('ApplyChanges')}</Button>
|
||||
</div>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
||||
@@ -3,3 +3,9 @@
|
||||
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.message {
|
||||
composes: alert from '~Components/Alert.css';
|
||||
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'deleteButton': string;
|
||||
'message': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
|
||||
@@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import { inputTypes, kinds } from 'Helpers/Props';
|
||||
import formatShortTimeSpan from 'Utilities/Date/formatShortTimeSpan';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './EditImportListModalContent.css';
|
||||
|
||||
@@ -42,6 +43,7 @@ function EditImportListModalContent(props) {
|
||||
name,
|
||||
enabled,
|
||||
enableAuto,
|
||||
minRefreshInterval,
|
||||
monitor,
|
||||
minimumAvailability,
|
||||
qualityProfileId,
|
||||
@@ -85,6 +87,14 @@ function EditImportListModalContent(props) {
|
||||
{message.value.message}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
<Alert
|
||||
kind={kinds.INFO}
|
||||
className={styles.message}
|
||||
>
|
||||
{translate('ListWillRefreshEveryInterp', [formatShortTimeSpan(minRefreshInterval.value)])}
|
||||
</Alert>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('Name')}</FormLabel>
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import Card from 'Components/Card';
|
||||
import Label from 'Components/Label';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import formatShortTimeSpan from 'Utilities/Date/formatShortTimeSpan';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import EditImportListModalConnector from './EditImportListModalConnector';
|
||||
import styles from './ImportList.css';
|
||||
@@ -56,7 +57,8 @@ class ImportList extends Component {
|
||||
id,
|
||||
name,
|
||||
enabled,
|
||||
enableAuto
|
||||
enableAuto,
|
||||
minRefreshInterval
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
@@ -96,6 +98,12 @@ class ImportList extends Component {
|
||||
}
|
||||
</div>
|
||||
|
||||
<div className={styles.enabled}>
|
||||
<Label kind={kinds.INFO} title='List Refresh Interval'>
|
||||
{`${translate('Refresh')}: ${formatShortTimeSpan(minRefreshInterval)}`}
|
||||
</Label>
|
||||
</div>
|
||||
|
||||
<EditImportListModalConnector
|
||||
id={id}
|
||||
isOpen={this.state.isEditImportListModalOpen}
|
||||
@@ -122,6 +130,7 @@ ImportList.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
enabled: PropTypes.bool.isRequired,
|
||||
enableAuto: PropTypes.bool.isRequired,
|
||||
minRefreshInterval: PropTypes.string.isRequired,
|
||||
onConfirmDeleteImportList: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -46,23 +46,6 @@ function ImportListOptions(props) {
|
||||
{
|
||||
hasSettings && !isFetching && !error &&
|
||||
<Form>
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('ListUpdateInterval')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.NUMBER}
|
||||
name="importListSyncInterval"
|
||||
min={6}
|
||||
unit="hours"
|
||||
helpText={translate('ImportListSyncIntervalHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.importListSyncInterval}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
|
||||
@@ -27,9 +27,9 @@ interface ManageIndexersEditModalContentProps {
|
||||
const NO_CHANGE = 'noChange';
|
||||
|
||||
const enableOptions = [
|
||||
{ key: NO_CHANGE, value: 'No Change', disabled: true },
|
||||
{ key: 'enabled', value: 'Enabled' },
|
||||
{ key: 'disabled', value: 'Disabled' },
|
||||
{ key: NO_CHANGE, value: translate('NoChange'), disabled: true },
|
||||
{ key: 'enabled', value: translate('Enabled') },
|
||||
{ key: 'disabled', value: translate('Disabled') },
|
||||
];
|
||||
|
||||
function ManageIndexersEditModalContent(
|
||||
@@ -97,7 +97,7 @@ function ManageIndexersEditModalContent(
|
||||
setPriority(value);
|
||||
break;
|
||||
default:
|
||||
console.warn('EditIndexersModalContent Unknown Input');
|
||||
console.warn(`EditIndexersModalContent Unknown Input: '${name}'`);
|
||||
}
|
||||
},
|
||||
[]
|
||||
@@ -111,7 +111,7 @@ function ManageIndexersEditModalContent(
|
||||
|
||||
<ModalBody>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('EnableRss')}</FormLabel>
|
||||
<FormLabel>{translate('EnableRSS')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -162,13 +162,13 @@ function ManageIndexersEditModalContent(
|
||||
|
||||
<ModalFooter className={styles.modalFooter}>
|
||||
<div className={styles.selected}>
|
||||
{translate('{count} indexers selected', { count: selectedCount })}
|
||||
{translate('CountIndexersSelected', [selectedCount])}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
|
||||
|
||||
<Button onPress={save}>{translate('Apply Changes')}</Button>
|
||||
<Button onPress={save}>{translate('ApplyChanges')}</Button>
|
||||
</div>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
||||
@@ -20,6 +20,7 @@ import {
|
||||
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
||||
import { SelectStateInputProps } from 'typings/props';
|
||||
import getErrorMessage from 'Utilities/Object/getErrorMessage';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import getSelectedIds from 'Utilities/Table/getSelectedIds';
|
||||
import ManageIndexersEditModal from './Edit/ManageIndexersEditModal';
|
||||
import ManageIndexersModalRow from './ManageIndexersModalRow';
|
||||
@@ -34,43 +35,43 @@ type OnSelectedChangeCallback = React.ComponentProps<
|
||||
const COLUMNS = [
|
||||
{
|
||||
name: 'name',
|
||||
label: 'Name',
|
||||
label: translate('Name'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'implementation',
|
||||
label: 'Implementation',
|
||||
label: translate('Implementation'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableRss',
|
||||
label: 'Enable RSS',
|
||||
label: translate('EnableRSS'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableAutomaticSearch',
|
||||
label: 'Enable Automatic Search',
|
||||
label: translate('EnableAutomaticSearch'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableInteractiveSearch',
|
||||
label: 'Enable Interactive Search',
|
||||
label: translate('EnableInteractiveSearch'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'priority',
|
||||
label: 'Priority',
|
||||
label: translate('Priority'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'tags',
|
||||
label: 'Tags',
|
||||
label: translate('Tags'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
@@ -189,12 +190,12 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
|
||||
[items, setSelectState]
|
||||
);
|
||||
|
||||
const errorMessage = getErrorMessage(error, 'Unable to load import lists.');
|
||||
const errorMessage = getErrorMessage(error, 'Unable to load indexers.');
|
||||
const anySelected = selectedCount > 0;
|
||||
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>Manage Import Lists</ModalHeader>
|
||||
<ModalHeader>{translate('ManageIndexers')}</ModalHeader>
|
||||
<ModalBody>
|
||||
{isFetching ? <LoadingIndicator /> : null}
|
||||
|
||||
@@ -234,7 +235,7 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
|
||||
isDisabled={!anySelected}
|
||||
onPress={onDeletePress}
|
||||
>
|
||||
Delete
|
||||
{translate('Delete')}
|
||||
</SpinnerButton>
|
||||
|
||||
<SpinnerButton
|
||||
@@ -242,7 +243,7 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
|
||||
isDisabled={!anySelected}
|
||||
onPress={onEditPress}
|
||||
>
|
||||
Edit
|
||||
{translate('Edit')}
|
||||
</SpinnerButton>
|
||||
|
||||
<SpinnerButton
|
||||
@@ -250,11 +251,11 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
|
||||
isDisabled={!anySelected}
|
||||
onPress={onTagsPress}
|
||||
>
|
||||
Set Tags
|
||||
{translate('SetTags')}
|
||||
</SpinnerButton>
|
||||
</div>
|
||||
|
||||
<Button onPress={onModalClose}>Close</Button>
|
||||
<Button onPress={onModalClose}>{translate('Close')}</Button>
|
||||
</ModalFooter>
|
||||
|
||||
<ManageIndexersEditModal
|
||||
@@ -274,9 +275,9 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
|
||||
<ConfirmModal
|
||||
isOpen={isDeleteModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title="Delete Import List(s)"
|
||||
message={`Are you sure you want to delete ${selectedIds.length} import list(s)?`}
|
||||
confirmLabel="Delete"
|
||||
title={translate('DeleteIndexers')}
|
||||
message={translate('DeleteIndexersMessageText', [selectedIds.length])}
|
||||
confirmLabel={translate('Delete')}
|
||||
onConfirm={onConfirmDelete}
|
||||
onCancel={onDeleteModalClose}
|
||||
/>
|
||||
|
||||
@@ -5,6 +5,7 @@ import Column from 'Components/Table/Column';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import TagListConnector from 'Components/TagListConnector';
|
||||
import { SelectStateInputProps } from 'typings/props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ManageIndexersModalRow.css';
|
||||
|
||||
interface ManageIndexersModalRowProps {
|
||||
@@ -59,15 +60,15 @@ function ManageIndexersModalRow(props: ManageIndexersModalRowProps) {
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.enableRss}>
|
||||
{enableRss ? 'Yes' : 'No'}
|
||||
{enableRss ? translate('Yes') : translate('No')}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.enableAutomaticSearch}>
|
||||
{enableAutomaticSearch ? 'Yes' : 'No'}
|
||||
{enableAutomaticSearch ? translate('Yes') : translate('No')}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.enableInteractiveSearch}>
|
||||
{enableInteractiveSearch ? 'Yes' : 'No'}
|
||||
{enableInteractiveSearch ? translate('Yes') : translate('No')}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.priority}>{priority}</TableRowCell>
|
||||
|
||||
@@ -17,6 +17,7 @@ import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import { inputTypes, kinds, sizes } from 'Helpers/Props';
|
||||
import createTagsSelector from 'Store/Selectors/createTagsSelector';
|
||||
import Indexer from 'typings/Indexer';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './TagsModalContent.css';
|
||||
|
||||
interface TagsModalContentProps {
|
||||
@@ -69,19 +70,19 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
}, [tags, applyTags, onApplyTagsPress]);
|
||||
|
||||
const applyTagsOptions = [
|
||||
{ key: 'add', value: 'Add' },
|
||||
{ key: 'remove', value: 'Remove' },
|
||||
{ key: 'replace', value: 'Replace' },
|
||||
{ key: 'add', value: translate('Add') },
|
||||
{ key: 'remove', value: translate('Remove') },
|
||||
{ key: 'replace', value: translate('Replace') },
|
||||
];
|
||||
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>Tags</ModalHeader>
|
||||
<ModalHeader>{translate('Tags')}</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
<Form>
|
||||
<FormGroup>
|
||||
<FormLabel>Tags</FormLabel>
|
||||
<FormLabel>{translate('Tags')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
@@ -92,7 +93,7 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>Apply Tags</FormLabel>
|
||||
<FormLabel>{translate('ApplyTags')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -110,7 +111,7 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>Result</FormLabel>
|
||||
<FormLabel>{translate('Result')}</FormLabel>
|
||||
|
||||
<div className={styles.result}>
|
||||
{seriesTags.map((id) => {
|
||||
@@ -127,7 +128,11 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
return (
|
||||
<Label
|
||||
key={tag.id}
|
||||
title={removeTag ? 'Removing tag' : 'Existing tag'}
|
||||
title={
|
||||
removeTag
|
||||
? translate('RemovingTag')
|
||||
: translate('ExistingTag')
|
||||
}
|
||||
kind={removeTag ? kinds.INVERSE : kinds.INFO}
|
||||
size={sizes.LARGE}
|
||||
>
|
||||
@@ -151,7 +156,7 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
return (
|
||||
<Label
|
||||
key={tag.id}
|
||||
title={'Adding tag'}
|
||||
title={translate('AddingTag')}
|
||||
kind={kinds.SUCCESS}
|
||||
size={sizes.LARGE}
|
||||
>
|
||||
@@ -165,10 +170,10 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<Button onPress={onModalClose}>Cancel</Button>
|
||||
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
|
||||
|
||||
<Button kind={kinds.PRIMARY} onPress={onApplyPress}>
|
||||
Apply
|
||||
{translate('Apply')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import PageSectionContent from 'Components/Page/PageSectionContent';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import TagConnector from './TagConnector';
|
||||
import styles from './Tags.css';
|
||||
@@ -14,9 +16,9 @@ function Tags(props) {
|
||||
|
||||
if (!items.length) {
|
||||
return (
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('NoTagsHaveBeenAddedYet')}
|
||||
</div>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
import { createAction } from 'redux-actions';
|
||||
import { batchActions } from 'redux-batched-actions';
|
||||
import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, sortDirections } from 'Helpers/Props';
|
||||
import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, filterTypes, sortDirections } from 'Helpers/Props';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import sortByName from 'Utilities/Array/sortByName';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
@@ -60,8 +60,30 @@ export const defaultState = {
|
||||
filters: [
|
||||
{
|
||||
key: 'all',
|
||||
label: 'All',
|
||||
label: translate('All'),
|
||||
filters: []
|
||||
},
|
||||
{
|
||||
key: 'missing',
|
||||
label: translate('Missing'),
|
||||
filters: [
|
||||
{
|
||||
key: 'missingMovies',
|
||||
value: 0,
|
||||
type: filterTypes.GREATER_THAN
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
key: 'complete',
|
||||
label: translate('Complete'),
|
||||
filters: [
|
||||
{
|
||||
key: 'missingMovies',
|
||||
value: 0,
|
||||
type: filterTypes.EQUAL
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import FilterMenu from 'Components/Menu/FilterMenu';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
@@ -11,7 +12,7 @@ import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||
import TablePager from 'Components/Table/TablePager';
|
||||
import { align, icons } from 'Helpers/Props';
|
||||
import { align, icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import LogsTableRow from './LogsTableRow';
|
||||
|
||||
@@ -82,9 +83,9 @@ function LogsTable(props) {
|
||||
|
||||
{
|
||||
isPopulated && !error && !items.length &&
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('NoEventsFound')}
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
|
||||
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
|
||||
import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import LogsNavMenu from '../LogsNavMenu';
|
||||
import LogFilesTableRow from './LogFilesTableRow';
|
||||
@@ -118,9 +118,9 @@ class LogFiles extends Component {
|
||||
|
||||
{
|
||||
!isFetching && !items.length &&
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('NoLogFiles')}
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
</PageContentBody>
|
||||
</PageContent>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Icon from 'Components/Icon';
|
||||
import Label from 'Components/Label';
|
||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||
@@ -61,9 +62,9 @@ class Updates extends Component {
|
||||
|
||||
{
|
||||
noUpdates &&
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
{translate('NoUpdatesAreAvailable')}
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
25
frontend/src/Utilities/Date/formatShortTimeSpan.js
Normal file
25
frontend/src/Utilities/Date/formatShortTimeSpan.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import moment from 'moment';
|
||||
|
||||
function formatShortTimeSpan(timeSpan) {
|
||||
if (!timeSpan) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const duration = moment.duration(timeSpan);
|
||||
|
||||
const hours = Math.floor(duration.asHours());
|
||||
const minutes = Math.floor(duration.asMinutes());
|
||||
const seconds = Math.floor(duration.asSeconds());
|
||||
|
||||
if (hours > 0) {
|
||||
return `${hours} hour(s)`;
|
||||
}
|
||||
|
||||
if (minutes > 0) {
|
||||
return `${minutes} minute(s)`;
|
||||
}
|
||||
|
||||
return `${seconds} second(s)`;
|
||||
}
|
||||
|
||||
export default formatShortTimeSpan;
|
||||
@@ -6,8 +6,8 @@
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
|
||||
<!-- Chrome, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#3a3f51" />
|
||||
<!-- Chrome, Safari, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#595959" />
|
||||
<!-- Windows Phone -->
|
||||
<meta name="msapplication-navbutton-color" content="#3a3f51" />
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
|
||||
<!-- Chrome, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#464b51" />
|
||||
<!-- Chrome, Safari, Opera, and Firefox OS -->
|
||||
<meta name="theme-color" content="#595959" />
|
||||
<!-- Windows Phone -->
|
||||
<meta name="msapplication-navbutton-color" content="#464b51" />
|
||||
|
||||
|
||||
@@ -158,6 +158,25 @@ namespace NzbDrone.Common.Test
|
||||
path.GetParentPath().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\mydir", "Test")]
|
||||
[TestCase(@"C:\Test\", @"C:\")]
|
||||
[TestCase(@"C:\", null)]
|
||||
[TestCase(@"\\server\share", null)]
|
||||
[TestCase(@"\\server\share\test", @"\\server\share")]
|
||||
public void path_should_return_parent_name_windows(string path, string parentPath)
|
||||
{
|
||||
WindowsOnly();
|
||||
path.GetParentName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"/", null)]
|
||||
[TestCase(@"/test", "/")]
|
||||
public void path_should_return_parent_name_mono(string path, string parentPath)
|
||||
{
|
||||
PosixOnly();
|
||||
path.GetParentName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void path_should_return_parent_for_oversized_path()
|
||||
{
|
||||
|
||||
@@ -87,9 +87,7 @@ namespace NzbDrone.Common.Extensions
|
||||
|
||||
public static string GetParentPath(this string childPath)
|
||||
{
|
||||
var cleanPath = OsInfo.IsWindows
|
||||
? PARENT_PATH_END_SLASH_REGEX.Replace(childPath, "")
|
||||
: childPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||
var cleanPath = childPath.GetCleanPath();
|
||||
|
||||
if (cleanPath.IsNullOrWhiteSpace())
|
||||
{
|
||||
@@ -99,6 +97,18 @@ namespace NzbDrone.Common.Extensions
|
||||
return Directory.GetParent(cleanPath)?.FullName;
|
||||
}
|
||||
|
||||
public static string GetParentName(this string childPath)
|
||||
{
|
||||
var cleanPath = childPath.GetCleanPath();
|
||||
|
||||
if (cleanPath.IsNullOrWhiteSpace())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return Directory.GetParent(cleanPath)?.Name;
|
||||
}
|
||||
|
||||
public static string GetCleanPath(this string path)
|
||||
{
|
||||
var cleanPath = OsInfo.IsWindows
|
||||
|
||||
@@ -73,7 +73,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
else
|
||||
{
|
||||
dsn = RuntimeInfo.IsProduction
|
||||
? "https://26668106d708406b9ddf5a2bda34fcbb@sentry.servarr.com/9"
|
||||
? "https://40f1288c1b4d495cbafdb5c89f7f01be@sentry.servarr.com/9"
|
||||
: "https://998b4673d4c849ccb5277b5966ed5bc2@sentry.servarr.com/10";
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
|
||||
o.Dsn = dsn;
|
||||
o.AttachStacktrace = true;
|
||||
o.MaxBreadcrumbs = 200;
|
||||
o.Release = BuildInfo.Release;
|
||||
o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}";
|
||||
o.BeforeSend = x => SentryCleanser.CleanseEvent(x);
|
||||
o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x);
|
||||
o.Environment = BuildInfo.Branch;
|
||||
|
||||
@@ -121,6 +121,11 @@ namespace NzbDrone.Common.Serializer
|
||||
return JsonConvert.SerializeObject(obj, SerializerSettings);
|
||||
}
|
||||
|
||||
public static string ToJson(this object obj, Formatting formatting)
|
||||
{
|
||||
return JsonConvert.SerializeObject(obj, formatting, SerializerSettings);
|
||||
}
|
||||
|
||||
public static void Serialize<TModel>(TModel model, TextWriter outputStream)
|
||||
{
|
||||
var jsonTextWriter = new JsonTextWriter(outputStream);
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Dapper;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Datastore.Migration;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.Datastore.Migration
|
||||
{
|
||||
[TestFixture]
|
||||
public class remove_invalid_roksbox_metadata_imagesFixture : MigrationTest<remove_invalid_roksbox_metadata_images>
|
||||
{
|
||||
[Test]
|
||||
public void should_remove_incorrect_roksbox_metadata_images()
|
||||
{
|
||||
var db = WithDapperMigrationTestDb(c =>
|
||||
{
|
||||
c.Insert.IntoTable("MetadataFiles").Row(new
|
||||
{
|
||||
MovieId = 1,
|
||||
Consumer = "RoksboxMetadata",
|
||||
Type = 5,
|
||||
RelativePath = @"metadata\Movie Title (2023).jpg",
|
||||
LastUpdated = "2023-01-21 00:00:00.000",
|
||||
Added = "2023-01-21 00:00:00.000",
|
||||
MovieFileId = 1,
|
||||
Extension = ".jpg"
|
||||
});
|
||||
|
||||
c.Insert.IntoTable("MetadataFiles").Row(new
|
||||
{
|
||||
MovieId = 1,
|
||||
Consumer = "RoksboxMetadata",
|
||||
Type = 5,
|
||||
RelativePath = @"Movie Title (2023).jpg",
|
||||
LastUpdated = "2023-01-21 00:00:00.000",
|
||||
MovieFileId = 1,
|
||||
Added = "2023-01-21 00:00:00.000",
|
||||
Extension = ".jpg"
|
||||
});
|
||||
});
|
||||
|
||||
var metadataFiles = db.Query<MetadataFile223>("SELECT * FROM \"MetadataFiles\"");
|
||||
|
||||
metadataFiles.Should().HaveCount(1);
|
||||
metadataFiles.First().RelativePath.Should().NotContain("metadata");
|
||||
}
|
||||
}
|
||||
|
||||
public class MetadataFile223
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int MovieId { get; set; }
|
||||
public int? MovieFileId { get; set; }
|
||||
public string RelativePath { get; set; }
|
||||
public DateTime Added { get; set; }
|
||||
public DateTime LastUpdated { get; set; }
|
||||
public string Extension { get; set; }
|
||||
public string Hash { get; set; }
|
||||
public string Consumer { get; set; }
|
||||
public int Type { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
_blockedLists = new List<ImportListStatus>();
|
||||
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.Enabled())
|
||||
.Setup(v => v.Enabled(It.IsAny<bool>()))
|
||||
.Returns(_importLists);
|
||||
|
||||
Mocker.GetMock<IImportListStatusService>()
|
||||
@@ -183,7 +183,7 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
var listResult = Subject.Fetch();
|
||||
listResult.AnyFailure.Should().BeFalse();
|
||||
listResult.Movies.Count.Should().Be(10);
|
||||
listResult.Movies.Count.Should().Be(5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
};
|
||||
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.Enabled())
|
||||
.Setup(v => v.Enabled(It.IsAny<bool>()))
|
||||
.Returns(_importLists);
|
||||
|
||||
Mocker.GetMock<IImportExclusionsService>()
|
||||
@@ -156,6 +156,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -179,6 +183,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -204,6 +212,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -224,6 +236,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -241,6 +257,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -267,6 +287,10 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
.Setup(v => v.GetAllMovies())
|
||||
.Returns(_existingMovies);
|
||||
|
||||
Mocker.GetMock<IImportListMovieService>()
|
||||
.Setup(v => v.GetAllListMovies())
|
||||
.Returns(_list1Movies);
|
||||
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IMovieService>()
|
||||
@@ -347,7 +371,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_add_duplicate_movies_from_seperate_lists()
|
||||
public void should_not_add_duplicate_movies_from_separate_lists()
|
||||
{
|
||||
_list2Movies.ForEach(m => m.ListId = 2);
|
||||
_importListFetch.Movies.ForEach(m => m.ListId = 1);
|
||||
@@ -384,7 +408,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IAddMovieService>()
|
||||
.Verify(v => v.AddMovies(It.Is<List<Movie>>(s => s.Count == 7 && !s.Any(m => m.TmdbId == _existingMovies[0].TmdbId)), true), Times.Once());
|
||||
.Verify(v => v.AddMovies(It.Is<List<Movie>>(s => s.Count == 7 && s.All(m => m.TmdbId != _existingMovies[0].TmdbId)), true), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -406,7 +430,7 @@ namespace NzbDrone.Core.Test.ImportList
|
||||
Subject.Execute(_commandAll);
|
||||
|
||||
Mocker.GetMock<IAddMovieService>()
|
||||
.Verify(v => v.AddMovies(It.Is<List<Movie>>(s => s.Count == 7 && !s.Any(m => m.TmdbId == _existingMovies[0].TmdbId)), true), Times.Once());
|
||||
.Verify(v => v.AddMovies(It.Is<List<Movie>>(s => s.Count == 7 && s.All(m => m.TmdbId != _existingMovies[0].TmdbId)), true), Times.Once());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -361,6 +361,7 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("The German 2021 Bluray AVC")]
|
||||
[TestCase("German.Only.Movie.2021.French.1080p.BluRay.AVC-UNTAVC")]
|
||||
[TestCase("Movie.Title.2008.US.Directors.Cut.UHD.BD66.Blu-ray")]
|
||||
[TestCase("Movie.2009.Blu.ray.AVC.DTS.HD.MA.5.1")]
|
||||
public void should_parse_brdisk_1080p_quality(string title)
|
||||
{
|
||||
ParseAndVerifyQuality(title, Source.BLURAY, false, Resolution.R1080p, Modifier.BRDISK);
|
||||
|
||||
@@ -116,13 +116,6 @@ namespace NzbDrone.Core.Configuration
|
||||
set { SetValue("AvailabilityDelay", value); }
|
||||
}
|
||||
|
||||
public int ImportListSyncInterval
|
||||
{
|
||||
get { return GetValueInt("ImportListSyncInterval", 24); }
|
||||
|
||||
set { SetValue("ImportListSyncInterval", value); }
|
||||
}
|
||||
|
||||
public string ListSyncLevel
|
||||
{
|
||||
get { return GetValue("ListSyncLevel", "disabled"); }
|
||||
|
||||
@@ -60,7 +60,6 @@ namespace NzbDrone.Core.Configuration
|
||||
bool AllowHardcodedSubs { get; set; }
|
||||
string WhitelistedHardcodedSubs { get; set; }
|
||||
|
||||
int ImportListSyncInterval { get; set; }
|
||||
string ListSyncLevel { get; set; }
|
||||
string ImportExclusions { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(223)]
|
||||
public class remove_invalid_roksbox_metadata_images : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
IfDatabase("sqlite").Execute.Sql("DELETE FROM \"MetadataFiles\" WHERE \"Consumer\" = 'RoksboxMetadata' AND \"Type\" = 5 AND (\"RelativePath\" LIKE 'metadata/%' OR \"RelativePath\" LIKE 'metadata\\%')");
|
||||
IfDatabase("postgresql").Execute.Sql("DELETE FROM \"MetadataFiles\" WHERE \"Consumer\" = 'RoksboxMetadata' AND \"Type\" = 5 AND (\"RelativePath\" LIKE 'metadata/%' OR \"RelativePath\" LIKE 'metadata\\\\%')");
|
||||
}
|
||||
}
|
||||
}
|
||||
18
src/NzbDrone.Core/Datastore/Migration/224_list_sync_time.cs
Normal file
18
src/NzbDrone.Core/Datastore/Migration/224_list_sync_time.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(224)]
|
||||
public class list_sync_time : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
Delete.Column("LastSyncListInfo").FromTable("ImportListStatus");
|
||||
|
||||
Alter.Table("ImportListStatus").AddColumn("LastInfoSync").AsDateTimeOffset().Nullable();
|
||||
|
||||
Delete.FromTable("Config").Row(new { Key = "importlistsyncinterval" });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(225)]
|
||||
public class add_tags_to_collections : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
Alter.Table("Collections").AddColumn("Tags").AsString().Nullable();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,6 +80,7 @@ namespace NzbDrone.Core.Datastore
|
||||
Mapper.Entity<ImportListDefinition>("ImportLists").RegisterModel()
|
||||
.Ignore(x => x.ImplementationName)
|
||||
.Ignore(i => i.ListType)
|
||||
.Ignore(i => i.MinRefreshInterval)
|
||||
.Ignore(i => i.Enable);
|
||||
|
||||
Mapper.Entity<NotificationDefinition>("Notifications").RegisterModel()
|
||||
|
||||
@@ -84,7 +84,8 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Roksbox
|
||||
|
||||
if (extension == ".jpg")
|
||||
{
|
||||
if (Path.GetFileNameWithoutExtension(filename).Equals(parentdir.Name, StringComparison.InvariantCultureIgnoreCase))
|
||||
if (Path.GetFileNameWithoutExtension(filename).Equals(parentdir.Name, StringComparison.InvariantCultureIgnoreCase) &&
|
||||
!path.GetParentName().Equals("metadata", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
metadata.Type = MetadataType.MovieImage;
|
||||
return metadata;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
@@ -10,6 +11,7 @@ namespace NzbDrone.Core.ImportLists.CouchPotato
|
||||
public override string Name => "CouchPotato";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Program;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromMinutes(30);
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -66,6 +66,15 @@ namespace NzbDrone.Core.ImportLists
|
||||
_logger.ProgressInfo("Syncing Movies for List: {0}", importList.Name);
|
||||
|
||||
var importListLocal = importList;
|
||||
|
||||
var importListStatus = _importListStatusService.GetLastSyncListInfo(importListLocal.Definition.Id);
|
||||
|
||||
if (importListStatus.HasValue && DateTime.UtcNow < importListStatus + importListLocal.MinRefreshInterval)
|
||||
{
|
||||
_logger.Trace("Skipping refresh of Import List {0} due to minimum refresh inverval", importListLocal.Definition.Name);
|
||||
continue;
|
||||
}
|
||||
|
||||
var blockedLists = _importListStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v);
|
||||
|
||||
if (blockedLists.TryGetValue(importList.Definition.Id, out var blockedListStatus))
|
||||
@@ -88,7 +97,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
if (!importListReports.AnyFailure)
|
||||
{
|
||||
var alreadyMapped = result.Movies.Where(x => importListReports.Movies.Any(r => r.TmdbId == x.TmdbId));
|
||||
var listMovies = MapMovieReports(importListReports.Movies.Where(x => !result.Movies.Any(r => r.TmdbId == x.TmdbId)).ToList()).Where(x => x.TmdbId > 0).ToList();
|
||||
var listMovies = MapMovieReports(importListReports.Movies.Where(x => result.Movies.All(r => r.TmdbId != x.TmdbId)).ToList()).Where(x => x.TmdbId > 0).ToList();
|
||||
|
||||
listMovies.AddRange(alreadyMapped);
|
||||
listMovies = listMovies.DistinctBy(x => x.TmdbId).ToList();
|
||||
@@ -99,6 +108,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -112,6 +123,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
Task.WaitAll(taskList.ToArray());
|
||||
|
||||
result.Movies = result.Movies.DistinctBy(r => new { r.TmdbId, r.ImdbId, r.Title }).ToList();
|
||||
|
||||
_logger.Debug("Found {0} reports for all lists", result.Movies.Count);
|
||||
|
||||
return result;
|
||||
@@ -151,6 +164,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
}
|
||||
|
||||
result.AnyFailure |= importListReports.AnyFailure;
|
||||
|
||||
_importListStatusService.UpdateListSyncStatus(importList.Definition.Id);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -158,6 +173,8 @@ namespace NzbDrone.Core.ImportLists
|
||||
_logger.Error(e, "Error during Import List Sync for list {0}", importList.Name);
|
||||
}
|
||||
|
||||
result.Movies = result.Movies.DistinctBy(r => new { r.TmdbId, r.ImdbId, r.Title }).ToList();
|
||||
|
||||
_logger.Debug("Found {0} reports for list {1}", result.Movies.Count, importList.Name);
|
||||
|
||||
return result;
|
||||
@@ -166,9 +183,9 @@ namespace NzbDrone.Core.ImportLists
|
||||
private List<ImportListMovie> MapMovieReports(List<ImportListMovie> reports)
|
||||
{
|
||||
var mappedMovies = reports.Select(m => _movieSearch.MapMovieToTmdbMovie(new MovieMetadata { Title = m.Title, TmdbId = m.TmdbId, ImdbId = m.ImdbId, Year = m.Year }))
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
.Where(x => x != null)
|
||||
.DistinctBy(x => x.TmdbId)
|
||||
.ToList();
|
||||
|
||||
_movieMetadataService.UpsertMany(mappedMovies);
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
@@ -8,6 +9,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
bool EnableAuto { get; }
|
||||
|
||||
ImportListType ListType { get; }
|
||||
TimeSpan MinRefreshInterval { get; }
|
||||
ImportListFetchResult Fetch();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
public abstract string Name { get; }
|
||||
|
||||
public abstract ImportListType ListType { get; }
|
||||
public abstract TimeSpan MinRefreshInterval { get; }
|
||||
public abstract bool Enabled { get; }
|
||||
public abstract bool EnableAuto { get; }
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
@@ -21,5 +22,6 @@ namespace NzbDrone.Core.ImportLists
|
||||
public override bool Enable => Enabled;
|
||||
|
||||
public ImportListType ListType { get; set; }
|
||||
public TimeSpan MinRefreshInterval { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,23 +9,24 @@ namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
public interface IImportListFactory : IProviderFactory<IImportList, ImportListDefinition>
|
||||
{
|
||||
List<IImportList> Enabled();
|
||||
List<IImportList> Enabled(bool filterBlockedImportLists = true);
|
||||
List<IImportList> Discoverable();
|
||||
}
|
||||
|
||||
public class ImportListFactory : ProviderFactory<IImportList, ImportListDefinition>, IImportListFactory
|
||||
{
|
||||
private readonly IImportListRepository _providerRepository;
|
||||
private readonly IImportListStatusService _importListStatusService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public ImportListFactory(IImportListRepository providerRepository,
|
||||
public ImportListFactory(IImportListStatusService importListStatusService,
|
||||
IImportListRepository providerRepository,
|
||||
IEnumerable<IImportList> providers,
|
||||
IServiceProvider container,
|
||||
IEventAggregator eventAggregator,
|
||||
Logger logger)
|
||||
: base(providerRepository, providers, container, eventAggregator, logger)
|
||||
{
|
||||
_providerRepository = providerRepository;
|
||||
_importListStatusService = importListStatusService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -39,18 +40,42 @@ namespace NzbDrone.Core.ImportLists
|
||||
base.SetProviderCharacteristics(provider, definition);
|
||||
|
||||
definition.ListType = provider.ListType;
|
||||
definition.MinRefreshInterval = provider.MinRefreshInterval;
|
||||
}
|
||||
|
||||
public List<IImportList> Enabled()
|
||||
public List<IImportList> Enabled(bool filterBlockedImportLists = true)
|
||||
{
|
||||
var enabledImporters = GetAvailableProviders().Where(n => ((ImportListDefinition)n.Definition).Enabled);
|
||||
return enabledImporters.ToList();
|
||||
var enabledImportLists = GetAvailableProviders().Where(n => ((ImportListDefinition)n.Definition).Enabled);
|
||||
|
||||
if (filterBlockedImportLists)
|
||||
{
|
||||
return FilterBlockedImportLists(enabledImportLists).ToList();
|
||||
}
|
||||
|
||||
return enabledImportLists.ToList();
|
||||
}
|
||||
|
||||
public List<IImportList> Discoverable()
|
||||
{
|
||||
var enabledImporters = GetAvailableProviders().Where(n => (n.GetType() == typeof(RadarrList.RadarrListImport) || n.GetType() == typeof(TMDb.Popular.TMDbPopularImport)));
|
||||
return enabledImporters.ToList();
|
||||
var enabledImportLists = GetAvailableProviders().Where(n => n.GetType() == typeof(RadarrList.RadarrListImport) || n.GetType() == typeof(TMDb.Popular.TMDbPopularImport));
|
||||
|
||||
return enabledImportLists.ToList();
|
||||
}
|
||||
|
||||
private IEnumerable<IImportList> FilterBlockedImportLists(IEnumerable<IImportList> importLists)
|
||||
{
|
||||
var blockedImportLists = _importListStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v);
|
||||
|
||||
foreach (var importList in importLists)
|
||||
{
|
||||
if (blockedImportLists.TryGetValue(importList.Definition.Id, out var blockedImportListStatus))
|
||||
{
|
||||
_logger.Debug("Temporarily ignoring import list {0} till {1} due to recent failures.", importList.Definition.Name, blockedImportListStatus.DisabledTill.Value.ToLocalTime());
|
||||
continue;
|
||||
}
|
||||
|
||||
yield return importList;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.ImportLists.ImportListMovies
|
||||
|
||||
_importListMovieRepository.InsertMany(listMovies.Where(l => l.Id == 0).ToList());
|
||||
_importListMovieRepository.UpdateMany(listMovies.Where(l => l.Id > 0).ToList());
|
||||
_importListMovieRepository.DeleteMany(existingListMovies.Where(l => !listMovies.Any(x => x.TmdbId == l.TmdbId)).ToList());
|
||||
_importListMovieRepository.DeleteMany(existingListMovies.Where(l => listMovies.All(x => x.TmdbId != l.TmdbId)).ToList());
|
||||
|
||||
return listMovies;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using NzbDrone.Core.Movies;
|
||||
using System;
|
||||
using NzbDrone.Core.ThingiProvider.Status;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
public class ImportListStatus : ProviderStatusBase
|
||||
{
|
||||
public Movie LastSyncListInfo { get; set; }
|
||||
public DateTime? LastInfoSync { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Movies;
|
||||
using NzbDrone.Core.ThingiProvider.Status;
|
||||
|
||||
namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
public interface IImportListStatusService : IProviderStatusServiceBase<ImportListStatus>
|
||||
{
|
||||
Movie GetLastSyncListInfo(int importListId);
|
||||
DateTime? GetLastSyncListInfo(int importListId);
|
||||
|
||||
void UpdateListSyncStatus(int importListId, Movie listItemInfo);
|
||||
void UpdateListSyncStatus(int importListId);
|
||||
}
|
||||
|
||||
public class ImportListStatusService : ProviderStatusServiceBase<IImportList, ImportListStatus>, IImportListStatusService
|
||||
@@ -20,18 +20,18 @@ namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
}
|
||||
|
||||
public Movie GetLastSyncListInfo(int importListId)
|
||||
public DateTime? GetLastSyncListInfo(int importListId)
|
||||
{
|
||||
return GetProviderStatus(importListId).LastSyncListInfo;
|
||||
return GetProviderStatus(importListId).LastInfoSync;
|
||||
}
|
||||
|
||||
public void UpdateListSyncStatus(int importListId, Movie listItemInfo)
|
||||
public void UpdateListSyncStatus(int importListId)
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
var status = GetProviderStatus(importListId);
|
||||
|
||||
status.LastSyncListInfo = listItemInfo;
|
||||
status.LastInfoSync = DateTime.UtcNow;
|
||||
|
||||
_providerStatusRepository.Upsert(status);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
private readonly IAddMovieService _addMovieService;
|
||||
private readonly IConfigService _configService;
|
||||
private readonly IImportExclusionsService _exclusionService;
|
||||
private readonly IImportListMovieService _listMovieService;
|
||||
|
||||
public ImportListSyncService(IImportListFactory importListFactory,
|
||||
IFetchAndParseImportList listFetcherAndParser,
|
||||
@@ -27,6 +28,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
IAddMovieService addMovieService,
|
||||
IConfigService configService,
|
||||
IImportExclusionsService exclusionService,
|
||||
IImportListMovieService listMovieService,
|
||||
Logger logger)
|
||||
{
|
||||
_importListFactory = importListFactory;
|
||||
@@ -34,6 +36,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
_movieService = movieService;
|
||||
_addMovieService = addMovieService;
|
||||
_exclusionService = exclusionService;
|
||||
_listMovieService = listMovieService;
|
||||
_logger = logger;
|
||||
_configService = configService;
|
||||
}
|
||||
@@ -59,7 +62,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
if (!result.AnyFailure)
|
||||
{
|
||||
CleanLibrary(result.Movies.ToList());
|
||||
CleanLibrary();
|
||||
}
|
||||
|
||||
ProcessReports(result);
|
||||
@@ -80,7 +83,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
}
|
||||
|
||||
// Check to see if movie excluded
|
||||
var excludedMovie = listExclusions.Where(s => s.TmdbId == report.TmdbId).SingleOrDefault();
|
||||
var excludedMovie = listExclusions.SingleOrDefault(s => s.TmdbId == report.TmdbId);
|
||||
|
||||
if (excludedMovie != null)
|
||||
{
|
||||
@@ -172,17 +175,20 @@ namespace NzbDrone.Core.ImportLists
|
||||
}
|
||||
}
|
||||
|
||||
private void CleanLibrary(List<ImportListMovie> listMovies)
|
||||
private void CleanLibrary()
|
||||
{
|
||||
var moviesToUpdate = new List<Movie>();
|
||||
|
||||
if (_configService.ListSyncLevel == "disabled")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var listMovies = _listMovieService.GetAllListMovies();
|
||||
|
||||
// TODO use AllMovieTmdbIds here?
|
||||
var moviesInLibrary = _movieService.GetAllMovies();
|
||||
|
||||
var moviesToUpdate = new List<Movie>();
|
||||
|
||||
foreach (var movie in moviesInLibrary)
|
||||
{
|
||||
var movieExists = listMovies.Any(c => c.TmdbId == movie.TmdbId || c.ImdbId == movie.ImdbId);
|
||||
@@ -207,8 +213,6 @@ namespace NzbDrone.Core.ImportLists
|
||||
_logger.Info("{0} was in your library, but not found in your lists --> Removing from library and deleting files", movie);
|
||||
_movieService.DeleteMovie(movie.Id, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace NzbDrone.Core.ImportLists.Plex
|
||||
{
|
||||
public readonly IPlexTvService _plexTvService;
|
||||
public override ImportListType ListType => ImportListType.Plex;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6);
|
||||
|
||||
public PlexImport(IPlexTvService plexTvService,
|
||||
IHttpClient httpClient,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
@@ -12,6 +13,7 @@ namespace NzbDrone.Core.ImportLists.RSSImport
|
||||
public override string Name => "RSS List";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Advanced;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace NzbDrone.Core.ImportLists.Radarr
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
public override ImportListType ListType => ImportListType.Program;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromMinutes(15);
|
||||
|
||||
public RadarrImport(IRadarrV3Proxy radarrV3Proxy,
|
||||
IImportListStatusService importListStatusService,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
@@ -12,6 +13,7 @@ namespace NzbDrone.Core.ImportLists.RadarrList
|
||||
public override string Name => "Custom Lists";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Advanced;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cloud;
|
||||
@@ -15,6 +16,7 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.IMDbList
|
||||
public override string Name => "IMDb Lists";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Other;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cloud;
|
||||
using NzbDrone.Common.Http;
|
||||
@@ -13,6 +14,8 @@ namespace NzbDrone.Core.ImportLists.RadarrList2.StevenLu
|
||||
public override string Name => "StevenLu List";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Other;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
@@ -9,6 +10,7 @@ namespace NzbDrone.Core.ImportLists.Rss.Plex
|
||||
{
|
||||
public override string Name => "Plex Watchlist RSS";
|
||||
public override ImportListType ListType => ImportListType.Plex;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(6);
|
||||
|
||||
public PlexRssImport(IHttpClient httpClient,
|
||||
IImportListStatusService importListStatusService,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
@@ -10,6 +11,7 @@ namespace NzbDrone.Core.ImportLists.StevenLu
|
||||
public override string Name => "StevenLu Custom";
|
||||
|
||||
public override ImportListType ListType => ImportListType.Advanced;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(24);
|
||||
public override bool Enabled => true;
|
||||
public override bool EnableAuto => false;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cloud;
|
||||
using NzbDrone.Common.Http;
|
||||
@@ -11,6 +12,7 @@ namespace NzbDrone.Core.ImportLists.TMDb
|
||||
where TSettings : TMDbSettingsBase<TSettings>, new()
|
||||
{
|
||||
public override ImportListType ListType => ImportListType.TMDB;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
|
||||
public readonly ISearchForNewMovie _skyhookProxy;
|
||||
public readonly IHttpRequestBuilderFactory _requestBuilder;
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace NzbDrone.Core.ImportLists.Trakt
|
||||
public ITraktProxy _traktProxy;
|
||||
private readonly IImportListRepository _importListRepository;
|
||||
public override ImportListType ListType => ImportListType.Trakt;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
|
||||
protected TraktImportBase(IImportListRepository importListRepository,
|
||||
ITraktProxy traktProxy,
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using Newtonsoft.Json;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
@@ -74,6 +75,7 @@ namespace NzbDrone.Core.Indexers.HDBits
|
||||
query.Medium = Settings.Mediums.ToArray();
|
||||
|
||||
request.SetContent(query.ToJson());
|
||||
request.ContentSummary = query.ToJson(Formatting.None);
|
||||
|
||||
yield return new IndexerRequest(request);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
get
|
||||
{
|
||||
yield return GetDefinition("Jackett", GetSettings("http://localhost:9117/api/v2.0/indexers/YOURINDEXER/results/torznab/"));
|
||||
yield return GetDefinition("HD4Free.xyz", GetSettings("http://hd4free.xyz"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -12,17 +13,14 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
{
|
||||
public class TorznabSettingsValidator : AbstractValidator<TorznabSettings>
|
||||
{
|
||||
private static readonly string[] ApiKeyWhiteList =
|
||||
{
|
||||
"hd4free.xyz",
|
||||
};
|
||||
private static readonly string[] ApiKeyWhiteList = Array.Empty<string>();
|
||||
|
||||
private static bool ShouldHaveApiKey(TorznabSettings settings)
|
||||
{
|
||||
return settings.BaseUrl != null && ApiKeyWhiteList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
|
||||
}
|
||||
|
||||
private static readonly Regex AdditionalParametersRegex = new Regex(@"(&.+?\=.+?)+", RegexOptions.Compiled);
|
||||
private static readonly Regex AdditionalParametersRegex = new (@"(&.+?\=.+?)+", RegexOptions.Compiled);
|
||||
|
||||
public TorznabSettingsValidator()
|
||||
{
|
||||
@@ -46,19 +44,19 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
|
||||
public class TorznabSettings : NewznabSettings, ITorrentIndexerSettings
|
||||
{
|
||||
private static readonly TorznabSettingsValidator Validator = new TorznabSettingsValidator();
|
||||
private static readonly TorznabSettingsValidator Validator = new ();
|
||||
|
||||
public TorznabSettings()
|
||||
{
|
||||
MinimumSeeders = IndexerDefaults.MINIMUM_SEEDERS;
|
||||
RequiredFlags = new List<int>();
|
||||
RequiredFlags = Array.Empty<int>();
|
||||
}
|
||||
|
||||
[FieldDefinition(8, Type = FieldType.Number, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
|
||||
public int MinimumSeeders { get; set; }
|
||||
|
||||
[FieldDefinition(9)]
|
||||
public SeedCriteriaSettings SeedCriteria { get; set; } = new SeedCriteriaSettings();
|
||||
public SeedCriteriaSettings SeedCriteria { get; set; } = new ();
|
||||
|
||||
[FieldDefinition(10, Type = FieldType.TagSelect, SelectOptions = typeof(IndexerFlags), Label = "Required Flags", HelpText = "What indexer flags are required?", HelpLink = "https://wiki.servarr.com/radarr/settings#indexer-flags", Advanced = true)]
|
||||
public IEnumerable<int> RequiredFlags { get; set; }
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace NzbDrone.Core.Jobs
|
||||
|
||||
new ScheduledTask
|
||||
{
|
||||
Interval = GetImportListSyncInterval(),
|
||||
Interval = 5,
|
||||
TypeName = typeof(ImportListSyncCommand).FullName
|
||||
},
|
||||
|
||||
@@ -210,14 +210,6 @@ namespace NzbDrone.Core.Jobs
|
||||
return interval;
|
||||
}
|
||||
|
||||
private int GetImportListSyncInterval()
|
||||
{
|
||||
// Enforce 6 hour min on list sync
|
||||
var interval = Math.Max(_configService.ImportListSyncInterval, 6);
|
||||
|
||||
return interval * 60;
|
||||
}
|
||||
|
||||
public void Handle(CommandExecutedEvent message)
|
||||
{
|
||||
var scheduledTask = _scheduledTaskRepository.All().SingleOrDefault(c => c.TypeName == message.Command.Body.GetType().FullName);
|
||||
@@ -239,19 +231,15 @@ namespace NzbDrone.Core.Jobs
|
||||
var rss = _scheduledTaskRepository.GetDefinition(typeof(RssSyncCommand));
|
||||
rss.Interval = GetRssSyncInterval();
|
||||
|
||||
var importList = _scheduledTaskRepository.GetDefinition(typeof(ImportListSyncCommand));
|
||||
importList.Interval = GetImportListSyncInterval();
|
||||
|
||||
var backup = _scheduledTaskRepository.GetDefinition(typeof(BackupCommand));
|
||||
backup.Interval = GetBackupInterval();
|
||||
|
||||
var refreshMonitoredDownloads = _scheduledTaskRepository.GetDefinition(typeof(RefreshMonitoredDownloadsCommand));
|
||||
refreshMonitoredDownloads.Interval = GetRefreshMonitoredInterval();
|
||||
|
||||
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, importList, refreshMonitoredDownloads, backup });
|
||||
_scheduledTaskRepository.UpdateMany(new List<ScheduledTask> { rss, refreshMonitoredDownloads, backup });
|
||||
|
||||
_cache.Find(rss.TypeName).Interval = rss.Interval;
|
||||
_cache.Find(importList.TypeName).Interval = importList.Interval;
|
||||
_cache.Find(backup.TypeName).Interval = backup.Interval;
|
||||
_cache.Find(refreshMonitoredDownloads.TypeName).Interval = refreshMonitoredDownloads.Interval;
|
||||
}
|
||||
|
||||
@@ -336,7 +336,6 @@
|
||||
"LoadingMovieFilesFailed": "فشل تحميل ملفات الفيلم",
|
||||
"LoadingMovieExtraFilesFailed": "فشل تحميل ملفات الفيلم الإضافية",
|
||||
"LoadingMovieCreditsFailed": "فشل تحميل اعتمادات الفيلم",
|
||||
"ListUpdateInterval": "سرد الفاصل الزمني للتحديث",
|
||||
"ListTagsHelpText": "ستتم إضافة عناصر قائمة العلامات مع",
|
||||
"ListSyncLevelHelpTextWarning": "سيتم حذف ملفات الأفلام نهائيًا ، وقد يؤدي ذلك إلى مسح مكتبتك إذا كانت قوائمك فارغة",
|
||||
"ListSyncLevelHelpText": "ستتم إزالة الأفلام الموجودة في المكتبة أو عدم مراقبتها إذا لم تكن موجودة في قائمتك",
|
||||
@@ -398,7 +397,6 @@
|
||||
"ImportNotForDownloads": "لا تستخدمه لاستيراد التنزيلات من عميل التنزيل الخاص بك ، فهذا مخصص فقط للمكتبات المنظمة الموجودة ، وليس الملفات التي لم يتم فرزها.",
|
||||
"ImportMovies": "استيراد أفلام",
|
||||
"ImportMechanismHealthCheckMessage": "تفعيل معالجة التنزيل المكتملة",
|
||||
"ImportListSyncIntervalHelpText": "كم مرة يتزامن Radarr مع القوائم الخاصة بك. الحد الادنى 6 ساعات",
|
||||
"ImportListStatusCheckSingleClientMessage": "القوائم غير متاحة بسبب الإخفاقات: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "جميع القوائم غير متاحة بسبب الإخفاقات",
|
||||
"ImportLibrary": "استيراد مكتبة",
|
||||
|
||||
@@ -341,7 +341,6 @@
|
||||
"ListSettings": "Настройки на списъка",
|
||||
"ListsSettingsSummary": "Списъци за импортиране, списъци с изключения",
|
||||
"ListSyncLevelHelpText": "Филмите в библиотеката ще бъдат премахнати или непроменени, ако не са във вашия списък",
|
||||
"ListUpdateInterval": "Интервал за актуализиране на списъка",
|
||||
"LogFiles": "Лог файлове",
|
||||
"Logging": "Регистрация",
|
||||
"LogLevel": "Log Level",
|
||||
@@ -830,7 +829,6 @@
|
||||
"ImportLibrary": "Внос на библиотека",
|
||||
"ImportListStatusCheckAllClientMessage": "Всички списъци са недостъпни поради неуспехи",
|
||||
"ImportListStatusCheckSingleClientMessage": "Списъци, недостъпни поради неуспехи: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Колко често Radarr се синхронизира с вашите списъци. Минимална стойност от 6 часа",
|
||||
"CreateEmptyMovieFoldersHelpText": "Създайте липсващи папки с филми по време на сканиране на диска",
|
||||
"DeleteBackup": "Изтриване на резервно копие",
|
||||
"DeleteCustomFormat": "Изтриване на потребителски формат",
|
||||
|
||||
@@ -562,7 +562,6 @@
|
||||
"ImportListMultipleMissingRoots": "Falten diverses carpetes arrel per a les llistes d'importació: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors",
|
||||
"ImportListStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Amb quina freqüència es sincronitza Radarr amb les vostres llistes. Valor mínim de 6 hores",
|
||||
"ImportMechanismHealthCheckMessage": "Activa la gestió de baixades completades",
|
||||
"ImportNotForDownloads": "No l'utilitzeu per importar baixades des del vostre client de baixada, això només és per a biblioteques existents, no per a fitxers no organitzats.",
|
||||
"ImportRootPath": "Dirigiu Radarr a la carpeta que conté totes les vostres pel·lícules, no una pel·lícula específica, per exemple, {0} i no {1}. A més, cada pel·lícula ha d'estar a la seva pròpia carpeta dins de la carpeta arrel o la carpeta de la biblioteca.",
|
||||
@@ -602,7 +601,6 @@
|
||||
"ListSyncLevelHelpText": "Les pel·lícules de la biblioteca s'eliminaran o no es controlaran si no es troben a la vostra llista",
|
||||
"ListSyncLevelHelpTextWarning": "Els fitxers de pel·lícules se suprimiran permanentment; això pot provocar que esborraràs la teva biblioteca si les teves llistes estan buides",
|
||||
"ListTagsHelpText": "Els elements de la llista d'etiquetes s'afegiran amb",
|
||||
"ListUpdateInterval": "Interval d'actualització de la llista",
|
||||
"LoadingMovieExtraFilesFailed": "No s'han pogut carregar els fitxers addicionals de la pel·lícula",
|
||||
"LoadingMovieFilesFailed": "No s'han pogut carregar els fitxers de pel·lícules",
|
||||
"Local": "Local",
|
||||
|
||||
@@ -244,7 +244,6 @@
|
||||
"ImportErrors": "Chyby importu",
|
||||
"ImportExtraFilesHelpText": "Po importu filmového souboru importujte odpovídající další soubory (titulky, nfo atd.)",
|
||||
"ImportFailed": "Import se nezdařil: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Jak často se Radarr synchronizuje s vašimi seznamy. Minimální hodnota 6 hodin",
|
||||
"CreateEmptyMovieFoldersHelpText": "Během skenování disku vytvářejte chybějící složky filmů",
|
||||
"DeleteDownloadClient": "Odstranit staženého klienta",
|
||||
"DeleteListMessageText": "Opravdu chcete smazat seznam „{0}“?",
|
||||
@@ -705,7 +704,6 @@
|
||||
"Lists": "Seznamy",
|
||||
"ListSettings": "Nastavení seznamu",
|
||||
"ListSyncLevelHelpText": "Filmy v knihovně budou odstraněny nebo nesledovány, pokud nejsou ve vašem seznamu",
|
||||
"ListUpdateInterval": "Interval aktualizace seznamu",
|
||||
"LogFiles": "Záznam souborů",
|
||||
"Logging": "Protokolování",
|
||||
"LogLevel": "Úroveň protokolu",
|
||||
|
||||
@@ -302,7 +302,6 @@
|
||||
"DeleteDownloadClient": "Slet Download Client",
|
||||
"OnDownloadHelpText": "Ved import",
|
||||
"ImportIncludeQuality": "Sørg for, at dine filer inkluderer kvaliteten i deres filnavne. f.eks. {0}",
|
||||
"ImportListSyncIntervalHelpText": "Hvor ofte synkroniserer Radarr med dine lister. Minimumsværdi på 6 timer",
|
||||
"IncludeHealthWarningsHelpText": "Inkluder sundhedsadvarsler",
|
||||
"Max": "Maks.",
|
||||
"Medium": "Medium",
|
||||
@@ -669,7 +668,6 @@
|
||||
"ListSettings": "Listeindstillinger",
|
||||
"ListsSettingsSummary": "Importlister, listeekskluderinger",
|
||||
"ListSyncLevelHelpText": "Film i biblioteket fjernes eller overvåges, hvis de ikke er på din liste",
|
||||
"ListUpdateInterval": "Listeopdateringsinterval",
|
||||
"LogFiles": "Logfiler",
|
||||
"Logging": "Logning",
|
||||
"LogLevel": "Logniveau",
|
||||
|
||||
@@ -413,7 +413,6 @@
|
||||
"Links": "Links",
|
||||
"ListSettings": "Listen Einstellungen",
|
||||
"ListSyncLevelHelpText": "Die Filme in der Bibliothek werden auf der Grundlage dieser Auswahl behandelt, wenn sie nicht auf einer Liste auftauchen",
|
||||
"ListUpdateInterval": "Aktualisierungs Intervall der Listen",
|
||||
"Local": "Lokal",
|
||||
"LogLevel": "Log Level",
|
||||
"Logs": "Protokolle",
|
||||
@@ -567,7 +566,6 @@
|
||||
"MovieIsOnImportExclusionList": "Film ist auf der Net Import Ausschluss Liste",
|
||||
"RemoveHelpTextWarning": "Dies wird den Download und alle bereits heruntergeladenen Dateien aus dem Downloader entfernen.",
|
||||
"EnableMediaInfoHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec aus Datien erkennen. Dazu ist es erforderlich, dass Radarr Teile der Datei liest, was zu hoher Festplatten- oder Netzwerkaktivität während der Scans führen kann.",
|
||||
"ImportListSyncIntervalHelpText": "Wie oft die Listen synchronisiert werden sollen. Minimum 6 Stunden",
|
||||
"AddListExclusion": "Listenausschluss hinzufügen",
|
||||
"RequiredHelpText": "Diese {0} Bedingungen müsen zutreffen damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.",
|
||||
"AllowHardcodedSubsHelpText": "Filme mit hartcodierten Untertiteln werden auch automatisch heruntergeladen",
|
||||
@@ -686,7 +684,7 @@
|
||||
"AddingTag": "Tag hinzufügen",
|
||||
"YouCanAlsoSearch": "Es kann auch nach der TMDb oder IMDb ID eines Filmes gesucht werden. Z.B.: 'tmdb:71663'",
|
||||
"VisitGithubCustomFormatsAphrodite": "Besuche das Wiki für mehr Details: ",
|
||||
"Unreleased": "Nicht verfügbar",
|
||||
"Unreleased": "Unveröffentlicht",
|
||||
"UnableToLoadUISettings": "Oberflächen Einstellungen konnten nicht geladen werden",
|
||||
"UnableToLoadTheCalendar": "Kalender konnte nicht geladen werden",
|
||||
"UnableToLoadRootFolders": "Stammordner konnten nicht geladen werden",
|
||||
@@ -1167,15 +1165,23 @@
|
||||
"UpdateFiltered": "Gefilterte updaten",
|
||||
"ThereWasAnErrorLoadingThisItem": "Beim Laden des Eintrags ist ein Fehler aufgetreten",
|
||||
"ThereWasAnErrorLoadingThisPage": "Beim Laden der Seite ist ein Fehler aufgetreten",
|
||||
"DeleteRemotePathMapping": "Entfernte Pfadzuordnung bearbeiten",
|
||||
"NoHistoryBlocklist": "Keine History Blockliste",
|
||||
"RemoveSelectedItemQueueMessageText": "Bist du sicher, dass du {0} aus der Warteschlange entfernen willst?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {0} aus der Warteschlange entfernen willst?",
|
||||
"DeleteRemotePathMapping": "Entfernte Pfadzuordnung löschen",
|
||||
"NoHistoryBlocklist": "Keine Verlauf-Sperrliste",
|
||||
"RemoveSelectedItemQueueMessageText": "Bist du sicher, dass du ein Eintrag aus der Warteschlange entfernen willst?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?",
|
||||
"ResetDefinitionTitlesHelpText": "Definitionstitel und Werte zurücksetzen",
|
||||
"DeleteConditionMessageText": "Benachrichtigung '{0}' wirklich löschen?",
|
||||
"DeleteCustomFormatMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteDelayProfileMessageText": "Bist du sicher, dass du dieses Verzögerungs-Profil löschen willst?",
|
||||
"DeleteFormatMessageText": "Bist du sicher, dass du das Formatierungstag {0} löschen willst ?",
|
||||
"DeleteConditionMessageText": "Bist du sicher, dass du die Bedingung '{0}' löschen willst?",
|
||||
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?",
|
||||
"DeleteDelayProfileMessageText": "Bist du sicher, dass du dieses Verzögerung-Profil löschen willst?",
|
||||
"DeleteFormatMessageText": "Bist du sicher, dass du das Formatierungstag {0} löschen willst?",
|
||||
"DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?",
|
||||
"ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?"
|
||||
"ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?",
|
||||
"DeleteRemotePathMappingMessageText": "Bist du sicher, dass du das diese entfernte Pfadzuordnung löschen willst?",
|
||||
"CloneCondition": "Bedingung klonen",
|
||||
"DeleteCondition": "Bedingung löschen",
|
||||
"RemoveSelectedItemBlocklistMessageText": "Bist du sicher, dass du die ausgewählten Einträge aus der Sperrliste entfernen willst?",
|
||||
"ResetQualityDefinitionsMessageText": "Bist du sicher, dass du die Qualitätsdefinitionen zurücksetzen willst?",
|
||||
"Complete": "Vollständig",
|
||||
"ListWillRefreshEveryInterp": "Liste wird alle [0] aktualisiert",
|
||||
"ListRefreshInterval": "Listen Aktualisierungsintervall"
|
||||
}
|
||||
|
||||
@@ -125,7 +125,6 @@
|
||||
"LastWriteTime": "Τελευταία ώρα εγγραφής",
|
||||
"LaunchBrowserHelpText": " Ανοίξτε ένα πρόγραμμα περιήγησης ιστού και μεταβείτε στην αρχική σελίδα του Radarr κατά την έναρξη της εφαρμογής.",
|
||||
"ListsSettingsSummary": "Εισαγωγή λιστών, εξαιρέσεις λίστας",
|
||||
"ListUpdateInterval": "Διάστημα ενημέρωσης λίστας",
|
||||
"ManualImportSelectMovie": "Μη αυτόματη εισαγωγή - Επιλέξτε ταινία",
|
||||
"MoreInfo": "Περισσότερες πληροφορίες",
|
||||
"MoveFolders1": "Θέλετε να μετακινήσετε τους φακέλους της ταινίας στο \"{0}\";",
|
||||
@@ -225,7 +224,6 @@
|
||||
"ImportLibrary": "Εισαγωγή βιβλιοθήκης",
|
||||
"ImportListStatusCheckAllClientMessage": "Όλες οι λίστες δεν είναι διαθέσιμες λόγω αστοχιών",
|
||||
"ImportListStatusCheckSingleClientMessage": "Μη διαθέσιμες λίστες λόγω αποτυχιών: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Πόσο συχνά συγχρονίζεται το Radarr με τις λίστες σας. Ελάχιστη τιμή 6 ωρών",
|
||||
"CreateEmptyMovieFoldersHelpText": "Δημιουργήστε φακέλους ταινιών που λείπουν κατά τη σάρωση δίσκου",
|
||||
"DeleteCustomFormat": "Διαγραφή προσαρμοσμένης μορφής",
|
||||
"Add": "Προσθήκη",
|
||||
@@ -970,7 +968,7 @@
|
||||
"UnmappedFolders": "Μη χαρτογραφημένοι φάκελοι",
|
||||
"Unmonitored": "Χωρίς παρακολούθηση",
|
||||
"UnmonitoredHelpText": "Συμπεριλάβετε ταινίες χωρίς παρακολούθηση στη ροή iCal",
|
||||
"Unreleased": "Μη διαθέσιμο",
|
||||
"Unreleased": "Ακυκλοφόρητο",
|
||||
"UnsavedChanges": "Μη αποθηκευμένες αλλαγές",
|
||||
"UnselectAll": "Αποεπιλογή όλων",
|
||||
"UpdateAll": "Ενημέρωση όλων",
|
||||
@@ -1164,5 +1162,24 @@
|
||||
"ThereWasAnErrorLoadingThisPage": "Υπήρξε ένα σφάλμα κατά τη φόρτωση της σελίδας",
|
||||
"DeleteRemotePathMapping": "Επεξεργασία αντιστοίχισης απομακρυσμένης διαδρομής",
|
||||
"DeleteRemotePathMappingMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την αντιστοίχιση απομακρυσμένης διαδρομής;",
|
||||
"OnHealthRestoredHelpText": "Στην Αποκατάσταση Υγείας"
|
||||
"OnHealthRestoredHelpText": "Στην Αποκατάσταση Υγείας",
|
||||
"MovieMatchType": "Τύπος αντιστοίχισης ταινίας",
|
||||
"Complete": "Ολοκληρώθηκαν",
|
||||
"ResetAPIKeyMessageText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε το κλειδί API σας;",
|
||||
"UseScriptImportHelpText": "Αντιγραφή αρχείων για εισαγωγή χρησιμοποιώντας ένα script (π.χ. για μετατροπή)",
|
||||
"OnManualInteractionRequiredHelpText": "Απαιτείται χειροκίνητη ενέργεια",
|
||||
"OnManualInteractionRequired": "Απαιτείται χειροκίνητη ενέργεια",
|
||||
"CloneCondition": "Κλωνοποίηση συνθήκης",
|
||||
"DeleteCondition": "Διαγραφή συνθήκης",
|
||||
"DeleteFormatMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την ετικέτα μορφής {0};",
|
||||
"DeleteConditionMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη συνθήκη '{0}';",
|
||||
"DeleteCustomFormatMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη προσαρμοσμένη μορφή '{0}';",
|
||||
"DeleteDelayProfileMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε αυτό το Προφίλ χρονοκαθυστέρησης;",
|
||||
"DeleteImportListExclusionMessageText": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εξαίρεση λίστας εισαγωγής;",
|
||||
"NoHistoryBlocklist": "Δεν υπάρχει λίστα αποκλεισμού ιστορικού",
|
||||
"RemoveSelectedItemBlocklistMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τα επιλεγμένα αντικείμενα από τη λίστα αποκλεισμού;",
|
||||
"RemoveSelectedItemQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε 1 αντικείμενο από την ουρά;",
|
||||
"RemoveSelectedItemsQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;",
|
||||
"ResetDefinitionTitlesHelpText": "Επαναφορά τίτλων ορισμού και των τιμών τους",
|
||||
"ResetQualityDefinitionsMessageText": "Είστε σίγουροι πως θέλετε να επαναφέρετε τους ορισμούς ποιότητας;"
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
"ApplicationURL": "Application URL",
|
||||
"ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base",
|
||||
"Apply": "Apply",
|
||||
"ApplyChanges": "Apply Changes",
|
||||
"ApplyTags": "Apply Tags",
|
||||
"ApplyTagsHelpTexts1": "How to apply tags to the selected movies",
|
||||
"ApplyTagsHelpTexts2": "Add: Add the tags to the existing list of tags",
|
||||
@@ -142,6 +143,7 @@
|
||||
"ColonReplacement": "Colon Replacement",
|
||||
"ColonReplacementFormatHelpText": "Change how Radarr handles colon replacement",
|
||||
"Columns": "Columns",
|
||||
"Complete": "Complete",
|
||||
"CompletedDownloadHandling": "Completed Download Handling",
|
||||
"Component": "Component",
|
||||
"Conditions": "Conditions",
|
||||
@@ -159,6 +161,7 @@
|
||||
"CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Radarr's rename function as a work around.",
|
||||
"CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update",
|
||||
"CouldNotFindResults": "Couldn't find any results for '{0}'",
|
||||
"CountIndexersSelected": "{0} indexers selected",
|
||||
"CreateEmptyMovieFolders": "Create empty movie folders",
|
||||
"CreateEmptyMovieFoldersHelpText": "Create missing movie folders during disk scan",
|
||||
"CreateGroup": "Create group",
|
||||
@@ -214,6 +217,8 @@
|
||||
"DeleteImportListExclusionMessageText": "Are you sure you want to delete this import list exclusion?",
|
||||
"DeleteIndexer": "Delete Indexer",
|
||||
"DeleteIndexerMessageText": "Are you sure you want to delete the indexer '{0}'?",
|
||||
"DeleteIndexers": "Delete Indexer(s)",
|
||||
"DeleteIndexersMessageText": "Are you sure you want to delete {0} indexers(s)?",
|
||||
"DeleteList": "Delete List",
|
||||
"DeleteListMessageText": "Are you sure you want to delete the list '{0}'?",
|
||||
"DeleteMovieFolderHelpText": "Delete the movie folder and its contents",
|
||||
@@ -290,6 +295,7 @@
|
||||
"EditQualityProfile": "Edit Quality Profile",
|
||||
"EditRemotePathMapping": "Edit Remote Path Mapping",
|
||||
"EditRestriction": "Edit Restriction",
|
||||
"EditSelectedIndexers": "Edit Selected Indexers",
|
||||
"EditSelectedMovies": "Edit Selected Movies",
|
||||
"Edition": "Edition",
|
||||
"Enable": "Enable",
|
||||
@@ -415,7 +421,6 @@
|
||||
"ImportListMultipleMissingRoots": "Multiple root folders are missing for import lists: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "All lists are unavailable due to failures",
|
||||
"ImportListStatusCheckSingleClientMessage": "Lists unavailable due to failures: {0}",
|
||||
"ImportListSyncIntervalHelpText": "How often Radarr syncs with your lists. Minimum value of 6 hours",
|
||||
"ImportMechanismHealthCheckMessage": "Enable Completed Download Handling",
|
||||
"ImportMovies": "Import Movies",
|
||||
"ImportNotForDownloads": "Do not use for importing downloads from your download client, this is only for existing organized libraries, not unsorted files.",
|
||||
@@ -483,11 +488,12 @@
|
||||
"Links": "Links",
|
||||
"List": "List",
|
||||
"ListExclusions": "List Exclusions",
|
||||
"ListRefreshInterval": "List Refresh Interval",
|
||||
"ListSettings": "List Settings",
|
||||
"ListSyncLevelHelpText": "Movies in library will be handled based on your selection if they fall off or do not appear on your list(s)",
|
||||
"ListSyncLevelHelpTextWarning": "Movie files will be permanently deleted, this can result in wiping your library if your lists are empty",
|
||||
"ListTagsHelpText": "Tags list items will be added with",
|
||||
"ListUpdateInterval": "List Update Interval",
|
||||
"ListWillRefreshEveryInterp": "List will refresh every {0}",
|
||||
"Lists": "Lists",
|
||||
"ListsSettingsSummary": "Import Lists, list exclusions",
|
||||
"Loading": "Loading",
|
||||
@@ -508,6 +514,7 @@
|
||||
"LowerCase": "Lowercase",
|
||||
"MIA": "MIA",
|
||||
"MaintenanceRelease": "Maintenance Release: bug fixes and other improvements. See Github Commit History for more details",
|
||||
"ManageIndexers": "Manage Indexers",
|
||||
"Manual": "Manual",
|
||||
"ManualImport": "Manual Import",
|
||||
"ManualImportSelectLanguage": "Manual Import - Select Language",
|
||||
|
||||
@@ -563,7 +563,6 @@
|
||||
"Logs": "Registros",
|
||||
"LogLevel": "Nivel de Registro",
|
||||
"Local": "Local",
|
||||
"ListUpdateInterval": "Intervalo de Actualización de Lista",
|
||||
"ListSyncLevelHelpText": "Las películas en la librería se borrarán o desmonitorearán si no están en tu lista",
|
||||
"ListSettings": "Ajustes de Lista",
|
||||
"Links": "Enlaces",
|
||||
@@ -614,7 +613,6 @@
|
||||
"OnHealthIssueHelpText": "En Problema de Salud",
|
||||
"OnGrabHelpText": "Al Capturar",
|
||||
"SettingsRuntimeFormat": "Formato de Tiempo de ejecución",
|
||||
"ImportListSyncIntervalHelpText": "Frecuencia de sincronización de Radarr con tus listas",
|
||||
"MovieIsOnImportExclusionList": "La película está en la Lista de Exclusión",
|
||||
"WaitingToProcess": "Esperando para Procesar",
|
||||
"WaitingToImport": "Esperando para Importar",
|
||||
|
||||
@@ -425,7 +425,6 @@
|
||||
"Search": "Haku",
|
||||
"AddImportExclusionHelpText": "Estä Radarria lisäämästä tiettyä elokuvaa tuontilistoilta.",
|
||||
"ImportListStatusCheckAllClientMessage": "Mitkään listat eivät ole virheiden vuoksi käytettävissä",
|
||||
"ImportListSyncIntervalHelpText": "Miten usein listat synkronoidaan. Vähimmäisarvo on 6 tuntia.",
|
||||
"StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta",
|
||||
"StartupDirectory": "Käynnistyskansio",
|
||||
"System": "Järjestelmä",
|
||||
@@ -669,7 +668,6 @@
|
||||
"Lists": "Listat",
|
||||
"ListSettings": "Listojen asetukset",
|
||||
"ListsSettingsSummary": "Tuontilistat ja niiden poikkeussäännöt.",
|
||||
"ListUpdateInterval": "Listojen päivitysväli",
|
||||
"LogFiles": "Lokitiedostot",
|
||||
"Logging": "Lokitietojen kirjaus",
|
||||
"LogLevel": "Kirjauksen taso",
|
||||
|
||||
@@ -463,7 +463,6 @@
|
||||
"DeleteNotificationMessageText": "Êtes-vous sûr de vouloir supprimer la notification '{0}' ?",
|
||||
"AutomaticSearch": "Recherche automatique",
|
||||
"AddIndexer": "Ajouter un indexeur",
|
||||
"ListUpdateInterval": "Intervalle de mise à jour de la liste",
|
||||
"ListSyncLevelHelpText": "Les films de la bibliothèque seront traités en fonction de votre sélection s'ils n'apparaissent pas dans votre (ou vos) liste(s)",
|
||||
"Links": "Liens",
|
||||
"LinkHere": "ici",
|
||||
@@ -477,7 +476,6 @@
|
||||
"IncludeRecommendationsHelpText": "Inclure les films recommandés par Radarr dans la vue découverte",
|
||||
"IncludeRadarrRecommendations": "Inclure les recommandations de Radarr",
|
||||
"ImportMovies": "Importer Films",
|
||||
"ImportListSyncIntervalHelpText": "À quelle fréquence Radarr se synchronise avec vos listes. Valeur minimale de 6 heures",
|
||||
"Importing": "Importation",
|
||||
"ImportFailed": "L'importation a échoué : {0}",
|
||||
"ImportCustomFormat": "Importer format personnalisé",
|
||||
|
||||
@@ -170,7 +170,6 @@
|
||||
"ImportIncludeQuality": "ודא שהקבצים שלך כוללים את האיכות בשמות הקבצים שלהם. לְמָשָׁל {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "כל הרשימות אינן זמינות בגלל כשלים",
|
||||
"ImportListStatusCheckSingleClientMessage": "רשימות לא זמינות בגלל כשלים: {0}",
|
||||
"ImportListSyncIntervalHelpText": "באיזו תדירות Radarr מסתנכרן עם הרשימות שלך. ערך מינימלי של 6 שעות",
|
||||
"AddNewTmdbIdMessage": "אתה יכול גם לחפש באמצעות מזהה TMDb של סרט. לְמָשָׁל 'tmdb: 71663'",
|
||||
"CreateEmptyMovieFoldersHelpText": "צור תיקיות סרט חסרות במהלך סריקת הדיסק",
|
||||
"DeleteBackup": "מחק את הגיבוי",
|
||||
@@ -671,7 +670,6 @@
|
||||
"ListSettings": "הגדרות רשימה",
|
||||
"ListsSettingsSummary": "ייבוא רשימות, אי הכללות רשימות",
|
||||
"ListSyncLevelHelpText": "סרטים בספריה יוסרו או יפקחו עליהם אם אינם ברשימה שלך",
|
||||
"ListUpdateInterval": "מרווח עדכון רשימה",
|
||||
"LogFiles": "קבצי יומן",
|
||||
"Logging": "רישום",
|
||||
"LogLevelTraceHelpTextWarning": "יש להפעיל רישום מעקב באופן זמני בלבד",
|
||||
@@ -1091,5 +1089,6 @@
|
||||
"EditMovies": "ערוך את הסרט",
|
||||
"ShowCinemaReleaseHelpText": "הצג תאריך יציאה תחת הכרזה",
|
||||
"DeleteRemotePathMapping": "ערוך מיפוי נתיבים מרחוק",
|
||||
"DeleteRemotePathMappingMessageText": "האם אתה בטוח שברצונך למחוק את מיפוי הנתיבים המרוחק הזה?"
|
||||
"DeleteRemotePathMappingMessageText": "האם אתה בטוח שברצונך למחוק את מיפוי הנתיבים המרוחק הזה?",
|
||||
"ApiKeyValidationHealthCheckMessage": "עדכן בבקשה את מפתח ה API שלך שיהיה עם לפחות {0} תווים. ניתן לעשות זאת דרך ההגדות או קובץ הקונפיגורציה"
|
||||
}
|
||||
|
||||
@@ -524,7 +524,6 @@
|
||||
"ImportExistingMovies": "मौजूदा फिल्में आयात करें",
|
||||
"ImportExtraFiles": "अतिरिक्त फ़ाइलें आयात करें",
|
||||
"ImportLibrary": "पुस्तकालय आयात",
|
||||
"ImportListSyncIntervalHelpText": "रेडर आपकी सूचियों के साथ कितनी बार सिंक करता है। न्यूनतम मूल्य 6 घंटे",
|
||||
"ImportMechanismHealthCheckMessage": "पूर्ण डाउनलोड हैंडलिंग सक्षम करें",
|
||||
"Added": "जोड़ा",
|
||||
"AddExclusion": "बहिष्करण जोड़ें",
|
||||
@@ -804,7 +803,6 @@
|
||||
"Links": "लिंक",
|
||||
"Lists": "सूचियों",
|
||||
"ListsSettingsSummary": "सूची आयात करें, सूची बहिष्करण करें",
|
||||
"ListUpdateInterval": "सूची अद्यतन अंतराल",
|
||||
"LogFiles": "फाइल्स लॉग करें # लॉग फाइलें",
|
||||
"Logging": "लॉगिंग",
|
||||
"LogLevelTraceHelpTextWarning": "ट्रेस लॉगिंग को केवल अस्थायी रूप से सक्षम किया जाना चाहिए",
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"ListUpdateInterval": "Lista frissítés gyakorisága",
|
||||
"About": "Névjegy",
|
||||
"Year": "Év",
|
||||
"Analytics": "Analitika",
|
||||
@@ -21,7 +20,7 @@
|
||||
"AddExclusion": "Kivétel hozzáadása",
|
||||
"Activity": "Aktivitás",
|
||||
"Error": "Hiba",
|
||||
"Ended": "Vége lett",
|
||||
"Ended": "Vége",
|
||||
"EnableCompletedDownloadHandlingHelpText": "A befejezett letöltések automatikus importálása a letöltési kliensből",
|
||||
"EnableColorImpairedModeHelpText": "Megváltoztatott színek, hogy a színvak felhasználók jobban meg tudják különböztetni a színkódolt információkat",
|
||||
"EnableAutomaticSearchHelpTextWarning": "Interaktív keresés esetén is felhasználható",
|
||||
@@ -29,7 +28,7 @@
|
||||
"DestinationRelativePath": "Célmappa Távoli Elérési Útvonala",
|
||||
"DeleteTag": "Címke Törlése",
|
||||
"EnableAutomaticSearchHelpText": "Akkor kerül felhasználásra, ha az automatikus kereséseket a kezelőfelületen vagy a Radarr-on keresztül hajtják végre",
|
||||
"EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést",
|
||||
"EnableAutomaticSearch": "Automatikus keresés engedélyezése",
|
||||
"EnableAutomaticAdd": "Engedélyezd az automatikus hozzáadást",
|
||||
"EnableAutoHelpText": "Ha engedélyezve van, a Filmek automatikusan hozzáadódnak a Radarr-hoz ebből a listából",
|
||||
"Enable": "Aktiválás",
|
||||
@@ -86,7 +85,7 @@
|
||||
"DeleteDownloadClient": "Letöltőkliens Törlése",
|
||||
"DeleteDelayProfile": "Késleltetési Profil Törlése",
|
||||
"Deleted": "Törölve",
|
||||
"DeleteCustomFormat": "Egyéni Formátum Törlése",
|
||||
"DeleteCustomFormat": "Egyéni formátum törlése",
|
||||
"DeleteBackupMessageText": "Biztosan törlöd a(z) „{0}” biztonsági mentést?",
|
||||
"DeleteBackup": "Biztonsági Mentés Törlése",
|
||||
"Delete": "Törlés",
|
||||
@@ -132,7 +131,7 @@
|
||||
"Close": "Bezárás",
|
||||
"CloneProfile": "Profil Klónozása",
|
||||
"CloneIndexer": "Indexer Klónozása",
|
||||
"CloneCustomFormat": "Egyéni Formátum Klónozása",
|
||||
"CloneCustomFormat": "Egyéni formátum klónozása",
|
||||
"ClientPriority": "Kliens Prioritás",
|
||||
"ClickToChangeQuality": "Kattints a minőség módosításához",
|
||||
"ClickToChangeMovie": "Kattints a film módosításához",
|
||||
@@ -191,7 +190,7 @@
|
||||
"Agenda": "Teendők",
|
||||
"AcceptConfirmationModal": "Változás Megerősítése",
|
||||
"Apply": "Alkalmazás",
|
||||
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön",
|
||||
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül",
|
||||
"AppDataDirectory": "AppData Mappa",
|
||||
"AddRestriction": "Korlátozás Hozzáadása",
|
||||
"AddRemotePathMapping": "Adj Meg Egy Távoli Elérési Útvonalat",
|
||||
@@ -199,8 +198,8 @@
|
||||
"Added": "Hozzáadva",
|
||||
"Actions": "Teendők",
|
||||
"History": "Történet",
|
||||
"HideAdvanced": "Haladó Elrejtése",
|
||||
"HiddenClickToShow": "Rejtett, kattints a megjelenítéshez",
|
||||
"HideAdvanced": "Haladó elrejtése",
|
||||
"HiddenClickToShow": "Rejtett, kattints a felfedéshez",
|
||||
"HealthNoIssues": "Nincs hiba a konfigurációval",
|
||||
"Health": "Állapot",
|
||||
"HaveNotAddedMovies": "Még nem adottál hozzá egyetlen filmet sem. Először szeretnéd importálni néhány filmedet vagy az összes filmet?",
|
||||
@@ -235,7 +234,7 @@
|
||||
"ExtraFileExtensionsHelpTexts2": "Például: '.sub, .nfo' vagy 'sub, nfo'",
|
||||
"ExtraFileExtensionsHelpTexts1": "Az importálandó extra fájlok vesszővel lesznek elválasztva (.nfo .nfo-orig néven lesz importálva)",
|
||||
"Extension": "Kiterjesztés",
|
||||
"ExportCustomFormat": "Egyéni Formátum Exportálása",
|
||||
"ExportCustomFormat": "Egyéni formátum exportálása",
|
||||
"ExistingTag": "Meglévő Címke",
|
||||
"ExistingMovies": "Létező Film(ek)",
|
||||
"Existing": "Létező",
|
||||
@@ -252,7 +251,7 @@
|
||||
"EnableMediaInfoHelpText": "Videofájlok, például felbontás, filmhossz és kodek információk kiolvasása fájlokból. Ehhez a Radarr-nak fel kell dolgoznia a fájl olyan részeit, amelyek nagy lemez, illetve hálózati aktivitást okozhatnak a vizsgálatok során.",
|
||||
"EnableInteractiveSearchHelpTextWarning": "A keresés nem támogatott ezzel az Indexerrel",
|
||||
"EnableInteractiveSearchHelpText": "Interaktív keresés esetén használható",
|
||||
"EnableInteractiveSearch": "Interaktív Keresés Engedélyezése",
|
||||
"EnableInteractiveSearch": "Interaktív keresés engedélyezése",
|
||||
"EnableHelpText": "Engedélyezze a metaadatfájlok létrehozását ehhez a metaadat típushoz",
|
||||
"EnabledHelpText": "Engedélyezze ezt a lista használatát a Radarr alkalmazásban",
|
||||
"EnableColorImpairedMode": "Engedélyezze a színtévesztő módot",
|
||||
@@ -388,7 +387,7 @@
|
||||
"RemoveRootFolder": "Gyökérmappa eltávolítása",
|
||||
"RemoveHelpTextWarning": "Az eltávolítás eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.",
|
||||
"RemoveFromQueue": "Eltávolítás a sorból",
|
||||
"RemoveFromDownloadClient": "Eltávolítás a letöltőkliensből",
|
||||
"RemoveFromDownloadClient": "Eltávolítás a letöltési kliensből",
|
||||
"RemoveFilter": "Szűrő törlése",
|
||||
"RemoveFailedDownloadsHelpText": "Távolítsa el a sikertelen letöltéseket a letöltési kliens előzményeiből",
|
||||
"RemovedMovieCheckSingleMessage": "A(z) {0} filmet eltávolították a TMDb-ről",
|
||||
@@ -435,7 +434,7 @@
|
||||
"QualitySettings": "Minőségi beállítások",
|
||||
"QualityProfiles": "Minőségi profilok",
|
||||
"QualityProfileDeleteConfirm": "Biztosan törli a {0} minőségi profilt",
|
||||
"QualityProfile": "Minőségi Profil",
|
||||
"QualityProfile": "Minőségi profil",
|
||||
"QualityDefinitions": "Minőségi meghatározások",
|
||||
"QualityCutoffHasNotBeenMet": "Minőségi küszöbhatár nincs elérve",
|
||||
"Quality": "Minőség",
|
||||
@@ -457,7 +456,7 @@
|
||||
"Profiles": "Profil(ok)",
|
||||
"ProcessingFolders": "Mappák feldolgozása",
|
||||
"PriorityHelpText": "Priorizálj több letöltési klienst. A Round-Robint azonos prioritású letöltőkliensek használják.",
|
||||
"Priority": "Prioritás",
|
||||
"Priority": "Elsőbbség",
|
||||
"PreviewRename": "Előnézet átnevezése",
|
||||
"PreferIndexerFlagsHelpText": "Prioritizáld a kiadásokat speciális zászlók segítségével",
|
||||
"Original": "Eredeti",
|
||||
@@ -555,7 +554,7 @@
|
||||
"MonitorMovie": "Film Monitorozása",
|
||||
"MonitoredOnly": "Csak a Megfigyelt",
|
||||
"MonitoredHelpText": "Töltse le a filmet, ha elérhető",
|
||||
"Monitored": "Monitorozva",
|
||||
"Monitored": "Felügyelt",
|
||||
"Monitor": "Monitorozni",
|
||||
"Mode": "Mód",
|
||||
"MissingNotMonitored": "Hiányzó (nincs Monitorozva)",
|
||||
@@ -710,7 +709,6 @@
|
||||
"ImportRootPath": "Mutasd meg a Radarr-nak a filmeket tartalmazó főmappádat, ne egy adott filmmappát. Például. {0} és nem {1}. Ezenkívül minden filmnek a saját mappában kell lennie a gyökér / könyvtár mappában.",
|
||||
"ImportMovies": "Filmek Importálása",
|
||||
"ImportMechanismHealthCheckMessage": "Engedélyezd a befejezett letöltés(ek) kezelését",
|
||||
"ImportListSyncIntervalHelpText": "A Radarr milyen gyakran szinkronizáljon a listáival. A minimum érték 6 óra",
|
||||
"ImportListStatusCheckSingleClientMessage": "A listák nem érhetőek el a következő hiba miatt: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "Az összes lista elérhetetlen, hiba miatt",
|
||||
"Importing": "Importálás Folyamatban",
|
||||
@@ -825,7 +823,7 @@
|
||||
"ChmodFolderHelpText": "Octal, importáláskor / átnevezéskor alkalmazva a média mappákra és fájlokra (bitek végrehajtása nélkül)",
|
||||
"ChmodFolder": "chmod Mappa",
|
||||
"ErrorRestoringBackup": "Hiba a mentés visszaállítása közben",
|
||||
"Enabled": "Engedélyezve",
|
||||
"Enabled": "Engedélyezés",
|
||||
"EditQualityProfile": "Minőség profil szerkesztése",
|
||||
"EditListExclusion": "Kivételek listájának szerkesztése",
|
||||
"EditGroups": "Csoportok szerkesztése",
|
||||
@@ -945,7 +943,7 @@
|
||||
"ReplaceWithDash": "Cserélés kötőjelre",
|
||||
"QualityOrLangCutoffHasNotBeenMet": "A minőség és a nyelv levágása nem sikerült",
|
||||
"OnHealthIssue": "Állapotprobléma",
|
||||
"Required": "Szükséges",
|
||||
"Required": "Kötelező",
|
||||
"Replace": "Kicserél",
|
||||
"RemoveMovieAndKeepFiles": "Film eltávolítása és a fájlok megtartása",
|
||||
"RemoveMovieAndDeleteFiles": "Film eltávolítása és a fájlok törlése",
|
||||
@@ -1068,8 +1066,8 @@
|
||||
"UnableToLoadBlocklist": "Nem sikerült betölteni a feketelistát",
|
||||
"BlocklistReleases": "Feketelistás Kiadás",
|
||||
"IndexerTagHelpText": "Csak olyan filmekhez használja ezt az indexelőt, amelyek legalább egy megfelelő címkével rendelkeznek. Hagyja üresen az összes filmhez való használathoz.",
|
||||
"RemoveSelectedItem": "A kiválasztott elem eltávolítása",
|
||||
"RemoveSelectedItems": "A kijelölt elemek eltávolítása",
|
||||
"RemoveSelectedItem": "Kijelölt elem eltávolítása",
|
||||
"RemoveSelectedItems": "Kijelölt elemek eltávolítása",
|
||||
"RemoveFailed": "Eltávolítás Sikertelen",
|
||||
"RemoveCompleted": "Eltávolítás Kész",
|
||||
"RemoveDownloadsAlert": "Az eltávolításhoz szükséges beállítások átkerültek a fenti táblázatban található egyéni letöltő beállítások közé.",
|
||||
@@ -1148,5 +1146,14 @@
|
||||
"UMask": "UMask",
|
||||
"EditMovies": "Film Szerkesztése",
|
||||
"ShowCinemaReleaseHelpText": "Mutasd a megjelenés dátumát a poszter alatt",
|
||||
"DeleteRemotePathMapping": "Távoli Elérési Útvonal Módosítása"
|
||||
"DeleteRemotePathMapping": "Távoli Elérési Útvonal Módosítása",
|
||||
"RemoveCompletedDownloads": "Befejezett letöltések eltávolítása",
|
||||
"RemoveFailedDownloads": "Sikertelen letöltések eltávolítása",
|
||||
"CloneCondition": "Feltétel klónozása",
|
||||
"DeleteCondition": "Feltétel törlése",
|
||||
"DeleteConditionMessageText": "Biztosan törölni akarod a '{0}' feltételt?",
|
||||
"DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{0}' egyéni formátumot?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {0} elemet a várólistáról?",
|
||||
"RemoveSelectedItemQueueMessageText": "Biztosan el akar távolítani 1 elemet a várólistáról?",
|
||||
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban"
|
||||
}
|
||||
|
||||
@@ -75,7 +75,6 @@
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Engir verðtryggingaraðilar í boði með virka gagnvirka leit, Radarr mun ekki veita neinar gagnvirkar leitarniðurstöður",
|
||||
"InstallLatest": "Settu upp nýjustu",
|
||||
"KeyboardShortcuts": "Flýtilyklar",
|
||||
"ListUpdateInterval": "Tíðni milliliða lista",
|
||||
"LogLevel": "Log Level",
|
||||
"LogOnly": "Aðeins log",
|
||||
"LookingForReleaseProfiles2": "í staðinn.",
|
||||
@@ -473,7 +472,6 @@
|
||||
"AddImportExclusionHelpText": "Koma í veg fyrir að kvikmyndum verði bætt við Radarr af listum",
|
||||
"ImportListStatusCheckAllClientMessage": "Allir listar eru ekki tiltækir vegna bilana",
|
||||
"ImportListStatusCheckSingleClientMessage": "Listar ekki tiltækir vegna bilana: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Hve oft samstillir Radarr við listana þína. Lágmarksgildi 6 klukkustundir",
|
||||
"MovieIsOnImportExclusionList": "Kvikmynd er á lista yfir innflutningsútilokun",
|
||||
"SettingsRuntimeFormat": "Runtime Format",
|
||||
"SettingsShortDateFormat": "Stutt dagsetningarsnið",
|
||||
|
||||
@@ -541,7 +541,6 @@
|
||||
"LoadingMovieFilesFailed": "Caricamento dei file del Film fallito",
|
||||
"LoadingMovieExtraFilesFailed": "Caricamento degli Extra del Film fallito",
|
||||
"LoadingMovieCreditsFailed": "Caricamento dei crediti del film fallito",
|
||||
"ListUpdateInterval": "Intervallo di aggiornamento lista",
|
||||
"ListSyncLevelHelpText": "I Film nella libreria saranno rimossi o non monitorati se non presenti nella tua lista",
|
||||
"ListSettings": "Impostazioni delle Lsite",
|
||||
"LinkHere": "qui",
|
||||
@@ -557,7 +556,6 @@
|
||||
"IncludeHealthWarningsHelpText": "Includi gli avvisi di salute",
|
||||
"IncludeCustomFormatWhenRenaming": "Includi formati personalizzati quando rinomini",
|
||||
"ImportMovies": "Importa Film",
|
||||
"ImportListSyncIntervalHelpText": "Quanto spesso Radarr sincronizza le tue liste. Valore minimo di 6 ore",
|
||||
"Importing": "Importazione",
|
||||
"ImportFailedInterp": "Importazione fallita: {0}",
|
||||
"ImportFailed": "Importazione fallita: {0}",
|
||||
|
||||
@@ -72,7 +72,6 @@
|
||||
"KeepAndUnmonitorMovie": "ムービーの保持と監視解除",
|
||||
"LanguageHelpText": "リリースの言語",
|
||||
"ListSettings": "リスト設定",
|
||||
"ListUpdateInterval": "リストの更新間隔",
|
||||
"MinimumFreeSpaceWhenImportingHelpText": "使用可能なディスク容量がこの量より少ない場合は、インポートを防止してください",
|
||||
"OrganizeModalSuccess": "成功!私の仕事は終わりました。名前を変更するファイルはありません。",
|
||||
"ProxyPasswordHelpText": "ユーザー名とパスワードが必要な場合にのみ入力する必要があります。それ以外の場合は空白のままにします。",
|
||||
@@ -199,7 +198,6 @@
|
||||
"ImportFailed": "インポートに失敗しました:{0}",
|
||||
"ImportHeader": "既存の整理されたライブラリをインポートして、Radarrに映画を追加します",
|
||||
"CouldNotConnectSignalR": "SignalRに接続できませんでした。UIは更新されません",
|
||||
"ImportListSyncIntervalHelpText": "Radarrがリストと同期する頻度。 6時間の最小値",
|
||||
"CreateEmptyMovieFoldersHelpText": "ディスクスキャン中に不足しているムービーフォルダを作成する",
|
||||
"DeleteBackup": "バックアップを削除する",
|
||||
"DeleteCustomFormat": "カスタムフォーマットを削除する",
|
||||
|
||||
@@ -436,7 +436,6 @@
|
||||
"AddImportExclusionHelpText": "영화가 목록별로 Radarr에 추가되지 않도록 방지",
|
||||
"ImportListStatusCheckAllClientMessage": "실패로 인해 모든 목록을 사용할 수 없습니다.",
|
||||
"ImportListStatusCheckSingleClientMessage": "실패로 인해 사용할 수없는 목록 : {0}",
|
||||
"ImportListSyncIntervalHelpText": "Radarr가 목록과 동기화되는 빈도입니다. 최소 6 시간",
|
||||
"TotalSpace": "총 공간",
|
||||
"UpdateCheckStartupNotWritableMessage": "'{1}'사용자가 '{0}'시작 폴더에 쓸 수 없기 때문에 업데이트를 설치할 수 없습니다.",
|
||||
"UpgradeAllowedHelpText": "비활성화 된 자질은 업그레이드되지 않습니다.",
|
||||
@@ -666,7 +665,6 @@
|
||||
"ListSettings": "목록 설정",
|
||||
"ListsSettingsSummary": "가져오기 목록, 목록 제외",
|
||||
"ListSyncLevelHelpText": "목록에없는 경우 라이브러리의 영화가 제거되거나 모니터링되지 않습니다.",
|
||||
"ListUpdateInterval": "목록 업데이트 간격",
|
||||
"LogFiles": "로그 파일",
|
||||
"Logging": "벌채 반출",
|
||||
"LogLevel": "로그 수준",
|
||||
|
||||
@@ -460,7 +460,6 @@
|
||||
"Logs": "Logbestanden",
|
||||
"LogLevel": "Log Niveau",
|
||||
"Local": "Lokaal",
|
||||
"ListUpdateInterval": "Lijst Bijwerken Tussentijd",
|
||||
"ListSettings": "Lijst Instellingen",
|
||||
"Links": "Koppelingen",
|
||||
"IconForCutoffUnmet": "Icoon voor Onbereikte Drempel",
|
||||
@@ -508,7 +507,6 @@
|
||||
"MovieIsOnImportExclusionList": "Film staat op de uitzonderingenlijst voor importeren",
|
||||
"MovieTitleHelpText": "De titel van de uit te sluiten film (kan van alles zijn)",
|
||||
"MovieYearHelpText": "Het jaar van de uit te sluiten film",
|
||||
"ImportListSyncIntervalHelpText": "Hoe vaak Radarr je lijsten synchroniseert. Minimale waarde van 6 uren",
|
||||
"NotificationTriggers": "Melding Reactiestarters",
|
||||
"OnDownloadHelpText": "Bij Importeren",
|
||||
"OnUpgradeHelpText": "Bij Opwaarderen",
|
||||
|
||||
@@ -106,7 +106,6 @@
|
||||
"InteractiveImport": "Interaktywny import",
|
||||
"KeyboardShortcuts": "Skróty klawiszowe",
|
||||
"LinkHere": "tutaj",
|
||||
"ListUpdateInterval": "Interwał aktualizacji listy",
|
||||
"ManualImportSelectQuality": " Import ręczny - wybierz Jakość",
|
||||
"MarkAsFailedMessageText": "Czy na pewno chcesz oznaczyć „{0}” jako nieudany?",
|
||||
"MinimumAvailability": "Minimalna dostępność",
|
||||
@@ -449,7 +448,6 @@
|
||||
"AddImportExclusionHelpText": "Zapobiegaj dodawaniu filmu do Radarr według list",
|
||||
"ImportListStatusCheckAllClientMessage": "Wszystkie listy są niedostępne z powodu błędów",
|
||||
"ImportListStatusCheckSingleClientMessage": "Listy niedostępne z powodu błędów: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Jak często Radarr synchronizuje się z Twoimi listami. Minimalna wartość 6 godzin",
|
||||
"New": "Nowy",
|
||||
"TotalFileSize": "Całkowity rozmiar pliku",
|
||||
"MovieIsOnImportExclusionList": "Film znajduje się na liście wykluczeń z importu",
|
||||
|
||||
@@ -377,7 +377,6 @@
|
||||
"Logs": "Registos",
|
||||
"LogLevel": "Nível de log",
|
||||
"Local": "Local",
|
||||
"ListUpdateInterval": "Intervalo de atualização da lista",
|
||||
"ListSettings": "Ajustes da lista",
|
||||
"Links": "Ligações",
|
||||
"LanguageHelpText": "Idioma das versões",
|
||||
@@ -587,7 +586,6 @@
|
||||
"LastDuration": "Última Duração",
|
||||
"InteractiveSearch": "Pesquisa interativa",
|
||||
"IncludeRadarrRecommendations": "Incluir recomendações do Radarr",
|
||||
"ImportListSyncIntervalHelpText": "Frequência com que o Radarr sincroniza suas listas. Valor mínimo de 6 horas",
|
||||
"ImportListStatusCheckSingleClientMessage": "Listas indisponíveis devido a erros: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "Todas as listas estão indisponíveis devido a erros",
|
||||
"ImportFailedInterp": "Falha na importação: {0}",
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
"ImportRootPath": "Aponte o Radarr para a pasta que contém todos os seus filmes, não um específico. Por exemplo: {0}, e não {1}. Além disso, cada filme deve estar contido em sua própria pasta dentro da pasta raiz/biblioteca.",
|
||||
"ImportMovies": "Importar filmes",
|
||||
"ImportMechanismHealthCheckMessage": "Habilitar Gerenciamento de Download Concluído",
|
||||
"ImportListSyncIntervalHelpText": "A frequência com que o Radarr sincroniza suas listas. Valor mínimo de 6 horas",
|
||||
"ImportListStatusCheckSingleClientMessage": "Listas indisponíveis devido a falhas: {0}",
|
||||
"ImportListStatusCheckAllClientMessage": "Todas as listas estão indisponíveis devido a falhas",
|
||||
"Importing": "Importando",
|
||||
@@ -122,7 +121,7 @@
|
||||
"FileManagement": "Gerenciamento de arquivo",
|
||||
"FileDateHelpText": "Alterar a data do arquivo ao importar/verificar novamente",
|
||||
"FeatureRequests": "Solicitações de recursos",
|
||||
"FailedToLoadQueue": "Falha ao carregar fila",
|
||||
"FailedToLoadQueue": "Falha ao carregar a fila",
|
||||
"FailedToLoadMovieFromAPI": "Falha ao carregar o filme da API",
|
||||
"FailedLoadingSearchResults": "Falha ao carregar os resultados da pesquisa, tente novamente.",
|
||||
"FailedDownloadHandling": "Falha no gerenciamento de download",
|
||||
@@ -439,7 +438,6 @@
|
||||
"LoadingMovieFilesFailed": "Falha ao carregar arquivos do filme",
|
||||
"LoadingMovieExtraFilesFailed": "Falha ao carregar arquivos adicionais do filme",
|
||||
"LoadingMovieCreditsFailed": "Falha ao carregar os créditos do filme",
|
||||
"ListUpdateInterval": "Intervalo de atualização da lista",
|
||||
"ListTagsHelpText": "Os itens na lista de tags serão adicionados com",
|
||||
"ListSyncLevelHelpTextWarning": "Os arquivos de filme serão excluídos permanentemente, o que pode resultar na limpeza de sua biblioteca se suas listas estiverem vazias",
|
||||
"ListSyncLevelHelpText": "Os filmes na biblioteca serão tratados com base na sua seleção se eles caírem ou não aparecerem na(s) sua(s) lista(s)",
|
||||
@@ -962,7 +960,7 @@
|
||||
"UpdateAll": "Atualizar tudo",
|
||||
"UnselectAll": "Deselecionar Todos",
|
||||
"UnsavedChanges": "Alterações não salvas",
|
||||
"Unreleased": "Indisponível",
|
||||
"Unreleased": "Inédito",
|
||||
"UnmonitoredHelpText": "Incluir filmes não monitorados no feed do iCal",
|
||||
"Unmonitored": "Não monitorado",
|
||||
"UnmappedFolders": "Pastas não mapeadas",
|
||||
@@ -1182,5 +1180,8 @@
|
||||
"RemoveSelectedItemsQueueMessageText": "Tem certeza de que deseja remover {0} itens da fila?",
|
||||
"ResetAPIKeyMessageText": "Tem certeza de que deseja redefinir sua chave de API?",
|
||||
"ResetDefinitionTitlesHelpText": "Redefinir títulos da configuração, bem como valores",
|
||||
"ResetQualityDefinitionsMessageText": "Tem certeza de que deseja redefinir as configurações de qualidade?"
|
||||
"ResetQualityDefinitionsMessageText": "Tem certeza de que deseja redefinir as configurações de qualidade?",
|
||||
"Complete": "Completo",
|
||||
"ListWillRefreshEveryInterp": "A lista será atualizada a cada {0}",
|
||||
"ListRefreshInterval": "Intervalo de atualização da lista"
|
||||
}
|
||||
|
||||
@@ -544,7 +544,6 @@
|
||||
"MovieIsDownloadingInterp": "Filmul se descarcă - {0}% {1}",
|
||||
"MovieIsMonitored": "Filmul este monitorizat",
|
||||
"AddImportExclusionHelpText": "Împiedicați ca filmele să fie adăugate la Radarr pe liste",
|
||||
"ImportListSyncIntervalHelpText": "Cât de des se sincronizează Radarr cu listele dvs. Valoare minimă de 6 ore",
|
||||
"MovieIsUnmonitored": "Filmul nu este monitorizat",
|
||||
"MoviesSelectedInterp": "{0} Film (e) selectat (e)",
|
||||
"AddingTag": "Se adaugă etichetă",
|
||||
@@ -787,7 +786,6 @@
|
||||
"Links": "Link-uri",
|
||||
"ListSettings": "Setări listă",
|
||||
"ListSyncLevelHelpText": "Filmele din bibliotecă vor fi eliminate sau monitorizate dacă nu se află în lista dvs.",
|
||||
"ListUpdateInterval": "Interval actualizare listă",
|
||||
"LogLevel": "Nivel jurnal",
|
||||
"LogOnly": "Numai jurnal",
|
||||
"Logs": "Jurnale",
|
||||
|
||||
@@ -162,7 +162,6 @@
|
||||
"Host": "Хост",
|
||||
"Hostname": "Имя хоста",
|
||||
"ICalHttpUrlHelpText": "Скопировать URL или нажать чтобы подписаться, если ваш браузер поддерживает webcal",
|
||||
"ImportListSyncIntervalHelpText": "Как часто синхронизировать с вашими листами. Минимальное значение 6 часов",
|
||||
"EnableInteractiveSearch": "Включить интерактивный поиск",
|
||||
"ExcludeTitle": "Исключить {0}? Radarr не будет автоматически добавлять сканируя лист.",
|
||||
"InCinemasMsg": "Фильмы в кинотеатрах",
|
||||
@@ -216,7 +215,6 @@
|
||||
"LastDuration": "Последняя длительность",
|
||||
"LastWriteTime": "Последнее время записи",
|
||||
"Lists": "Списки",
|
||||
"ListUpdateInterval": "Интервал обновления листа",
|
||||
"LoadingMovieExtraFilesFailed": "Неудачная загрузка дополнительных файлов фильма",
|
||||
"ListTagsHelpText": "Тэги листа будут добавлены с",
|
||||
"LoadingMovieCreditsFailed": "Неудачная загрузка информации о фильме",
|
||||
|
||||
@@ -694,7 +694,6 @@
|
||||
"ImportFailed": "Import misslyckades: {0}",
|
||||
"CouldNotConnectSignalR": "Kunde inte ansluta till SignalR, UI uppdateras inte",
|
||||
"ImportLibrary": "Biblioteksimport",
|
||||
"ImportListSyncIntervalHelpText": "Hur ofta synkroniseras Radarr med dina listor. Minsta värde på 6 timmar",
|
||||
"CreateEmptyMovieFoldersHelpText": "Skapa saknade filmmappar under skivsökning",
|
||||
"DeleteCustomFormat": "Ta bort anpassat format",
|
||||
"DockerUpdater": "uppdatera dockerbehållaren för att ta emot uppdateringen",
|
||||
@@ -870,7 +869,6 @@
|
||||
"LaunchBrowserHelpText": " Öppna en webbläsare och navigera till Radarr-hemsidan vid appstart.",
|
||||
"ListSettings": "Listinställningar",
|
||||
"ListSyncLevelHelpText": "Filmer i biblioteket tas bort eller övervakas om de inte finns i din lista",
|
||||
"ListUpdateInterval": "Intervall för listauppdatering",
|
||||
"LogLevel": "Loggnivå",
|
||||
"LogLevelTraceHelpTextWarning": "Spårloggning bör endast aktiveras tillfälligt",
|
||||
"LogOnly": "Endast logg",
|
||||
|
||||
@@ -382,7 +382,6 @@
|
||||
"ApiKey": "คีย์ API",
|
||||
"Always": "เสมอ",
|
||||
"OnDownloadHelpText": "ในการนำเข้า",
|
||||
"ImportListSyncIntervalHelpText": "Radarr ซิงค์กับรายการของคุณบ่อยเพียงใด ค่าต่ำสุด 6 ชั่วโมง",
|
||||
"OnGrab": "บน Grab",
|
||||
"OnHealthIssue": "เกี่ยวกับปัญหาสุขภาพ",
|
||||
"OnHealthIssueHelpText": "เกี่ยวกับปัญหาสุขภาพ",
|
||||
@@ -742,7 +741,6 @@
|
||||
"Links": "ลิงค์",
|
||||
"Lists": "รายการ",
|
||||
"ListSettings": "การตั้งค่ารายการ",
|
||||
"ListUpdateInterval": "รายการช่วงเวลาอัปเดต",
|
||||
"LogFiles": "ล็อกไฟล์",
|
||||
"Logging": "การบันทึก",
|
||||
"LogLevelTraceHelpTextWarning": "ควรเปิดใช้งานการบันทึกการติดตามชั่วคราวเท่านั้น",
|
||||
|
||||
@@ -473,7 +473,6 @@
|
||||
"WhatsNew": "Ne var ne yok?",
|
||||
"Uptime": "Uptime",
|
||||
"Announced": "Açıklandı",
|
||||
"ImportListSyncIntervalHelpText": "Radarr, listelerinizle ne sıklıkla senkronize olur. 6 saatlik minimum değer",
|
||||
"DeleteBackup": "Yedeklemeyi Sil",
|
||||
"DeletedMsg": "Film TMDb'den silindi",
|
||||
"DeleteListMessageText": "'{0}' listesini silmek istediğinizden emin misiniz?",
|
||||
@@ -851,7 +850,6 @@
|
||||
"Links": "Bağlantılar",
|
||||
"ListSettings": "Liste Ayarları",
|
||||
"ListSyncLevelHelpText": "Kitaplıktaki filmler listenizde yoksa kaldırılacak veya izlenmeyecek",
|
||||
"ListUpdateInterval": "Liste Güncelleme Aralığı",
|
||||
"LogLevel": "Günlük Düzeyi",
|
||||
"LogLevelTraceHelpTextWarning": "İzleme günlük kaydı yalnızca geçici olarak etkinleştirilmelidir",
|
||||
"LogOnly": "Sadece hesap aç",
|
||||
|
||||
@@ -427,7 +427,6 @@
|
||||
"UnsavedChanges": "Незбережені зміни",
|
||||
"Indexers": "Індексатори",
|
||||
"ListTagsHelpText": "Буде додано елементи списку тегів",
|
||||
"ListUpdateInterval": "Інтервал оновлення списку",
|
||||
"LoadingMovieCreditsFailed": "Не вдалося завантажити титри фільму",
|
||||
"MustContain": "Має містити",
|
||||
"PreferUsenet": "Віддавайте перевагу Usenet",
|
||||
@@ -1012,7 +1011,6 @@
|
||||
"IndexerPriority": "Пріоритет індексатора",
|
||||
"ImportListStatusCheckAllClientMessage": "Усі списки недоступні через помилки",
|
||||
"ImportListStatusCheckSingleClientMessage": "Списки недоступні через помилки: {0}",
|
||||
"ImportListSyncIntervalHelpText": "Як часто Radarr синхронізує ваші списки. Мінімальне значення 6 годин",
|
||||
"ImportMechanismHealthCheckMessage": "Увімкнути обробку завершених завантажень",
|
||||
"ImportMovies": "Імпорт фільмів",
|
||||
"ImportNotForDownloads": "Не використовуйте для імпортування завантажень із вашого клієнта завантаження, це лише для існуючих упорядкованих бібліотек, а не для несортованих файлів.",
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
"IndexerRssHealthCheckNoIndexers": "Không có bộ lập chỉ mục nào có đồng bộ RSS được bật, Radarr sẽ không tự động lấy các bản phát hành mới",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Tất cả các trình chỉ mục có khả năng tìm kiếm tạm thời không khả dụng do các lỗi trình lập chỉ mục gần đây",
|
||||
"InteractiveImportErrQuality": "Chất lượng phải được chọn cho mỗi tệp đã chọn",
|
||||
"ListUpdateInterval": "Khoảng thời gian cập nhật danh sách",
|
||||
"LogFiles": "Tệp nhật ký",
|
||||
"Logging": "Ghi nhật ký",
|
||||
"LogLevel": "Mức đăng nhập",
|
||||
@@ -320,7 +319,7 @@
|
||||
"AddCustomFormat": "Thêm định dạng tùy chỉnh",
|
||||
"AddDelayProfile": "Thêm cấu hình trễ",
|
||||
"AddDownloadClient": "Thêm ứng dụng khách tải xuống",
|
||||
"AddedToDownloadQueue": "Đã thêm vào hàng đợi đã tải xuống",
|
||||
"AddedToDownloadQueue": "Đã thêm vào hàng đợi tải xuống",
|
||||
"ClientPriority": "Ưu tiên khách hàng",
|
||||
"AddNotification": "Thêm thông báo",
|
||||
"CustomFormat": "Định dạng tùy chỉnh",
|
||||
@@ -335,7 +334,7 @@
|
||||
"AddRootFolder": "Thêm thư mục gốc",
|
||||
"Medium": "Trung bình",
|
||||
"Minutes": "Phút",
|
||||
"AddToDownloadQueue": "Đã thêm vào hàng đợi tải xuống",
|
||||
"AddToDownloadQueue": "Thêm vào hàng đợi tải xuống",
|
||||
"AfterManualRefresh": "Sau khi làm mới thủ công",
|
||||
"AllFiles": "Tất cả các tệp",
|
||||
"NegateHelpText": "Nếu được chọn, định dạng tùy chỉnh sẽ không áp dụng nếu điều kiện {0} này phù hợp.",
|
||||
@@ -369,16 +368,16 @@
|
||||
"ReleasedMsg": "Phim được phát hành",
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Các tệp trong thùng rác cũ hơn số ngày đã chọn sẽ tự động được dọn dẹp",
|
||||
"AuthBasic": "Cơ bản (Cửa sổ bật lên trình duyệt)",
|
||||
"Announced": "Công bố",
|
||||
"Announced": "Được công bố",
|
||||
"DeleteListMessageText": "Bạn có chắc chắn muốn xóa danh sách '{0}' không?",
|
||||
"AuthForm": "Biểu mẫu (Trang đăng nhập)",
|
||||
"AvailabilityDelayHelpText": "Khoảng thời gian trước hoặc sau ngày khả dụng để tìm kiếm Phim",
|
||||
"BackupIntervalHelpText": "Khoảng thời gian giữa các bản sao lưu tự động",
|
||||
"BackupRetentionHelpText": "Các bản sao lưu tự động cũ hơn khoảng thời gian lưu giữ sẽ tự động được dọn dẹp",
|
||||
"Backups": "Sao lưu",
|
||||
"Backups": "Những bản sao lưu",
|
||||
"BeforeUpdate": "Trước khi cập nhật",
|
||||
"BindAddress": "Địa chỉ ràng buộc",
|
||||
"BindAddressHelpText": "Địa chỉ IP4 hợp lệ hoặc '*' cho tất cả các giao diện",
|
||||
"BindAddressHelpText": "Địa chỉ IP hợp lệ, localhost hoặc '*' cho tất cả các giao diện",
|
||||
"BuiltIn": "Được xây dựng trong",
|
||||
"CalendarOptions": "Tùy chọn lịch",
|
||||
"CancelProcessing": "Hủy xử lý",
|
||||
@@ -396,7 +395,7 @@
|
||||
"ImportExistingMovies": "Nhập phim hiện có",
|
||||
"IndexersSettingsSummary": "Trình lập chỉ mục và hạn chế phát hành",
|
||||
"Age": "Tuổi tác",
|
||||
"Agenda": "Chương trình nghị sự",
|
||||
"Agenda": "Lịch",
|
||||
"AgeWhenGrabbed": "Tuổi (khi nắm lấy)",
|
||||
"All": "Tất cả",
|
||||
"ChmodFolderHelpTextWarning": "Điều này chỉ hoạt động nếu người dùng chạy Radarr là chủ sở hữu của tệp. Tốt hơn là đảm bảo ứng dụng khách tải xuống đặt các quyền đúng cách.",
|
||||
@@ -420,7 +419,6 @@
|
||||
"DownloadClientStatusCheckAllClientMessage": "Tất cả các ứng dụng khách tải xuống không khả dụng do lỗi",
|
||||
"EditGroups": "Chỉnh sửa nhóm",
|
||||
"EditIndexer": "Chỉnh sửa trình lập chỉ mục",
|
||||
"ImportListSyncIntervalHelpText": "Tần suất Radarr đồng bộ với danh sách của bạn. Giá trị tối thiểu là 6 giờ",
|
||||
"CreateEmptyMovieFoldersHelpText": "Tạo thư mục phim bị thiếu trong quá trình quét đĩa",
|
||||
"DeletedMsg": "Phim đã bị xóa khỏi TMDb",
|
||||
"DeleteMovieFolderLabel": "Xóa thư mục phim",
|
||||
@@ -502,7 +500,7 @@
|
||||
"MovieIsUnmonitored": "Phim không được giám sát",
|
||||
"AddNewMovie": "Thêm phim mới",
|
||||
"AddList": "Thêm vào danh sách",
|
||||
"Added": "Thêm",
|
||||
"Added": "Đã thêm",
|
||||
"Actions": "Hành động",
|
||||
"About": "Trong khoảng",
|
||||
"Movies": "Phim",
|
||||
@@ -528,7 +526,7 @@
|
||||
"NoUpdatesAreAvailable": "Không có bản cập nhật nào có sẵn",
|
||||
"OAuthPopupMessage": "Cửa sổ bật lên đang bị trình duyệt của bạn chặn",
|
||||
"BypassProxyForLocalAddresses": "Bỏ qua proxy cho địa chỉ cục bộ",
|
||||
"CertificateValidationHelpText": "Thay đổi cách xác thực chứng chỉ HTTPS nghiêm ngặt",
|
||||
"CertificateValidationHelpText": "Thay đổi cách xác thực chứng chỉ HTTPS nghiêm ngặt. Không được đổi nếu bạn biết rõ về",
|
||||
"FailedDownloadHandling": "Xử lý tải xuống không thành công",
|
||||
"Failed": "Thất bại",
|
||||
"Events": "Sự kiện",
|
||||
@@ -542,7 +540,7 @@
|
||||
"PackageVersion": "Phiên bản gói",
|
||||
"Columns": "Cột",
|
||||
"Component": "Thành phần",
|
||||
"AnalyticsEnabledHelpText": "Gửi thông tin sử dụng và lỗi ẩn danh đến máy chủ của Radarr. Điều này bao gồm thông tin về trình duyệt của bạn, trang WebUI của Radarr mà bạn sử dụng, báo cáo lỗi cũng như hệ điều hành và phiên bản thời gian chạy. Chúng tôi sẽ sử dụng thông tin này để ưu tiên các tính năng và sửa lỗi.",
|
||||
"AnalyticsEnabledHelpText": "Gửi thông tin sử dụng và lỗi ẩn danh đến máy chủ của Radarr. Điều này bao gồm thông tin về trình duyệt của bạn, những trang WebUI của Radarr mà bạn sử dụng, báo cáo lỗi cũng như hệ điều hành và phiên bản thời gian chạy. Chúng tôi sẽ sử dụng thông tin này để ưu tiên các tính năng và sửa lỗi.",
|
||||
"AppDataDirectory": "Thư mục AppData",
|
||||
"AsAllDayHelpText": "Sự kiện sẽ xuất hiện dưới dạng sự kiện cả ngày trong lịch của bạn",
|
||||
"Authentication": "Xác thực",
|
||||
@@ -626,15 +624,15 @@
|
||||
"ProfilesSettingsSummary": "Cấu hình Chất lượng, Ngôn ngữ và Độ trễ",
|
||||
"AddRemotePathMapping": "Thêm ánh xạ đường dẫn từ xa",
|
||||
"AlternativeTitle": "Tiêu đề thay thế",
|
||||
"Apply": "Ứng dụng",
|
||||
"Apply": "Áp dụng",
|
||||
"AudioInfo": "Thông tin âm thanh",
|
||||
"BackupNow": "Sao lưu ngay",
|
||||
"Analytics": "phân tích",
|
||||
"AllMoviesHiddenDueToFilter": "Tất cả phim đều bị ẩn do áp dụng bộ lọc.",
|
||||
"Proper": "Thích hợp",
|
||||
"Protocol": "Giao thức",
|
||||
"AppDataLocationHealthCheckMessage": "Việc cập nhật sẽ không thể ngăn việc xóa AppData khi cập nhật",
|
||||
"Certification": "Chứng nhận",
|
||||
"AppDataLocationHealthCheckMessage": "Việc cập nhật sẽ không xảy ra để tránh xóa AppData khi cập nhật",
|
||||
"Certification": "Chứng chỉ",
|
||||
"Calendar": "Lịch",
|
||||
"Cancel": "Huỷ bỏ",
|
||||
"Cast": "Diễn viên",
|
||||
@@ -650,7 +648,7 @@
|
||||
"UpdateCheckStartupNotWritableMessage": "Không thể cài đặt bản cập nhật vì người dùng '{0}' không thể ghi thư mục khởi động '{1}'.",
|
||||
"UpgradeAllowedHelpText": "Nếu chất lượng bị vô hiệu hóa sẽ không được nâng cấp",
|
||||
"Week": "Tuần",
|
||||
"AllowHardcodedSubsHelpText": "Đăng ký mã cứng được phát hiện sẽ được tự động tải xuống",
|
||||
"AllowHardcodedSubsHelpText": "Phụ đề cứng được phát hiện sẽ được tự động tải xuống",
|
||||
"RadarrTags": "Thẻ Radarr",
|
||||
"AlreadyInYourLibrary": "Đã có trong thư viện của bạn",
|
||||
"RefreshAndScan": "Làm mới và quét",
|
||||
@@ -1036,11 +1034,11 @@
|
||||
"DownloadClientCheckDownloadingToRoot": "Tải xuống ứng dụng khách {0} đặt các bản tải xuống trong thư mục gốc {1}. Bạn không nên tải xuống thư mục gốc.",
|
||||
"DeleteFileLabel": "Xóa {0} Tệp Phim",
|
||||
"UnableToAddRootFolder": "Không thể tải các thư mục gốc",
|
||||
"Blocklist": "Danh sách đen",
|
||||
"BlocklistRelease": "Phát hành danh sách đen",
|
||||
"Blocklist": "Danh sách chặn",
|
||||
"BlocklistRelease": "Chặn bản phát hành",
|
||||
"RemoveFromBlocklist": "Xóa khỏi danh sách đen",
|
||||
"UnableToLoadBlocklist": "Không thể tải danh sách đen",
|
||||
"Blocklisted": "Danh sách đen",
|
||||
"Blocklisted": "Bị thêm vào danh sách chặn",
|
||||
"BlocklistReleases": "Phát hành danh sách đen",
|
||||
"Rating": "Xếp hạng",
|
||||
"Filters": "Bộ lọc",
|
||||
@@ -1056,5 +1054,11 @@
|
||||
"File": "Các tập tin",
|
||||
"EditMovies": "Chỉnh sửa phim",
|
||||
"ShowCinemaReleaseHelpText": "Hiển thị ngày phát hành dưới áp phích",
|
||||
"DeleteRemotePathMapping": "Chỉnh sửa ánh xạ đường dẫn từ xa"
|
||||
"DeleteRemotePathMapping": "Chỉnh sửa ánh xạ đường dẫn từ xa",
|
||||
"Auto": "Tự động",
|
||||
"AnnouncedMsg": "Phim đã được công bố",
|
||||
"ApplicationURL": "URL của ứng dụng",
|
||||
"BlocklistHelpText": "Ngăn chặn Radarr không lấy bản phát hành này nữa",
|
||||
"BypassDelayIfHighestQuality": "Bỏ qua nếu chất lượng cao nhất",
|
||||
"ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {0} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config"
|
||||
}
|
||||
|
||||
@@ -565,7 +565,6 @@
|
||||
"AddedToDownloadQueue": "已添加到下载队列",
|
||||
"Added": "已添加",
|
||||
"Actions": "操作",
|
||||
"ImportListSyncIntervalHelpText": "多久Radarr同步一次您的影片列表,最小值为6小时",
|
||||
"IMDb": "IMDb",
|
||||
"PendingChangesDiscardChanges": "舍弃修改并退出",
|
||||
"Pending": "挂起",
|
||||
@@ -841,7 +840,6 @@
|
||||
"AgeWhenGrabbed": "发布时长",
|
||||
"RemoveFailedDownloadsHelpText": "从下载客户端中删除已失败的下载",
|
||||
"PendingChangesStayReview": "留下检查更改",
|
||||
"ListUpdateInterval": "列表更新间隔",
|
||||
"RecycleBinCleanupDaysHelpText": "设置为0关闭自动清理",
|
||||
"SettingsShowRelativeDates": "显示相对日期",
|
||||
"Timeleft": "剩余时间",
|
||||
@@ -1156,5 +1154,18 @@
|
||||
"EditSelectedMovies": "编辑选定的电影",
|
||||
"RecycleBinUnableToWriteHealthCheck": "无法写入配置的回收站文件夹:{0}。确保此路径存在,并且可由运行Radarr的用户写入",
|
||||
"ShowCinemaReleaseHelpText": "在海报下显示发布日期",
|
||||
"DeleteRemotePathMapping": "编辑远程映射路径"
|
||||
"DeleteRemotePathMapping": "编辑远程映射路径",
|
||||
"Complete": "完成",
|
||||
"DeleteCondition": "删除条件",
|
||||
"DeleteConditionMessageText": "是否确实要删除条件“{0}”?",
|
||||
"DeleteDelayProfileMessageText": "是否确实要删除此延迟配置文件?",
|
||||
"DeleteCustomFormatMessageText": "是否确实要删除条件“{0}”?",
|
||||
"DeleteRemotePathMappingMessageText": "是否确实要删除此远程路径映射?",
|
||||
"ImportScriptPath": "导入脚本路径",
|
||||
"ImportUsingScript": "使用脚本导入",
|
||||
"ListRefreshInterval": "列表刷新间隔",
|
||||
"CloneCondition": "克隆条件",
|
||||
"ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作",
|
||||
"DeleteFormatMessageText": "你确定要删除格式标签 “{0}” 吗?",
|
||||
"DeleteImportListExclusionMessageText": "你确定要删除这个导入排除列表吗?"
|
||||
}
|
||||
|
||||
@@ -19,5 +19,93 @@
|
||||
"EditDelayProfile": "新增延時配置",
|
||||
"AddToDownloadQueue": "已添加到下載隊列",
|
||||
"ExportCustomFormat": "新增自定義格式",
|
||||
"ImportCustomFormat": "新增自定義格式"
|
||||
"ImportCustomFormat": "新增自定義格式",
|
||||
"DeleteQualityProfile": "刪除品質設定檔",
|
||||
"AllCollectionsHiddenDueToFilter": "因為使用了篩選器,所有集合將被隱藏。",
|
||||
"CustomFormatHelpText": "Radarr使用匹配的自定義格式的分數總和來評分每個發行版本。如果一個新的發行版本可以在相同或更好的品質下提供更高分數,Radarr將抓取該版本。",
|
||||
"QualityCutoffHasNotBeenMet": "影片還未滿足所選品質",
|
||||
"QualityDefinitions": "品質定義",
|
||||
"AutoRedownloadFailedHelpText": "自動搜尋並嘗試下載不同的版本",
|
||||
"BypassDelayIfHighestQuality": "如果有最高的質量就跳過",
|
||||
"BuiltIn": "內建的",
|
||||
"AddListExclusion": "新增排除清單",
|
||||
"AddMovie": "加入電影",
|
||||
"AddRootFolder": "加入根目錄資料夾",
|
||||
"Quality": "品質",
|
||||
"Auto": "自動",
|
||||
"BypassDelayIfHighestQualityHelpText": "當發行版本具有在品質設定檔中啟用的最高品質以及首選通訊協定時繞過延遲",
|
||||
"ProfilesSettingsSummary": "品質,語言與延遲設定檔",
|
||||
"AnnouncedMsg": "電影已被公布",
|
||||
"AudioInfo": "聲音資訊",
|
||||
"ImportIncludeQuality": "請確保您的文件名中包含品質信息,例如:{0}",
|
||||
"AuthBasic": "基礎(瀏覽器彈出視窗)",
|
||||
"AuthForm": "表單(登入頁面)",
|
||||
"Authentication": "認證",
|
||||
"AuthenticationMethodHelpText": "需要使用者名稱和密碼來存取Radarr",
|
||||
"Automatic": "自動",
|
||||
"AutomaticSearch": "自動搜尋",
|
||||
"AsAllDayHelpText": "在行事曆中,事件將以全天事件的形式顯示",
|
||||
"AvailabilityDelayHelpText": "在可用日期之前或之後搜索電影的次數",
|
||||
"BlocklistReleases": "封鎖清單版本",
|
||||
"ApplicationURL": "應用程式 URL",
|
||||
"ApplicationUrlHelpText": "這個應用程式的外部網址,包括http(s)://、端口和URL Base。",
|
||||
"AvailabilityDelay": "可用性延遲(Availability Delay)",
|
||||
"Backup": "備份",
|
||||
"CutoffHelpText": "一旦達到此品質,Radarr將不再下載該電影",
|
||||
"ApplyTagsHelpTexts2": "新增:將這些標籤加入現有的標籤清單中",
|
||||
"ApplyTagsHelpTexts3": "移除:刪除輸入的標籤",
|
||||
"ApplyTagsHelpTexts4": "取代:用輸入的標籤替換現有的標籤(如果不輸入任何標籤,則清除所有標籤)",
|
||||
"AptUpdater": "使用apt安裝更新",
|
||||
"ApplyTagsHelpTexts1": "如何對選中的電影套用標籤",
|
||||
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "從磁碟中刪除的電影將自動在Radarr中取消監控",
|
||||
"BackupFolderHelpText": "相對路徑將位於Radarr的AppData目錄下",
|
||||
"Blocklist": "封鎖清單",
|
||||
"BlocklistHelpText": "防止Radarr自動再次抓取此版本",
|
||||
"BlocklistRelease": "封鎖清單版本",
|
||||
"Blocklisted": "已封鎖",
|
||||
"Branch": "分支",
|
||||
"BranchUpdate": "用於更新Radarr的分支",
|
||||
"BranchUpdateMechanism": "外部更新機制使用的分支",
|
||||
"BackupIntervalHelpText": "自動備份時間間隔",
|
||||
"BackupNow": "馬上備份",
|
||||
"BackupRetentionHelpText": "超過保留期的自動備份將被自動清理",
|
||||
"Backups": "備份",
|
||||
"BeforeUpdate": "在更新前",
|
||||
"BindAddress": "綁定地址(Bind Address)",
|
||||
"BindAddressHelpText": "有效的IP地址,本地主機(localhost)或者「*」以表示所有介面。",
|
||||
"ClickToChangeQuality": "點擊以更改品質",
|
||||
"InteractiveImportErrQuality": "必須為每個選定的文件選擇品質",
|
||||
"ManualImportSelectQuality": " 手動導入-選擇品質",
|
||||
"AllResultsHiddenFilter": "根據所使用的篩選器已將所有結果隱藏",
|
||||
"AllowHardcodedSubs": "允許燒錄的字幕",
|
||||
"AllowHardcodedSubsHelpText": "將會自動下載檢測到有燒錄字幕的影片",
|
||||
"EditQualityProfile": "編輯品質設定檔",
|
||||
"Announced": "已公布",
|
||||
"ApiKey": "API 金鑰",
|
||||
"AddExclusion": "新增列外",
|
||||
"AddImportExclusionHelpText": "防止清單中的電影被添加到 Radarr 中",
|
||||
"AnalyticsEnabledHelpText": "將使用和錯誤資訊匿名傳送至Radarr的伺服器。這些資訊包括您的瀏覽器資訊、使用的Radarr WebUI頁面、錯誤報告,以及作業系統和執行時版本。我們將使用這些資訊來優先處理功能和錯誤修復。",
|
||||
"AddQualityProfile": "加入品質設定檔",
|
||||
"AllFiles": "全部文件",
|
||||
"AddMovies": "加入電影",
|
||||
"AddNew": "加入新的",
|
||||
"AddNewMessage": "加入新的電影很簡單,只需要輸入您想加入的電影名稱",
|
||||
"AddNewMovie": "加入新的電影",
|
||||
"AddNewTmdbIdMessage": "您也可以使用該電影的TMDbID來搜尋。例如「tmdb:71663」",
|
||||
"AddNotification": "加入通知",
|
||||
"AddRemotePathMapping": "加入遠程路徑對應",
|
||||
"AddRestriction": "加入限制",
|
||||
"AfterManualRefresh": "在手動重新整理之後",
|
||||
"Agenda": "日程表",
|
||||
"AllMoviesHiddenDueToFilter": "根據所使用的篩選器已隱藏所有電影。",
|
||||
"AllMoviesInPathHaveBeenImported": "在 {0} 的所有電影已被導入",
|
||||
"AlreadyInYourLibrary": "已經在您的資源庫中",
|
||||
"AlternativeTitle": "其他標題",
|
||||
"Always": "總是",
|
||||
"AnalyseVideoFiles": "分析影像文件",
|
||||
"AppDataDirectory": "AppData 路徑",
|
||||
"AppDataLocationHealthCheckMessage": "為了避免在更新過程中刪除AppData,將無法進行更新。",
|
||||
"Apply": "套用",
|
||||
"ApplyTags": "套用標籤",
|
||||
"ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{0}個字元長。您可以通過設定或配置文件進行此操作。"
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace NzbDrone.Core.Movies.Collections
|
||||
public List<MediaCover.MediaCover> Images { get; set; }
|
||||
public DateTime Added { get; set; }
|
||||
public List<MovieMetadata> Movies { get; set; }
|
||||
public HashSet<int> Tags { get; set; }
|
||||
|
||||
public void ApplyChanges(MovieCollection otherCollection)
|
||||
{
|
||||
@@ -35,6 +36,7 @@ namespace NzbDrone.Core.Movies.Collections
|
||||
QualityProfileId = otherCollection.QualityProfileId;
|
||||
MinimumAvailability = otherCollection.MinimumAvailability;
|
||||
RootFolderPath = otherCollection.RootFolderPath;
|
||||
Tags = otherCollection.Tags;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user