网站首页 网站源码
using System.Drawing;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Shard.Service;
using Dpz.Core.Web.Models;
using Dpz.Core.Web.Models.Video;
namespace Dpz.Core.Web.Controllers;
public class VideoController(
IBarrageService barrageService,
ILogger<VideoController> logger,
IVideoShardService videoShardService
) : Controller
{
public async Task<IActionResult> Index()
{
this.SetTitle("视频");
var videos = await videoShardService.GetVideosAsync();
return View(videos);
}
[Route("video/watch/{id}.html")]
public async Task<IActionResult> Watch(string id)
{
var video = await videoShardService.GetVideoAsync(id);
if (video == null)
return NotFound();
this.SetTitle(video.VideoTitle);
return View(video);
}
[Route("history/chat/v3/"), HttpGet]
public async Task<IActionResult> HistoryChat(string id)
{
var dbDanmaku = await barrageService.GetGroupBarragesAsync(id);
var allDanmaku = dbDanmaku.Select(x =>
{
var result = int.TryParse(x.Color, out var color);
return new object[] { x.Time, x.Position, result ? color : x.Color, "阿胖", x.Text };
});
return Json(new { code = 0, data = allDanmaku });
}
[Route("history/danmaku/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmaku(string id)
{
var dbDanmaku = await barrageService.GetGroupBarragesAsync(id);
var allDanmaku = dbDanmaku
.OrderBy(x => x.Time)
.Select(x =>
{
var result = int.TryParse(x.Color, out var color);
var colorRgb = Color.FromArgb(color);
return new
{
color = result ? $"rgb({colorRgb.R},{colorRgb.G},{colorRgb.B})" : x.Color,
text = x.Text,
time = x.Time,
type = x.Position switch
{
0 => "scroll",
1 => "top",
2 => "bottom",
_ => "",
},
};
})
.ToList();
return Json(allDanmaku);
}
[Route("history/danmaku"), HttpPost]
public async Task<IActionResult> HistoryDanmaku([FromBody] VideoDanmaku2 danmaku)
{
var color = ColorTranslator.FromHtml("#FF0000");
var vmBarrage = new VmBarrage
{
Color = color.ToArgb().ToString(),
Group = danmaku.Id,
Position = danmaku.Type switch
{
"scroll" => 0,
"top" => 1,
"bottom" => 2,
_ => 0,
},
SendTime = DateTime.Now,
Size = 0,
Text = danmaku.Text,
Time = danmaku.Time,
};
await barrageService.AddBarrageAsync(vmBarrage);
return Json(new ResultInfo(true));
}
[Route("history/chat/v3/"), HttpPost]
public async Task<IActionResult> HistoryChat([FromBody] VideoDanmaku danmaku)
{
var vmBarrage = new VmBarrage
{
Color = danmaku.Color.ToString(),
Group = danmaku.Id,
Position = (int)danmaku.Type,
SendTime = DateTime.Now,
Size = 0,
Text = danmaku.Text,
Time = danmaku.Time,
};
await barrageService.AddBarrageAsync(vmBarrage);
return Json(new { code = 0, data = danmaku });
}
[Route("history/danmaku/v2/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmakuV2(string id)
{
var dbDanmaku = await barrageService.GetGroupBarragesAsync(id);
var data = dbDanmaku
.Select(x =>
{
var result = int.TryParse(x.Color, out var color);
var colorRgb = Color.FromArgb(color);
return new
{
text = x.Text,
time = x.Time,
color = result ? $"rgb({colorRgb.R},{colorRgb.G},{colorRgb.B})" : x.Color,
border = false,
mode = x.Position switch
{
0 => 0,
1 => 1,
2 => 1,
_ => 0,
},
};
})
.ToList();
return Json(data);
}
[Route("send/danmaku/v2"), HttpPost]
public async Task<IActionResult> SendDanmaku([FromBody] SendDanmaku danmaku)
{
if (!ModelState.IsValid)
{
return Json(new ResultInfo(false, ModelState));
}
Color color;
try
{
color = ColorTranslator.FromHtml(danmaku.Color);
}
catch (Exception e)
{
color = ColorTranslator.FromHtml("#FFFFFF");
logger.LogError(e, "color translator fail,in color:{Color}", danmaku.Color);
}
var vmBarrage = new VmBarrage
{
Color = color.ToArgb().ToString(),
Group = danmaku.Id,
Position = danmaku.Mode,
SendTime = DateTime.Now,
Size = 0,
Text = danmaku.Text,
Time = danmaku.Time,
};
await barrageService.AddBarrageAsync(vmBarrage);
return Json(new ResultInfo(true));
}
}
上述代码是一个 ASP.NET Core MVC 控制器类 VideoController
,用于处理与视频相关的请求。它主要涉及视频的展示、弹幕(即评论)功能的管理和处理。以下是对代码中各个部分的详细解释:
public VideoController(
IBarrageService barrageService,
ILogger<VideoController> logger,
IVideoShardService videoShardService
)
IBarrageService
:用于处理弹幕相关的操作。ILogger<VideoController>
:用于记录日志。IVideoShardService
:用于处理视频相关的操作。public async Task<IActionResult> Index()
videoShardService.GetVideosAsync()
方法获取视频数据,并将其传递给视图。[Route("video/watch/{id}.html")]
public async Task<IActionResult> Watch(string id)
videoShardService.GetVideoAsync(id)
获取视频,如果视频不存在则返回 404。[Route("history/chat/v3/"), HttpGet]
public async Task<IActionResult> HistoryChat(string id)
barrageService.GetGroupBarragesAsync(id)
获取弹幕数据,并将其格式化为 JSON 返回。[Route("history/danmaku/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmaku(string id)
[Route("history/danmaku"), HttpPost]
public async Task<IActionResult> HistoryDanmaku([FromBody] VideoDanmaku2 danmaku)
VmBarrage
对象并调用 barrageService.AddBarrageAsync(vmBarrage)
保存弹幕。[Route("history/danmaku/v2/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmakuV2(string id)
HistoryDanmaku
类似,但返回的数据格式略有不同。[Route("send/danmaku/v2"), HttpPost]
public async Task<IActionResult> SendDanmaku([FromBody] SendDanmaku danmaku)
VmBarrage
对象并保存弹幕。这个控制器主要负责视频的展示和弹幕的管理,包括获取视频列表、观看视频、获取和发送弹幕等功能。通过依赖注入的服务,控制器能够与数据层进行交互,处理用户请求并返回相应的视图或 JSON 数据。