using VideoAnalysisCore.Common; using Microsoft.AspNetCore.Mvc; using System.Reflection; using MapsterMapper; using Mapster; using VideoAnalysisCore.AICore.SherpaOnnx; using UserCenter.Model.Enum; using VideoAnalysisCore.AICore.GPT.ChatGPT; using VideoAnalysisCore.AICore.GPT; using System.Text.Json; using Microsoft.AspNetCore.Authorization; using VideoAnalysisCore.Model.Enum; using FFmpeg.NET.Services; using static FFmpeg.NET.MetaData; using static System.Runtime.InteropServices.JavaScript.JSType; using Yitter.IdGenerator; using VideoAnalysisCore.AICore.GPT.Dto; using VideoAnalysisCore.Model; using VideoAnalysisCore.Controllers.Dto; using VideoAnalysisCore.Model.Dto; using VideoAnalysisCore.Model.蓝鲸智库; namespace VideoAnalysisCore.Controllers { /// /// 蓝鲸字库接口 /// [ApiController] [Route("LJZK/[action]")] public class LJZK_Controller : ControllerBase { private readonly IMapper mp; private readonly Repository nodesubscriptionDB; private readonly Repository videoTaskDB; private readonly Repository courseInfoDB; private readonly Repository videoKonwPointDB; private readonly Repository nodePackageInfoDB; private readonly Repository videoQuestionDB; private readonly Repository videoQuestionKonwDB; private readonly RedisManager redisManager; public LJZK_Controller(IMapper mp, Repository nodesubscriptionDB, Repository videoTaskDB = null, Repository videoKonwPointDB = null , Repository nodePackageInfoDB = null, Repository videoQuestionDB = null, Repository videoQuestionKonwDB = null, Repository courseInfoDB = null, RedisManager redisManager = null) { this.mp = mp; this.nodesubscriptionDB = nodesubscriptionDB; this.videoTaskDB = videoTaskDB; this.videoKonwPointDB = videoKonwPointDB; this.nodePackageInfoDB = nodePackageInfoDB; this.videoQuestionDB = videoQuestionDB; this.videoQuestionKonwDB = videoQuestionKonwDB; this.courseInfoDB = courseInfoDB; this.redisManager = redisManager; } /// /// 蓝鲸智库_文件包订阅 /// /// 请求体 /// [HttpPost(Name = "NodePackage")] public async Task NodePackage(NodePackageReq[] reqArr) { Console.WriteLine($"{DateTime.Now} 文件包订阅请求 req=" + reqArr.ToJson()); if (reqArr is null || reqArr.Count() == 0) return BadRequest("无效视频列表数据"); var videos = new List(reqArr.Count()); var nodePackages = new List(reqArr.Count()); var videoIdArr = videoTaskDB.AsQueryable().Select(v => v.TagId).Distinct().ToArray(); var courseArr = await courseInfoDB.AsQueryable().ToArrayAsync(); //系统可接收任务的学科 var subjectArr = new List { SubjectEnum.数学 }; foreach (var sGroup in reqArr.GroupBy(s => s.ContentId)) { var s = sGroup.FirstOrDefault(s => s.VideoType == VideoType.摄像头); if (s is null) return BadRequest("无有效的老师授课视频"); //校验学科有效 if (!subjectArr.Contains(s.SubjectId)) continue; var stageId = s.StageId.GetHashCode(); var subjectId = s.SubjectId.GetHashCode(); var course = courseArr.FirstOrDefault(x => stageId == x.Stage_Id && subjectId == x.Subject_Id); if (course == null) continue; var sPPT = sGroup.FirstOrDefault(s => s.VideoType == VideoType.PPT课件); var np = new NodePackageInfo() { VideoCode = s.VideoCode, MaterialId = s.MaterialId, AttachmentId = s.AttachmentId, Stage = s.StageId, CourseId = course.Id, SubjectType = s.SubjectId, VideoUrl = s.VideoUrl, CourseType = s.CourseType, CallBackUrl = s.CallBackUrl, Area = s.Area, HostIP = s.HostIP, }; nodePackages.Add(np); if (videoIdArr.Contains(s.VideoCode)) continue; var pptCode = sPPT != null ? sPPT.VideoCode : string.Empty; var pptUrl = sPPT != null ? sPPT.VideoUrl : string.Empty; videos.Add(new VideoTask() { Id = YitIdHelper.NextId(), ComeFrom = GetClientIpAddress(), ApiToken = "", EducationStage = s.StageId, CourseId = course.Id, Subject = s.SubjectId, TagId = s.VideoCode, MediaUrl = s.VideoUrl, PPTVideoCode = pptCode, PPTVideoUrl = pptUrl, VideoType = s.CourseType }); } await nodePackageInfoDB.InsertRangeAsync(nodePackages); await videoTaskDB.InsertRangeAsync(videos); if (videos is null || videos.Count == 0) return Ok(); var ids = videos.Select(s => s.Id).ToArray(); redisManager.JoinQueue(ids); return Ok(); } 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地址"); } /// /// 获取任务类型 /// /// [HttpGet(Name = "TaskTypList")] public IActionResult TaskType() { Type type = typeof(TaskTypeEnum); return Ok(Enum.GetValues(type).Cast() .Select(s => new { Text = s.ToString(), Value = (int)s })); } /// /// 获取学科类型 /// /// [HttpGet(Name = "SubjectList")] public IActionResult Subject() { Type type = typeof(SubjectEnum); return Ok(Enum.GetValues(type).Cast() .Select(s => new { Text = s.ToString(), Value = (int)s })); } /// /// 获取视频知识点片段taskId/tagId二选一 /// /// 自定义id /// 自定义id /// [HttpGet(Name = "TaskKnowInfo")] public async Task TaskKnowInfo(string? tagId , string? taskId) { if (string.IsNullOrEmpty(tagId) && !string.IsNullOrEmpty(taskId)) tagId = taskId; if (string.IsNullOrEmpty(tagId)) return BadRequest(); var task = await videoTaskDB.AsQueryable() .Where(s => s.TagId == tagId || s.PPTVideoCode == tagId) .FirstAsync(); if (task is null) return BadRequest("无效任务"); var konwArr = await videoKonwPointDB.AsQueryable() .Where(s => s.VideoTaskId == task.Id) .ToArrayAsync(); if (konwArr is null || konwArr.Length == 0) return BadRequest("无有效任务分段"); var res = new TaskKnowRes() { TagId = task.TagId, Status = task.LastEnum, VideoTaskId = task.Id, KnowBlockArr = konwArr .GroupBy(s => s.StartTime) .Select(s => new TaskKnowBlock() { Id = s.First().Id, Content = s.First().Content, StartTime = s.First().StartTime, StageId = s.First().StageId, EndTime = s.First().EndTime, Theme = s.First().Theme, Know = s.Select(x => new TaskKnowInfo() { Id = x.Id, KnowPoint = x.KnowPoint, KnowPointId = x.KnowPointId }).ToArray() }).ToArray() }; if (task.VideoType == AttachmentsInfoType.复习) { var questionArr = await videoQuestionDB .AsQueryable().Where(s => s.VideoTaskId == task.Id) .Select() .ToArrayAsync(); var konwDic = (await videoQuestionKonwDB .AsQueryable().Where(s => s.VideoTaskId == task.Id) .ToArrayAsync()).GroupBy(s => s.VideoQuestionId) .ToDictionary(s => s.Key); foreach (var item in questionArr.Where(s => konwDic.ContainsKey(s.Id))) item.KonwArr = konwDic[item.Id].ToArray(); foreach (var item in res.KnowBlockArr) item.QuestionArr = questionArr .Where(s => s.StageId == item.StageId).ToArray(); } return Ok(res); } } }