Add video preview, source crop, find-videos, and render toasts

Bring the Video tab closer to Shorts with 4K preview stills and crop
modes (none, auto, center, plus the visual editor). Settings store a
default source folder so Find videos can collect output.avi sequences.
Cap the FFmpeg log with auto-scroll, hide repeat spam, and show a
Windows notification when a video or short finishes or fails.
This commit is contained in:
2026-08-16 09:20:56 +02:00
parent e635b708a2
commit a590904e89
20 changed files with 1259 additions and 103 deletions
+18
View File
@@ -21,6 +21,12 @@ public sealed record AppSettings
public required string EndCardHoldSeconds { get; init; }
public required string ThumbnailInterval { get; init; }
public bool? MoveSourcesToOriginals { get; init; }
public string SourceSearchFolder { get; init; } = "";
public string VideoSourceCropMode { get; init; } = "Auto";
public string VideoCropLeft { get; init; } = "0";
public string VideoCropRight { get; init; } = "0";
public string VideoCropTop { get; init; } = "0";
public string VideoCropBottom { get; init; } = "0";
// Shorts tab defaults (sticky across launches, same as the fields above).
public string ShortsStyle { get; init; } = "Brand";
@@ -57,6 +63,12 @@ public sealed record AppSettings
EndCardHoldSeconds = "4",
ThumbnailInterval = "10",
MoveSourcesToOriginals = true,
SourceSearchFolder = "",
VideoSourceCropMode = "Auto",
VideoCropLeft = "0",
VideoCropRight = "0",
VideoCropTop = "0",
VideoCropBottom = "0",
};
public AppSettings Normalize(string fallbackOutputFolder) => this with
@@ -73,6 +85,12 @@ public sealed record AppSettings
EndCardHoldSeconds = string.IsNullOrWhiteSpace(EndCardHoldSeconds) ? "4" : EndCardHoldSeconds,
ThumbnailInterval = string.IsNullOrWhiteSpace(ThumbnailInterval) ? "10" : ThumbnailInterval,
MoveSourcesToOriginals = MoveSourcesToOriginals ?? true,
SourceSearchFolder = SourceSearchFolder ?? "",
VideoSourceCropMode = string.IsNullOrWhiteSpace(VideoSourceCropMode) ? "Auto" : VideoSourceCropMode,
VideoCropLeft = string.IsNullOrWhiteSpace(VideoCropLeft) ? "0" : VideoCropLeft,
VideoCropRight = string.IsNullOrWhiteSpace(VideoCropRight) ? "0" : VideoCropRight,
VideoCropTop = string.IsNullOrWhiteSpace(VideoCropTop) ? "0" : VideoCropTop,
VideoCropBottom = string.IsNullOrWhiteSpace(VideoCropBottom) ? "0" : VideoCropBottom,
ShortsStyle = string.IsNullOrWhiteSpace(ShortsStyle) ? "Brand" : ShortsStyle,
ShortsHook = ShortsHook ?? "THIS RAN ON AN AMIGA",
ShortsWebsite = ShortsWebsite ?? "AMIGADB.NET",
+15
View File
@@ -29,6 +29,11 @@ public sealed record RenderSettings
public required double EndCardHoldSeconds { get; init; }
public required int ThumbnailInterval { get; init; }
public bool MoveSourcesToOriginals { get; init; } = true;
public ShortSourceCropMode SourceCropMode { get; init; } = ShortSourceCropMode.Auto;
public int CropLeft { get; init; }
public int CropRight { get; init; }
public int CropTop { get; init; }
public int CropBottom { get; init; }
public int Width { get; init; } = 3840;
public int Height { get; init; } = 2160;
public int FramesPerSecond { get; init; } = 50;
@@ -37,3 +42,13 @@ public sealed record RenderSettings
}
public sealed record RenderProgress(double Percent, string Stage, string Message);
/// <summary>Which moment of a long-form video a preview still represents.</summary>
public enum VideoPreviewShot
{
Opening,
Closing,
}
/// <summary>PNG stills of the cropped 4K source look and the end card.</summary>
public sealed record VideoPreviewFrames(string OpeningPath, string ClosingPath);
+2 -1
View File
@@ -25,9 +25,10 @@ public enum ShortStyle
Video,
}
/// <summary>How the video style crops the Amiga source before overlaying it.</summary>
/// <summary>How the Amiga source is cropped before it is scaled into the output.</summary>
public enum ShortSourceCropMode
{
None,
Auto,
Center,
}