Skip to content

Commit 91b546f

Browse files
committed
feat: CLI 新增 makeacb/makedds 命令,移除导出命令
- 新增 makeacb:音频转 ACB(wav/mp3/ogg/wma/aac/hca) - 新增 makedds:图片转 DDS,复用 DdsHelper.ConvertPngToDds - 两命令均支持多文件批量转换、-O 单文件输出、终端进度条 - 移除 export-mp3、export-jacket 命令及对应文件 - CLI csproj 链接复制 template_music.acb 到输出目录,修复 makeacb 运行时找不到模板 - 清理 Program.cs 中的 MaiChartManager 命名空间残留 - 删除 Packaging/build.sh:FreeMote 工具链为 net48,无法在 Linux 交叉编译
1 parent 53a1aa0 commit 91b546f

7 files changed

Lines changed: 149 additions & 375 deletions

File tree

ChuChartManager.CLI/ChuChartManager.CLI.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
</ItemGroup>
1616

1717
<ItemGroup>
18+
<None Include="..\ChuChartManager\Resources\template_music.acb" Link="Resources\template_music.acb" CopyToOutputDirectory="PreserveNewest" />
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<PackageReference Include="Sentry" Version="6.6.0" />
1823
<PackageReference Include="Spectre.Console.Cli" Version="0.49.1" />
1924
</ItemGroup>
2025

ChuChartManager.CLI/Commands/ExportJacketCommand.cs

Lines changed: 0 additions & 118 deletions
This file was deleted.

ChuChartManager.CLI/Commands/ExportMp3Command.cs

