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 UploadWorkflowExpand { public static void AddUploadWorkflow(this IServiceCollection services) { // 只有在配置启用时才注册 if (AppCommon.Config.Workflow.Upload.Enabled) { Console.WriteLine($"{DateTime.Now}=>初始化 视频合并工作流"); services.AddUploadExpand(); // Register UploadHandle services.AddSingleton(); services.AddSingleton(); } } } public class UploadWorkflowInit { private readonly UploadWorkflowManager _manager; private readonly IServiceProvider _serviceProvider; public UploadWorkflowInit(UploadWorkflowManager manager, IServiceProvider serviceProvider) { _manager = manager; _serviceProvider = serviceProvider; Init(); _manager.InitChannel(); } public void Init() { var SubscribeList = _manager.SubscribeList; SubscribeList.Add(RedisUploadChannelEnum.排队中, async (task) => await Task.CompletedTask); SubscribeList.Add(RedisUploadChannelEnum.下载文件, async (task) => { using var scope = _serviceProvider.CreateScope(); var downloadService = scope.ServiceProvider.GetRequiredService(); await downloadService.RunTask(task); }); SubscribeList.Add(RedisUploadChannelEnum.合并切片, async (task) => { using var scope = _serviceProvider.CreateScope(); var ffmpegService = scope.ServiceProvider.GetRequiredService(); await ffmpegService.MergeAndSliceAsync(task); }); SubscribeList.Add(RedisUploadChannelEnum.上传视频, async (task) => { using var scope = _serviceProvider.CreateScope(); var uploadService = scope.ServiceProvider.GetRequiredService(); await uploadService.RunAsync(task); }); SubscribeList.Add(RedisUploadChannelEnum.结束任务, _manager.RedisManager.TaskEnd); } } public class UploadWorkflowManager : WorkflowBase { public UploadWorkflowManager(RedisClient redis, RedisManager redisManager) : base(redis, redisManager) { } protected override string ChannelKey => RedisExpandKey.UploadChannelKey; protected override int Concurrency => AppCommon.Config.Workflow.Upload.Concurrency; } }