FF-1015 - fixing copy/move

This commit is contained in:
John Andrews
2023-07-15 10:42:45 +12:00
parent 4517f30912
commit 4b28b85f54
3 changed files with 79 additions and 96 deletions

View File

@@ -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);
}
}

View File

@@ -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
/// <returns>the output to call next</returns>
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)
/// <summary>
/// Gets the full destination path
/// </summary>
/// <param name="args">the node parameters</param>
/// <param name="destinationPath">the requested destination path</param>
/// <param name="destinationFile">the requested destination file</param>
/// <param name="moveFolder">if the relative folder should be also be included, relative to the library</param>
/// <returns>the full destination path</returns>
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;
}
/// <summary>
/// Gets the destination path and filename
/// </summary>
/// <param name="args">the node parameters</param>
/// <param name="destinationPath">the requested destination path</param>
/// <param name="destinationFile">the requested destination file</param>
/// <param name="moveFolder">if the relative folder should be also be included, relative to the library</param>
/// <returns>the path and filename</returns>
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);
}
}

View File

@@ -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);
}
}