Remove usage of exit codes, apply suggestions

This commit is contained in:
Jendrik Weise 2023-09-14 19:11:44 +02:00
parent 818b5356e3
commit 298da8a461
6 changed files with 51 additions and 32 deletions

View File

@ -10,7 +10,7 @@ namespace NzbDrone.Core.Extras
{ {
public interface IExistingExtraFiles public interface IExistingExtraFiles
{ {
List<string> ImportFileList(Series series, List<string> possibleExtraFiles); List<string> ImportExtraFiles(Series series, List<string> possibleExtraFiles);
} }
public class ExistingExtraFileService : IExistingExtraFiles, IHandle<SeriesScannedEvent> public class ExistingExtraFileService : IExistingExtraFiles, IHandle<SeriesScannedEvent>
@ -25,7 +25,7 @@ namespace NzbDrone.Core.Extras
_logger = logger; _logger = logger;
} }
public List<string> ImportFileList(Series series, List<string> possibleExtraFiles) public List<string> ImportExtraFiles(Series series, List<string> possibleExtraFiles)
{ {
_logger.Debug("Looking for existing extra files in {0}", series.Path); _logger.Debug("Looking for existing extra files in {0}", series.Path);
@ -47,7 +47,7 @@ namespace NzbDrone.Core.Extras
var possibleExtraFiles = message.PossibleExtraFiles; var possibleExtraFiles = message.PossibleExtraFiles;
var importedFiles = ImportFileList(series, possibleExtraFiles); var importedFiles = ImportExtraFiles(series, possibleExtraFiles);
_logger.Info("Found {0} possible extra files, imported {1} files.", possibleExtraFiles.Count, importedFiles.Count); _logger.Info("Found {0} possible extra files, imported {1} files.", possibleExtraFiles.Count, importedFiles.Count);
} }

View File

