From 94b481a66f8773ccaa14563222e95092aa8ef850 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 13 Feb 2021 15:24:56 -0800 Subject: [PATCH] New: Include renamed file information for Webhook and Custom Scripts Closes #3927 (cherry picked from commit 3c45349404f59064d1c8db0549401189c456e4c0) --- .../NotificationBaseFixture.cs | 4 +++- .../SynologyIndexerFixture.cs | 4 ++-- .../MediaFiles/Events/MovieRenamedEvent.cs | 7 ++++-- .../MediaFiles/RenameMovieFileService.cs | 22 +++++++++++++------ .../MediaFiles/RenamedMovieFile.cs | 9 ++++++++ .../CustomScript/CustomScript.cs | 8 ++++++- .../Notifications/Discord/Discord.cs | 16 ++++++++++++++ .../Notifications/INotification.cs | 4 +++- .../MediaBrowser/MediaBrowser.cs | 3 ++- .../Notifications/NotificationBase.cs | 3 ++- .../Notifications/NotificationService.cs | 2 +- .../Notifications/Plex/Server/PlexServer.cs | 3 ++- .../Notifications/Slack/Slack.cs | 3 ++- .../Notifications/Synology/SynologyIndexer.cs | 3 ++- .../Notifications/Webhook/Webhook.cs | 6 +++-- .../Webhook/WebhookRenamePayload.cs | 3 +++ .../Webhook/WebhookRenamedMovieFile.cs | 17 ++++++++++++++ src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs | 3 ++- 18 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 src/NzbDrone.Core/MediaFiles/RenamedMovieFile.cs create mode 100644 src/NzbDrone.Core/Notifications/Webhook/WebhookRenamedMovieFile.cs diff --git a/src/NzbDrone.Core.Test/NotificationTests/NotificationBaseFixture.cs b/src/NzbDrone.Core.Test/NotificationTests/NotificationBaseFixture.cs index e8ba8551a..e50435ae2 100644 --- a/src/NzbDrone.Core.Test/NotificationTests/NotificationBaseFixture.cs +++ b/src/NzbDrone.Core.Test/NotificationTests/NotificationBaseFixture.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using FluentAssertions; using FluentValidation.Results; using NUnit.Framework; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.Notifications; using NzbDrone.Core.ThingiProvider; @@ -57,7 +59,7 @@ public override void OnDownload(DownloadMessage message) TestLogger.Info("OnDownload was called"); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { TestLogger.Info("OnRename was called"); } diff --git a/src/NzbDrone.Core.Test/NotificationTests/SynologyIndexerFixture.cs b/src/NzbDrone.Core.Test/NotificationTests/SynologyIndexerFixture.cs index 072a5e3aa..f114e624e 100644 --- a/src/NzbDrone.Core.Test/NotificationTests/SynologyIndexerFixture.cs +++ b/src/NzbDrone.Core.Test/NotificationTests/SynologyIndexerFixture.cs @@ -60,7 +60,7 @@ public void should_not_update_library_if_disabled() { (Subject.Definition.Settings as SynologyIndexerSettings).UpdateLibrary = false; - Subject.OnMovieRename(_movie); + Subject.OnMovieRename(_movie, new List()); Mocker.GetMock() .Verify(v => v.UpdateFolder(_movie.Path), Times.Never()); @@ -90,7 +90,7 @@ public void should_add_new_movie_on_upgrade() [Test] public void should_update_entire_movie_folder_on_rename() { - Subject.OnMovieRename(_movie); + Subject.OnMovieRename(_movie, new List()); Mocker.GetMock() .Verify(v => v.UpdateFolder(@"C:\Test\".AsOsAgnostic()), Times.Once()); diff --git a/src/NzbDrone.Core/MediaFiles/Events/MovieRenamedEvent.cs b/src/NzbDrone.Core/MediaFiles/Events/MovieRenamedEvent.cs index 491677499..ed761c504 100644 --- a/src/NzbDrone.Core/MediaFiles/Events/MovieRenamedEvent.cs +++ b/src/NzbDrone.Core/MediaFiles/Events/MovieRenamedEvent.cs @@ -1,4 +1,5 @@ -using NzbDrone.Common.Messaging; +using System.Collections.Generic; +using NzbDrone.Common.Messaging; using NzbDrone.Core.Movies; namespace NzbDrone.Core.MediaFiles.Events @@ -6,10 +7,12 @@ namespace NzbDrone.Core.MediaFiles.Events public class MovieRenamedEvent : IEvent { public Movie Movie { get; private set; } + public List RenamedFiles { get; private set; } - public MovieRenamedEvent(Movie movie) + public MovieRenamedEvent(Movie movie, List renamedFiles) { Movie = movie; + RenamedFiles = renamedFiles; } } } diff --git a/src/NzbDrone.Core/MediaFiles/RenameMovieFileService.cs b/src/NzbDrone.Core/MediaFiles/RenameMovieFileService.cs index bf7c81f78..71219a955 100644 --- a/src/NzbDrone.Core/MediaFiles/RenameMovieFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/RenameMovieFileService.cs @@ -80,13 +80,14 @@ private IEnumerable GetPreviews(Movie movie, List movieFiles, Movie movie) + private List RenameFiles(List movieFiles, Movie movie) { - var renamed = new List(); + var renamed = new List(); foreach (var movieFile in movieFiles) { - var movieFilePath = Path.Combine(movie.Path, movieFile.RelativePath); + var previousRelativePath = movieFile.RelativePath; + var previousPath = Path.Combine(movie.Path, movieFile.RelativePath); try { @@ -95,11 +96,16 @@ private void RenameFiles(List movieFiles, Movie movie) _mediaFileService.Update(movieFile); _movieService.UpdateMovie(movie); - renamed.Add(movieFile); + renamed.Add(new RenamedMovieFile + { + MovieFile = movieFile, + PreviousRelativePath = previousRelativePath, + PreviousPath = previousPath + }); _logger.Debug("Renamed movie file: {0}", movieFile); - _eventAggregator.PublishEvent(new MovieFileRenamedEvent(movie, movieFile, movieFilePath)); + _eventAggregator.PublishEvent(new MovieFileRenamedEvent(movie, movieFile, previousPath)); } catch (SameFilenameException ex) { @@ -107,7 +113,7 @@ private void RenameFiles(List movieFiles, Movie movie) } catch (Exception ex) { - _logger.Error(ex, "Failed to rename file: {0}", movieFilePath); + _logger.Error(ex, "Failed to rename file: {0}", previousPath); } } @@ -115,8 +121,10 @@ private void RenameFiles(List movieFiles, Movie movie) { _diskProvider.RemoveEmptySubfolders(movie.Path); - _eventAggregator.PublishEvent(new MovieRenamedEvent(movie)); + _eventAggregator.PublishEvent(new MovieRenamedEvent(movie, renamed)); } + + return renamed; } public void Execute(RenameFilesCommand message) diff --git a/src/NzbDrone.Core/MediaFiles/RenamedMovieFile.cs b/src/NzbDrone.Core/MediaFiles/RenamedMovieFile.cs new file mode 100644 index 000000000..088ec7ca3 --- /dev/null +++ b/src/NzbDrone.Core/MediaFiles/RenamedMovieFile.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.MediaFiles +{ + public class RenamedMovieFile + { + public MovieFile MovieFile { get; set; } + public string PreviousPath { get; set; } + public string PreviousRelativePath { get; set; } + } +} diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 7524abe39..6a2b706fe 100755 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -9,6 +9,7 @@ using NzbDrone.Common.Extensions; using NzbDrone.Common.Processes; using NzbDrone.Core.HealthCheck; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.Validation; @@ -100,7 +101,7 @@ public override void OnDownload(DownloadMessage message) ExecuteScript(environmentVariables); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { var environmentVariables = new StringDictionary(); @@ -113,6 +114,11 @@ public override void OnMovieRename(Movie movie) environmentVariables.Add("Radarr_Movie_TmdbId", movie.TmdbId.ToString()); environmentVariables.Add("Radarr_Movie_In_Cinemas_Date", movie.InCinemas.ToString() ?? string.Empty); environmentVariables.Add("Radarr_Movie_Physical_Release_Date", movie.PhysicalRelease.ToString() ?? string.Empty); + environmentVariables.Add("Radarr_MovieFile_Ids", string.Join(",", renamedFiles.Select(e => e.MovieFile.Id))); + environmentVariables.Add("Radarr_MovieFile_RelativePaths", string.Join("|", renamedFiles.Select(e => e.MovieFile.RelativePath))); + environmentVariables.Add("Radarr_MovieFile_Paths", string.Join("|", renamedFiles.Select(e => e.MovieFile.Path))); + environmentVariables.Add("Radarr_MovieFile_PreviousRelativePaths", string.Join("|", renamedFiles.Select(e => e.PreviousRelativePath))); + environmentVariables.Add("Radarr_MovieFile_PreviousPaths", string.Join("|", renamedFiles.Select(e => e.PreviousPath))); ExecuteScript(environmentVariables); } diff --git a/src/NzbDrone.Core/Notifications/Discord/Discord.cs b/src/NzbDrone.Core/Notifications/Discord/Discord.cs index 458859e1d..9f6b69a89 100644 --- a/src/NzbDrone.Core/Notifications/Discord/Discord.cs +++ b/src/NzbDrone.Core/Notifications/Discord/Discord.cs @@ -5,6 +5,7 @@ using FluentValidation.Results; using NzbDrone.Common.Extensions; using NzbDrone.Core.MediaCover; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles.MediaInfo; using NzbDrone.Core.Movies; using NzbDrone.Core.Notifications.Discord.Payloads; @@ -213,6 +214,21 @@ public override void OnDownload(DownloadMessage message) _proxy.SendPayload(payload, Settings); } + public override void OnMovieRename(Movie movie, List renamedFiles) + { + var attachments = new List + { + new Embed + { + Title = movie.Title, + } + }; + + var payload = CreatePayload("Renamed", attachments); + + _proxy.SendPayload(payload, Settings); + } + public override void OnMovieDelete(MovieDeleteMessage deleteMessage) { var movie = deleteMessage.Movie; diff --git a/src/NzbDrone.Core/Notifications/INotification.cs b/src/NzbDrone.Core/Notifications/INotification.cs index 63e897ca9..152e6d5b2 100644 --- a/src/NzbDrone.Core/Notifications/INotification.cs +++ b/src/NzbDrone.Core/Notifications/INotification.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.ThingiProvider; @@ -9,7 +11,7 @@ public interface INotification : IProvider void OnGrab(GrabMessage grabMessage); void OnDownload(DownloadMessage message); - void OnMovieRename(Movie movie); + void OnMovieRename(Movie movie, List renamedFiles); void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage); void OnMovieDelete(MovieDeleteMessage deleteMessage); void OnHealthIssue(HealthCheck.HealthCheck healthCheck); diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs index fa6d1102a..f7365dfb7 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowser.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; namespace NzbDrone.Core.Notifications.Emby @@ -38,7 +39,7 @@ public override void OnDownload(DownloadMessage message) } } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { if (Settings.UpdateLibrary) { diff --git a/src/NzbDrone.Core/Notifications/NotificationBase.cs b/src/NzbDrone.Core/Notifications/NotificationBase.cs index 26e5b994a..ab6503b68 100644 --- a/src/NzbDrone.Core/Notifications/NotificationBase.cs +++ b/src/NzbDrone.Core/Notifications/NotificationBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using FluentValidation.Results; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.ThingiProvider; @@ -44,7 +45,7 @@ public virtual void OnDownload(DownloadMessage message) { } - public virtual void OnMovieRename(Movie movie) + public virtual void OnMovieRename(Movie movie, List renamedFiles) { } diff --git a/src/NzbDrone.Core/Notifications/NotificationService.cs b/src/NzbDrone.Core/Notifications/NotificationService.cs index df7fdd3aa..321b95833 100644 --- a/src/NzbDrone.Core/Notifications/NotificationService.cs +++ b/src/NzbDrone.Core/Notifications/NotificationService.cs @@ -152,7 +152,7 @@ public void Handle(MovieRenamedEvent message) { if (ShouldHandleMovie(notification.Definition, message.Movie)) { - notification.OnMovieRename(message.Movie); + notification.OnMovieRename(message.Movie, message.RenamedFiles); } } catch (Exception ex) diff --git a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServer.cs b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServer.cs index 7ccbff05d..a88f2f3a5 100644 --- a/src/NzbDrone.Core/Notifications/Plex/Server/PlexServer.cs +++ b/src/NzbDrone.Core/Notifications/Plex/Server/PlexServer.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Core.Exceptions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.Notifications.Plex.PlexTv; using NzbDrone.Core.Validation; @@ -43,7 +44,7 @@ public override void OnDownload(DownloadMessage message) UpdateIfEnabled(message.Movie); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { UpdateIfEnabled(movie); } diff --git a/src/NzbDrone.Core/Notifications/Slack/Slack.cs b/src/NzbDrone.Core/Notifications/Slack/Slack.cs index 3bc2e7163..ed79e8e45 100644 --- a/src/NzbDrone.Core/Notifications/Slack/Slack.cs +++ b/src/NzbDrone.Core/Notifications/Slack/Slack.cs @@ -4,6 +4,7 @@ using System.Linq; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.Notifications.Slack.Payloads; using NzbDrone.Core.Validation; @@ -56,7 +57,7 @@ public override void OnDownload(DownloadMessage message) _proxy.SendPayload(payload, Settings); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { var attachments = new List { diff --git a/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs b/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs index c8fb4c121..fe0ae926d 100644 --- a/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs +++ b/src/NzbDrone.Core/Notifications/Synology/SynologyIndexer.cs @@ -3,6 +3,7 @@ using FluentValidation.Results; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Extensions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; namespace NzbDrone.Core.Notifications.Synology @@ -38,7 +39,7 @@ public override void OnDownload(DownloadMessage message) } } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { if (Settings.UpdateLibrary) { diff --git a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs index a8c9fb620..39f91b2f7 100755 --- a/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/Webhook.cs @@ -3,6 +3,7 @@ using System.Linq; using FluentValidation.Results; using NzbDrone.Common.Extensions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; using NzbDrone.Core.Validation; @@ -64,12 +65,13 @@ public override void OnDownload(DownloadMessage message) _proxy.SendWebhook(payload, Settings); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { var payload = new WebhookRenamePayload { EventType = WebhookEventType.Rename, - Movie = new WebhookMovie(movie) + Movie = new WebhookMovie(movie), + RenamedMovieFiles = renamedFiles.ConvertAll(x => new WebhookRenamedMovieFile(x)) }; _proxy.SendWebhook(payload, Settings); diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamePayload.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamePayload.cs index 7f3d9fa8b..1ee849345 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamePayload.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamePayload.cs @@ -1,7 +1,10 @@ +using System.Collections.Generic; + namespace NzbDrone.Core.Notifications.Webhook { public class WebhookRenamePayload : WebhookPayload { public WebhookMovie Movie { get; set; } + public List RenamedMovieFiles { get; set; } } } diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamedMovieFile.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamedMovieFile.cs new file mode 100644 index 000000000..f800f5eff --- /dev/null +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookRenamedMovieFile.cs @@ -0,0 +1,17 @@ +using NzbDrone.Core.MediaFiles; + +namespace NzbDrone.Core.Notifications.Webhook +{ + public class WebhookRenamedMovieFile : WebhookMovieFile + { + public WebhookRenamedMovieFile(RenamedMovieFile renamedMovie) + : base(renamedMovie.MovieFile) + { + PreviousRelativePath = renamedMovie.PreviousRelativePath; + PreviousPath = renamedMovie.PreviousPath; + } + + public string PreviousRelativePath { get; set; } + public string PreviousPath { get; set; } + } +} diff --git a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs index 5421a3ada..5644daf21 100644 --- a/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs +++ b/src/NzbDrone.Core/Notifications/Xbmc/Xbmc.cs @@ -4,6 +4,7 @@ using FluentValidation.Results; using NLog; using NzbDrone.Common.Extensions; +using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Movies; namespace NzbDrone.Core.Notifications.Xbmc @@ -36,7 +37,7 @@ public override void OnDownload(DownloadMessage message) UpdateAndCleanMovie(message.Movie, message.OldMovieFiles.Any()); } - public override void OnMovieRename(Movie movie) + public override void OnMovieRename(Movie movie, List renamedFiles) { UpdateAndCleanMovie(movie); }