mirror of
https://github.com/Radarr/Radarr.git
synced 2024-08-16 15:29:40 +02:00
New: Ability to skip redownload when marking an item as failed from Activity Queue
(cherry picked from commit d7025a98deb321397db9a4933cf688b68eafeba9) Closes #8861
This commit is contained in:
parent
97a28fee3b
commit
d8ba7f4d67
@ -44,14 +44,14 @@ class QueueRow extends Component {
|
||||
this.setState({ isRemoveQueueItemModalOpen: true });
|
||||
};
|
||||
|
||||
onRemoveQueueItemModalConfirmed = (blocklist) => {
|
||||
onRemoveQueueItemModalConfirmed = (blocklist, skipRedownload) => {
|
||||
const {
|
||||
onRemoveQueueItemPress,
|
||||
onQueueRowModalOpenOrClose
|
||||
} = this.props;
|
||||
|
||||
onQueueRowModalOpenOrClose(false);
|
||||
onRemoveQueueItemPress(blocklist);
|
||||
onRemoveQueueItemPress(blocklist, skipRedownload);
|
||||
|
||||
this.setState({ isRemoveQueueItemModalOpen: false });
|
||||
};
|
||||
|
@ -22,7 +22,8 @@ class RemoveQueueItemModal extends Component {
|
||||
|
||||
this.state = {
|
||||
remove: true,
|
||||
blocklist: false
|
||||
blocklist: false,
|
||||
skipRedownload: false
|
||||
};
|
||||
}
|
||||
|
||||
@ -32,7 +33,8 @@ class RemoveQueueItemModal extends Component {
|
||||
resetState = function() {
|
||||
this.setState({
|
||||
remove: true,
|
||||
blocklist: false
|
||||
blocklist: false,
|
||||
skipRedownload: false
|
||||
});
|
||||
};
|
||||
|
||||
@ -47,6 +49,10 @@ class RemoveQueueItemModal extends Component {
|
||||
this.setState({ blocklist: value });
|
||||
};
|
||||
|
||||
onSkipRedownloadChange = ({ value }) => {
|
||||
this.setState({ skipRedownload: value });
|
||||
};
|
||||
|
||||
onRemoveConfirmed = () => {
|
||||
const state = this.state;
|
||||
|
||||
@ -70,7 +76,7 @@ class RemoveQueueItemModal extends Component {
|
||||
isPending
|
||||
} = this.props;
|
||||
|
||||
const { remove, blocklist } = this.state;
|
||||
const { remove, blocklist, skipRedownload } = this.state;
|
||||
|
||||
return (
|
||||
<Modal
|
||||
@ -118,6 +124,20 @@ class RemoveQueueItemModal extends Component {
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
blocklist ?
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SkipRedownload')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="skipRedownload"
|
||||
value={skipRedownload}
|
||||
helpText={translate('SkipRedownloadHelpText')}
|
||||
onChange={this.onSkipRedownloadChange}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
|
@ -23,7 +23,8 @@ class RemoveQueueItemsModal extends Component {
|
||||
|
||||
this.state = {
|
||||
remove: true,
|
||||
blocklist: false
|
||||
blocklist: false,
|
||||
skipRedownload: false
|
||||
};
|
||||
}
|
||||
|
||||
@ -33,7 +34,8 @@ class RemoveQueueItemsModal extends Component {
|
||||
resetState = function() {
|
||||
this.setState({
|
||||
remove: true,
|
||||
blocklist: false
|
||||
blocklist: false,
|
||||
skipRedownload: false
|
||||
});
|
||||
};
|
||||
|
||||
@ -48,6 +50,10 @@ class RemoveQueueItemsModal extends Component {
|
||||
this.setState({ blocklist: value });
|
||||
};
|
||||
|
||||
onSkipRedownloadChange = ({ value }) => {
|
||||
this.setState({ skipRedownload: value });
|
||||
};
|
||||
|
||||
onRemoveConfirmed = () => {
|
||||
const state = this.state;
|
||||
|
||||
@ -71,7 +77,7 @@ class RemoveQueueItemsModal extends Component {
|
||||
allPending
|
||||
} = this.props;
|
||||
|
||||
const { remove, blocklist } = this.state;
|
||||
const { remove, blocklist, skipRedownload } = this.state;
|
||||
|
||||
return (
|
||||
<Modal
|
||||
@ -122,6 +128,20 @@ class RemoveQueueItemsModal extends Component {
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
blocklist ?
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SkipRedownload')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="skipRedownload"
|
||||
value={skipRedownload}
|
||||
helpText={translate('SkipRedownloadHelpText')}
|
||||
onChange={this.onSkipRedownloadChange}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
|
@ -371,13 +371,14 @@ export const actionHandlers = handleThunks({
|
||||
const {
|
||||
id,
|
||||
remove,
|
||||
blocklist
|
||||
blocklist,
|
||||
skipRedownload
|
||||
} = payload;
|
||||
|
||||
dispatch(updateItem({ section: paged, id, isRemoving: true }));
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: `/queue/${id}?removeFromClient=${remove}&blocklist=${blocklist}`,
|
||||
url: `/queue/${id}?removeFromClient=${remove}&blocklist=${blocklist}&skipRedownload=${skipRedownload}`,
|
||||
method: 'DELETE'
|
||||
}).request;
|
||||
|
||||
@ -394,7 +395,8 @@ export const actionHandlers = handleThunks({
|
||||
const {
|
||||
ids,
|
||||
remove,
|
||||
blocklist
|
||||
blocklist,
|
||||
skipRedownload
|
||||
} = payload;
|
||||
|
||||
dispatch(batchActions([
|
||||
@ -410,7 +412,7 @@ export const actionHandlers = handleThunks({
|
||||
]));
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: `/queue/bulk?removeFromClient=${remove}&blocklist=${blocklist}`,
|
||||
url: `/queue/bulk?removeFromClient=${remove}&blocklist=${blocklist}&skipRedownload=${skipRedownload}`,
|
||||
method: 'DELETE',
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
|
@ -22,5 +22,6 @@ public DownloadFailedEvent()
|
||||
public Dictionary<string, string> Data { get; set; }
|
||||
public TrackedDownload TrackedDownload { get; set; }
|
||||
public List<Language> Languages { get; set; }
|
||||
public bool SkipRedownload { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -9,8 +9,8 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
public interface IFailedDownloadService
|
||||
{
|
||||
void MarkAsFailed(int historyId);
|
||||
void MarkAsFailed(string downloadId);
|
||||
void MarkAsFailed(int historyId, bool skipRedownload = false);
|
||||
void MarkAsFailed(string downloadId, bool skipRedownload = false);
|
||||
void Check(TrackedDownload trackedDownload);
|
||||
void ProcessFailed(TrackedDownload trackedDownload);
|
||||
}
|
||||
@ -30,14 +30,14 @@ public FailedDownloadService(IHistoryService historyService,
|
||||
_eventAggregator = eventAggregator;
|
||||
}
|
||||
|
||||
public void MarkAsFailed(int historyId)
|
||||
public void MarkAsFailed(int historyId, bool skipRedownload = false)
|
||||
{
|
||||
var history = _historyService.Get(historyId);
|
||||
|
||||
var downloadId = history.DownloadId;
|
||||
if (downloadId.IsNullOrWhiteSpace())
|
||||
{
|
||||
PublishDownloadFailedEvent(new List<MovieHistory> { history }, "Manually marked as failed");
|
||||
PublishDownloadFailedEvent(new List<MovieHistory> { history }, "Manually marked as failed", skipRedownload: skipRedownload);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -57,7 +57,7 @@ public void MarkAsFailed(int historyId)
|
||||
PublishDownloadFailedEvent(grabbedHistory, "Manually marked as failed");
|
||||
}
|
||||
|
||||
public void MarkAsFailed(string downloadId)
|
||||
public void MarkAsFailed(string downloadId, bool skipRedownload = false)
|
||||
{
|
||||
var history = _historyService.Find(downloadId, MovieHistoryEventType.Grabbed);
|
||||
|
||||
@ -65,7 +65,7 @@ public void MarkAsFailed(string downloadId)
|
||||
{
|
||||
var trackedDownload = _trackedDownloadService.Find(downloadId);
|
||||
|
||||
PublishDownloadFailedEvent(history, "Manually marked as failed", trackedDownload);
|
||||
PublishDownloadFailedEvent(history, "Manually marked as failed", trackedDownload, skipRedownload: skipRedownload);
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,7 +125,7 @@ public void ProcessFailed(TrackedDownload trackedDownload)
|
||||
PublishDownloadFailedEvent(grabbedItems, failure, trackedDownload);
|
||||
}
|
||||
|
||||
private void PublishDownloadFailedEvent(List<MovieHistory> historyItems, string message, TrackedDownload trackedDownload = null)
|
||||
private void PublishDownloadFailedEvent(List<MovieHistory> historyItems, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false)
|
||||
{
|
||||
var historyItem = historyItems.First();
|
||||
|
||||
@ -139,7 +139,8 @@ private void PublishDownloadFailedEvent(List<MovieHistory> historyItems, string
|
||||
Message = message,
|
||||
Data = historyItem.Data,
|
||||
TrackedDownload = trackedDownload,
|
||||
Languages = historyItem.Languages
|
||||
Languages = historyItem.Languages,
|
||||
SkipRedownload = skipRedownload
|
||||
};
|
||||
|
||||
_eventAggregator.PublishEvent(downloadFailedEvent);
|
||||
|
@ -26,6 +26,12 @@ public RedownloadFailedDownloadService(IConfigService configService,
|
||||
[EventHandleOrder(EventHandleOrder.Last)]
|
||||
public void Handle(DownloadFailedEvent message)
|
||||
{
|
||||
if (message.SkipRedownload)
|
||||
{
|
||||
_logger.Debug("Skip redownloading requested by user");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_configService.AutoRedownloadFailed)
|
||||
{
|
||||
_logger.Debug("Auto redownloading failed movies is disabled");
|
||||
|
@ -1031,6 +1031,8 @@
|
||||
"SizeOnDisk": "Size on Disk",
|
||||
"SkipFreeSpaceCheck": "Skip Free Space Check",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Use when Radarr is unable to detect free space from your movie root folder",
|
||||
"SkipRedownload": "Skip Redownload",
|
||||
"SkipRedownloadHelpText": "Prevents Radarr from trying to download an alternative release for this item",
|
||||
"Small": "Small",
|
||||
"Socks4": "Socks4",
|
||||
"Socks5": "Socks5 (Support TOR)",
|
||||
|
@ -65,7 +65,7 @@ protected override QueueResource GetResourceById(int id)
|
||||
}
|
||||
|
||||
[RestDeleteById]
|
||||
public void RemoveAction(int id, bool removeFromClient = true, bool blocklist = false)
|
||||
public void RemoveAction(int id, bool removeFromClient = true, bool blocklist = false, bool skipRedownload = false)
|
||||
{
|
||||
var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id);
|
||||
|
||||
@ -83,12 +83,12 @@ public void RemoveAction(int id, bool removeFromClient = true, bool blocklist =
|
||||
throw new NotFoundException();
|
||||
}
|
||||
|
||||
Remove(trackedDownload, removeFromClient, blocklist);
|
||||
Remove(trackedDownload, removeFromClient, blocklist, skipRedownload);
|
||||
_trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId);
|
||||
}
|
||||
|
||||
[HttpDelete("bulk")]
|
||||
public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool removeFromClient = true, [FromQuery] bool blocklist = false)
|
||||
public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool removeFromClient = true, [FromQuery] bool blocklist = false, [FromQuery] bool skipRedownload = false)
|
||||
{
|
||||
var trackedDownloadIds = new List<string>();
|
||||
var pendingToRemove = new List<NzbDrone.Core.Queue.Queue>();
|
||||
@ -119,7 +119,7 @@ public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool
|
||||
|
||||
foreach (var trackedDownload in trackedToRemove.DistinctBy(t => t.DownloadItem.DownloadId))
|
||||
{
|
||||
Remove(trackedDownload, removeFromClient, blocklist);
|
||||
Remove(trackedDownload, removeFromClient, blocklist, skipRedownload);
|
||||
trackedDownloadIds.Add(trackedDownload.DownloadItem.DownloadId);
|
||||
}
|
||||
|
||||
@ -242,7 +242,7 @@ private void Remove(NzbDrone.Core.Queue.Queue pendingRelease)
|
||||
_pendingReleaseService.RemovePendingQueueItems(pendingRelease.Id);
|
||||
}
|
||||
|
||||
private TrackedDownload Remove(TrackedDownload trackedDownload, bool removeFromClient, bool blocklist)
|
||||
private TrackedDownload Remove(TrackedDownload trackedDownload, bool removeFromClient, bool blocklist, bool skipRedownload)
|
||||
{
|
||||
if (removeFromClient)
|
||||
{
|
||||
@ -258,7 +258,7 @@ private TrackedDownload Remove(TrackedDownload trackedDownload, bool removeFromC
|
||||
|
||||
if (blocklist)
|
||||
{
|
||||
_failedDownloadService.MarkAsFailed(trackedDownload.DownloadItem.DownloadId);
|
||||
_failedDownloadService.MarkAsFailed(trackedDownload.DownloadItem.DownloadId, skipRedownload);
|
||||
}
|
||||
|
||||
if (!removeFromClient && !blocklist)
|
||||
|
Loading…
Reference in New Issue
Block a user