From f446a06cc3605803c008967e2b529e104c2cccc9 Mon Sep 17 00:00:00 2001 From: Mika Cohen Date: Thu, 23 Apr 2026 15:15:29 -0600 Subject: [PATCH] Refresh tracked downloads on edit events --- .../TrackedDownloadServiceFixture.cs | 97 +++++++++++++------ .../TrackedDownloadService.cs | 38 +++----- 2 files changed, 83 insertions(+), 52 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/TrackedDownloads/TrackedDownloadServiceFixture.cs b/src/NzbDrone.Core.Test/Download/TrackedDownloads/TrackedDownloadServiceFixture.cs index 0ab88375a4..b1e8deb19c 100644 --- a/src/NzbDrone.Core.Test/Download/TrackedDownloads/TrackedDownloadServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Download/TrackedDownloads/TrackedDownloadServiceFixture.cs @@ -89,38 +89,15 @@ private void GivenTrackedDownloadCanBeMapped() }); } - [Test] - public void should_reuse_stable_queued_downloading_tracked_download() + [TestCase(DownloadItemStatus.Queued)] + [TestCase(DownloadItemStatus.Paused)] + public void should_reuse_stable_waiting_downloading_tracked_download(DownloadItemStatus status) { GivenTrackedDownloadCanBeMapped(); var client = CreateDownloadClient(); - var item = CreateDownloadItem(DownloadItemStatus.Queued); - var updatedItem = CreateDownloadItem(DownloadItemStatus.Queued); - updatedItem.RemainingSize = 250; - - var trackedDownload = Subject.TrackDownload(client, item); - var refreshedTrackedDownload = Subject.TrackDownload(client, updatedItem); - - trackedDownload.State.Should().Be(TrackedDownloadState.Downloading); - refreshedTrackedDownload.Should().BeSameAs(trackedDownload); - refreshedTrackedDownload.DownloadItem.Should().BeSameAs(updatedItem); - - Mocker.GetMock() - .Verify(s => s.FindByDownloadId(It.IsAny()), Times.Once()); - - Mocker.GetMock() - .Verify(s => s.Map(It.IsAny(), It.IsAny(), It.IsAny(), null), Times.Once()); - } - - [Test] - public void should_reuse_stable_paused_downloading_tracked_download() - { - GivenTrackedDownloadCanBeMapped(); - - var client = CreateDownloadClient(); - var item = CreateDownloadItem(DownloadItemStatus.Paused); - var updatedItem = CreateDownloadItem(DownloadItemStatus.Paused); + var item = CreateDownloadItem(status); + var updatedItem = CreateDownloadItem(status); updatedItem.RemainingSize = 250; var trackedDownload = Subject.TrackDownload(client, item); @@ -409,6 +386,70 @@ public void should_unmap_tracked_download_if_movie_deleted() trackedDownloads.First().RemoteMovie.Should().BeNull(); } + [Test] + public void should_update_tracked_download_when_movie_edited() + { + var originalMovie = new Movie { Id = 3, TmdbId = 10, Title = "A Movie" }; + var updatedMovie = new Movie { Id = 3, TmdbId = 10, Title = "A Movie Updated" }; + + var remoteMovie = new RemoteMovie + { + Movie = originalMovie, + ParsedMovieInfo = new ParsedMovieInfo + { + MovieTitles = { "A Movie" }, + Year = 1998 + } + }; + + var updatedRemoteMovie = new RemoteMovie + { + Movie = updatedMovie, + ParsedMovieInfo = new ParsedMovieInfo + { + MovieTitles = { "A Movie" }, + Year = 1998 + } + }; + + Mocker.GetMock() + .SetupSequence(s => s.Map(It.IsAny(), It.IsAny(), It.IsAny(), null)) + .Returns(remoteMovie) + .Returns(updatedRemoteMovie); + + Mocker.GetMock() + .Setup(s => s.FindByDownloadId(It.IsAny())) + .Returns(new List()); + + var client = new DownloadClientDefinition + { + Id = 1, + Protocol = DownloadProtocol.Torrent + }; + + var item = new DownloadClientItem + { + Title = "A Movie 1998", + DownloadId = "12345", + DownloadClientInfo = new DownloadClientItemClientInfo + { + Id = 1, + Type = "Blackhole", + Name = "Blackhole Client", + Protocol = DownloadProtocol.Torrent + } + }; + + Subject.TrackDownload(client, item); + + Subject.Handle(new MovieEditedEvent(updatedMovie, originalMovie)); + + var trackedDownloads = Subject.GetTrackedDownloads(); + trackedDownloads.Should().HaveCount(1); + trackedDownloads.First().RemoteMovie.Should().BeSameAs(updatedRemoteMovie); + trackedDownloads.First().RemoteMovie.Movie.Title.Should().Be("A Movie Updated"); + } + [Test] public void should_not_throw_when_processing_deleted_movie() { diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs index 51d9754724..a8d969bec7 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/TrackedDownloadService.cs @@ -263,6 +263,16 @@ private void UpdateCachedItem(TrackedDownload trackedDownload) _aggregationService.Augment(trackedDownload.RemoteMovie); } + private void RefreshCachedItems(List cachedItems) + { + if (cachedItems.Any()) + { + cachedItems.ForEach(UpdateCachedItem); + + _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); + } + } + private static TrackedDownloadState GetStateFromHistory(DownloadHistoryEventType eventType) { switch (eventType) @@ -304,12 +314,7 @@ public void Handle(MovieAddedEvent message) message.Movie?.TmdbId == t.RemoteMovie.Movie.TmdbId) .ToList(); - if (cachedItems.Any()) - { - cachedItems.ForEach(UpdateCachedItem); - - _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); - } + RefreshCachedItems(cachedItems); } public void Handle(MovieEditedEvent message) @@ -320,12 +325,7 @@ public void Handle(MovieEditedEvent message) (t.RemoteMovie.Movie.Id == message.Movie?.Id || t.RemoteMovie.Movie.TmdbId == message.Movie?.TmdbId)) .ToList(); - if (cachedItems.Any()) - { - cachedItems.ForEach(UpdateCachedItem); - - _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); - } + RefreshCachedItems(cachedItems); } public void Handle(MoviesBulkEditedEvent message) @@ -336,12 +336,7 @@ public void Handle(MoviesBulkEditedEvent message) message.Movies.Any(m => m.Id == t.RemoteMovie.Movie.Id || m.TmdbId == t.RemoteMovie.Movie.TmdbId)) .ToList(); - if (cachedItems.Any()) - { - cachedItems.ForEach(UpdateCachedItem); - - _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); - } + RefreshCachedItems(cachedItems); } public void Handle(MoviesDeletedEvent message) @@ -352,12 +347,7 @@ public void Handle(MoviesDeletedEvent message) message.Movies.Any(m => m.Id == t.RemoteMovie.Movie.Id || m.TmdbId == t.RemoteMovie.Movie.TmdbId)) .ToList(); - if (cachedItems.Any()) - { - cachedItems.ForEach(UpdateCachedItem); - - _eventAggregator.PublishEvent(new TrackedDownloadRefreshedEvent(GetTrackedDownloads())); - } + RefreshCachedItems(cachedItems); } } }