@ -130,7 +130,7 @@ namespace NzbDrone.Core.MediaFiles
try try
{ {
MoveEpisodeFile(episodeFile, series, episodeFile.Episodes); MoveEpisodeFile(episodeFile, series, episodeFile.Episodes);
localEpisode.ImportRenamed = true; localEpisode.FileRenamedAfterScriptImport = true;
} }
catch (SameFilenameException) catch (SameFilenameException)
{ {

View File

@ -135,9 +135,9 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
{ {
if (localEpisode.ScriptImported) if (localEpisode.ScriptImported)
{ {
_existingExtraFiles.ImportFileList(localEpisode.Series, localEpisode.PossibleExtraFiles); _existingExtraFiles.ImportExtraFiles(localEpisode.Series, localEpisode.PossibleExtraFiles);
if (localEpisode.ImportRenamed) if (localEpisode.FileRenamedAfterScriptImport)
{ {
_extraService.MoveFilesAfterRename(localEpisode.Series, episodeFile); _extraService.MoveFilesAfterRename(localEpisode.Series, episodeFile);
} }

View File

@ -47,12 +47,14 @@ namespace NzbDrone.Core.MediaFiles
_logger = logger; _logger = logger;
} }
private static readonly Regex OutputRegex = new Regex(@"^\[(?:(?<mediaFile>MediaFile)|(?<extraFile>ExtraFile))\]\s(?<fileName>.+)$", RegexOptions.Compiled); private static readonly Regex OutputRegex = new Regex(@"^(?:\[(?:(?<mediaFile>MediaFile)|(?<extraFile>ExtraFile))\]\s?(?<fileName>.+)|(?<preventExtraImport>\[PreventExtraImport\])|\[MoveStatus\]\s?(?:(?<deferMove>DeferMove)|(?<moveComplete>MoveComplete)|(?<renameRequested>RenameRequested)))$", RegexOptions.Compiled);
private ScriptImportInfo ProcessOutput(List<ProcessOutputLine> processOutputLines) private ScriptImportInfo ProcessOutput(List<ProcessOutputLine> processOutputLines)
{ {
var possibleExtraFiles = new List<string>(); var possibleExtraFiles = new List<string>();
string mediaFile = null; string mediaFile = null;
var decision = ScriptImportDecision.MoveComplete;
var importExtraFiles = true;
foreach (var line in processOutputLines) foreach (var line in processOutputLines)
{ {
@ -78,18 +80,34 @@ namespace NzbDrone.Core.MediaFiles
} }
else if (match.Groups["extraFile"].Success) else if (match.Groups["extraFile"].Success)
{ {
possibleExtraFiles.Add(match.Groups["fileName"].Value); var fileName = match.Groups["fileName"].Value;
var lastAdded = possibleExtraFiles.Last(); if (!_diskProvider.FileExists(fileName))
if (!_diskProvider.FileExists(lastAdded))
{ {
throw new ScriptImportException("Script output contains non-existent possible extra file: {0}", lastAdded); _logger.Warn("Script output contains non-existent possible extra file: {0}", fileName);
} }
possibleExtraFiles.Add(fileName);
}
else if (match.Groups["moveComplete"].Success)
{
decision = ScriptImportDecision.MoveComplete;
}
else if (match.Groups["renameRequested"].Success)
{
decision = ScriptImportDecision.RenameRequested;
}
else if (match.Groups["deferMove"].Success)
{
decision = ScriptImportDecision.DeferMove;
}
else if (match.Groups["preventExtraImport"].Success)
{
importExtraFiles = false;
} }
} }
return new ScriptImportInfo(possibleExtraFiles, mediaFile); return new ScriptImportInfo(possibleExtraFiles, mediaFile, decision, importExtraFiles);
} }
public ScriptImportDecision TryImport(string sourcePath, string destinationFilePath, LocalEpisode localEpisode, EpisodeFile episodeFile, TransferMode mode) public ScriptImportDecision TryImport(string sourcePath, string destinationFilePath, LocalEpisode localEpisode, EpisodeFile episodeFile, TransferMode mode)
@ -165,9 +183,13 @@ namespace NzbDrone.Core.MediaFiles
var processOutput = _processProvider.StartAndCapture(_configService.ScriptImportPath, $"\"{sourcePath}\" \"{destinationFilePath}\"", environmentVariables); var processOutput = _processProvider.StartAndCapture(_configService.ScriptImportPath, $"\"{sourcePath}\" \"{destinationFilePath}\"", environmentVariables);
_logger.Debug("Executed external script: {0} - Status: {1}", _configService.ScriptImportPath, processOutput.ExitCode);
_logger.Debug("Script Output: \r\n{0}", string.Join("\r\n", processOutput.Lines)); _logger.Debug("Script Output: \r\n{0}", string.Join("\r\n", processOutput.Lines));
if (processOutput.ExitCode != 0)
{
throw new ScriptImportException("Script exited with non-zero exit code: {0}", processOutput.ExitCode);
}
var scriptImportInfo = ProcessOutput(processOutput.Lines); var scriptImportInfo = ProcessOutput(processOutput.Lines);
var mediaFile = scriptImportInfo.MediaFile ?? destinationFilePath; var mediaFile = scriptImportInfo.MediaFile ?? destinationFilePath;
@ -178,27 +200,20 @@ namespace NzbDrone.Core.MediaFiles
var exitCode = processOutput.ExitCode; var exitCode = processOutput.ExitCode;
if (exitCode >= 4) localEpisode.ShouldImportExtras = scriptImportInfo.ImportExtraFiles;
if (scriptImportInfo.Decision != ScriptImportDecision.DeferMove)
{ {
localEpisode.ShouldImportExtras = true; localEpisode.ScriptImported = true;
exitCode -= 4;
} }
switch (exitCode) if (scriptImportInfo.Decision == ScriptImportDecision.RenameRequested)
{ {
case 0: // Copy complete episodeFile.MediaInfo = _videoFileInfoReader.GetMediaInfo(mediaFile);
localEpisode.ScriptImported = true; episodeFile.Path = null;
return ScriptImportDecision.MoveComplete;
case 2: // Copy complete, file potentially changed, should try renaming again
localEpisode.ScriptImported = true;
episodeFile.MediaInfo = _videoFileInfoReader.GetMediaInfo(mediaFile);
episodeFile.Path = null;
return ScriptImportDecision.RenameRequested;
case 3: // Let Sonarr handle it
return ScriptImportDecision.DeferMove;
default: // Error, fail to import
throw new ScriptImportException("Moving with script failed! Exit code {0}", processOutput.ExitCode);
} }
return scriptImportInfo.Decision;
} }
} }
} }

View File

@ -6,11 +6,15 @@ namespace NzbDrone.Core.MediaFiles
{ {
public List<string> PossibleExtraFiles { get; set; } public List<string> PossibleExtraFiles { get; set; }
public string MediaFile { get; set; } public string MediaFile { get; set; }
public ScriptImportDecision Decision { get; set; }
public bool ImportExtraFiles { get; set; }
public ScriptImportInfo(List<string> possibleExtraFiles, string mediaFile) public ScriptImportInfo(List<string> possibleExtraFiles, string mediaFile, ScriptImportDecision decision, bool importExtraFiles)
{ {
PossibleExtraFiles = possibleExtraFiles; PossibleExtraFiles = possibleExtraFiles;
MediaFile = mediaFile; MediaFile = mediaFile;
Decision = decision;
ImportExtraFiles = importExtraFiles;
} }
} }
} }

View File

@ -41,7 +41,7 @@ namespace NzbDrone.Core.Parser.Model
public int CustomFormatScore { get; set; } public int CustomFormatScore { get; set; }
public GrabbedReleaseInfo Release { get; set; } public GrabbedReleaseInfo Release { get; set; }
public bool ScriptImported { get; set; } public bool ScriptImported { get; set; }
public bool ImportRenamed { get; set; } public bool FileRenamedAfterScriptImport { get; set; }
public bool ShouldImportExtras { get; set; } public bool ShouldImportExtras { get; set; }
public List<string> PossibleExtraFiles { get; set; } public List<string> PossibleExtraFiles { get; set; }