4c71e9803e0a696f2ca116820a0d1615a054318e
dec-music
作为库使用
模块路径:jsuse.com/dev/dec-music
对外包名:music
API(与历史版本兼容)
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 下。
示例
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 应用”等。
# 正确:编译命令行程序
go build -o dec-music.exe ./cmd/dec-music
# 根目录仅校验库能否编译(不会在目录里生成可运行的 exe)
go build .
无参数运行 dec-music.exe 会打印用法(等同 --help)。
用法
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 密钥(可选)
示例
# 解密当前目录到 ./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() 为准。
项目结构
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。
开发
go build .
go test ./decrypt/...
go build ./cmd/dec-music
许可
与项目原有许可保持一致。internal/tea 摘自 golang.org/x/crypto(BSD),见该目录内源文件注释。
D:\Media\Kugou\Download\KugouMusic\张蔷 - 夜猫.kgma
Description
Languages
Go
99.2%
Shell
0.8%