网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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));
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core MVC 控制器类 VideoController,用于处理与视频相关的请求。它主要涉及视频的展示、弹幕(即评论)功能的管理和处理。以下是对代码中各个部分的详细解释:

1. 控制器构造函数

public VideoController(
    IBarrageService barrageService,
    ILogger<VideoController> logger,
    IVideoShardService videoShardService
)
  • 依赖注入:控制器通过构造函数注入了三个服务:
    • IBarrageService:用于处理弹幕相关的操作。
    • ILogger<VideoController>:用于记录日志。
    • IVideoShardService:用于处理视频相关的操作。

2. Index 方法

public async Task<IActionResult> Index()
  • 功能:获取所有视频并返回视频列表视图。
  • 实现:调用 videoShardService.GetVideosAsync() 方法获取视频数据,并将其传递给视图。

3. Watch 方法

[Route("video/watch/{id}.html")]
public async Task<IActionResult> Watch(string id)
  • 功能:根据视频 ID 获取特定视频的详细信息并返回视图。
  • 实现:调用 videoShardService.GetVideoAsync(id) 获取视频,如果视频不存在则返回 404。

4. HistoryChat 方法 (GET)

[Route("history/chat/v3/"), HttpGet]
public async Task<IActionResult> HistoryChat(string id)
  • 功能:获取特定视频的聊天记录(弹幕)。
  • 实现:调用 barrageService.GetGroupBarragesAsync(id) 获取弹幕数据,并将其格式化为 JSON 返回。

5. HistoryDanmaku 方法 (GET)

[Route("history/danmaku/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmaku(string id)
  • 功能:获取特定视频的弹幕记录。
  • 实现:获取弹幕数据,按时间排序,并将其格式化为 JSON 返回。

6. HistoryDanmaku 方法 (POST)

[Route("history/danmaku"), HttpPost]
public async Task<IActionResult> HistoryDanmaku([FromBody] VideoDanmaku2 danmaku)
  • 功能:接收并保存新的弹幕数据。
  • 实现:创建 VmBarrage 对象并调用 barrageService.AddBarrageAsync(vmBarrage) 保存弹幕。

7. HistoryDanmakuV2 方法 (GET)

[Route("history/danmaku/v2/{id}"), HttpGet]
public async Task<IActionResult> HistoryDanmakuV2(string id)
  • 功能:获取特定视频的弹幕记录(版本 2)。
  • 实现:与 HistoryDanmaku 类似,但返回的数据格式略有不同。

8. SendDanmaku 方法 (POST)

[Route("send/danmaku/v2"), HttpPost]
public async Task<IActionResult> SendDanmaku([FromBody] SendDanmaku danmaku)
  • 功能:接收并保存新的弹幕数据(版本 2)。
  • 实现:验证模型状态,处理颜色转换,创建 VmBarrage 对象并保存弹幕。

总结

这个控制器主要负责视频的展示和弹幕的管理,包括获取视频列表、观看视频、获取和发送弹幕等功能。通过依赖注入的服务,控制器能够与数据层进行交互,处理用户请求并返回相应的视图或 JSON 数据。

loading