import PropTypes from 'prop-types'; import React, { Component } from 'react'; import FieldSet from 'Components/FieldSet'; import SelectInput from 'Components/Form/SelectInput'; import TextInput from 'Components/Form/TextInput'; import Icon from 'Components/Icon'; import Button from 'Components/Link/Button'; import Modal from 'Components/Modal/Modal'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { icons, sizes } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import InlineMarkdown from '../../../Components/Markdown/InlineMarkdown'; import NamingOption from './NamingOption'; import styles from './NamingModal.css'; const separatorOptions = [ { key: ' ', get value() { return `${translate('Space')} ( )`; } }, { key: '.', get value() { return `${translate('Period')} (.)`; } }, { key: '_', get value() { return `${translate('Underscore')} (_)`; } }, { key: '-', get value() { return `${translate('Dash')} (-)`; } } ]; const caseOptions = [ { key: 'title', get value() { return translate('DefaultCase'); } }, { key: 'lower', get value() { return translate('Lowercase'); } }, { key: 'upper', get value() { return translate('Uppercase'); } } ]; const fileNameTokens = [ { token: '{Series Title} - S{season:00}E{episode:00} - {Episode Title} {Quality Full}', example: 'The Series Title\'s! (2010) - S01E01 - Episode Title HDTV-720p Proper' }, { token: '{Series Title} - {season:0}x{episode:00} - {Episode Title} {Quality Full}', example: 'The Series Title\'s! (2010) - 1x01 - Episode Title HDTV-720p Proper' }, { token: '{Series.Title}.S{season:00}E{episode:00}.{EpisodeClean.Title}.{Quality.Full}', example: 'The.Series.Title\'s!.(2010).S01E01.Episode.Title.HDTV-720p' } ]; const seriesTokens = [ { token: '{Series Title}', example: 'The Series Title\'s!' }, { token: '{Series CleanTitle}', example: 'The Series Title\'s!' }, { token: '{Series CleanTitleYear}', example: 'The Series Titles! 2010' }, { token: '{Series CleanTitleWithoutYear}', example: 'The Series Title\'s!' }, { token: '{Series TitleThe}', example: 'Series Title\'s!, The' }, { token: '{Series TitleTheYear}', example: 'Series Title\'s!, The (2010)' }, { token: '{Series TitleTheWithoutYear}', example: 'Series Title\'s!, The' }, { token: '{Series TitleYear}', example: 'The Series Title\'s! (2010)' }, { token: '{Series TitleWithoutYear}', example: 'Series Title\'s!' }, { token: '{Series TitleFirstCharacter}', example: 'S' }, { token: '{Series Year}', example: '2010' } ]; const seriesIdTokens = [ { token: '{ImdbId}', example: 'tt12345' }, { token: '{TvdbId}', example: '12345' }, { token: '{TvMazeId}', example: '54321' } ]; const seasonTokens = [ { token: '{season:0}', example: '1' }, { token: '{season:00}', example: '01' } ]; const episodeTokens = [ { token: '{episode:0}', example: '1' }, { token: '{episode:00}', example: '01' } ]; const airDateTokens = [ { token: '{Air-Date}', example: '2016-03-20' }, { token: '{Air Date}', example: '2016 03 20' } ]; const absoluteTokens = [ { token: '{absolute:0}', example: '1' }, { token: '{absolute:00}', example: '01' }, { token: '{absolute:000}', example: '001' } ]; const episodeTitleTokens = [ { token: '{Episode Title}', example: 'Episode\'s Title' }, { token: '{Episode CleanTitle}', example: 'Episodes Title' } ]; const qualityTokens = [ { token: '{Quality Full}', example: 'WEBDL-1080p Proper' }, { token: '{Quality Title}', example: 'WEBDL-1080p' } ]; const mediaInfoTokens = [ { token: '{MediaInfo Simple}', example: 'x264 DTS' }, { token: '{MediaInfo Full}', example: 'x264 DTS [EN+DE]', footNote: 1 }, { token: '{MediaInfo AudioCodec}', example: 'DTS' }, { token: '{MediaInfo AudioChannels}', example: '5.1' }, { token: '{MediaInfo AudioLanguages}', example: '[EN+DE]', footNote: 1 }, { token: '{MediaInfo SubtitleLanguages}', example: '[DE]', footNote: 1 }, { token: '{MediaInfo VideoCodec}', example: 'x264' }, { token: '{MediaInfo VideoBitDepth}', example: '10' }, { token: '{MediaInfo VideoDynamicRange}', example: 'HDR' }, { token: '{MediaInfo VideoDynamicRangeType}', example: 'DV HDR10' } ]; const otherTokens = [ { token: '{Release Group}', example: 'Rls Grp' }, { token: '{Custom Formats}', example: 'iNTERNAL' } ]; const originalTokens = [ { token: '{Original Title}', example: 'The.Series.Title\'s!.S01E01.WEBDL.1080p.x264-EVOLVE' }, { token: '{Original Filename}', example: 'the.series.title\'s!.s01e01.webdl.1080p.x264-EVOLVE' } ]; class NamingModal extends Component { // // Lifecycle constructor(props, context) { super(props, context); this._selectionStart = null; this._selectionEnd = null; this.state = { separator: ' ', case: 'title' }; } // // Listeners onTokenSeparatorChange = (event) => { this.setState({ separator: event.value }); }; onTokenCaseChange = (event) => { this.setState({ case: event.value }); }; onInputSelectionChange = (selectionStart, selectionEnd) => { this._selectionStart = selectionStart; this._selectionEnd = selectionEnd; }; onOptionPress = ({ isFullFilename, tokenValue }) => { const { name, value, onInputChange } = this.props; const selectionStart = this._selectionStart; const selectionEnd = this._selectionEnd; if (isFullFilename) { onInputChange({ name, value: tokenValue }); } else if (selectionStart == null) { onInputChange({ name, value: `${value}${tokenValue}` }); } else { const start = value.substring(0, selectionStart); const end = value.substring(selectionEnd); const newValue = `${start}${tokenValue}${end}`; onInputChange({ name, value: newValue }); this._selectionStart = newValue.length - 1; this._selectionEnd = newValue.length - 1; } }; // // Render render() { const { name, value, isOpen, advancedSettings, season, episode, anime, additional, onInputChange, onModalClose } = this.props; const { separator: tokenSeparator, case: tokenCase } = this.state; return ( {translate('FileNameTokens')}
{ !advancedSettings &&
{ fileNameTokens.map(({ token, example }) => { return ( ); } ) }
}
{ seriesTokens.map(({ token, example }) => { return ( ); } ) }
{ seriesIdTokens.map(({ token, example }) => { return ( ); } ) }
{ season &&
{ seasonTokens.map(({ token, example }) => { return ( ); } ) }
} { episode &&
{ episodeTokens.map(({ token, example }) => { return ( ); } ) }
{ airDateTokens.map(({ token, example }) => { return ( ); } ) }
{ anime &&
{ absoluteTokens.map(({ token, example }) => { return ( ); } ) }
}
} { additional &&
{ episodeTitleTokens.map(({ token, example }) => { return ( ); } ) }
{ qualityTokens.map(({ token, example }) => { return ( ); } ) }
{ mediaInfoTokens.map(({ token, example, footNote }) => { return ( ); } ) }
{ otherTokens.map(({ token, example }) => { return ( ); } ) }
{ originalTokens.map(({ token, example }) => { return ( ); } ) }
}
); } } NamingModal.propTypes = { name: PropTypes.string.isRequired, value: PropTypes.string.isRequired, isOpen: PropTypes.bool.isRequired, advancedSettings: PropTypes.bool.isRequired, season: PropTypes.bool.isRequired, episode: PropTypes.bool.isRequired, daily: PropTypes.bool.isRequired, anime: PropTypes.bool.isRequired, additional: PropTypes.bool.isRequired, onInputChange: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; NamingModal.defaultProps = { season: false, episode: false, daily: false, anime: false, additional: false }; export default NamingModal;