mirror of
https://github.com/BililiveRecorder/BililiveRecorder.git
synced 2024-12-26 20:26:00 +08:00
62 lines
2.0 KiB
C#
62 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using BililiveRecorder.Flv.Amf;
|
|
|
|
namespace BililiveRecorder.Flv.Pipeline.Rules
|
|
{
|
|
/// <summary>
|
|
/// 处理收到 Script Tag 的情况
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 本规则为一般规则
|
|
/// </remarks>
|
|
public class HandleNewScriptRule : ISimpleProcessingRule
|
|
{
|
|
private static readonly ProcessingComment comment = new ProcessingComment(CommentType.Other, "收到了非 onMetaData 的 Script Tag");
|
|
|
|
public Task RunAsync(FlvProcessingContext context, Func<Task> next)
|
|
{
|
|
if (context.OriginalInput is PipelineScriptAction scriptAction)
|
|
{
|
|
var data = scriptAction.Tag.ScriptData;
|
|
if (!(data is null)
|
|
&& data.Values.Count == 2
|
|
&& data.Values[0] is ScriptDataString name
|
|
&& name == "onMetaData")
|
|
{
|
|
ScriptDataEcmaArray? value = data.Values[1] switch
|
|
{
|
|
ScriptDataObject obj => obj,
|
|
ScriptDataEcmaArray arr => arr,
|
|
_ => null
|
|
};
|
|
|
|
if (value is null)
|
|
value = new ScriptDataEcmaArray();
|
|
|
|
context.ClearOutput();
|
|
context.AddNewFileAtStart();
|
|
context.Output.Add(new PipelineScriptAction(new Tag
|
|
{
|
|
Type = TagType.Script,
|
|
ScriptData = new ScriptTagBody(new List<IScriptDataValue>
|
|
{
|
|
name,
|
|
value
|
|
})
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
context.AddComment(comment);
|
|
context.ClearOutput();
|
|
}
|
|
return Task.CompletedTask;
|
|
}
|
|
else
|
|
return next();
|
|
}
|
|
}
|
|
}
|