网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Net.Http.Json;
using System.Text.Json.Nodes;
using Dpz.Core.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Dpz.Core.Service.ObjectStorage.VideoHandle;

public class VideoPretreatment(
    HttpClient httpClient,
    ILogger<VideoPretreatment> logger,
    IConfiguration configuration,
    UpyunOperator upyunOperator
)
{
    public async Task SliceAsync(string source, string name)
    {
        var argument = new PretreatmentArgument
        {
            Service = upyunOperator.Bucket ?? throw new InvalidConfigurationException(),
            NotifyUrl = configuration["NotifyUrl"] ?? throw new InvalidConfigurationException(),
            Source = source,
            Tasks =
            [
                new PretreatmentTask
                {
                    Type = "video",
                    AvOpts = [new 切片(5), new 视频分辨率()],
                    SaveAs = $"/Video/{name}/1080p.m3u8"
                }
            ]
        };

        var request = new HttpRequestMessage(HttpMethod.Post, "pretreatment");
        request.Content = new FormUrlEncodedContent(
            [
                new KeyValuePair<string, string>("service", argument.Service),
                new KeyValuePair<string, string>("notify_url", argument.NotifyUrl),
                new KeyValuePair<string, string>("source", argument.Source),
                new KeyValuePair<string, string>("tasks", argument.TasksBase64String()),
                new KeyValuePair<string, string>("Accept", argument.Accept),
            ]
        );

        await request.SignatureAsync(upyunOperator);
        var response = await httpClient.SendAsync(request);

        if (!response.IsSuccessStatusCode)
        {
            logger.LogError("pretreatment fail,status code:{StatusCode}", response.StatusCode);
            throw new BusinessException(
                $"pretreatment fail,response status code:{response.StatusCode}"
            );
        }

        var taskIds = await response.Content.ReadFromJsonAsync<List<string>>();
        if (taskIds == null || taskIds.Count == 0)
        {
            logger.LogWarning("pretreatment fail,task ids is empty");
            return;
        }

        await QueryTaskResultAsync(taskIds[0]);
    }

    public async Task QueryTaskResultAsync(string taskId)
    {
        var request = new HttpRequestMessage(
            HttpMethod.Get,
            $"status?service={upyunOperator.Bucket}&task_ids={taskId}"
        );
        await request.SignatureAsync(upyunOperator);
        var response = await httpClient.SendAsync(request);
        if (!response.IsSuccessStatusCode)
        {
            logger.LogError("query task result fail,status code:{StatusCode}", response.StatusCode);
            throw new BusinessException(
                $"query task result fail,response status code:{response.StatusCode}"
            );
        }

        var json = await response.Content.ReadAsStringAsync();

        var root = JsonNode.Parse(json);
        var status = root?["tasks"]?[taskId]?.GetValue<decimal?>();

        if (status == null)
        {
            logger.LogWarning("query task result fail,task status is null,data :{Data}", json);
        }
        if (status is null or < 100)
        {
            logger.LogInformation("task is processing : {Process}%", status ?? 0);
            await Task.Delay(TimeSpan.FromSeconds(3));
            await QueryTaskResultAsync(taskId);
            return;
        }

        logger.LogInformation("task is processed");
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 C# 类 VideoPretreatment 的实现,主要用于处理视频的预处理任务。它使用了 HttpClient 来与一个视频处理服务进行交互,执行视频切片和查询任务状态的功能。以下是代码的主要功能和结构的详细解释:

类的构造函数

public VideoPretreatment(
    HttpClient httpClient,
    ILogger<VideoPretreatment> logger,
    IConfiguration configuration,
    UpyunOperator upyunOperator
)
  • HttpClient: 用于发送 HTTP 请求。
  • ILogger: 用于记录日志。
  • IConfiguration: 用于读取配置文件中的设置。
  • UpyunOperator: 可能是一个自定义的类,用于处理与 Upyun(一个云存储服务)相关的操作。

方法 SliceAsync

public async Task SliceAsync(string source, string name)
  • 功能: 该方法用于切片视频。
  • 参数:
    • source: 视频源的 URL。
    • name: 切片后视频的名称。

主要步骤

  1. 构建请求参数: 创建一个 PretreatmentArgument 对象,包含服务名称、通知 URL、源视频和任务列表。
  2. 创建 HTTP 请求: 使用 HttpRequestMessage 创建一个 POST 请求,目标是 pretreatment 接口。
  3. 设置请求内容: 使用 FormUrlEncodedContent 设置请求的内容,包括服务、通知 URL、源视频和任务信息。
  4. 签名请求: 调用 SignatureAsync 方法为请求添加签名(可能是为了安全性)。
  5. 发送请求: 使用 httpClient.SendAsync 发送请求。
  6. 处理响应: 检查响应状态码,如果失败则记录错误并抛出异常。
  7. 读取任务 ID: 从响应中读取任务 ID,并检查是否为空。
  8. 查询任务结果: 调用 QueryTaskResultAsync 方法查询任务的处理结果。

方法 QueryTaskResultAsync

public async Task QueryTaskResultAsync(string taskId)
  • 功能: 查询指定任务的处理状态。
  • 参数: taskId,要查询的任务 ID。

主要步骤

  1. 创建请求: 使用 HttpRequestMessage 创建一个 GET 请求,目标是 status 接口,包含服务名称和任务 ID。
  2. 签名请求: 同样调用 SignatureAsync 方法为请求添加签名。
  3. 发送请求: 发送请求并检查响应状态码。
  4. 处理响应: 读取响应内容并解析为 JSON。
  5. 检查任务状态: 从 JSON 中提取任务状态。
  6. 处理状态:
    • 如果状态为 null,记录警告。
    • 如果状态小于 100,表示任务仍在处理,记录进度并等待 3 秒后再次查询。
    • 如果任务处理完成,记录信息。

总结

这个类的主要功能是与视频处理服务进行交互,执行视频切片操作,并能够查询任务的处理状态。它通过异步方法实现了非阻塞的操作,适合在高并发环境中使用。代码中还包含了错误处理和日志记录,以便于调试和监控。

loading