Loading src/VideoSlice.Cli/MainCommand.cs +2 −4 Original line number Diff line number Diff line using System.ComponentModel; using System.ComponentModel; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using Spectre.Console; Loading Loading @@ -65,7 +65,7 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> "-i", f, "-vf", $"\"fps:1/{time.TotalSeconds}\"", $"\"fps=1/{time.TotalSeconds}\"", Path.Join(Path.Combine(settings.Directory, settings.Disc), $"{Path.GetFileName(f)}_%03d.{settings.Format}") ]; } Loading @@ -83,8 +83,6 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> { if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.')) { if (!settings.NoExecute) AnsiConsole.WriteLine($"找到: {f}"); yield return f; } } Loading src/VideoSlice.Tests/MainCommandTest.cs 0 → 100644 +152 −0 Original line number Diff line number Diff line using System; using System.Collections.Generic; using System.IO; using System.Linq; using JetBrains.Annotations; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using VideoSlice.Cli; using Xunit; using Assert = Xunit.Assert; namespace VideoSlice.Tests; [TestSubject(typeof(MainCommand))] public class MainCommandTest { [Fact] public void Should_GetFiles_Filter_By_Formats() { var settings = CreateSettings(s => s.VideoFormats = "mp4,mov"); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov"), Path.Combine("videos", "c.avi"), Path.Combine("videos", "d.MP4")); var result = MainCommand.GetFiles(settings, dir).ToArray(); Assert.Equal( [ Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov") ], result); } [Fact] public void Should_GetFiles_Support_Dotted_Formats() { var settings = CreateSettings(s => s.VideoFormats = ".mp4,.mov"); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov")); var result = MainCommand.GetFiles(settings, dir).ToArray(); Assert.Equal( [ Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov") ], result); } [Fact] public void Should_GetFiles_Empty_When_No_Match() { var settings = CreateSettings(); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.avi")); Assert.Empty(MainCommand.GetFiles(settings, dir)); } [Fact] public void Should_GetFiles_Empty_When_File_Option_Set() { var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4")); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); Assert.Empty(MainCommand.GetFiles(settings, dir)); } [Fact] public void Should_Generate_Command_Per_File() { var settings = CreateSettings(); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mp4")); var commands = MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir).ToArray(); Assert.Collection(commands, c => Assert.Equal( [ "-i", Path.Combine("videos", "a.mp4"), "-vf", "\"fps=1/1800\"", Path.Join(Path.Combine("videos", "output"), "a.mp4_%03d.png") ], c), c => Assert.Equal( [ "-i", Path.Combine("videos", "b.mp4"), "-vf", "\"fps=1/1800\"", Path.Join(Path.Combine("videos", "output"), "b.mp4_%03d.png") ], c)); } [Fact] public void Should_Generate_Command_With_Custom_Slice_Disc_And_Format() { var settings = CreateSettings(s => { s.SliceTime = "1m"; s.Disc = "frames"; s.Format = "jpg"; }); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); var command = Assert.Single(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir)); Assert.Equal( [ "-i", Path.Combine("videos", "a.mp4"), "-vf", "\"fps=1/60\"", Path.Join(Path.Combine("videos", "frames"), "a.mp4_%03d.jpg") ], command); } [Fact] public void Should_Generate_Empty_When_No_Files() { var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4")); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); Assert.Empty(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir)); } private static MainCommand.Settings CreateSettings(Action<MainCommand.Settings> configure = null) { var settings = new MainCommand.Settings { NoExecute = true, Directory = "videos", Disc = "output", Format = "png", VideoFormats = "mp4", SliceTime = "30m" }; configure?.Invoke(settings); return settings; } private sealed class TestDirectoryBridge(params string[] files) : DirectoryBridge { public override IEnumerable<string> EnumerateFiles(string path) => files; } } Loading
src/VideoSlice.Cli/MainCommand.cs +2 −4 Original line number Diff line number Diff line using System.ComponentModel; using System.ComponentModel; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using Spectre.Console; Loading Loading @@ -65,7 +65,7 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> "-i", f, "-vf", $"\"fps:1/{time.TotalSeconds}\"", $"\"fps=1/{time.TotalSeconds}\"", Path.Join(Path.Combine(settings.Directory, settings.Disc), $"{Path.GetFileName(f)}_%03d.{settings.Format}") ]; } Loading @@ -83,8 +83,6 @@ public class MainCommand : AsyncCommand<MainCommand.Settings> { if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.')) { if (!settings.NoExecute) AnsiConsole.WriteLine($"找到: {f}"); yield return f; } } Loading
src/VideoSlice.Tests/MainCommandTest.cs 0 → 100644 +152 −0 Original line number Diff line number Diff line using System; using System.Collections.Generic; using System.IO; using System.Linq; using JetBrains.Annotations; using shRabbit.Base.IO.Directories; using shRabbit.Base.IO.Files; using VideoSlice.Cli; using Xunit; using Assert = Xunit.Assert; namespace VideoSlice.Tests; [TestSubject(typeof(MainCommand))] public class MainCommandTest { [Fact] public void Should_GetFiles_Filter_By_Formats() { var settings = CreateSettings(s => s.VideoFormats = "mp4,mov"); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov"), Path.Combine("videos", "c.avi"), Path.Combine("videos", "d.MP4")); var result = MainCommand.GetFiles(settings, dir).ToArray(); Assert.Equal( [ Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov") ], result); } [Fact] public void Should_GetFiles_Support_Dotted_Formats() { var settings = CreateSettings(s => s.VideoFormats = ".mp4,.mov"); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov")); var result = MainCommand.GetFiles(settings, dir).ToArray(); Assert.Equal( [ Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mov") ], result); } [Fact] public void Should_GetFiles_Empty_When_No_Match() { var settings = CreateSettings(); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.avi")); Assert.Empty(MainCommand.GetFiles(settings, dir)); } [Fact] public void Should_GetFiles_Empty_When_File_Option_Set() { var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4")); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); Assert.Empty(MainCommand.GetFiles(settings, dir)); } [Fact] public void Should_Generate_Command_Per_File() { var settings = CreateSettings(); var dir = new TestDirectoryBridge( Path.Combine("videos", "a.mp4"), Path.Combine("videos", "b.mp4")); var commands = MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir).ToArray(); Assert.Collection(commands, c => Assert.Equal( [ "-i", Path.Combine("videos", "a.mp4"), "-vf", "\"fps=1/1800\"", Path.Join(Path.Combine("videos", "output"), "a.mp4_%03d.png") ], c), c => Assert.Equal( [ "-i", Path.Combine("videos", "b.mp4"), "-vf", "\"fps=1/1800\"", Path.Join(Path.Combine("videos", "output"), "b.mp4_%03d.png") ], c)); } [Fact] public void Should_Generate_Command_With_Custom_Slice_Disc_And_Format() { var settings = CreateSettings(s => { s.SliceTime = "1m"; s.Disc = "frames"; s.Format = "jpg"; }); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); var command = Assert.Single(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir)); Assert.Equal( [ "-i", Path.Combine("videos", "a.mp4"), "-vf", "\"fps=1/60\"", Path.Join(Path.Combine("videos", "frames"), "a.mp4_%03d.jpg") ], command); } [Fact] public void Should_Generate_Empty_When_No_Files() { var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4")); var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4")); Assert.Empty(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir)); } private static MainCommand.Settings CreateSettings(Action<MainCommand.Settings> configure = null) { var settings = new MainCommand.Settings { NoExecute = true, Directory = "videos", Disc = "output", Format = "png", VideoFormats = "mp4", SliceTime = "30m" }; configure?.Invoke(settings); return settings; } private sealed class TestDirectoryBridge(params string[] files) : DirectoryBridge { public override IEnumerable<string> EnumerateFiles(string path) => files; } }