Skip to content

Commit 9b0115f

Browse files
committed
fix: 导出 UGC 支持全难度 + 补充元信息 + BGM/封面引用
- 导出所有启用的难度 (bas/adv/exp/mas/ult) - 从 Music.xml 填充 Title/Artist/Designer/Level/MusicId - 用 fumen 索引覆盖 @DIFF (C2S DIFFICULT 字段全为 00) - UGC 文件插入 @bgm=bgm.wav 和 @jacket=jacket.png - ZIP 结构: 曲名/{bas,adv,exp,mas}.ugc + bgm.wav + jacket.png
1 parent f6a4a76 commit 9b0115f

1 file changed

Lines changed: 39 additions & 23 deletions

File tree

ChuChartManager/Controllers/MusicController.cs

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,38 +1078,54 @@ public ActionResult ExportCustom([FromQuery] int id, [FromQuery] string assetDir
10781078
if (music == null) return NotFound();
10791079

10801080
var safeName = string.Join("_", music.Name.Split(Path.GetInvalidFileNameChars()));
1081+
var ext = format.ToLowerInvariant() == "sus" ? "sus" : "ugc";
1082+
var diffFileNames = new[] { "bas", "adv", "exp", "mas", "ult", "we" };
1083+
10811084
var ms = new MemoryStream();
10821085
using (var zip = new ZipArchive(ms, ZipArchiveMode.Create, true))
10831086
{
1084-
var enabledFumen = music.Fumens.FirstOrDefault(f => f is { Enable: true });
1085-
if (enabledFumen != null)
1087+
for (var i = 0; i < music.Fumens.Length; i++)
10861088
{
1087-
var c2sPath = Path.Combine(music.MusicDirectory, enabledFumen.FilePath);
1088-
if (System.IO.File.Exists(c2sPath))
1089+
var fumen = music.Fumens[i];
1090+
if (fumen is not { Enable: true } || string.IsNullOrEmpty(fumen.FilePath)) continue;
1091+
1092+
var c2sPath = Path.Combine(music.MusicDirectory, fumen.FilePath);
1093+
if (!System.IO.File.Exists(c2sPath)) continue;
1094+
1095+
var c2sContent = System.IO.File.ReadAllText(c2sPath, Encoding.UTF8);
1096+
try
10891097
{
1090-
var c2sContent = System.IO.File.ReadAllText(c2sPath, Encoding.UTF8);
1091-
try
1092-
{
1093-
var (chart, _) = new C2sParser().Parse(c2sContent);
1094-
var ext = format.ToLowerInvariant() == "sus" ? "sus" : "ugc";
1095-
var content = ext == "sus"
1096-
? new SusGenerator().Generate(chart).Item1
1097-
: new UgcGenerator().Generate(chart).Item1;
1098-
var entry = zip.CreateEntry($"{safeName}.{ext}");
1099-
using var w = new StreamWriter(entry.Open(), Encoding.UTF8);
1100-
w.Write(content);
1101-
}
1102-
catch
1103-
{
1104-
zip.CreateEntryFromFile(c2sPath, $"{safeName}.c2s");
1105-
}
1098+
var (chart, _) = new C2sParser().Parse(c2sContent);
1099+
chart.Difficulty = i;
1100+
chart.Title = music.Name;
1101+
chart.Artist = music.Artist;
1102+
chart.Designer = fumen.NotesDesigner;
1103+
chart.DisplayLevel = fumen.LevelDisplay;
1104+
chart.Level = fumen.LevelValue;
1105+
chart.MusicId = music.Id.ToString();
1106+
var content = ext == "sus"
1107+
? new SusGenerator().Generate(chart).Item1
1108+
: new UgcGenerator().Generate(chart).Item1;
1109+
1110+
if (ext == "ugc")
1111+
content = content.Replace("@SONGID\t", "@BGM\tbgm.wav\r\n@JACKET\tjacket.png\r\n@SONGID\t");
1112+
1113+
var fileName = i < diffFileNames.Length ? diffFileNames[i] : $"diff{i}";
1114+
var entry = zip.CreateEntry($"{safeName}/{fileName}.{ext}");
1115+
using var w = new StreamWriter(entry.Open(), Encoding.UTF8);
1116+
w.Write(content);
1117+
}
1118+
catch
1119+
{
1120+
var fileName = i < diffFileNames.Length ? diffFileNames[i] : $"diff{i}";
1121+
zip.CreateEntryFromFile(c2sPath, $"{safeName}/{fileName}.c2s");
11061122
}
11071123
}
11081124

11091125
var wav = AudioHelper.GetWavFromMusic(music);
11101126
if (wav != null)
11111127
{
1112-
var entry = zip.CreateEntry($"{safeName}.wav");
1128+
var entry = zip.CreateEntry($"{safeName}/bgm.wav");
11131129
using var s = entry.Open();
11141130
s.Write(wav);
11151131
}
@@ -1120,13 +1136,13 @@ public ActionResult ExportCustom([FromQuery] int id, [FromQuery] string assetDir
11201136
var pngData = ConvertDdsToPng(jacketPath);
11211137
if (pngData != null)
11221138
{
1123-
var entry = zip.CreateEntry($"{safeName}.png");
1139+
var entry = zip.CreateEntry($"{safeName}/jacket.png");
11241140
using var s = entry.Open();
11251141
s.Write(pngData);
11261142
}
11271143
else if (Path.GetExtension(jacketPath).ToLowerInvariant() is ".png" or ".jpg" or ".jpeg")
11281144
{
1129-
zip.CreateEntryFromFile(jacketPath, $"{safeName}{Path.GetExtension(jacketPath)}");
1145+
zip.CreateEntryFromFile(jacketPath, $"{safeName}/jacket{Path.GetExtension(jacketPath)}");
11301146
}
11311147
}
11321148
}

0 commit comments

Comments
 (0)