New: Add recycle bin path for deleted movies to webhook/custom script

(cherry picked from commit a71d40edba1388d67e4deefd8bfc354a7a83c6b1)

Closes #9674
This commit is contained in:
Mark McDowall 2024-01-20 19:22:07 -08:00 committed by Bogdan
parent 82fb355930
commit 99ab65f790
17 changed files with 58 additions and 33 deletions

View File

@ -176,7 +176,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
public void should_return_ok_on_movie_imported_event()
{
GivenFolderExists(_downloadRootPath);
var importEvent = new MovieFileImportedEvent(new LocalMovie(), new MovieFile(), new List<MovieFile>(), true, new DownloadClientItem());
var importEvent = new MovieFileImportedEvent(new LocalMovie(), new MovieFile(), new List<DeletedMovieFile>(), true, new DownloadClientItem());
Subject.Check(importEvent).ShouldBeOk();
}

View File

@ -91,7 +91,7 @@ namespace NzbDrone.Core.Test.HistoryTests
DownloadId = "abcd"
};
Subject.Handle(new MovieFileImportedEvent(localMovie, movieFile, new List<MovieFile>(), true, downloadClientItem));
Subject.Handle(new MovieFileImportedEvent(localMovie, movieFile, new List<DeletedMovieFile>(), true, downloadClientItem));
Mocker.GetMock<IHistoryRepository>()
.Verify(v => v.Insert(It.Is<MovieHistory>(h => h.SourceTitle == Path.GetFileNameWithoutExtension(localMovie.Path))));

View File

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
@ -33,16 +33,16 @@ namespace NzbDrone.Core.Test.NotificationTests
RelativePath = "moviefile1.mkv"
},
OldMovieFiles = new List<MovieFile>
OldMovieFiles = new List<DeletedMovieFile>
{
new MovieFile
new DeletedMovieFile(new MovieFile
{
RelativePath = "oldmoviefile1.mkv"
},
new MovieFile
}, null),
new DeletedMovieFile(new MovieFile
{
RelativePath = "oldmoviefile2.mkv"
}
}, null)
}
};

View File

