Files
dec-music/README.md
T

4.4 KiB
Raw Blame History

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-extdecrypt.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/teaBSD
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/cryptoBSD),见该目录内源文件注释。

D:\Media\Kugou\Download\KugouMusic\张蔷 - 夜猫.kgma