using VideoAnalysisCore.Common; using Learn.VideoAnalysis.Controllers.Dto; using Microsoft.AspNetCore.Mvc; using System.Reflection; using VideoAnalysisCore.Enum; using VideoAnalysisCore.Model; using VideoAnalysisCore.AICore.FFMPGE; namespace Learn.VideoAnalysis.Controllers { [ApiController] [Route("[controller]/[action]")] public class ApiController : ControllerBase { private readonly ILogger _logger; private readonly Repository videoTaskDB; public ApiController(ILogger logger, Repository videoTaskDB) { _logger = logger; this.videoTaskDB = videoTaskDB; } private string GetClientIpAddress() { // 检查 X-Forwarded-For 请求头 if (HttpContext.Request.Headers.ContainsKey("X-Forwarded-For") && !string.IsNullOrEmpty(HttpContext.Request.Headers["X-Forwarded-For"])) return HttpContext.Request.Headers["X-Forwarded-For"].ToString(); if (HttpContext.Connection.RemoteIpAddress != null) return HttpContext.Connection.RemoteIpAddress.ToString(); throw new Exception("未能获取到客户端ip地址"); } /// /// 插入队列 /// /// /// /// [HttpPost(Name = "TestInsertChannel")] public IActionResult TestInsertChannel(int @enum=1, string msg= "test_0001") { RedisExpand.InsertChannel(@enum.ToEnum().Value , msg); return Ok(); } /// /// 视频处理 /// /// 请求体 /// [HttpPost(Name = "VideoAnalysis")] public async Task VideoAnalysis(VideoAnalysisReq req) { if (!ModelState.IsValid) return BadRequest(ModelState); // 自动映射属性到哈希 var task = new VideoTask() { ComeFrom = GetClientIpAddress(), MediaUrl = req.MediaUrl, ApiToken = req.ApiToken, Tag = req.Tag, CallBackUrl = req.CallBackUrl, }; //入库 task.Id = await videoTaskDB.InsertReturnBigIdentityAsync(task); var hashEntries = task.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .ToDictionary(s => s.Name, s => s.GetValue(task)); RedisExpand.Redis.HMSet(RedisExpandKey.Task(task.Id), hashEntries); RedisExpand.InsertChannel(RedisChannelEnum.DownloadFile,task.Id); return Ok(task.Id); } } }