@ -28,7 +28,7 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc
_downloadMessage = Builder<DownloadMessage>.CreateNew()
.With(d => d.Movie = movie)
.With(d => d.MovieFile = movieFile)
.With(d => d.OldMovieFiles = new List<MovieFile>())
.With(d => d.OldMovieFiles = new List<DeletedMovieFile>())
.Build();
Subject.Definition = new NotificationDefinition();
@ -40,9 +40,12 @@ namespace NzbDrone.Core.Test.NotificationTests.Xbmc
private void GivenOldFiles()
{
_downloadMessage.OldMovieFiles = Builder<MovieFile>.CreateListOfSize(1)
.Build()
.ToList();
_downloadMessage.OldMovieFiles = Builder<DeletedMovieFile>
.CreateListOfSize(1)
.All()
.WithFactory(() => new DeletedMovieFile(Builder<MovieFile>.CreateNew().Build(), null))
.Build()
.ToList();
Subject.Definition.Settings = new XbmcSettings
{

View File

@ -0,0 +1,14 @@
namespace NzbDrone.Core.MediaFiles
{
public class DeletedMovieFile
{
public string RecycleBinPath { get; set; }
public MovieFile MovieFile { get; set; }
public DeletedMovieFile(MovieFile movieFile, string recycleBinPath)
{
MovieFile = movieFile;
RecycleBinPath = recycleBinPath;
}
}
}

View File

@ -9,12 +9,12 @@ namespace NzbDrone.Core.MediaFiles.Events
{
public LocalMovie MovieInfo { get; private set; }
public MovieFile ImportedMovie { get; private set; }
public List<MovieFile> OldFiles { get; private set; }
public List<DeletedMovieFile> OldFiles { get; private set; }
public bool NewDownload { get; private set; }
public DownloadClientItemClientInfo DownloadClientInfo { get; set; }
public string DownloadId { get; private set; }
public MovieFileImportedEvent(LocalMovie movieInfo, MovieFile importedMovie, List<MovieFile> oldFiles, bool newDownload, DownloadClientItem downloadClientItem)
public MovieFileImportedEvent(LocalMovie movieInfo, MovieFile importedMovie, List<DeletedMovieFile> oldFiles, bool newDownload, DownloadClientItem downloadClientItem)
{
MovieInfo = movieInfo;
ImportedMovie = importedMovie;

View File

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
namespace NzbDrone.Core.MediaFiles
{
@ -6,10 +6,10 @@ namespace NzbDrone.Core.MediaFiles
{
public MovieFileMoveResult()
{
OldFiles = new List<MovieFile>();
OldFiles = new List<DeletedMovieFile>();
}
public MovieFile MovieFile { get; set; }
public List<MovieFile> OldFiles { get; set; }
public List<DeletedMovieFile> OldFiles { get; set; }
}
}

View File

@ -73,7 +73,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport
foreach (var importDecision in qualifiedImports.OrderByDescending(e => e.LocalMovie.Size))
{
var localMovie = importDecision.LocalMovie;
var oldFiles = new List<MovieFile>();
var oldFiles = new List<DeletedMovieFile>();
try
{

View File

@ -14,7 +14,7 @@ namespace NzbDrone.Core.MediaFiles
public interface IRecycleBinProvider
{
void DeleteFolder(string path);
void DeleteFile(string path, string subfolder = "");
string DeleteFile(string path, string subfolder = "");
void Empty();
void Cleanup();
}
@ -66,7 +66,7 @@ namespace NzbDrone.Core.MediaFiles
}
}
public void DeleteFile(string path, string subfolder = "")
public string DeleteFile(string path, string subfolder = "")
{
_logger.Debug("Attempting to send '{0}' to recycling bin", path);
var recyclingBin = _configService.RecycleBin;
@ -82,6 +82,8 @@ namespace NzbDrone.Core.MediaFiles
_diskProvider.DeleteFile(path);
_logger.Debug("File has been permanently deleted: {0}", path);
return null;
}
else
{
@ -128,6 +130,8 @@ namespace NzbDrone.Core.MediaFiles
SetLastWriteTime(destination, DateTime.UtcNow);
_logger.Debug("File has been moved to the recycling bin: {0}", destination);
return destination;
}
}

View File

@ -170,9 +170,9 @@ namespace NzbDrone.Core.MediaFiles
if (oldFiles.Any())
{
environmentVariables.Add("Radarr_DeletedRelativePaths", string.Join("|", oldFiles.Select(e => e.RelativePath)));
environmentVariables.Add("Radarr_DeletedPaths", string.Join("|", oldFiles.Select(e => Path.Combine(movie.Path, e.RelativePath))));
environmentVariables.Add("Radarr_DeletedDateAdded", string.Join("|", oldFiles.Select(e => e.DateAdded)));
environmentVariables.Add("Radarr_DeletedRelativePaths", string.Join("|", oldFiles.Select(e => e.MovieFile.RelativePath)));
environmentVariables.Add("Radarr_DeletedPaths", string.Join("|", oldFiles.Select(e => Path.Combine(movie.Path, e.MovieFile.RelativePath))));
environmentVariables.Add("Radarr_DeletedDateAdded", string.Join("|", oldFiles.Select(e => e.MovieFile.DateAdded)));
}
_logger.Debug("Executing external script: {0}", _configService.ScriptImportPath);

View File

@ -55,14 +55,15 @@ namespace NzbDrone.Core.MediaFiles
{
var movieFilePath = Path.Combine(localMovie.Movie.Path, existingFile.RelativePath);
var subfolder = rootFolder.GetRelativePath(_diskProvider.GetParentFolder(movieFilePath));
string recycleBinPath = null;
if (_diskProvider.FileExists(movieFilePath))
{
_logger.Debug("Removing existing movie file: {0}", existingFile);
_recycleBinProvider.DeleteFile(movieFilePath, subfolder);
recycleBinPath = _recycleBinProvider.DeleteFile(movieFilePath, subfolder);
}
moveFileResult.OldFiles.Add(existingFile);
moveFileResult.OldFiles.Add(new DeletedMovieFile(existingFile, recycleBinPath));
_mediaFileService.Delete(existingFile, DeleteMediaFileReason.Upgrade);
}

View File

@ -143,9 +143,10 @@ namespace NzbDrone.Core.Notifications.CustomScript
if (message.OldMovieFiles.Any())
{
environmentVariables.Add("Radarr_DeletedRelativePaths", string.Join("|", message.OldMovieFiles.Select(e => e.RelativePath)));
environmentVariables.Add("Radarr_DeletedPaths", string.Join("|", message.OldMovieFiles.Select(e => Path.Combine(movie.Path, e.RelativePath))));
environmentVariables.Add("Radarr_DeletedDateAdded", string.Join("|", message.OldMovieFiles.Select(e => e.DateAdded)));
environmentVariables.Add("Radarr_DeletedRelativePaths", string.Join("|", message.OldMovieFiles.Select(e => e.MovieFile.RelativePath)));
environmentVariables.Add("Radarr_DeletedPaths", string.Join("|", message.OldMovieFiles.Select(e => Path.Combine(movie.Path, e.MovieFile.RelativePath))));
environmentVariables.Add("Radarr_DeletedDateAdded", string.Join("|", message.OldMovieFiles.Select(e => e.MovieFile.DateAdded)));
environmentVariables.Add("Radarr_DeletedRecycleBinPaths", string.Join("|", message.OldMovieFiles.Select(e => e.RecycleBinPath ?? string.Empty)));
}
ExecuteScript(environmentVariables);

View File

@ -12,7 +12,7 @@ namespace NzbDrone.Core.Notifications
public Movie Movie { get; set; }
public LocalMovie MovieInfo { get; set; }
public MovieFile MovieFile { get; set; }
public List<MovieFile> OldMovieFiles { get; set; }
public List<DeletedMovieFile> OldMovieFiles { get; set; }
public string SourcePath { get; set; }
public DownloadClientItemClientInfo DownloadClientInfo { get; set; }
public string DownloadId { get; set; }

View File

@ -29,7 +29,7 @@ namespace NzbDrone.Core.Notifications.Synology
{
foreach (var oldFile in message.OldMovieFiles)
{
var fullPath = Path.Combine(message.Movie.Path, oldFile.RelativePath);
var fullPath = Path.Combine(message.Movie.Path, oldFile.MovieFile.RelativePath);
_indexerProxy.DeleteFile(fullPath);
}

View File

@ -66,9 +66,10 @@ namespace NzbDrone.Core.Notifications.Webhook
if (message.OldMovieFiles.Any())
{
payload.DeletedFiles = message.OldMovieFiles.ConvertAll(x =>
new WebhookMovieFile(x)
new WebhookMovieFile(x.MovieFile)
{
Path = Path.Combine(message.Movie.Path, x.RelativePath)
Path = Path.Combine(message.Movie.Path, x.MovieFile.RelativePath),
RecycleBinPath = x.RecycleBinPath
});
}

View File

@ -39,5 +39,6 @@ namespace NzbDrone.Core.Notifications.Webhook
public long Size { get; set; }
public DateTime DateAdded { get; set; }
public WebhookMovieFileMediaInfo MediaInfo { get; set; }
public string RecycleBinPath { get; set; }
}
}

View File

@ -23,7 +23,7 @@ namespace NzbDrone.Core.Parser.Model
public DownloadClientItem DownloadItem { get; set; }
public ParsedMovieInfo FolderMovieInfo { get; set; }
public Movie Movie { get; set; }
public List<MovieFile> OldFiles { get; set; }
public List<DeletedMovieFile> OldFiles { get; set; }
public QualityModel Quality { get; set; }
public List<Language> Languages { get; set; }
public MediaInfoModel MediaInfo { get; set; }