diff --git a/src/NzbDrone.Core/Download/Pending/PendingReleaseService.cs b/src/NzbDrone.Core/Download/Pending/PendingReleaseService.cs index 3f8a39db2..f41cae0d4 100644 --- a/src/NzbDrone.Core/Download/Pending/PendingReleaseService.cs +++ b/src/NzbDrone.Core/Download/Pending/PendingReleaseService.cs @@ -181,63 +181,28 @@ namespace NzbDrone.Core.Download.Pending var nextRssSync = new Lazy(() => _taskManager.GetNextExecution(typeof(RssSyncCommand))); var pendingReleases = IncludeRemoteAlbums(_repository.WithoutFallback()); + foreach (var pendingRelease in pendingReleases) { - foreach (var album in pendingRelease.RemoteAlbum.Albums) + if (pendingRelease.RemoteAlbum.Albums.Empty()) { - var ect = pendingRelease.Release.PublishDate.AddMinutes(GetDelay(pendingRelease.RemoteAlbum)); + var noAlbumItem = GetQueueItem(pendingRelease, nextRssSync, null); - if (ect < nextRssSync.Value) - { - ect = nextRssSync.Value; - } - else - { - ect = ect.AddMinutes(_configService.RssSyncInterval); - } + noAlbumItem.ErrorMessage = "Unable to find matching album(s)"; - var timeleft = ect.Subtract(DateTime.UtcNow); + queued.Add(noAlbumItem); - if (timeleft.TotalSeconds < 0) - { - timeleft = TimeSpan.Zero; - } - - string downloadClientName = null; - var indexer = _indexerFactory.Find(pendingRelease.Release.IndexerId); - - if (indexer is { DownloadClientId: > 0 }) - { - var downloadClient = _downloadClientFactory.Find(indexer.DownloadClientId); - - downloadClientName = downloadClient?.Name; - } + continue; + } - var queue = new Queue.Queue - { - Id = GetQueueId(pendingRelease, album), - Artist = pendingRelease.RemoteAlbum.Artist, - Album = album, - Quality = pendingRelease.RemoteAlbum.ParsedAlbumInfo.Quality, - Title = pendingRelease.Title, - Size = pendingRelease.RemoteAlbum.Release.Size, - Sizeleft = pendingRelease.RemoteAlbum.Release.Size, - RemoteAlbum = pendingRelease.RemoteAlbum, - Timeleft = timeleft, - EstimatedCompletionTime = ect, - Added = pendingRelease.Added, - Status = pendingRelease.Reason.ToString(), - Protocol = pendingRelease.RemoteAlbum.Release.DownloadProtocol, - Indexer = pendingRelease.RemoteAlbum.Release.Indexer, - DownloadClient = downloadClientName - }; - - queued.Add(queue); + foreach (var album in pendingRelease.RemoteAlbum.Albums) + { + queued.Add(GetQueueItem(pendingRelease, nextRssSync, album)); } } // Return best quality release for each album - var deduped = queued.GroupBy(q => q.Album.Id).Select(g => + var deduped = queued.Where(q => q.Album != null).GroupBy(q => q.Album.Id).Select(g => { var artist = g.First().Artist; @@ -330,26 +295,34 @@ namespace NzbDrone.Core.Download.Pending return null; } - List albums; - - if (knownRemoteAlbums != null && knownRemoteAlbums.TryGetValue(release.Release.Title, out var knownRemoteAlbum)) - { - albums = knownRemoteAlbum.Albums; - } - else - { - albums = _parsingService.GetAlbums(release.ParsedAlbumInfo, artist); - } - release.RemoteAlbum = new RemoteAlbum { Artist = artist, - Albums = albums, ReleaseSource = release.AdditionalInfo?.ReleaseSource ?? ReleaseSourceType.Unknown, ParsedAlbumInfo = release.ParsedAlbumInfo, Release = release.Release }; + if (knownRemoteAlbums != null && knownRemoteAlbums.TryGetValue(release.Release.Title, out var knownRemoteAlbum)) + { + release.RemoteAlbum.Albums = knownRemoteAlbum.Albums; + } + else + { + try + { + var remoteAlbums = _parsingService.GetAlbums(release.ParsedAlbumInfo, artist); + + release.RemoteAlbum.Albums = remoteAlbums; + } + catch (InvalidOperationException ex) + { + _logger.Debug(ex, ex.Message); + + release.RemoteAlbum.Albums = new List(); + } + } + _aggregationService.Augment(release.RemoteAlbum); release.RemoteAlbum.CustomFormats = _formatCalculator.ParseCustomFormat(release.RemoteAlbum, release.Release.Size); @@ -359,6 +332,58 @@ namespace NzbDrone.Core.Download.Pending return result; } + private Queue.Queue GetQueueItem(PendingRelease pendingRelease, Lazy nextRssSync, Album album) + { + var ect = pendingRelease.Release.PublishDate.AddMinutes(GetDelay(pendingRelease.RemoteAlbum)); + + if (ect < nextRssSync.Value) + { + ect = nextRssSync.Value; + } + else + { + ect = ect.AddMinutes(_configService.RssSyncInterval); + } + + var timeleft = ect.Subtract(DateTime.UtcNow); + + if (timeleft.TotalSeconds < 0) + { + timeleft = TimeSpan.Zero; + } + + string downloadClientName = null; + var indexer = _indexerFactory.Find(pendingRelease.Release.IndexerId); + + if (indexer is { DownloadClientId: > 0 }) + { + var downloadClient = _downloadClientFactory.Find(indexer.DownloadClientId); + + downloadClientName = downloadClient?.Name; + } + + var queue = new Queue.Queue + { + Id = GetQueueId(pendingRelease, album), + Artist = pendingRelease.RemoteAlbum.Artist, + Album = album, + Quality = pendingRelease.RemoteAlbum.ParsedAlbumInfo.Quality, + Title = pendingRelease.Title, + Size = pendingRelease.RemoteAlbum.Release.Size, + Sizeleft = pendingRelease.RemoteAlbum.Release.Size, + RemoteAlbum = pendingRelease.RemoteAlbum, + Timeleft = timeleft, + EstimatedCompletionTime = ect, + Added = pendingRelease.Added, + Status = pendingRelease.Reason.ToString(), + Protocol = pendingRelease.RemoteAlbum.Release.DownloadProtocol, + Indexer = pendingRelease.RemoteAlbum.Release.Indexer, + DownloadClient = downloadClientName + }; + + return queue; + } + private void Insert(DownloadDecision decision, PendingReleaseReason reason) { _repository.Insert(new PendingRelease @@ -449,7 +474,7 @@ namespace NzbDrone.Core.Download.Pending private int GetQueueId(PendingRelease pendingRelease, Album album) { - return HashConverter.GetHashInt31(string.Format("pending-{0}-album{1}", pendingRelease.Id, album.Id)); + return HashConverter.GetHashInt31(string.Format("pending-{0}-album{1}", pendingRelease.Id, album?.Id ?? 0)); } private int PrioritizeDownloadProtocol(Artist artist, DownloadProtocol downloadProtocol)