Add queued FFmpeg conversion and finish splitting the window from the host.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-25 01:49:50 +02:00
parent 48d03f794f
commit 6fc7506eb7
85 changed files with 3394 additions and 512 deletions

View File

@@ -160,6 +160,44 @@ public class FileOperationProfilePlannerTests
Assert.Contains(plan.Issues, i => i.Message.Contains("7-Zip", StringComparison.OrdinalIgnoreCase));
}
[Fact]
public void Convert_lists_one_job_per_matching_file()
{
var fs = Tree()
.Dir(@"C:\src")
.File(@"C:\src\clip.mov", 10, T0)
.File(@"C:\src\notes.txt", 1, T0)
.Dir(@"C:\dst");
var plan = Build(new OperationProfile
{
Name = "Convert",
DestPath = @"C:\dst",
DoConvert = true,
ConversionKind = ConversionKind.VideoToMp4
}, fs, [@"C:\src"]);
Assert.True(plan.CanEnqueue);
var convert = Assert.Single(plan.Operations);
Assert.Equal(TransferOp.Convert, convert.Op);
Assert.Equal(@"C:\src\clip.mov", convert.SourcePath);
Assert.Equal(@"C:\dst\clip.mp4", convert.DestinationPath);
Assert.Contains(plan.ProfilePreview, r => r.Action == "Convert");
}
[Fact]
public void Missing_ffmpeg_is_an_error()
{
var fs = Tree().Dir(@"C:\src").File(@"C:\src\clip.mov", 10, T0).Dir(@"C:\dst");
var plan = Build(new OperationProfile
{
Name = "Convert",
DestPath = @"C:\dst",
DoConvert = true
}, fs, [@"C:\src"], convertAvailable: false);
Assert.False(plan.CanEnqueue);
Assert.Contains(plan.Issues, i => i.Message.Contains("FFmpeg", StringComparison.OrdinalIgnoreCase));
}
private static OperationProfile CopyProfile(string dest = @"C:\dst", bool git = false)
=> new()
{
@@ -176,6 +214,7 @@ public class FileOperationProfilePlannerTests
GitStatus? git = null,
bool gitAvailable = true,
bool compressAvailable = true,
bool convertAvailable = true,
Func<string, bool>? reachable = null,
Func<FileSystemItem, bool>? wouldHydrate = null)
=> new FileOperationProfilePlanner(new RenamePlanner()).Build(
@@ -188,7 +227,9 @@ public class FileOperationProfilePlannerTests
compressAvailable,
SevenZipLocator.MissingHint,
pathExists: _ => false,
wouldHydrate: wouldHydrate);
wouldHydrate: wouldHydrate,
convertAvailable: convertAvailable,
convertMissingHint: FfmpegLocator.MissingHint);
private static TreeEnumerator Tree() => new();
}