# dec-music ## 作为库使用 模块路径:`jsuse.com/dev/dec-music` 对外包名:`music` ### API(与历史版本兼容) ```go import "jsuse.com/dev/dec-music" // 批量解密目录(递归子目录) err := music.DecryptProcess(inputDir, outputDir, noSubOutput, onProcess) // 解密单个文件 err := music.DecryptFile(inputFile, outputDir, noSubOutput, onProcess) ``` | 符号 | 说明 | |------|------| | `music.DecryptProcess` | 遍历 `inputDir` 下媒体文件并解密到 `outputDir` | | `music.DecryptFile` | 只处理一个文件 | | `music.OnProcess` | 可选回调 `func(src, dst, err string)`,`err` 为空表示成功 | | `music.ErrNoDecoder` | 无可用解密器时的错误文案常量 | `noSubOutput == false` 时,输出目录会保留相对子目录结构;为 `true` 时所有文件平铺在 `outputDir` 下。 ### 示例 ```go package main import ( "fmt" "jsuse.com/dev/dec-music" ) func main() { err := music.DecryptProcess(`D:\Music\encrypted`, `D:\Music\decrypted`, false, func(src, dst, errMsg string) { if errMsg != "" { fmt.Println("失败:", src, errMsg) return } fmt.Println("成功:", src, "->", dst) }) if err != nil { panic(err) } } ``` ## 命令行工具(本地测试) CLI 位于 `cmd/dec-music`,依赖 `urfave/cli`,与库分离。 **不要在仓库根目录**对 `.` 执行 `go build -o xxx.exe`:根目录是 `package music`(库),没有 `main`。那样即使生成名为 `.exe` 的文件,也不是 Windows 可执行程序,运行会提示“不是有效的 Win32 应用”等。 ```bash # 正确:编译命令行程序 go build -o dec-music.exe ./cmd/dec-music # 根目录仅校验库能否编译(不会在目录里生成可运行的 exe) go build . ``` 无参数运行 `dec-music.exe` 会打印用法(等同 `--help`)。 ### 用法 ```text dec-music [选项] [输入路径] 选项: -i, --input <路径> 输入文件或目录(默认当前目录) -o, --output <路径> 输出目录(默认与输入相同) --no-sub-output 输出文件不保留子目录结构 --skip-noop 跳过已是明文的音频(mp3/flac 等透传解码器) --overwrite 覆盖已存在的输出文件 --supported-ext 列出支持的加密扩展名并退出 --qmc-mmkv <文件> macOS QQ 音乐 MMKV 密钥库路径 --qmc-mmkv-key <密钥> 加密 MMKV 的 AES 密钥(可选) ``` ### 示例 ```bash # 解密当前目录到 ./out dec-music -i . -o ./out # 解密单个文件 dec-music -i song.ncm -o ./out # 查看支持的扩展名 dec-music --supported-ext # macOS QQ 音乐:指定 MMKV(可选) dec-music -i ~/Music --qmc-mmkv "/path/to/MMKVStreamEncryptId" ``` 成功时终端会打印彩色行:`操作成功: 源 -> 目标`(由 `log` 包输出)。 ## 支持的格式 | 平台 | 常见扩展名 | |------|------------| | 网易云 | `.ncm` | | QQ / 腾讯 | `.qmc0` `.qmc3` `.qmcflac` `.mgg` `.mflac` `.tkm` 等 | | 酷狗 | `.kgm` `.kgma` `.vpr` | | 酷我 | `.kwm` | | 喜马拉雅 | `.x2m` `.x3m` `.xm` | | 虾米等 | `.xm` `.wav` `.mp3`(部分) | 完整列表以 `--supported-ext` 或 `decrypt.SupportedExtensions()` 为准。 ## 项目结构 ```text dec-music/ ├── decrypt.go # package music:对外 API ├── decrypt/ # 各平台解密实现(内部) ├── mmkv/ # QQ Mac MMKV 密钥(内部,darwin) ├── internal/ │ ├── crypto/ # AES 等 │ ├── sniff/ # 输出格式嗅探 │ └── fileutil/ # 媒体文件判断 ├── log/ # 可选彩色日志(CLI 使用) └── cmd/dec-music/ # 命令行 ``` ## 依赖说明 | 模块 | 用途 | |------|------| | (根模块库) | 仅标准库;`internal/tea` 为 QQ 密钥派生(源自 golang.org/x/crypto/tea,BSD) | | `cmd/dec-music` | 额外需要 `github.com/urfave/cli/v2` | MMKV 的 protobuf 线格式解析已内置在 `mmkv/internal`,不依赖 `google.golang.org/protobuf`。 ## 开发 ```bash go build . go test ./decrypt/... go build ./cmd/dec-music ``` ## 许可 与项目原有许可保持一致。`internal/tea` 摘自 golang.org/x/crypto(BSD),见该目录内源文件注释。 D:\Media\Kugou\Download\KugouMusic\张蔷 - 夜猫.kgma