111 lines
4.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|