动机:解决苹果系统发布包缺少执行权限和特殊文件误处理问题。 改动:校验发布包权限,支持两类芯片架构并改进文件识别。 影响:苹果系统可直接运行发布包,其他平台构建与使用方式兼容。 验证:运行 go test ./...、go vet ./... 和完整发布构建,结果通过。 关联:无
141 lines
4.1 KiB
Markdown
141 lines
4.1 KiB
Markdown
# ncmdump-go
|
||
|
||
基于 https://github.com/taurusxin/ncmdump 的 Golang 移植版
|
||
|
||
支持网易云音乐最新的 3.x 版本,但需要注意:从 3. x开始的某些网易云音乐版本不再在 ncm 文件中内置封面图片,本项目支持从网易服务器上自动下载对应歌曲的封面图并写入到最终的音乐文件中
|
||
|
||
你也可以去 https://git.taurusxin.com/taurusxin/ncmdump-gui 下载基于本项目的 gui 可视化图形应用,只需简单点击即可自动转换。
|
||
|
||
## 如何提 Issue
|
||
|
||
由于本站恶意机器人注册过多,已关闭账号注册,如果需要提 Issue 请前往 [GitHub](https://github.com/taurusxin/ncmdump),必须注明 Issue 的主题为 ncmdump-go,敬请谅解。
|
||
|
||
## 安装
|
||
|
||
你可以前往 [releases](https://git.taurusxin.com/taurusxin/ncmdump-go/releases/latest) 下载最新版预编译好的二进制文件,或者使用包管理器安装。
|
||
|
||
### macOS
|
||
|
||
项目同时支持 Apple Silicon(M1/M2/M3/M4 等)和 Intel Mac:
|
||
|
||
- Apple Silicon 下载文件名包含 `darwin_arm64` 的压缩包;
|
||
- Intel Mac 下载文件名包含 `darwin_amd64` 的压缩包;
|
||
- 不确定芯片架构时,可运行 `uname -m`:输出 `arm64` 对应 Apple Silicon,输出 `x86_64` 对应 Intel。
|
||
|
||
下载并解压后,在终端执行:
|
||
|
||
```shell
|
||
chmod +x ncmdump-go
|
||
sudo install -d /usr/local/bin
|
||
sudo install -m 0755 ncmdump-go /usr/local/bin/ncmdump-go
|
||
ncmdump-go --version
|
||
```
|
||
|
||
新发布的 macOS 压缩包已经包含可执行权限;这里保留 `chmod`,以兼容早期发布包。如果 macOS 提示无法验证开发者,可在确认文件来自本项目发布页后、执行安装命令前移除下载隔离属性:
|
||
|
||
```shell
|
||
xattr -d com.apple.quarantine ncmdump-go
|
||
```
|
||
|
||
也可以安装 Go 1.23 或更高版本后从源码构建:
|
||
|
||
```shell
|
||
go build -o ncmdump-go .
|
||
```
|
||
|
||
```shell
|
||
# Windows Scoop
|
||
scoop bucket add taurusxin https://git.taurusxin.com/taurusxin/scoop-bucket.git # 添加 scoop 源
|
||
scoop install ncmdump-go # 安装 ncmdump-go
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
使用 `-h` 或 `--help` 参数来打印帮助
|
||
|
||
```shell
|
||
ncmdump-go -h
|
||
```
|
||
|
||
使用 `-v` 或 `--version` 参数来打印版本信息
|
||
|
||
```shell
|
||
ncmdump-go -v
|
||
```
|
||
|
||
处理单个或多个文件
|
||
|
||
```shell
|
||
ncmdump-go 1.ncm 2.ncm...
|
||
```
|
||
|
||
使用 `-d` 参数来指定一个文件夹,对文件夹下的所有以 ncm 为扩展名的文件进行批量处理
|
||
|
||
```shell
|
||
ncmdump-go -d source_dir
|
||
```
|
||
|
||
使用 `-r` 配合 `-d` 参数来递归处理文件夹下的所有以 ncm 为扩展名的文件
|
||
|
||
```shell
|
||
ncmdump-go -d source_dir -r
|
||
```
|
||
|
||
使用 `-o` 参数来指定输出目录,将转换后的文件输出到指定目录,该参数支持与 `-r` 参数一起使用
|
||
|
||
```shell
|
||
# 处理单个或多个文件并输出到指定目录
|
||
ncmdump-go 1.ncm 2.ncm -o output_dir
|
||
|
||
# 处理文件夹下的所有以 ncm 为扩展名并输出到指定目录,不包含子文件夹
|
||
ncmdump-go -d source_dir -o output_dir
|
||
|
||
# 递归处理文件夹并输出到指定目录,并保留目录结构
|
||
ncmdump-go -d source_dir -o output_dir -r
|
||
```
|
||
|
||
## 开发
|
||
|
||
使用 Go module 下载 ncmdump-go 包
|
||
|
||
```shell
|
||
go get git.taurusxin.com/taurusxin/ncmdump-go@latest
|
||
```
|
||
|
||
导入并使用
|
||
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"git.taurusxin.com/taurusxin/ncmdump-go/ncmcrypt"
|
||
)
|
||
|
||
func main() {
|
||
filePath := "test.ncm"
|
||
|
||
// 创建实例
|
||
ncm, err := ncmcrypt.NewNeteaseCloudMusic(filePath)
|
||
if err != nil {
|
||
fmt.Printf("Reading '%s' failed: '%s'\n", filePath, err.Error())
|
||
return
|
||
}
|
||
|
||
// 转换格式,若目标文件夹为空,则保存在原目录
|
||
dumpResult, err := ncm.Dump("")
|
||
if err != nil {
|
||
fmt.Printf("Processing '%s' failed: '%s'\n", filePath, err.Error())
|
||
}
|
||
if dumpResult {
|
||
// 使用源文件的元数据修补转换后的音乐文件
|
||
// 注意:自网易云音乐 3.0 版本开始,ncm 文件中不再内嵌专辑封面图片,参数若为 true 则表示从网易服务器上下载图片并嵌入到目标音乐文件(需要联网)
|
||
metadata, err := ncm.FixMetadata(true)
|
||
if !metadata {
|
||
fmt.Printf("Fix metadata for '%s' failed: '%s'", filePath, err.Error())
|
||
}
|
||
fmt.Printf("'%s' -> '%s'\n", filePath, ncm.GetDumpFilePath())
|
||
}
|
||
}
|
||
```
|