From 4b28b85f549abaee2345da716c0bde173d3cc1cd Mon Sep 17 00:00:00 2001 From: John Andrews Date: Sat, 15 Jul 2023 10:42:45 +1200 Subject: [PATCH] FF-1015 - fixing copy/move --- BasicNodes/File/CopyFile.cs | 53 +++-------------------- BasicNodes/File/MoveFile.cs | 80 ++++++++++++++++++++++------------- BasicNodes/Tests/MoveTests.cs | 42 +++++++++--------- 3 files changed, 79 insertions(+), 96 deletions(-) diff --git a/BasicNodes/File/CopyFile.cs b/BasicNodes/File/CopyFile.cs index af84705e..81a03e5b 100644 --- a/BasicNodes/File/CopyFile.cs +++ b/BasicNodes/File/CopyFile.cs @@ -79,55 +79,16 @@ namespace FileFlows.BasicNodes.File public override int Execute(NodeParameters args) { Canceled = false; - string dest = args.ReplaceVariables(DestinationPath, true); - - args.Logger.ILog($"CopyFile.Dest[0] '{dest}'"); - dest = dest.Replace("\\", Path.DirectorySeparatorChar.ToString()); - dest = dest.Replace("/", Path.DirectorySeparatorChar.ToString()); - args.Logger.ILog($"CopyFile.Dest[1] '{dest}'"); - if (string.IsNullOrEmpty(dest)) - { - args.Logger?.ELog("No destination specified"); - return -1; - } - - args.Logger.ILog($"CopyFile.Dest[2] '{dest}'"); - if (CopyFolder) // we only want the full directory relative to the library, we don't want the original filename - { - dest = Path.Combine(dest, args.RelativeFile); - dest = dest[..dest.LastIndexOf(Path.DirectorySeparatorChar)]; - args.Logger?.ILog("Using relative directory: " + dest); - } - dest = Path.Combine(dest, new FileInfo(args.FileName).Name); - args.Logger.ILog($"CopyFile.Dest[3] '{dest}'"); - - var fiDest = new FileInfo(dest); - var fiWorking = new FileInfo(args.WorkingFile); - if (string.IsNullOrEmpty(fiDest.Extension) == false && fiDest.Extension != fiWorking.Extension) - { - dest = dest.Substring(0, dest.LastIndexOf(".")) + fiWorking.Extension; - } - args.Logger.ILog($"CopyFile.Dest[5] '{dest}'"); - + var destParts = MoveFile.GetDestinationPathParts(args, DestinationPath, DestinationFile, CopyFolder); + if (destParts.Filename == null) + return -1; + // cant use new FileInfo(dest).Directory.Name here since // if the folder is a linux folder and this node is running on windows // /mnt, etc will be converted to c:\mnt and break the destination - var destDir = dest.Substring(0, dest.Replace("\\", "/").LastIndexOf("/")); - - if(string.IsNullOrEmpty(DestinationFile) == false) - { - // FF-154 - changed file.Name and file.Orig.Filename to be the full short filename including the extension - string destFile = DestinationFile; - destFile = destFile.Replace("{file.Orig.FileName}{file.Orig.Extension}", "{file.Orig.FileName}"); - destFile = destFile.Replace("{file.Name}{file.Extension}", "{file.Name}"); - destFile = destFile.Replace("{file.Name}{ext}", "{file.Name}"); - destFile = args.ReplaceVariables(destFile); - dest = Path.Combine(destDir!, destFile); - } - args.Logger.ILog($"CopyFile.Dest[6] '{dest}'"); - - args.Logger.ILog($"CopyFileArgs: '{args.WorkingFile}', '{dest}'"); + var destDir = destParts.Path; + string dest = destParts.Path + destParts.Separator + destParts.Filename; bool copied = args.CopyFile(args.WorkingFile, dest, updateWorkingFile: true); if (!copied) @@ -171,7 +132,7 @@ namespace FileFlows.BasicNodes.File } catch (Exception ex) { - args.Logger.WLog("Error copying additinoal files: " + ex.Message); + args.Logger.WLog("Error copying additional files: " + ex.Message); } } diff --git a/BasicNodes/File/MoveFile.cs b/BasicNodes/File/MoveFile.cs index 39ed5f14..d20eab3b 100644 --- a/BasicNodes/File/MoveFile.cs +++ b/BasicNodes/File/MoveFile.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using System.Text.RegularExpressions; using FileFlows.Plugin; using FileFlows.Plugin.Attributes; @@ -80,7 +81,7 @@ public class MoveFile : Node /// the output to call next public override int Execute(NodeParameters args) { - var dest = GetDesitnationPath(args, DestinationPath, DestinationFile, MoveFolder); + var dest = GetDestinationPath(args, DestinationPath, DestinationFile, MoveFolder); if (dest == null) return -1; @@ -146,55 +147,76 @@ public class MoveFile : Node return 1; } - internal static string GetDesitnationPath(NodeParameters args, string destinationPath, string destinationFile = null, bool moveFolder = false) + /// + /// Gets the full destination path + /// + /// the node parameters + /// the requested destination path + /// the requested destination file + /// if the relative folder should be also be included, relative to the library + /// the full destination path + internal static string GetDestinationPath(NodeParameters args, string destinationPath, + string destinationFile = null, bool moveFolder = false) { - string dest = args.ReplaceVariables(destinationPath, true); - dest = dest.Replace("\\", Path.DirectorySeparatorChar.ToString()); - dest = dest.Replace("/", Path.DirectorySeparatorChar.ToString()); - if (string.IsNullOrEmpty(dest)) + var result = GetDestinationPathParts(args, destinationPath, destinationFile, moveFolder); + if(result.Filename == null) + return null; + return result.Path + result.Separator + result.Filename; + } + + /// + /// Gets the destination path and filename + /// + /// the node parameters + /// the requested destination path + /// the requested destination file + /// if the relative folder should be also be included, relative to the library + /// the path and filename + internal static (string? Path, string? Filename, string? Separator) GetDestinationPathParts(NodeParameters args, string destinationPath, string destinationFile = null, bool moveFolder = false) + { + string separator = args.WorkingFile.IndexOf('/') >= 0 ? "/" : "\\"; + string destFolder = args.ReplaceVariables(destinationPath, true); + destFolder = destFolder.Replace("\\", separator); + destFolder = destFolder.Replace("/", separator); + string destFilename = args.FileName.Replace("\\", separator) + .Replace("/", separator); + destFilename = destFilename.Substring(destFilename.LastIndexOf(separator) + 1); + if (string.IsNullOrEmpty(destFolder)) { args.Logger?.ELog("No destination specified"); args.Result = NodeResult.Failure; - return null; + return (null, null, null); } args.Result = NodeResult.Failure; if (moveFolder) // we only want the full directory relative to the library, we don't want the original filename { - dest = Path.Combine(dest, args.RelativeFile); - dest = dest[..dest.LastIndexOf(Path.DirectorySeparatorChar)]; - args.Logger?.ILog("Using relative directory: " + dest); - } - - dest = Path.Combine(dest, new FileInfo(args.FileName).Name); - - var fiDest = new FileInfo(dest); - var fiWorking = new FileInfo(args.WorkingFile); - if (string.IsNullOrEmpty(fiDest.Extension) == false && fiDest.Extension != fiWorking.Extension) - { - dest = dest.Substring(0, dest.LastIndexOf(".")) + fiWorking.Extension; + destFolder = Path.Combine(destFolder, args.RelativeFile); + destFolder = destFolder[..destFolder.LastIndexOf(separator)]; + args.Logger?.ILog("Using relative directory: " + destFolder); } + // dest = Path.Combine(dest, argsFilename); if (string.IsNullOrEmpty(destinationFile) == false) { // FF-154 - changed file.Name and file.Orig.Filename to be the full short filename including the extension destinationFile = destinationFile.Replace("{file.Orig.FileName}{file.Orig.Extension}", "{file.Orig.FileName}"); destinationFile = destinationFile.Replace("{file.Name}{file.Extension}", "{file.Name}"); destinationFile = destinationFile.Replace("{file.Name}{ext}", "{file.Name}"); - string destFile = args.ReplaceVariables(destinationFile); - dest = Path.Combine(new FileInfo(dest).DirectoryName!, destFile); + destFilename = args.ReplaceVariables(destinationFile); } + + string destExtension = new FileInfo(destFilename).Extension; + string workingExtension = new FileInfo(args.WorkingFile).Extension; - fiDest = new FileInfo(dest); - var fiWorkingFile = new FileInfo(args.WorkingFile); - if (fiDest.Extension != fiWorkingFile.Extension) + if (string.IsNullOrEmpty(destExtension) == false && destExtension != workingExtension) { - dest = dest.Replace(fiDest.Extension, fiWorkingFile.Extension); - fiDest = new FileInfo(dest); + destFilename = destFilename.Substring(0, destFilename.LastIndexOf(".")) + workingExtension; } - args.Logger?.ILog("Final destination: " + dest); - - return dest; + args.Logger?.ILog("Final destination path: " + destFolder); + args.Logger?.ILog("Final destination filename: " + destFilename); + + return (destFolder, destFilename, separator); } } \ No newline at end of file diff --git a/BasicNodes/Tests/MoveTests.cs b/BasicNodes/Tests/MoveTests.cs index 11d4be9c..bcf4b012 100644 --- a/BasicNodes/Tests/MoveTests.cs +++ b/BasicNodes/Tests/MoveTests.cs @@ -17,79 +17,79 @@ public class MoveTests public void MoveTests_Variable_Filename() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Name}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Name}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.s01e15-1080p.mkv", dest); } [TestMethod] public void MoveTests_Variable_FilenameExt() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); // ensure we dont double up the extension after FF-154 - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Name}{file.Extension}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Name}{file.Extension}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.s01e15-1080p.mkv", dest); } [TestMethod] public void MoveTests_Variable_FilenameNoExtension() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); // ensure we dont double up the extension after FF-154 - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.NameNoExtension}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.NameNoExtension}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.mkv", dest); } [TestMethod] public void MoveTests_Variable_Ext() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); // ensure we dont double up the extension after FF-154 - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Name}{ext}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Name}{ext}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.s01e15-1080p.mkv", dest); } [TestMethod] public void MoveTests_Variable_Original_Filename() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Orig.FileName}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Orig.FileName}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.s01e15-1080p.mkv", dest); } [TestMethod] public void MoveTests_Variable_Original_FilenameExt() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); // ensure we dont double up the extension after FF-154 - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Orig.FileName}{file.Orig.Extension}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Orig.FileName}{file.Orig.Extension}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.s01e15-1080p.mkv", dest); } [TestMethod] public void MoveTests_Variable_Original_NoExtension() { var logger = new TestLogger(); - var args = new FileFlows.Plugin.NodeParameters(@"c:\test\tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); + var args = new FileFlows.Plugin.NodeParameters(@"/home/user/test/tv4a-starwarsrebels.s01e15-1080p.mkv", logger, false, string.Empty); // ensure we dont double up the extension after FF-154 - string dest = MoveFile.GetDesitnationPath(args, @"D:\test", "{file.Orig.FileNameNoExtension}"); + string dest = MoveFile.GetDestinationPath(args, @"D:\test", "{file.Orig.FileNameNoExtension}"); - Assert.AreEqual(@"D:\test\tv4a-starwarsrebels.mkv", dest); + Assert.AreEqual(@"D:/test/tv4a-starwarsrebels.mkv", dest); } }