Learn.VideoAnalysis/VideoAnalysisCore/Common/TidySlideWorkflowManager.cs

111 lines
4.2 KiB
C#

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<TidySlideWorkflowManager>();
services.AddSingleton<TidySlideWorkflowInit>();
}
}
}
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<TidySlideHandle>();
await s.CheckTask(task);
});
SubscribeList.Add(RedisTidySlideChannelEnum., async (task) =>
{
using var scope = _serviceProvider.CreateScope();
var downloadService = scope.ServiceProvider.GetRequiredService<DownloadFile>();
await downloadService.RunTask(task, "TidySlideWorkflow");
});
SubscribeList.Add(RedisTidySlideChannelEnum., async (task) =>
{
using var scope = _serviceProvider.CreateScope();
var ffmpegService = scope.ServiceProvider.GetRequiredService<FFMPGEHandle>();
await ffmpegService.MergeAndSliceAsync(task);
});
SubscribeList.Add(RedisTidySlideChannelEnum., async (task) =>
{
using var scope = _serviceProvider.CreateScope();
var uploadService = scope.ServiceProvider.GetRequiredService<TidySlideHandle>();
await uploadService.RunAsync(task);
});
SubscribeList.Add(RedisTidySlideChannelEnum., _manager.TaskEnd);
}
}
public class TidySlideWorkflowManager : WorkflowBase<RedisTidySlideChannelEnum>
{
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;
}
}
}
}