mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2025-12-30 23:29:29 -06:00
FF-1015 - fixing copy/move
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user