using FreeRedis; using Microsoft.Extensions.DependencyInjection; using SqlSugar.IOC; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using VideoAnalysisCore.AICore.FFMPGE; using VideoAnalysisCore.Common.Expand; using VideoAnalysisCore.Model; using VideoAnalysisCore.Model.Enum; namespace VideoAnalysisCore.Common { public static class TidySlideWorkflowExpand { public static void AddTidySlideWorkflow(this IServiceCollection services) { // 只有在配置启用时才注册 if (AppCommon.Config.Workflow.TidySlide.Enabled) { Console.WriteLine($"{DateTime.Now}=>初始化 视频合并工作流(TidySlide)"); services.AddTidySlideExpand(); // Register TidySlideHandle services.AddSingleton(); services.AddSingleton(); } } } public class TidySlideWorkflowInit { private readonly TidySlideWorkflowManager _manager; private readonly IServiceProvider _serviceProvider; public TidySlideWorkflowInit(TidySlideWorkflowManager manager, IServiceProvider serviceProvider) { _manager = manager; _serviceProvider = serviceProvider; Init(); _manager.InitChannel(); } public void Init() { var SubscribeList = _manager.SubscribeList; SubscribeList.Add(RedisTidySlideChannelEnum.排队中, async (task) => await Task.CompletedTask); SubscribeList.Add(RedisTidySlideChannelEnum.任务校验, async (task) => { using var scope = _serviceProvider.CreateScope(); var s = scope.ServiceProvider.GetRequiredService(); await s.CheckTask(task); }); SubscribeList.Add(RedisTidySlideChannelEnum.下载文件, async (task) => { using var scope = _serviceProvider.CreateScope(); var downloadService = scope.ServiceProvider.GetRequiredService(); await downloadService.RunTask(task, "TidySlideWorkflow"); }); SubscribeList.Add(RedisTidySlideChannelEnum.合并切片, async (task) => { using var scope = _serviceProvider.CreateScope(); var ffmpegService = scope.ServiceProvider.GetRequiredService(); await ffmpegService.MergeAndSliceAsync(task); }); SubscribeList.Add(RedisTidySlideChannelEnum.上传视频, async (task) => { using var scope = _serviceProvider.CreateScope(); var uploadService = scope.ServiceProvider.GetRequiredService(); await uploadService.RunAsync(task); }); SubscribeList.Add(RedisTidySlideChannelEnum.结束任务, _manager.TaskEnd); } } public class TidySlideWorkflowManager : WorkflowBase { public TidySlideWorkflowManager(RedisClient redis, RedisManager redisManager) : base(redis, redisManager) { } protected override string ChannelKey => RedisExpandKey.TidySlideChannelKey; protected override int Concurrency => AppCommon.Config.Workflow.TidySlide.Concurrency; protected override string WorkflowName => "TidySlideWorkflow"; // 显式指定 protected override async Task UpdateTaskStateAsync(string taskId, RedisTidySlideChannelEnum step) { // TidySlide 工作流只更新 VideoTaskWorkflow 表,不污染 VideoTask.LastEnum // 调用基类实现即可 await base.UpdateTaskStateAsync(taskId, step); } public override async Task TaskEnd(string task) { var tId = long.Parse(task); //await base.TaskEnd(task); // TidySlide 工作流结束时清理文件 try { await ExpandFunction.DeleteTaskAllFileAsync(tId, this); } catch (Exception) { throw; } } } }