mirror of https://github.com/Sonarr/Sonarr
438 lines
17 KiB
JavaScript
438 lines
17 KiB
JavaScript
import PropTypes from 'prop-types';
|
|
import React, { Component } from 'react';
|
|
import { inputTypes, sizes } from 'Helpers/Props';
|
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
|
import FieldSet from 'Components/FieldSet';
|
|
import PageContent from 'Components/Page/PageContent';
|
|
import PageContentBodyConnector from 'Components/Page/PageContentBodyConnector';
|
|
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
|
|
import Form from 'Components/Form/Form';
|
|
import FormGroup from 'Components/Form/FormGroup';
|
|
import FormLabel from 'Components/Form/FormLabel';
|
|
import FormInputGroup from 'Components/Form/FormInputGroup';
|
|
import RootFoldersConnector from 'RootFolder/RootFoldersConnector';
|
|
import NamingConnector from './Naming/NamingConnector';
|
|
import AddRootFolderConnector from './RootFolder/AddRootFolderConnector';
|
|
|
|
const episodeTitleRequiredOptions = [
|
|
{ key: 'always', value: 'Always' },
|
|
{ key: 'bulkSeasonReleases', value: 'Only for Bulk Season Releases' },
|
|
{ key: 'never', value: 'Never' }
|
|
];
|
|
|
|
const rescanAfterRefreshOptions = [
|
|
{ key: 'always', value: 'Always' },
|
|
{ key: 'afterManual', value: 'After Manual Refresh' },
|
|
{ key: 'never', value: 'Never' }
|
|
];
|
|
|
|
const downloadPropersAndRepacksOptions = [
|
|
{ key: 'preferAndUpgrade', value: 'Prefer and Upgrade' },
|
|
{ key: 'doNotUpgrade', value: 'Do not Upgrade Automatically' },
|
|
{ key: 'doNotPrefer', value: 'Do not Prefer' }
|
|
];
|
|
|
|
const fileDateOptions = [
|
|
{ key: 'none', value: 'None' },
|
|
{ key: 'localAirDate', value: 'Local Air Date' },
|
|
{ key: 'utcAirDate', value: 'UTC Air Date' }
|
|
];
|
|
|
|
class MediaManagement extends Component {
|
|
|
|
//
|
|
// Render
|
|
|
|
render() {
|
|
const {
|
|
advancedSettings,
|
|
isFetching,
|
|
error,
|
|
settings,
|
|
hasSettings,
|
|
isMono,
|
|
onInputChange,
|
|
onSavePress,
|
|
...otherProps
|
|
} = this.props;
|
|
|
|
return (
|
|
<PageContent title="Media Management Settings">
|
|
<SettingsToolbarConnector
|
|
advancedSettings={advancedSettings}
|
|
{...otherProps}
|
|
onSavePress={onSavePress}
|
|
/>
|
|
|
|
<PageContentBodyConnector>
|
|
<NamingConnector />
|
|
|
|
{
|
|
isFetching &&
|
|
<FieldSet legend="Naming Settings">
|
|
<LoadingIndicator />
|
|
</FieldSet>
|
|
}
|
|
|
|
{
|
|
!isFetching && error &&
|
|
<FieldSet legend="Naming Settings">
|
|
<div>Unable to load Media Management settings</div>
|
|
</FieldSet>
|
|
}
|
|
|
|
{
|
|
hasSettings && !isFetching && !error &&
|
|
<Form
|
|
id="mediaManagementSettings"
|
|
{...otherProps}
|
|
>
|
|
{
|
|
advancedSettings &&
|
|
<FieldSet legend="Folders">
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Create empty series folders</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="createEmptySeriesFolders"
|
|
helpText="Create missing series folders during disk scan"
|
|
onChange={onInputChange}
|
|
{...settings.createEmptySeriesFolders}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Delete empty folders</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="deleteEmptyFolders"
|
|
helpText="Delete empty series and season folders during disk scan and when episode files are deleted"
|
|
onChange={onInputChange}
|
|
{...settings.deleteEmptyFolders}
|
|
/>
|
|
</FormGroup>
|
|
</FieldSet>
|
|
}
|
|
|
|
{
|
|
advancedSettings &&
|
|
<FieldSet
|
|
legend="Importing"
|
|
>
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.SMALL}
|
|
>
|
|
<FormLabel>Episode Title Required</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.SELECT}
|
|
name="episodeTitleRequired"
|
|
helpText="Prevent importing for up to 24 hours if the episode title is in the naming format and the episode title is TBA"
|
|
values={episodeTitleRequiredOptions}
|
|
onChange={onInputChange}
|
|
{...settings.episodeTitleRequired}
|
|
/>
|
|
</FormGroup>
|
|
|
|
{
|
|
isMono &&
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Skip Free Space Check</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="skipFreeSpaceCheckWhenImporting"
|
|
helpText="Use when Sonarr is unable to detect free space from your series root folder"
|
|
onChange={onInputChange}
|
|
{...settings.skipFreeSpaceCheckWhenImporting}
|
|
/>
|
|
</FormGroup>
|
|
}
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Use Hardlinks instead of Copy</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="copyUsingHardlinks"
|
|
helpText="Use Hardlinks when trying to copy files from torrents that are still being seeded"
|
|
helpTextWarning="Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Sonarr's rename function as a work around."
|
|
onChange={onInputChange}
|
|
{...settings.copyUsingHardlinks}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup size={sizes.MEDIUM}>
|
|
<FormLabel>Import Extra Files</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="importExtraFiles"
|
|
helpText="Import matching extra files (subtitles, nfo, etc) after importing an episode file"
|
|
onChange={onInputChange}
|
|
{...settings.importExtraFiles}
|
|
/>
|
|
</FormGroup>
|
|
|
|
{
|
|
settings.importExtraFiles.value &&
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>Import Extra Files</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.TEXT}
|
|
name="extraFileExtensions"
|
|
helpTexts={[
|
|
'Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)',
|
|
'Examples: ".sub, .nfo" or "sub,nfo"'
|
|
]}
|
|
onChange={onInputChange}
|
|
{...settings.extraFileExtensions}
|
|
/>
|
|
</FormGroup>
|
|
}
|
|
</FieldSet>
|
|
}
|
|
|
|
<FieldSet
|
|
legend="File Management"
|
|
>
|
|
<FormGroup size={sizes.MEDIUM}>
|
|
<FormLabel>Ignore Deleted Episodes</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="autoUnmonitorPreviouslyDownloadedEpisodes"
|
|
helpText="Episodes deleted from disk are automatically unmonitored in Sonarr"
|
|
onChange={onInputChange}
|
|
{...settings.autoUnmonitorPreviouslyDownloadedEpisodes}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Propers and Repacks</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.SELECT}
|
|
name="downloadPropersAndRepacks"
|
|
helpTexts={[
|
|
'Whether or not to automatically upgrade to Propers/Repacks',
|
|
'Use \'Do not Prefer\' to sort by preferred word score over propers/repacks'
|
|
]}
|
|
helpTextWarning={
|
|
settings.downloadPropersAndRepacks.value === 'doNotPrefer' ?
|
|
'Use preferred words for automatic upgrades to propers/repacks' :
|
|
undefined
|
|
}
|
|
values={downloadPropersAndRepacksOptions}
|
|
onChange={onInputChange}
|
|
{...settings.downloadPropersAndRepacks}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Analyse video files</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="enableMediaInfo"
|
|
helpText="Extract video information such as resolution, runtime and codec information from files. This requires Sonarr to read parts of the file which may cause high disk or network activity during scans."
|
|
onChange={onInputChange}
|
|
{...settings.enableMediaInfo}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>Rescan Series Folder after Refresh</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.SELECT}
|
|
name="rescanAfterRefresh"
|
|
helpText="Rescan the series folder after refreshing the series"
|
|
helpTextWarning="Sonarr will not automatically detect changes to files when not set to 'Always'"
|
|
values={rescanAfterRefreshOptions}
|
|
onChange={onInputChange}
|
|
{...settings.rescanAfterRefresh}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>Change File Date</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.SELECT}
|
|
name="fileDate"
|
|
helpText="Change file date on import/rescan"
|
|
values={fileDateOptions}
|
|
onChange={onInputChange}
|
|
{...settings.fileDate}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>Recycling Bin</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.PATH}
|
|
name="recycleBin"
|
|
helpText="Episode files will go here when deleted instead of being permanently deleted"
|
|
helpTextWarning="Files in the recycle bin older than a week will be cleaned up automatically"
|
|
onChange={onInputChange}
|
|
{...settings.recycleBin}
|
|
/>
|
|
</FormGroup>
|
|
</FieldSet>
|
|
|
|
{
|
|
advancedSettings && isMono &&
|
|
<FieldSet
|
|
legend="Permissions"
|
|
>
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
size={sizes.MEDIUM}
|
|
>
|
|
<FormLabel>Set Permissions</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.CHECK}
|
|
name="setPermissionsLinux"
|
|
helpText="Should chmod/chown be run when files are imported/renamed?"
|
|
helpTextWarning="If you're unsure what these settings do, do not alter them."
|
|
onChange={onInputChange}
|
|
{...settings.setPermissionsLinux}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>File chmod mode</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.TEXT}
|
|
name="fileChmod"
|
|
helpText="Octal, applied to media files when imported/renamed by Sonarr"
|
|
onChange={onInputChange}
|
|
{...settings.fileChmod}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>Folder chmod mode</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.TEXT}
|
|
name="folderChmod"
|
|
helpText="Octal, applied to series/season folders created by Sonarr"
|
|
values={fileDateOptions}
|
|
onChange={onInputChange}
|
|
{...settings.folderChmod}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>chown User</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.TEXT}
|
|
name="chownUser"
|
|
helpText="Username or uid. Use uid for remote file systems."
|
|
values={fileDateOptions}
|
|
onChange={onInputChange}
|
|
{...settings.chownUser}
|
|
/>
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
advancedSettings={advancedSettings}
|
|
isAdvanced={true}
|
|
>
|
|
<FormLabel>chown Group</FormLabel>
|
|
|
|
<FormInputGroup
|
|
type={inputTypes.TEXT}
|
|
name="chownGroup"
|
|
helpText="Group name or gid. Use gid for remote file systems."
|
|
values={fileDateOptions}
|
|
onChange={onInputChange}
|
|
{...settings.chownGroup}
|
|
/>
|
|
</FormGroup>
|
|
</FieldSet>
|
|
}
|
|
</Form>
|
|
}
|
|
|
|
<FieldSet legend="Root Folders">
|
|
<RootFoldersConnector />
|
|
<AddRootFolderConnector />
|
|
</FieldSet>
|
|
</PageContentBodyConnector>
|
|
</PageContent>
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
MediaManagement.propTypes = {
|
|
advancedSettings: PropTypes.bool.isRequired,
|
|
isFetching: PropTypes.bool.isRequired,
|
|
error: PropTypes.object,
|
|
settings: PropTypes.object.isRequired,
|
|
hasSettings: PropTypes.bool.isRequired,
|
|
isMono: PropTypes.bool.isRequired,
|
|
onSavePress: PropTypes.func.isRequired,
|
|
onInputChange: PropTypes.func.isRequired
|
|
};
|
|
|
|
export default MediaManagement;
|