|
|
|
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
public interface IFailedDownloadService
|
|
|
|
|
{
|
|
|
|
|
void MarkAsFailed(int historyId, bool skipRedownload = false);
|
|
|
|
|
void MarkAsFailed(string downloadId, bool skipRedownload = false);
|
|
|
|
|
void MarkAsFailed(TrackedDownload trackedDownload, bool skipRedownload = false);
|
|
|
|
|
void Check(TrackedDownload trackedDownload);
|
|
|
|
|
void ProcessFailed(TrackedDownload trackedDownload);
|
|
|
|
|
}
|
|
|
|
@ -20,7 +20,6 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
public class FailedDownloadService : IFailedDownloadService
|
|
|
|
|
{
|
|
|
|
|
private readonly IHistoryService _historyService;
|
|
|
|
|
private readonly ITrackedDownloadService _trackedDownloadService;
|
|
|
|
|
private readonly IEventAggregator _eventAggregator;
|
|
|
|
|
|
|
|
|
|
public FailedDownloadService(IHistoryService historyService,
|
|
|
|
@ -28,7 +27,6 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
IEventAggregator eventAggregator)
|
|
|
|
|
{
|
|
|
|
|
_historyService = historyService;
|
|
|
|
|
_trackedDownloadService = trackedDownloadService;
|
|
|
|
|
_eventAggregator = eventAggregator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -37,9 +35,10 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
var history = _historyService.Get(historyId);
|
|
|
|
|
|
|
|
|
|
var downloadId = history.DownloadId;
|
|
|
|
|
|
|
|
|
|
if (downloadId.IsNullOrWhiteSpace())
|
|
|
|
|
{
|
|
|
|
|
PublishDownloadFailedEvent(new List<EpisodeHistory> { history }, "Manually marked as failed", skipRedownload: skipRedownload);
|
|
|
|
|
PublishDownloadFailedEvent(history, new List<int> { history.EpisodeId }, "Manually marked as failed", skipRedownload: skipRedownload);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -53,21 +52,19 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add any other history items for the download ID then filter out any duplicate history items.
|
|
|
|
|
grabbedHistory.AddRange(_historyService.Find(downloadId, EpisodeHistoryEventType.Grabbed));
|
|
|
|
|
grabbedHistory.AddRange(GetGrabbedHistory(downloadId));
|
|
|
|
|
grabbedHistory = grabbedHistory.DistinctBy(h => h.Id).ToList();
|
|
|
|
|
|
|
|
|
|
PublishDownloadFailedEvent(grabbedHistory, "Manually marked as failed");
|
|
|
|
|
PublishDownloadFailedEvent(history, GetEpisodeIds(grabbedHistory), "Manually marked as failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void MarkAsFailed(string downloadId, bool skipRedownload = false)
|
|
|
|
|
public void MarkAsFailed(TrackedDownload trackedDownload, bool skipRedownload = false)
|
|
|
|
|
{
|
|
|
|
|
var history = _historyService.Find(downloadId, EpisodeHistoryEventType.Grabbed);
|
|
|
|
|
var history = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId);
|
|
|
|
|
|
|
|
|
|
if (history.Any())
|
|
|
|
|
{
|
|
|
|
|
var trackedDownload = _trackedDownloadService.Find(downloadId);
|
|
|
|
|
|
|
|
|
|
PublishDownloadFailedEvent(history, "Manually marked as failed", trackedDownload, skipRedownload: skipRedownload);
|
|
|
|
|
PublishDownloadFailedEvent(history.First(), GetEpisodeIds(history), "Manually marked as failed", trackedDownload, skipRedownload: skipRedownload);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -82,9 +79,7 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
if (trackedDownload.DownloadItem.IsEncrypted ||
|
|
|
|
|
trackedDownload.DownloadItem.Status == DownloadItemStatus.Failed)
|
|
|
|
|
{
|
|
|
|
|
var grabbedItems = _historyService
|
|
|
|
|
.Find(trackedDownload.DownloadItem.DownloadId, EpisodeHistoryEventType.Grabbed)
|
|
|
|
|
.ToList();
|
|
|
|
|
var grabbedItems = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId);
|
|
|
|
|
|
|
|
|
|
if (grabbedItems.Empty())
|
|
|
|
|
{
|
|
|
|
@ -103,9 +98,7 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var grabbedItems = _historyService
|
|
|
|
|
.Find(trackedDownload.DownloadItem.DownloadId, EpisodeHistoryEventType.Grabbed)
|
|
|
|
|
.ToList();
|
|
|
|
|
var grabbedItems = GetGrabbedHistory(trackedDownload.DownloadItem.DownloadId);
|
|
|
|
|
|
|
|
|
|
if (grabbedItems.Empty())
|
|
|
|
|
{
|
|
|
|
@ -124,18 +117,17 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trackedDownload.State = TrackedDownloadState.Failed;
|
|
|
|
|
PublishDownloadFailedEvent(grabbedItems, failure, trackedDownload);
|
|
|
|
|
PublishDownloadFailedEvent(grabbedItems.First(), GetEpisodeIds(grabbedItems), failure, trackedDownload);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PublishDownloadFailedEvent(List<EpisodeHistory> historyItems, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false)
|
|
|
|
|
private void PublishDownloadFailedEvent(EpisodeHistory historyItem, List<int> episodeIds, string message, TrackedDownload trackedDownload = null, bool skipRedownload = false)
|
|
|
|
|
{
|
|
|
|
|
var historyItem = historyItems.Last();
|
|
|
|
|
Enum.TryParse(historyItem.Data.GetValueOrDefault(EpisodeHistory.RELEASE_SOURCE, ReleaseSourceType.Unknown.ToString()), out ReleaseSourceType releaseSource);
|
|
|
|
|
|
|
|
|
|
var downloadFailedEvent = new DownloadFailedEvent
|
|
|
|
|
{
|
|
|
|
|
SeriesId = historyItem.SeriesId,
|
|
|
|
|
EpisodeIds = historyItems.Select(h => h.EpisodeId).Distinct().ToList(),
|
|
|
|
|
EpisodeIds = episodeIds,
|
|
|
|
|
Quality = historyItem.Quality,
|
|
|
|
|
SourceTitle = historyItem.SourceTitle,
|
|
|
|
|
DownloadClient = historyItem.Data.GetValueOrDefault(EpisodeHistory.DOWNLOAD_CLIENT),
|
|
|
|
@ -145,10 +137,23 @@ namespace NzbDrone.Core.Download
|
|
|
|
|
TrackedDownload = trackedDownload,
|
|
|
|
|
Languages = historyItem.Languages,
|
|
|
|
|
SkipRedownload = skipRedownload,
|
|
|
|
|
ReleaseSource = releaseSource
|
|
|
|
|
ReleaseSource = releaseSource,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_eventAggregator.PublishEvent(downloadFailedEvent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<int> GetEpisodeIds(List<EpisodeHistory> historyItems)
|
|
|
|
|
{
|
|
|
|
|
return historyItems.Select(h => h.EpisodeId).Distinct().ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<EpisodeHistory> GetGrabbedHistory(string downloadId)
|
|
|
|
|
{
|
|
|
|
|
// Sort by date so items are always in the same order
|
|
|
|
|
return _historyService.Find(downloadId, EpisodeHistoryEventType.Grabbed)
|
|
|
|
|
.OrderByDescending(h => h.Date)
|
|
|
|
|
.ToList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|