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; using VideoAnalysisCore.Model.Dto; using VideoAnalysisCore.AICore.ChatGPT.Dto; 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地址"); } /// /// 获取视频信息taskId/tagId二选一 /// /// /// 自定义id /// [HttpGet(Name = "TaskInfo")] public async Task TaskInfo(long taskId,string? tagId) { var task = await videoTaskDB.AsQueryable() .WhereIF(taskId!=0, s => s.Id == taskId) .WhereIF(string.IsNullOrEmpty(tagId), s => s.TagId == tagId) .FirstAsync(); if (task.LastEnum != RedisChannelEnum.EndTask) return BadRequest(new { Enum = task.LastEnum ,Task = task.ChatAnalysis}); return Ok(new { Enum = task.LastEnum, Task = task.ChatAnalysis }); } /// /// 插入队列 /// /// /// /// [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, TagId = req.TagId, }; //入库 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); } } }