Lines changed: 0 additions & 90 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.ComponentModel;
2+
using ChuChartManager;
3+
using ChuChartManager.CLI.Utils;
4+
using Spectre.Console;
5+
using Spectre.Console.Cli;
6+
7+
namespace ChuChartManager.CLI.Commands;
8+
9+
public class MakeAcbCommand : AsyncCommand<MakeAcbCommand.Settings>
10+
{
11+
public class Settings : CommandSettings
12+
{
13+
[CommandArgument(0, "<sources>")]
14+
[Description("要转换的源音频文件(支持 wav/mp3/ogg/wma/aac/hca)")]
15+
public string[] Sources { get; set; } = [];
16+
17+
[CommandOption("-O|--output <PATH>")]
18+
[Description("输出文件路径(仅单文件时可用,默认与源文件同名 .acb)")]
19+
public string? Output { get; set; }
20+
21+
public override ValidationResult Validate()
22+
{
23+
if (Sources.Length == 0)
24+
return ValidationResult.Error("至少需要一个源文件");
25+
26+
if (Sources.Length > 1 && !string.IsNullOrEmpty(Output))
27+
return ValidationResult.Error("多文件转换时不能使用 -O 选项");
28+
29+
foreach (var source in Sources)
30+
{
31+
if (!File.Exists(source))
32+
return ValidationResult.Error($"源文件不存在: {source}");
33+
}
34+
35+
return ValidationResult.Success();
36+
}
37+
}
38+
39+
public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
40+
{
41+
int done = 0, failed = 0;
42+
foreach (var source in settings.Sources)
43+
{
44+
try
45+
{
46+
TerminalProgress.Set(done * 100 / settings.Sources.Length);
47+
var output = settings.Sources.Length == 1 && !string.IsNullOrEmpty(settings.Output)
48+
? settings.Output
49+
: Path.ChangeExtension(source, ".acb");
50+
51+
await Task.Run(() => AcbHelper.PackMusicAcb(source, output));
52+
AnsiConsole.MarkupLine($"[green]✓[/] {Markup.Escape(Path.GetFileName(source))}{Markup.Escape(output)}");
53+
done++;
54+
}
55+
catch (Exception ex)
56+
{
57+
AnsiConsole.MarkupLine($"[red]✗[/] {Markup.Escape(Path.GetFileName(source))}: {Markup.Escape(ex.Message)}");
58+
failed++;
59+
}
60+
}
61+
62+
TerminalProgress.Clear();
63+
AnsiConsole.MarkupLine($"\n[green]完成: {done} 个转换[/]{(failed > 0 ? $", [yellow]{failed} 个失败[/]" : "")}");
64+
return failed > 0 ? 1 : 0;
65+
}
66+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.ComponentModel;
2+
using ChuChartManager;
3+
using ChuChartManager.CLI.Utils;
4+
using Spectre.Console;
5+
using Spectre.Console.Cli;
6+
7+
namespace ChuChartManager.CLI.Commands;
8+
9+
public class MakeDdsCommand : AsyncCommand<MakeDdsCommand.Settings>
10+
{
11+
public class Settings : CommandSettings
12+
{
13+
[CommandArgument(0, "<sources>")]
14+
[Description("要转换的源图片文件(支持 png/jpg/bmp/gif/tiff/webp 等)")]
15+
public string[] Sources { get; set; } = [];
16+
17+
[CommandOption("-O|--output <PATH>")]
18+
[Description("输出文件路径(仅单文件时可用,默认与源文件同名 .dds)")]
19+
public string? Output { get; set; }
20+
21+
public override ValidationResult Validate()
22+
{
23+
if (Sources.Length == 0)
24+
return ValidationResult.Error("至少需要一个源文件");
25+
26+
if (Sources.Length > 1 && !string.IsNullOrEmpty(Output))
27+
return ValidationResult.Error("多文件转换时不能使用 -O 选项");
28+
29+
foreach (var source in Sources)
30+
{
31+
if (!File.Exists(source))
32+
return ValidationResult.Error($"源文件不存在: {source}");
33+
}
34+
35+
return ValidationResult.Success();
36+
}
37+
}
38+
39+
public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
40+
{
41+
int done = 0, failed = 0;
42+
foreach (var source in settings.Sources)
43+
{
44+
try
45+
{
46+
TerminalProgress.Set(done * 100 / settings.Sources.Length);
47+
var output = settings.Sources.Length == 1 && !string.IsNullOrEmpty(settings.Output)
48+
? settings.Output
49+
: Path.ChangeExtension(source, ".dds");
50+
51+
await Task.Run(() => DdsHelper.ConvertPngToDds(source, output));
52+
AnsiConsole.MarkupLine($"[green]✓[/] {Markup.Escape(Path.GetFileName(source))}{Markup.Escape(output)}");
53+
done++;
54+
}
55+
catch (Exception ex)
56+
{
57+
AnsiConsole.MarkupLine($"[red]✗[/] {Markup.Escape(Path.GetFileName(source))}: {Markup.Escape(ex.Message)}");
58+
failed++;
59+
}
60+
}
61+
62+
TerminalProgress.Clear();
63+
AnsiConsole.MarkupLine($"\n[green]完成: {done} 个转换[/]{(failed > 0 ? $", [yellow]{failed} 个失败[/]" : "")}");
64+
return failed > 0 ? 1 : 0;
65+
}
66+
}

ChuChartManager.CLI/Program.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
using System.Text;
21
using ChuChartManager;
32
using ChuChartManager.CLI.Commands;
43
using ChuChartManager.CLI.Utils;
54
using Spectre.Console.Cli;
5+
using System.Text;
66

77
Console.OutputEncoding = Encoding.UTF8;
88
Console.CancelKeyPress += (_, _) => TerminalProgress.Clear();
@@ -22,15 +22,17 @@
2222
.WithDescription("查看单曲详细信息")
2323
.WithExample("info", "-p", "G:\\", "-i", "100");
2424

25-
config.AddCommand<ExportMp3Command>("export-mp3")
26-
.WithDescription("导出曲目音频为 MP3")
27-
.WithExample("export-mp3", "-p", "G:\\", "-i", "100")
28-
.WithExample("export-mp3", "-p", "G:\\", "-a", "-o", "mp3_output");
29-
30-
config.AddCommand<ExportJacketCommand>("export-jacket")
31-
.WithDescription("导出曲目封面为 PNG")
32-
.WithExample("export-jacket", "-p", "G:\\", "-i", "100")
33-
.WithExample("export-jacket", "-p", "G:\\", "-a", "-o", "jacket_output");
25+
config.AddCommand<MakeAcbCommand>("makeacb")
26+
.WithDescription("将音频文件转换为 ACB 格式")
27+
.WithExample("makeacb", "audio.wav")
28+
.WithExample("makeacb", "audio.mp3", "-O", "output.acb")
29+
.WithExample("makeacb", "audio1.wav", "audio2.mp3");
30+
31+
config.AddCommand<MakeDdsCommand>("makedds")
32+
.WithDescription("将图片文件转换为 DDS 格式")
33+
.WithExample("makedds", "cover.png")
34+
.WithExample("makedds", "cover.jpg", "-O", "output.dds")
35+
.WithExample("makedds", "img1.png", "img2.jpg");
3436

3537
config.AddCommand<ValidateCommand>("validate")
3638
.WithDescription("检查数据完整性(缺音频、缺封面、XML 损坏)")

0 commit comments

Comments
 (0)