Commit fa0c98fa authored by shrabbit's avatar shrabbit
Browse files

实现GetFiles和GenerateFfMpegCommand,批量创建命令。

parent 77c9c2ec
Loading
Loading
Loading
Loading
+69 −2
Original line number Diff line number Diff line
using System.ComponentModel;
using shRabbit.Base.IO.Directories;
using shRabbit.Base.IO.Files;
using Spectre.Console;
using Spectre.Console.Cli;

namespace VideoSlice.Cli;
@@ -14,11 +17,75 @@ public class MainCommand : AsyncCommand<MainCommand.Settings>

        [CommandOption("-d|--dir")]
        [Description("选择的视频目录。")]
        public string? Directory { get; set; }
        public string Directory { get; set; } = string.Empty;

        [CommandOption("-f|--ffmpeg")]
        [CommandOption("-s|--desc")]
        [Description("图像文件输出目录。")]
        public string Desc { get; set; } = "output";

        [CommandOption("-fm|--format")]
        [Description("图像格式(默认png)。")]
        public string Format { get; set; } = "png";

        [CommandOption("-fm|--format")]
        [Description("视频格式(默认mp4,可用','使用多个)。")]
        public string VideoFormats { get; set; } = "mp4";

        [CommandOption("-p|-parallel")]
        [Description("并行处理数量。")]
        public uint ParallelNumber { get; set; } = 4;

        [CommandOption("-m|--ffmpeg")]
        [Description("FFmpeg命令行程序的路径。")]
        public string FfMpegPath { get; set; } = "ffmpeg";

        [CommandOption("-s|--slice")]
        [Description("将视频按照时长切分的间隔时间(默认30m)。")]
        public string SliceTime { get; set; } = "30m";
    }

    /// <summary>
    /// 生成 ffmpeg 调用参数。
    /// </summary>
    /// <param name="settings"></param>
    /// <param name="file"></param>
    /// <param name="dir"></param>
    /// <returns>两层数组,第一次是每个命令,第二次是命令中的参数。</returns>
    public static string[][] GenerateFfMpegCommand(Settings settings, IFile file, IDirectory dir)
    {
        var files = GetFiles(settings, dir);
        var arr = new string[files.Length][];

        var time = SimpleTimeSpanExpress.ToTimeSpan(settings.SliceTime);
        
        for (var i = 0; i < arr.Length; i++)
        {
            arr[i] = ["-i", files[i], "-vf", $"\"fps:1/{time.TotalSeconds}\"", $"{settings.Desc}{files[i]}_%03d.{settings.Format}"];
        }

        return arr;
    }

    public static string[] GetFiles(Settings settings, IDirectory dir)
    {
        if (settings.File is { } s) return [s];
        
        var split = settings.VideoFormats.Split(',');

        var list = new List<string>();
        foreach (var f in dir.EnumerateFiles(settings.Directory))
        {
            foreach (var sp in split)
            {
                if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.'))
                {
                    AnsiConsole.WriteLine($"找到: {f}");
                    list.Add(f);
                }
            }
        }
        
        return list.ToArray();
    }

    protected override async Task<int> ExecuteAsync(CommandContext context, Settings settings, CancellationToken cancellationToken)