Skip to content

Commit 47834d4

Browse files
committed
[+] UgcGenerator新增extraHeaders参数,用于在UGC中添加自定义的头字段
1 parent c59588f commit 47834d4

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ var (ugcChart, alerts) = new UgcParser().Parse(ugcText); // 解析 UGC 谱面字
167167
168168
var (c2sText, alerts) = new C2sGenerator().Generate(ugcChart); // UGC -> C2S
169169
var (ugcText, alerts) = new UgcGenerator().Generate(c2sChart); // C2S -> UGC
170+
// 若需在UGC的头部区域写入自定义的字段(如BGM、JACKET等),可向构造函数内传入一个List<(string, string)>参数,例如:new UgcGenerator([("BGM", "xxx.mp3"), ("JACKET", "xxx.png")]);
170171
// 各种Generator的Generate方法,均接受 ChuChart(可将任一 Parser 产出的 ChuChart 互相传入)。
171172
// 同上,alerts是生成过程中可能产生的警告信息等,建议打印出来。
172173
```
@@ -208,6 +209,9 @@ var (ogkrText, alerts) = new OngekiGenerator().Generate(ogkChart); // 将 OgkCha
208209
- StrictLevelEnum `strictLevel` (默认为 `Normal`): 解析 Simai 时的严格程度(`Strict` / `Normal` / `Lax`),影响语法容错与报错策略。各个严格程度策略的具体含义,请参见上方[CLI文档](#基本用法)中的相关描述。
209210
- MA2Generator带有以下选项:
210211
- bool `isUtage` (默认为false): 仅影响生成的MA2的文件头区域的`FES_MODE`的值是1还是0,一般来说是不重要的。
212+
- UgcGenerator带有以下选项:
213+
- List<(string, string)> `extraHeaders` (默认为`null`即不添加额外的头字段):在生成的UGC的头部区域中,写入额外的字段。
214+
- `(string, string)`元组的第一项为字段名(不含`@`前缀),第二项为字段值;生成时会输出为 `@{字段名}\t{内容}`
211215
212216
#### 更多示例(异常处理)
213217
注意:当解析/生成步骤失败时,会抛出`ConversionException`异常,其中含有`Alerts`属性,是转谱过程中遇到的错误和警告等信息。(类比于C语言编译器会打印出Error和Warning信息)

generator/chu/UgcGenerator.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ public class UgcGenerator : IGenerator<ChuChart>
1010
{
1111
private int RSL = 480 * 4;
1212
private List<Alert> alerts = [];
13+
public List<(string, string)> ExtraHeaders = [];
14+
15+
/**
16+
* <param name="extraHeaders">在生成的UGC的HEAD区域,添加上额外的字段。</param>
17+
*/
18+
public UgcGenerator(List<(string, string)>? extraHeaders = null)
19+
{
20+
if (extraHeaders != null) ExtraHeaders = extraHeaders;
21+
}
1322

1423
public (string, List<Alert>) Generate(ChuChart chart)
1524
{
@@ -48,6 +57,7 @@ void Dfs(ChuNote n)
4857
private string Serialize(ChuChart ugc)
4958
{
5059
ugc.Sort();
60+
var extraHeaderKeys = ExtraHeaders.Select(x => x.Item1).ToHashSet();
5161

5262
var sb = new StringBuilder();
5363
sb.AppendLine($"' Created with MuConvert v{Utils.AppVersion}");
@@ -62,6 +72,10 @@ private string Serialize(ChuChart ugc)
6272
sb.AppendLine(FormattableString.Invariant($"@CONST\t{ugc.Level:F5}"));
6373
var songId = !(string.IsNullOrEmpty(ugc.MusicId) || ugc.MusicId == "0") ? ugc.MusicId : $"MuC-{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}";
6474
sb.AppendLine($"@SONGID\t{songId}");
75+
foreach (var (key, value) in ExtraHeaders)
76+
{ // 写入用户传入的ExtraHeaders中要求的字段
77+
sb.AppendLine($"@{key}\t{value}");
78+
}
6579
sb.AppendLine("@FLAG\tHIPRECISION\tTRUE"); // 表明,谱面中的高度使用的是两位高度而不是一位高度
6680
sb.AppendLine($"@TICKS\t{RSL / 4}");
6781
foreach (var met in ugc.MetList)
@@ -74,15 +88,15 @@ private string Serialize(ChuChart ugc)
7488
var (m, o) = Utils.BarAndTick(b.Time, RSL);
7589
sb.AppendLine(FormattableString.Invariant($"@BPM\t{m}'{o}\t{b.Bpm:F5}"));
7690
}
77-
sb.AppendLine("@TIL\t0\t0'0\t1.00000");
91+
if (!extraHeaderKeys.Contains("TIL")) sb.AppendLine("@TIL\t0\t0'0\t1.00000"); // 用户没有通过ExtraHeaders指定,则提供一个默认值
7892

7993
foreach (var s in ugc.SflList.OrderBy(x => x.Time))
8094
{
8195
var (m, o) = Utils.BarAndTick(s.Time, RSL);
8296
sb.AppendLine(FormattableString.Invariant($"@SPDMOD\t{m}'{o}\t{s.Multiplier:0.00000}"));
8397
}
8498

85-
sb.AppendLine("@MAINTIL\t0");
99+
if (!extraHeaderKeys.Contains("MAINTIL")) sb.AppendLine("@MAINTIL\t0"); // 用户没有通过ExtraHeaders指定,则提供一个默认值
86100
sb.AppendLine("@ENDHEAD");
87101
sb.AppendLine();
88102

0 commit comments

Comments
 (0)