parent
cd30175308
commit
4bba820e5a
|
@ -25,6 +25,7 @@ import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal'
|
||||||
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
|
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
|
||||||
import SelectSeriesModal from 'InteractiveImport/Series/SelectSeriesModal';
|
import SelectSeriesModal from 'InteractiveImport/Series/SelectSeriesModal';
|
||||||
import SelectSeasonModal from 'InteractiveImport/Season/SelectSeasonModal';
|
import SelectSeasonModal from 'InteractiveImport/Season/SelectSeasonModal';
|
||||||
|
import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal';
|
||||||
import InteractiveImportRow from './InteractiveImportRow';
|
import InteractiveImportRow from './InteractiveImportRow';
|
||||||
import styles from './InteractiveImportModalContent.css';
|
import styles from './InteractiveImportModalContent.css';
|
||||||
|
|
||||||
|
@ -51,6 +52,11 @@ const columns = [
|
||||||
label: 'Episode(s)',
|
label: 'Episode(s)',
|
||||||
isVisible: true
|
isVisible: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'releaseGroup',
|
||||||
|
label: 'Release Group',
|
||||||
|
isVisible: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'quality',
|
name: 'quality',
|
||||||
label: 'Quality',
|
label: 'Quality',
|
||||||
|
@ -94,8 +100,9 @@ const SELECT = 'select';
|
||||||
const SERIES = 'series';
|
const SERIES = 'series';
|
||||||
const SEASON = 'season';
|
const SEASON = 'season';
|
||||||
const EPISODE = 'episode';
|
const EPISODE = 'episode';
|
||||||
const LANGUAGE = 'language';
|
const RELEASE_GROUP = 'releaseGroup';
|
||||||
const QUALITY = 'quality';
|
const QUALITY = 'quality';
|
||||||
|
const LANGUAGE = 'language';
|
||||||
|
|
||||||
class InteractiveImportModalContent extends Component {
|
class InteractiveImportModalContent extends Component {
|
||||||
|
|
||||||
|
@ -231,8 +238,9 @@ class InteractiveImportModalContent extends Component {
|
||||||
{ key: SELECT, value: 'Select...', disabled: true },
|
{ key: SELECT, value: 'Select...', disabled: true },
|
||||||
{ key: SEASON, value: 'Select Season' },
|
{ key: SEASON, value: 'Select Season' },
|
||||||
{ key: EPISODE, value: 'Select Episode(s)' },
|
{ key: EPISODE, value: 'Select Episode(s)' },
|
||||||
{ key: LANGUAGE, value: 'Select Language' },
|
{ key: QUALITY, value: 'Select Quality' },
|
||||||
{ key: QUALITY, value: 'Select Quality' }
|
{ key: RELEASE_GROUP, value: 'Select Release Group' },
|
||||||
|
{ key: LANGUAGE, value: 'Select Language' }
|
||||||
];
|
];
|
||||||
|
|
||||||
if (allowSeriesChange) {
|
if (allowSeriesChange) {
|
||||||
|
@ -400,6 +408,13 @@ class InteractiveImportModalContent extends Component {
|
||||||
onModalClose={this.onSelectModalClose}
|
onModalClose={this.onSelectModalClose}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<SelectReleaseGroupModal
|
||||||
|
isOpen={selectModalOpen === RELEASE_GROUP}
|
||||||
|
ids={selectedIds}
|
||||||
|
releaseGroup=""
|
||||||
|
onModalClose={this.onSelectModalClose}
|
||||||
|
/>
|
||||||
|
|
||||||
<SelectLanguageModal
|
<SelectLanguageModal
|
||||||
isOpen={selectModalOpen === LANGUAGE}
|
isOpen={selectModalOpen === LANGUAGE}
|
||||||
ids={selectedIds}
|
ids={selectedIds}
|
||||||
|
|
|
@ -110,6 +110,7 @@ class InteractiveImportModalContentConnector extends Component {
|
||||||
series,
|
series,
|
||||||
seasonNumber,
|
seasonNumber,
|
||||||
episodes,
|
episodes,
|
||||||
|
releaseGroup,
|
||||||
quality,
|
quality,
|
||||||
language
|
language
|
||||||
} = item;
|
} = item;
|
||||||
|
@ -144,6 +145,7 @@ class InteractiveImportModalContentConnector extends Component {
|
||||||
folderName: item.folderName,
|
folderName: item.folderName,
|
||||||
seriesId: series.id,
|
seriesId: series.id,
|
||||||
episodeIds: episodes.map((e) => e.id),
|
episodeIds: episodes.map((e) => e.id),
|
||||||
|
releaseGroup,
|
||||||
quality,
|
quality,
|
||||||
language,
|
language,
|
||||||
downloadId: this.props.downloadId
|
downloadId: this.props.downloadId
|
||||||
|
|
|
@ -16,6 +16,7 @@ import SelectSeriesModal from 'InteractiveImport/Series/SelectSeriesModal';
|
||||||
import SelectSeasonModal from 'InteractiveImport/Season/SelectSeasonModal';
|
import SelectSeasonModal from 'InteractiveImport/Season/SelectSeasonModal';
|
||||||
import SelectEpisodeModal from 'InteractiveImport/Episode/SelectEpisodeModal';
|
import SelectEpisodeModal from 'InteractiveImport/Episode/SelectEpisodeModal';
|
||||||
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
|
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
|
||||||
|
import SelectReleaseGroupModal from 'InteractiveImport/ReleaseGroup/SelectReleaseGroupModal';
|
||||||
import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal';
|
import SelectLanguageModal from 'InteractiveImport/Language/SelectLanguageModal';
|
||||||
import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder';
|
import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder';
|
||||||
import styles from './InteractiveImportRow.css';
|
import styles from './InteractiveImportRow.css';
|
||||||
|
@ -32,6 +33,7 @@ class InteractiveImportRow extends Component {
|
||||||
isSelectSeriesModalOpen: false,
|
isSelectSeriesModalOpen: false,
|
||||||
isSelectSeasonModalOpen: false,
|
isSelectSeasonModalOpen: false,
|
||||||
isSelectEpisodeModalOpen: false,
|
isSelectEpisodeModalOpen: false,
|
||||||
|
isSelectReleaseGroupModalOpen: false,
|
||||||
isSelectQualityModalOpen: false,
|
isSelectQualityModalOpen: false,
|
||||||
isSelectLanguageModalOpen: false
|
isSelectLanguageModalOpen: false
|
||||||
};
|
};
|
||||||
|
@ -125,6 +127,10 @@ class InteractiveImportRow extends Component {
|
||||||
this.setState({ isSelectEpisodeModalOpen: true });
|
this.setState({ isSelectEpisodeModalOpen: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSelectReleaseGroupPress = () => {
|
||||||
|
this.setState({ isSelectReleaseGroupModalOpen: true });
|
||||||
|
}
|
||||||
|
|
||||||
onSelectQualityPress = () => {
|
onSelectQualityPress = () => {
|
||||||
this.setState({ isSelectQualityModalOpen: true });
|
this.setState({ isSelectQualityModalOpen: true });
|
||||||
}
|
}
|
||||||
|
@ -148,6 +154,11 @@ class InteractiveImportRow extends Component {
|
||||||
this.selectRowAfterChange(changed);
|
this.selectRowAfterChange(changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSelectReleaseGroupModalClose = (changed) => {
|
||||||
|
this.setState({ isSelectReleaseGroupModalOpen: false });
|
||||||
|
this.selectRowAfterChange(changed);
|
||||||
|
}
|
||||||
|
|
||||||
onSelectQualityModalClose = (changed) => {
|
onSelectQualityModalClose = (changed) => {
|
||||||
this.setState({ isSelectQualityModalOpen: false });
|
this.setState({ isSelectQualityModalOpen: false });
|
||||||
this.selectRowAfterChange(changed);
|
this.selectRowAfterChange(changed);
|
||||||
|
@ -171,6 +182,7 @@ class InteractiveImportRow extends Component {
|
||||||
episodes,
|
episodes,
|
||||||
quality,
|
quality,
|
||||||
language,
|
language,
|
||||||
|
releaseGroup,
|
||||||
size,
|
size,
|
||||||
rejections,
|
rejections,
|
||||||
isReprocessing,
|
isReprocessing,
|
||||||
|
@ -182,6 +194,7 @@ class InteractiveImportRow extends Component {
|
||||||
isSelectSeriesModalOpen,
|
isSelectSeriesModalOpen,
|
||||||
isSelectSeasonModalOpen,
|
isSelectSeasonModalOpen,
|
||||||
isSelectEpisodeModalOpen,
|
isSelectEpisodeModalOpen,
|
||||||
|
isSelectReleaseGroupModalOpen,
|
||||||
isSelectQualityModalOpen,
|
isSelectQualityModalOpen,
|
||||||
isSelectLanguageModalOpen
|
isSelectLanguageModalOpen
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
@ -202,6 +215,7 @@ class InteractiveImportRow extends Component {
|
||||||
const showSeriesPlaceholder = isSelected && !series;
|
const showSeriesPlaceholder = isSelected && !series;
|
||||||
const showSeasonNumberPlaceholder = isSelected && !!series && isNaN(seasonNumber) && !isReprocessing;
|
const showSeasonNumberPlaceholder = isSelected && !!series && isNaN(seasonNumber) && !isReprocessing;
|
||||||
const showEpisodeNumbersPlaceholder = isSelected && Number.isInteger(seasonNumber) && !episodes.length;
|
const showEpisodeNumbersPlaceholder = isSelected && Number.isInteger(seasonNumber) && !episodes.length;
|
||||||
|
const showReleaseGroupPlaceholder = isSelected && !releaseGroup;
|
||||||
const showQualityPlaceholder = isSelected && !quality;
|
const showQualityPlaceholder = isSelected && !quality;
|
||||||
const showLanguagePlaceholder = isSelected && !language;
|
const showLanguagePlaceholder = isSelected && !language;
|
||||||
|
|
||||||
|
@ -246,7 +260,6 @@ class InteractiveImportRow extends Component {
|
||||||
|
|
||||||
/> : null
|
/> : null
|
||||||
}
|
}
|
||||||
|
|
||||||
</TableRowCellButton>
|
</TableRowCellButton>
|
||||||
|
|
||||||
<TableRowCellButton
|
<TableRowCellButton
|
||||||
|
@ -259,6 +272,17 @@ class InteractiveImportRow extends Component {
|
||||||
}
|
}
|
||||||
</TableRowCellButton>
|
</TableRowCellButton>
|
||||||
|
|
||||||
|
<TableRowCellButton
|
||||||
|
title="Click to change release group"
|
||||||
|
onPress={this.onSelectReleaseGroupPress}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
showReleaseGroupPlaceholder ?
|
||||||
|
<InteractiveImportRowCellPlaceholder /> :
|
||||||
|
releaseGroup
|
||||||
|
}
|
||||||
|
</TableRowCellButton>
|
||||||
|
|
||||||
<TableRowCellButton
|
<TableRowCellButton
|
||||||
className={styles.quality}
|
className={styles.quality}
|
||||||
title="Click to change quality"
|
title="Click to change quality"
|
||||||
|
@ -354,6 +378,13 @@ class InteractiveImportRow extends Component {
|
||||||
onModalClose={this.onSelectEpisodeModalClose}
|
onModalClose={this.onSelectEpisodeModalClose}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<SelectReleaseGroupModal
|
||||||
|
isOpen={isSelectReleaseGroupModalOpen}
|
||||||
|
ids={[id]}
|
||||||
|
releaseGroup={releaseGroup ?? ''}
|
||||||
|
onModalClose={this.onSelectReleaseGroupModalClose}
|
||||||
|
/>
|
||||||
|
|
||||||
<SelectQualityModal
|
<SelectQualityModal
|
||||||
isOpen={isSelectQualityModalOpen}
|
isOpen={isSelectQualityModalOpen}
|
||||||
ids={[id]}
|
ids={[id]}
|
||||||
|
@ -382,6 +413,7 @@ InteractiveImportRow.propTypes = {
|
||||||
series: PropTypes.object,
|
series: PropTypes.object,
|
||||||
seasonNumber: PropTypes.number,
|
seasonNumber: PropTypes.number,
|
||||||
episodes: PropTypes.arrayOf(PropTypes.object).isRequired,
|
episodes: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
|
releaseGroup: PropTypes.string,
|
||||||
quality: PropTypes.object,
|
quality: PropTypes.object,
|
||||||
language: PropTypes.object,
|
language: PropTypes.object,
|
||||||
size: PropTypes.number.isRequired,
|
size: PropTypes.number.isRequired,
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import Modal from 'Components/Modal/Modal';
|
||||||
|
import SelectReleaseGroupModalContentConnector from './SelectReleaseGroupModalContentConnector';
|
||||||
|
|
||||||
|
class SelectReleaseGroupModal extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
isOpen,
|
||||||
|
onModalClose,
|
||||||
|
...otherProps
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
isOpen={isOpen}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<SelectReleaseGroupModalContentConnector
|
||||||
|
{...otherProps}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectReleaseGroupModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool.isRequired,
|
||||||
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SelectReleaseGroupModal;
|
|
@ -0,0 +1,98 @@
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { inputTypes, kinds } from 'Helpers/Props';
|
||||||
|
import Button from 'Components/Link/Button';
|
||||||
|
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 ModalContent from 'Components/Modal/ModalContent';
|
||||||
|
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||||
|
import ModalBody from 'Components/Modal/ModalBody';
|
||||||
|
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||||
|
|
||||||
|
class SelectReleaseGroupModalContent extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
constructor(props, context) {
|
||||||
|
super(props, context);
|
||||||
|
|
||||||
|
const {
|
||||||
|
releaseGroup
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
releaseGroup
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onReleaseGroupChange = ({ value }) => {
|
||||||
|
this.setState({ releaseGroup: value });
|
||||||
|
}
|
||||||
|
|
||||||
|
onReleaseGroupSelect = () => {
|
||||||
|
this.props.onReleaseGroupSelect(this.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
onModalClose
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
releaseGroup
|
||||||
|
} = this.state;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalContent onModalClose={onModalClose}>
|
||||||
|
<ModalHeader>
|
||||||
|
Manual Import - Set Release Group
|
||||||
|
</ModalHeader>
|
||||||
|
|
||||||
|
<ModalBody>
|
||||||
|
<Form>
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>Release Group</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.TEXT}
|
||||||
|
name="releaseGroup"
|
||||||
|
value={releaseGroup}
|
||||||
|
onChange={this.onReleaseGroupChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
</Form>
|
||||||
|
</ModalBody>
|
||||||
|
|
||||||
|
<ModalFooter>
|
||||||
|
<Button onPress={onModalClose}>
|
||||||
|
Cancel
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
kind={kinds.SUCCESS}
|
||||||
|
onPress={this.onReleaseGroupSelect}
|
||||||
|
>
|
||||||
|
Set Release Group
|
||||||
|
</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectReleaseGroupModalContent.propTypes = {
|
||||||
|
releaseGroup: PropTypes.string.isRequired,
|
||||||
|
onReleaseGroupSelect: PropTypes.func.isRequired,
|
||||||
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SelectReleaseGroupModalContent;
|
|
@ -0,0 +1,54 @@
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { updateInteractiveImportItems, reprocessInteractiveImportItems } from 'Store/Actions/interactiveImportActions';
|
||||||
|
import SelectReleaseGroupModalContent from './SelectReleaseGroupModalContent';
|
||||||
|
|
||||||
|
const mapDispatchToProps = {
|
||||||
|
dispatchUpdateInteractiveImportItems: updateInteractiveImportItems,
|
||||||
|
dispatchReprocessInteractiveImportItems: reprocessInteractiveImportItems
|
||||||
|
};
|
||||||
|
|
||||||
|
class SelectReleaseGroupModalContentConnector extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onReleaseGroupSelect = ({ releaseGroup }) => {
|
||||||
|
const {
|
||||||
|
ids,
|
||||||
|
dispatchUpdateInteractiveImportItems,
|
||||||
|
dispatchReprocessInteractiveImportItems
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
dispatchUpdateInteractiveImportItems({
|
||||||
|
ids,
|
||||||
|
releaseGroup
|
||||||
|
});
|
||||||
|
|
||||||
|
dispatchReprocessInteractiveImportItems({ ids });
|
||||||
|
|
||||||
|
this.props.onModalClose(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<SelectReleaseGroupModalContent
|
||||||
|
{...this.props}
|
||||||
|
onReleaseGroupSelect={this.onReleaseGroupSelect}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectReleaseGroupModalContentConnector.propTypes = {
|
||||||
|
ids: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||||
|
dispatchUpdateInteractiveImportItems: PropTypes.func.isRequired,
|
||||||
|
dispatchReprocessInteractiveImportItems: PropTypes.func.isRequired,
|
||||||
|
onModalClose: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(null, mapDispatchToProps)(SelectReleaseGroupModalContentConnector);
|
|
@ -175,6 +175,7 @@ export const actionHandlers = handleThunks({
|
||||||
episodeIds: (item.episodes || []).map((e) => e.id),
|
episodeIds: (item.episodes || []).map((e) => e.id),
|
||||||
quality: item.quality,
|
quality: item.quality,
|
||||||
language: item.language,
|
language: item.language,
|
||||||
|
releaseGroup: item.releaseGroup,
|
||||||
downloadId: item.downloadId
|
downloadId: item.downloadId
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
public List<int> EpisodeIds { get; set; }
|
public List<int> EpisodeIds { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
public Language Language { get; set; }
|
public Language Language { get; set; }
|
||||||
|
public string ReleaseGroup { get; set; }
|
||||||
public string DownloadId { get; set; }
|
public string DownloadId { get; set; }
|
||||||
|
|
||||||
public bool Equals(ManualImportFile other)
|
public bool Equals(ManualImportFile other)
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
public List<Episode> Episodes { get; set; }
|
public List<Episode> Episodes { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
public Language Language { get; set; }
|
public Language Language { get; set; }
|
||||||
|
public string ReleaseGroup { get; set; }
|
||||||
public string DownloadId { get; set; }
|
public string DownloadId { get; set; }
|
||||||
public IEnumerable<Rejection> Rejections { get; set; }
|
public IEnumerable<Rejection> Rejections { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
public interface IManualImportService
|
public interface IManualImportService
|
||||||
{
|
{
|
||||||
List<ManualImportItem> GetMediaFiles(string path, string downloadId, int? seriesId, bool filterExistingFiles);
|
List<ManualImportItem> GetMediaFiles(string path, string downloadId, int? seriesId, bool filterExistingFiles);
|
||||||
ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, QualityModel quality, Language language);
|
ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, Language language);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ManualImportService : IExecute<ManualImportCommand>, IManualImportService
|
public class ManualImportService : IExecute<ManualImportCommand>, IManualImportService
|
||||||
|
@ -96,7 +96,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
return ProcessFolder(path, path, downloadId, seriesId, filterExistingFiles);
|
return ProcessFolder(path, path, downloadId, seriesId, filterExistingFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, QualityModel quality, Language language)
|
public ManualImportItem ReprocessItem(string path, string downloadId, int seriesId, int? seasonNumber, List<int> episodeIds, string releaseGroup, QualityModel quality, Language language)
|
||||||
{
|
{
|
||||||
var rootFolder = Path.GetDirectoryName(path);
|
var rootFolder = Path.GetDirectoryName(path);
|
||||||
var series = _seriesService.GetSeries(seriesId);
|
var series = _seriesService.GetSeries(seriesId);
|
||||||
|
@ -115,6 +115,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
SceneSource = SceneSource(series, rootFolder),
|
SceneSource = SceneSource(series, rootFolder),
|
||||||
ExistingFile = series.Path.IsParentPath(path),
|
ExistingFile = series.Path.IsParentPath(path),
|
||||||
Size = _diskProvider.GetFileSize(path),
|
Size = _diskProvider.GetFileSize(path),
|
||||||
|
ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup,
|
||||||
Language = language == Language.Unknown ? LanguageParser.ParseLanguage(path) : language,
|
Language = language == Language.Unknown ? LanguageParser.ParseLanguage(path) : language,
|
||||||
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality
|
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality
|
||||||
};
|
};
|
||||||
|
@ -141,6 +142,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
SceneSource = SceneSource(series, rootFolder),
|
SceneSource = SceneSource(series, rootFolder),
|
||||||
ExistingFile = series.Path.IsParentPath(path),
|
ExistingFile = series.Path.IsParentPath(path),
|
||||||
Size = _diskProvider.GetFileSize(path),
|
Size = _diskProvider.GetFileSize(path),
|
||||||
|
ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup,
|
||||||
Language = language == Language.Unknown ? LanguageParser.ParseLanguage(path) : language,
|
Language = language == Language.Unknown ? LanguageParser.ParseLanguage(path) : language,
|
||||||
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality
|
Quality = quality.Quality == Quality.Unknown ? QualityParser.ParseQuality(path) : quality
|
||||||
};
|
};
|
||||||
|
@ -250,7 +252,9 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
{
|
{
|
||||||
var localEpisode = new LocalEpisode();
|
var localEpisode = new LocalEpisode();
|
||||||
localEpisode.Path = file;
|
localEpisode.Path = file;
|
||||||
|
localEpisode.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
|
||||||
localEpisode.Quality = QualityParser.ParseQuality(file);
|
localEpisode.Quality = QualityParser.ParseQuality(file);
|
||||||
|
localEpisode.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
|
||||||
localEpisode.Language = LanguageParser.ParseLanguage(file);
|
localEpisode.Language = LanguageParser.ParseLanguage(file);
|
||||||
localEpisode.Size = _diskProvider.GetFileSize(file);
|
localEpisode.Size = _diskProvider.GetFileSize(file);
|
||||||
|
|
||||||
|
@ -350,6 +354,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item.ReleaseGroup = decision.LocalEpisode.ReleaseGroup;
|
||||||
item.Quality = decision.LocalEpisode.Quality;
|
item.Quality = decision.LocalEpisode.Quality;
|
||||||
item.Language = decision.LocalEpisode.Language;
|
item.Language = decision.LocalEpisode.Language;
|
||||||
item.Size = _diskProvider.GetFileSize(decision.LocalEpisode.Path);
|
item.Size = _diskProvider.GetFileSize(decision.LocalEpisode.Path);
|
||||||
|
@ -382,6 +387,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
Episodes = episodes,
|
Episodes = episodes,
|
||||||
FileEpisodeInfo = fileEpisodeInfo,
|
FileEpisodeInfo = fileEpisodeInfo,
|
||||||
Path = file.Path,
|
Path = file.Path,
|
||||||
|
ReleaseGroup = file.ReleaseGroup,
|
||||||
Quality = file.Quality,
|
Quality = file.Quality,
|
||||||
Language = file.Language,
|
Language = file.Language,
|
||||||
Series = series,
|
Series = series,
|
||||||
|
@ -405,6 +411,7 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
|
||||||
// Apply the user-chosen values.
|
// Apply the user-chosen values.
|
||||||
localEpisode.Series = series;
|
localEpisode.Series = series;
|
||||||
localEpisode.Episodes = episodes;
|
localEpisode.Episodes = episodes;
|
||||||
|
localEpisode.ReleaseGroup = file.ReleaseGroup;
|
||||||
localEpisode.Quality = file.Quality;
|
localEpisode.Quality = file.Quality;
|
||||||
localEpisode.Language = file.Language;
|
localEpisode.Language = file.Language;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Nancy;
|
using Nancy;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Core.Languages;
|
using NzbDrone.Core.Languages;
|
||||||
using NzbDrone.Core.MediaFiles.EpisodeImport.Manual;
|
using NzbDrone.Core.MediaFiles.EpisodeImport.Manual;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
|
@ -39,7 +40,7 @@ namespace Sonarr.Api.V3.ManualImport
|
||||||
|
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
var processedItem = _manualImportService.ReprocessItem(item.Path, item.DownloadId, item.SeriesId, item.SeasonNumber, item.EpisodeIds ?? new List<int>(), item.Quality, item.Language);
|
var processedItem = _manualImportService.ReprocessItem(item.Path, item.DownloadId, item.SeriesId, item.SeasonNumber, item.EpisodeIds ?? new List<int>(), item.ReleaseGroup, item.Quality, item.Language);
|
||||||
|
|
||||||
item.SeasonNumber = processedItem.SeasonNumber;
|
item.SeasonNumber = processedItem.SeasonNumber;
|
||||||
item.Episodes = processedItem.Episodes.ToResource();
|
item.Episodes = processedItem.Episodes.ToResource();
|
||||||
|
@ -56,6 +57,11 @@ namespace Sonarr.Api.V3.ManualImport
|
||||||
item.Quality = processedItem.Quality;
|
item.Quality = processedItem.Quality;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item.ReleaseGroup.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
item.ReleaseGroup = processedItem.ReleaseGroup;
|
||||||
|
}
|
||||||
|
|
||||||
// Clear episode IDs in favour of the full episode
|
// Clear episode IDs in favour of the full episode
|
||||||
item.EpisodeIds = null;
|
item.EpisodeIds = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace Sonarr.Api.V3.ManualImport
|
||||||
public List<int> EpisodeIds { get; set; }
|
public List<int> EpisodeIds { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
public Language Language { get; set; }
|
public Language Language { get; set; }
|
||||||
|
public string ReleaseGroup { get; set; }
|
||||||
public string DownloadId { get; set; }
|
public string DownloadId { get; set; }
|
||||||
|
|
||||||
public IEnumerable<Rejection> Rejections { get; set; }
|
public IEnumerable<Rejection> Rejections { get; set; }
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace Sonarr.Api.V3.ManualImport
|
||||||
public SeriesResource Series { get; set; }
|
public SeriesResource Series { get; set; }
|
||||||
public int? SeasonNumber { get; set; }
|
public int? SeasonNumber { get; set; }
|
||||||
public List<EpisodeResource> Episodes { get; set; }
|
public List<EpisodeResource> Episodes { get; set; }
|
||||||
|
public string ReleaseGroup { get; set; }
|
||||||
public QualityModel Quality { get; set; }
|
public QualityModel Quality { get; set; }
|
||||||
public Language Language { get; set; }
|
public Language Language { get; set; }
|
||||||
public int QualityWeight { get; set; }
|
public int QualityWeight { get; set; }
|
||||||
|
@ -45,6 +46,7 @@ namespace Sonarr.Api.V3.ManualImport
|
||||||
Series = model.Series.ToResource(),
|
Series = model.Series.ToResource(),
|
||||||
SeasonNumber = model.SeasonNumber,
|
SeasonNumber = model.SeasonNumber,
|
||||||
Episodes = model.Episodes.ToResource(),
|
Episodes = model.Episodes.ToResource(),
|
||||||
|
ReleaseGroup = model.ReleaseGroup,
|
||||||
Quality = model.Quality,
|
Quality = model.Quality,
|
||||||
Language = model.Language,
|
Language = model.Language,
|
||||||
//QualityWeight
|
//QualityWeight
|
||||||
|
|
Loading…
Reference in New Issue