423 lines
18 KiB
C#
423 lines
18 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 Yitter.IdGenerator;
|
||
using VideoAnalysisCore.AICore.GPT.Dto;
|
||
using VideoAnalysisCore.Model;
|
||
using VideoAnalysisCore.Controllers.Dto;
|
||
using VideoAnalysisCore.Model.Dto;
|
||
using SqlSugar;
|
||
using AlibabaCloud.SDK.Vod20170321;
|
||
using VideoAnalysisCore.Model.À¶¾¨ÖÇ¿â;
|
||
using AlibabaCloud.SDK.Vod20170321.Models;
|
||
|
||
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<CourseInfo> courseInfoDB;
|
||
private readonly Repository<VideoKonwPoint> videoKonwPointDB;
|
||
private readonly Client vodClient;
|
||
private readonly Repository<VideoTaskStage> videoTaskStageDB;
|
||
private readonly Repository<NodePackageInfo> nodePackageInfoDB;
|
||
private readonly Repository<VideoQuestion> videoQuestionDB;
|
||
private readonly Repository<VideoQuestionKonw> videoQuestionKonwDB;
|
||
private readonly RedisManager redisManager;
|
||
|
||
public LJZK_Controller(IMapper mp, Repository<NodeSubscription> nodesubscriptionDB,
|
||
Repository<VideoTask> videoTaskDB = null, Repository<VideoKonwPoint> videoKonwPointDB = null
|
||
, Repository<NodePackageInfo> nodePackageInfoDB = null, Repository<VideoQuestion> videoQuestionDB = null,
|
||
Repository<VideoQuestionKonw> videoQuestionKonwDB = null, Repository<CourseInfo> courseInfoDB = null,
|
||
RedisManager redisManager = null, Repository<VideoTaskStage> videoTaskStageDB = null, Client vodClient = 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;
|
||
this.videoTaskStageDB = videoTaskStageDB;
|
||
this.vodClient = vodClient;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// À¶¾¨ÖÇ¿â_Îļþ°ü¶©ÔÄ
|
||
/// </summary>
|
||
/// <param name="reqArr">ÇëÇóÌå</param>
|
||
/// <returns></returns>
|
||
[HttpPost(Name = "NodePackage")]
|
||
public async Task<IActionResult> NodePackage(NodePackageReq[] reqArr)
|
||
{
|
||
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();
|
||
var courseArr = await courseInfoDB.AsQueryable().ToArrayAsync();
|
||
//ϵͳ¿É½ÓÊÕÈÎÎñµÄѧ¿Æ
|
||
var subjectArr = new List<SubjectEnum?>
|
||
{
|
||
SubjectEnum.ÓïÎÄ,
|
||
SubjectEnum.Êýѧ,
|
||
SubjectEnum.Ó¢Óï,
|
||
SubjectEnum.ÎïÀí,
|
||
SubjectEnum.»¯Ñ§,
|
||
SubjectEnum.ÉúÎï,
|
||
SubjectEnum.ÕþÖÎ,
|
||
SubjectEnum.ÀúÊ·,
|
||
SubjectEnum.µØÀí,
|
||
|
||
};
|
||
var courseTypeArr = new List<AttachmentsInfoType?>
|
||
{
|
||
AttachmentsInfoType.ÎÞ,
|
||
AttachmentsInfoType.пÎ,
|
||
AttachmentsInfoType.¸´Ï°
|
||
};
|
||
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;
|
||
//ÎÞЧµÄ¿Î³ÌÀàÐÍ
|
||
if (!courseTypeArr.Contains(s.CourseType)) 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,
|
||
CloudSchoolId = s.UserCenterCloudSchoolId,
|
||
Area = s.Area,
|
||
HostIP = s.HostIP,
|
||
StageId = s.StageId,
|
||
GradeId = s.GradeId,
|
||
GradeYear = s.Trem == 0 ? null : s.Trem,
|
||
GradeSemester = s.GradeSemester,
|
||
TextBookVersionId = s.TextBookVersionId,
|
||
};
|
||
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,
|
||
CloudSchoolId = s.UserCenterCloudSchoolId,
|
||
TextBookVersionId = s.TextBookVersionId,
|
||
GradeSemester = s.GradeSemester,
|
||
CourseLevel = s.CourseLevel,
|
||
GradeId = s.GradeId,
|
||
GradeYear = np.GradeYear,
|
||
});
|
||
}
|
||
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(RedisExpandKey.ChannelKey, 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="tagId">×Ô¶¨Òåid</param>
|
||
/// <param name="taskId">×Ô¶¨Òåid</param>
|
||
/// <returns></returns>
|
||
[HttpGet(Name = "TaskKnowInfo")]
|
||
public async Task<IActionResult> 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 stageArr = await videoTaskStageDB.AsQueryable()
|
||
.Where(s => s.VideoTaskId == task.Id)
|
||
.ToArrayAsync();
|
||
var videoKnowDic = konwArr
|
||
.GroupBy(s => s.StageId)
|
||
.ToDictionary(s => s.Key);
|
||
var videoKnows = stageArr
|
||
.Select(s => new VideoKnowRes()
|
||
{
|
||
Content = s.Content,
|
||
StartTime = s.StartTime,
|
||
EndTime = s.EndTime,
|
||
Theme = s.Theme,
|
||
StageId = s.Id,
|
||
KnowPoint = videoKnowDic.ContainsKey(s.Id)
|
||
? string.Join(',', videoKnowDic[s.Id].Select(x => x.KnowPoint))
|
||
: string.Empty
|
||
}).ToArray();
|
||
|
||
var res = new TaskKnowRes()
|
||
{
|
||
TagId = task.TagId,
|
||
Status = task.LastEnum,
|
||
VideoTaskId = task.Id,
|
||
KnowBlockArr = stageArr
|
||
.Select(s => new TaskKnowBlock()
|
||
{
|
||
Id = s.Id,
|
||
Content = s.Content,
|
||
StartTime = s.StartTime,
|
||
StageId = s.Id,
|
||
EndTime = s.EndTime,
|
||
Theme = s.Theme,
|
||
Know = videoKnowDic.ContainsKey(s.Id)
|
||
? videoKnowDic[s.Id]?.Select(x => new TaskKnowInfo()
|
||
{
|
||
Id = x.Id,
|
||
KnowPoint = x.KnowPoint,
|
||
KnowPointId = x.KnowPointId,
|
||
KnowWeight = x.KnowPointWeight ?? 0f,
|
||
})?.ToArray()
|
||
: null
|
||
}).ToArray()
|
||
};
|
||
if (task.VideoType == AttachmentsInfoType.¸´Ï°)
|
||
{
|
||
var questionArr = await videoQuestionDB
|
||
.AsQueryable().Where(s => s.VideoTaskId == task.Id)
|
||
.Select<VideoQuestionShowDto>()
|
||
.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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// ²éѯ ÊÓÆµÇÐÆ¬
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
[HttpPost(Name = "QueryVideoStage")]
|
||
public async Task<IActionResult> QueryVideoStage([FromBody] VideoKonwPointQueryReq req)
|
||
{
|
||
if (req is null)
|
||
return BadRequest("²ÎÊý²»ÄÜΪ¿Õ");
|
||
|
||
var stageQuery = videoTaskStageDB.AsQueryable();
|
||
stageQuery = stageQuery.WhereIF(req.CloudSchoolId.HasValue, s => s.CloudSchoolId == req.CloudSchoolId);
|
||
stageQuery = stageQuery.WhereIF(req.GradeYear.HasValue, s => s.GradeYear == req.GradeYear);
|
||
stageQuery = stageQuery.WhereIF(req.CourseLevel.HasValue, s => s.CourseLevel == req.CourseLevel);
|
||
stageQuery = stageQuery.WhereIF(req.GradeId.HasValue, s => s.GradeId == req.GradeId);
|
||
stageQuery = stageQuery.WhereIF(req.GradeSemester.HasValue, s => s.GradeSemester == req.GradeSemester);
|
||
stageQuery = stageQuery.WhereIF(req.TextBookVersionId.HasValue, s => s.TextBookVersionId == req.TextBookVersionId.Value);
|
||
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Theme), s => s.Theme.Contains(req.Theme));
|
||
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Content), s => s.Content.Contains(req.Content));
|
||
|
||
//stageQuery = stageQuery.Where(s => s.Stage != StageEnum.¿Î³ÌÒýÈë);
|
||
|
||
var pageIndex = req.PageIndex < 0 ? 0 : req.PageIndex;
|
||
var pageSize = req.PageSize <= 0 ? 50 : req.PageSize > 100 ? 100 : req.PageSize;
|
||
string[]? knowArr = null;
|
||
if (req.KnowPointStrArr is not null && req.KnowPointStrArr.Length > 0)
|
||
{
|
||
knowArr = req.KnowPointStrArr.Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).Distinct().ToArray();
|
||
if (knowArr.Length > 0)
|
||
{
|
||
stageQuery = stageQuery.Where(s => SqlFunc.Subqueryable<VideoKonwPoint>()
|
||
.Where(k => k.StageId == s.Id && k.KnowPoint != null && knowArr.Contains(k.KnowPoint))
|
||
.Any());
|
||
}
|
||
}
|
||
|
||
RefAsync<int> total = 0;
|
||
var stagePageArr = await stageQuery.ToPageListAsync(pageIndex + 1, pageSize, total);
|
||
if (stagePageArr is null || stagePageArr.Count == 0)
|
||
return Ok(new VideoTaskStageQueryRes());
|
||
|
||
var taskIdArr = stagePageArr.Select(s => s.VideoTaskId).ToArray();
|
||
var kpQuery = videoKonwPointDB.AsQueryable()
|
||
.Where(s => taskIdArr.Contains(s.VideoTaskId) && s.KnowPointId != null);
|
||
//if (knowArr != null && knowArr.Length > 0)
|
||
// kpQuery = kpQuery.Where(s => knowArr.Contains(s.KnowPoint));
|
||
|
||
var kpArr = await kpQuery
|
||
.Select(s => new { s.StageId, s.KnowPoint })
|
||
.ToArrayAsync();
|
||
var kpDic = (kpArr ?? [])
|
||
.GroupBy(s => s.StageId)
|
||
.ToDictionary(s => s.Key, s => s.Select(x => x.KnowPoint!).Distinct().ToArray());
|
||
|
||
//var gDataKey = stagePageArr.GroupBy(s => s.VideoTaskId).Select(s => s.Key).Distinct();
|
||
//var videoInfoQRes = vodClient.GetVideoInfos(new GetVideoInfosRequest()
|
||
//{
|
||
// VideoIds = string.Join(",", gDataKey)
|
||
//});
|
||
//var videoInfoRes = videoInfoQRes.Body.VideoList.ToDictionary(s => s.VideoId, s => s.CoverURL);
|
||
var data = stagePageArr.Select(s => new VideoTaskStageRes()
|
||
{
|
||
Id = s.Id,
|
||
VideoTaskId = s.VideoTaskId,
|
||
StartTime = s.StartTime,
|
||
EndTime = s.EndTime,
|
||
Theme = s.Theme,
|
||
CloudSchoolId = s.CloudSchoolId,
|
||
VideoCode = s.TagId,
|
||
Stage = s.Stage.ToString(),
|
||
CourseLevel = ((°®Ñ§µû±ä²ã´ÎEnum)(int)(s.CourseLevel ??CourselevelTypeEnum.ÎÞ²ã´Î)).ToString(),
|
||
GradeId = s.GradeId.ToString(),
|
||
GradeYear = s.GradeYear?.ToString(),
|
||
//PreviewUrl= videoInfoRes.ContainsKey(s.VideoTaskId.ToString())? videoInfoRes[] :
|
||
KnowPoints = kpDic.ContainsKey(s.Id) ? kpDic[s.Id] : []
|
||
}).ToArray();
|
||
|
||
|
||
return Ok(new VideoTaskStageQueryRes()
|
||
{
|
||
Total = total,
|
||
Data = data
|
||
});
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// ²éѯ ÊÓÆµÇÐÆ¬
|
||
/// </summary>
|
||
/// <param name="videoTaskId">ÊÓÆµid</param>
|
||
/// <returns>ÊÓÆµµØÖ·</returns>
|
||
[HttpGet(Name = "GetVideoURL")]
|
||
public async Task<IActionResult> GetVideoURL(long videoTaskId)
|
||
{
|
||
if (videoTaskId == 0)
|
||
return BadRequest("²ÎÊý²»ÄÜΪ¿Õ");
|
||
var task = await videoTaskDB.GetByIdAsync(videoTaskId);
|
||
if (task is null)
|
||
return BadRequest("²ÎÊýÎÞЧ");
|
||
if(!string.IsNullOrWhiteSpace(task.MediaUrl))
|
||
return Ok(task.MediaUrl);
|
||
else
|
||
return BadRequest("´ËÊÓÆµÎ´ÄÜ»ñÈ¡µ½ÊÓÆµ");
|
||
//try
|
||
//{
|
||
// var videoInfo = await vodClient.GetPlayInfoAsync(new GetPlayInfoRequest()
|
||
// {
|
||
// VideoId = task.TagId,
|
||
// Formats = "mp4",
|
||
// OutputType = "cdn",
|
||
// AuthTimeout = 3600 * 24 * 12,
|
||
// });
|
||
// if (videoInfo is null || videoInfo.StatusCode != 200 && !videoInfo.Body.PlayInfoList.PlayInfo.Any())
|
||
// return BadRequest("»ñÈ¡´æ´¢µÄÊÓÆµÐÅϢʧ°Ü!");
|
||
// return Ok(videoInfo.Body.PlayInfoList.PlayInfo.First().PlayURL);
|
||
|
||
//}
|
||
//catch (Exception ex)
|
||
//{
|
||
// return BadRequest("»ñÈ¡´æ´¢µÄÊÓÆµÐÅϢʧ°Ü!" + ex.Message);
|
||
//}
|
||
|
||
}
|
||
|
||
}
|
||
}
|