194 lines
7.3 KiB
C#
194 lines
7.3 KiB
C#
|
|
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;
|
|
|
|
namespace VideoAnalysisCore.Controllers
|
|
{
|
|
/// <summary>
|
|
/// 蓝鲸字库接口
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("LJZK/[action]")]
|
|
public class LJZK_Controller : ControllerBase
|
|
{
|
|
private readonly IMapper mp;
|
|
private readonly Repository<NodeSubscription> nodesubscriptionDB;
|
|
private readonly Repository<VideoTask> videoTaskDB;
|
|
private readonly Repository<VideoKonwPoint> videoKonwPointDB;
|
|
private readonly Repository<NodePackageInfo> nodePackageInfoDB;
|
|
public LJZK_Controller( IMapper mp, Repository<NodeSubscription> nodesubscriptionDB,
|
|
Repository<VideoTask> videoTaskDB = null, Repository<VideoKonwPoint> videoKonwPointDB = null
|
|
, Repository<NodePackageInfo> nodePackageInfoDB = null)
|
|
{
|
|
this.mp = mp;
|
|
this.nodesubscriptionDB = nodesubscriptionDB;
|
|
this.videoTaskDB = videoTaskDB;
|
|
this.videoKonwPointDB = videoKonwPointDB;
|
|
this.nodePackageInfoDB = nodePackageInfoDB;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 蓝鲸智库_文件包订阅
|
|
/// </summary>
|
|
/// <param name="reqArr">请求体</param>
|
|
/// <returns></returns>
|
|
[HttpPost(Name = "NodePackage")]
|
|
public async Task<IActionResult> NodePackage(NodePackageReq[] reqArr)
|
|
{
|
|
Console.WriteLine($"{DateTime.Now} 文件包订阅请求 req=" + reqArr.ToJson());
|
|
if (reqArr is null || reqArr.Count() == 0)
|
|
return BadRequest("无效视频列表数据");
|
|
var videos = new List<VideoTask>(reqArr.Count());
|
|
var nodePackages = new List<NodePackageInfo>(reqArr.Count());
|
|
var videoIdArr = videoTaskDB.AsQueryable().Select(v => v.TagId).Distinct().ToArray();
|
|
foreach (var sGroup in reqArr.GroupBy(s=>s.ContentId))
|
|
{
|
|
var s= sGroup.First(s=>s.VideoType==VideoType.摄像头);
|
|
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 = s.CourseId,
|
|
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;
|
|
videos.Add(new VideoTask()
|
|
{
|
|
Id = YitIdHelper.NextId(),
|
|
ComeFrom = GetClientIpAddress(),
|
|
ApiToken = "",
|
|
EducationStage = s.StageId,
|
|
CourseId = s.CourseId,
|
|
Subject = s.SubjectId,
|
|
TagId = s.VideoCode,
|
|
MediaUrl =s.VideoUrl,
|
|
PPTVideoCode = pptCode,
|
|
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();
|
|
RedisExpand.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地址");
|
|
}
|
|
/// <summary>
|
|
/// 获取任务类型
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet(Name = "TaskTypList")]
|
|
public IActionResult TaskType()
|
|
{
|
|
Type type = typeof(TaskTypeEnum);
|
|
return Ok(Enum.GetValues(type).Cast<object>()
|
|
.Select(s => new { Text = s.ToString(), Value = (int)s }));
|
|
}
|
|
/// <summary>
|
|
/// 获取学科类型
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet(Name = "SubjectList")]
|
|
public IActionResult Subject()
|
|
{
|
|
Type type = typeof(SubjectEnum);
|
|
return Ok(Enum.GetValues(type).Cast<object>()
|
|
.Select(s => new { Text = s.ToString(), Value = (int)s }));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取视频知识点片段<para>taskId/tagId二选一</para>
|
|
/// </summary>
|
|
/// <param name="taskId"></param>
|
|
/// <param name="tagId">自定义id</param>
|
|
/// <returns></returns>
|
|
[HttpGet(Name = "TaskKnowInfo")]
|
|
public async Task<IActionResult> TaskKnowInfo(string? tagId)
|
|
{
|
|
if ( string.IsNullOrEmpty(tagId))
|
|
return BadRequest();
|
|
long taskId = 0;
|
|
var taskIdOK = long.TryParse(tagId,out taskId);
|
|
var task = await videoTaskDB.AsQueryable()
|
|
.Where(s=> s.TagId == tagId || s.PPTVideoCode== tagId || (taskIdOK&& s.Id == taskId))
|
|
.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("无效任务");
|
|
return Ok(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,
|
|
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()
|
|
});
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|