8 Commits

Author SHA1 Message Date
1765813f08 bump version to 1.7.2 2024-11-25 14:04:01 +08:00
c11fbf88db chore: modified go mod name 2024-11-25 13:59:13 +08:00
88314554d0 release 1.7.1 2024-11-08 15:01:14 +08:00
686bfc79bf fix: rune not supported by encoding. 2024-11-08 14:59:37 +08:00
300a412058 更新 README.md 2024-10-23 19:50:04 +08:00
609bfd03cc update: README.md 2024-10-23 19:31:38 +08:00
5862d7a8d8 release: 1.7.0 2024-10-23 19:18:44 +08:00
be81c22e49 fix: incorrect metadata structure 2024-10-23 19:17:51 +08:00
6 changed files with 58 additions and 17 deletions

View File

@@ -4,6 +4,18 @@
支持网易云音乐最新的 3.x 版本,但需要注意:从该版本开始网易云音乐不再在 ncm 文件中内置封面图片,本工具支持从网易服务器上自动下载对应歌曲的封面图并写入到最终的音乐文件中 支持网易云音乐最新的 3.x 版本,但需要注意:从该版本开始网易云音乐不再在 ncm 文件中内置封面图片,本工具支持从网易服务器上自动下载对应歌曲的封面图并写入到最终的音乐文件中
## 安装
你可以使用去 [releases](https://git.taurusxin.com/taurusxin/ncmdump-go/releases/latest) 下载最新版预编译好的二进制文件,或者你也可以用包管理器来安装
```shell
# Windows Scoop
scoop bucket add taurusxin https://git.taurusxin.com/taurusxin/scoop-bucket.git # 添加 scoop 源
scoop install ncmdump-go # 安装 ncmdump-go
# macOS & Linux 之后会支持
```
## 使用方法 ## 使用方法
使用 `-h``--help` 参数来打印帮助 使用 `-h``--help` 参数来打印帮助
@@ -54,7 +66,7 @@ ncmdump-go -d source_dir -o output_dir -r
使用 go module 下载 ncmdump-go 包 使用 go module 下载 ncmdump-go 包
```shell ```shell
go get -u github.com/taurusxin/ncmdump-go go get -u git.taurusxin.com/taurusxin/ncmdump-go
``` ```
导入并使用 导入并使用
@@ -64,7 +76,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/taurusxin/ncmdump-go/ncmcrypt" "git.taurusxin.com/taurusxin/ncmdump-go/ncmcrypt"
) )
func main() { func main() {

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION=1.6.0 VERSION=1.7.2
# Clean up the build directory # Clean up the build directory
rm -rf build rm -rf build
@@ -8,30 +8,30 @@ mkdir build
# Linux amd64 # Linux amd64
echo "Building for Linux amd64..." echo "Building for Linux amd64..."
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go github.com/taurusxin/ncmdump-go CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go git.taurusxin.com/taurusxin/ncmdump-go
tar zcf build/ncmdump-go_linux_amd64_$VERSION.tar.gz -C build ncmdump-go tar zcf build/ncmdump-go_linux_amd64_$VERSION.tar.gz -C build ncmdump-go
rm build/ncmdump-go rm build/ncmdump-go
# Linux arm64 # Linux arm64
echo "Building for Linux arm64..." echo "Building for Linux arm64..."
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-w -s" -o build/ncmdump-go github.com/taurusxin/ncmdump-go CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-w -s" -o build/ncmdump-go git.taurusxin.com/taurusxin/ncmdump-go
tar zcf build/ncmdump-go_linux_arm64_$VERSION.tar.gz -C build ncmdump-go tar zcf build/ncmdump-go_linux_arm64_$VERSION.tar.gz -C build ncmdump-go
rm build/ncmdump-go rm build/ncmdump-go
# macOS amd64 # macOS amd64
echo "Building for macOS amd64..." echo "Building for macOS amd64..."
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go github.com/taurusxin/ncmdump-go CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go git.taurusxin.com/taurusxin/ncmdump-go
tar zcf build/ncmdump-go_darwin_amd64_$VERSION.tar.gz -C build ncmdump-go tar zcf build/ncmdump-go_darwin_amd64_$VERSION.tar.gz -C build ncmdump-go
rm build/ncmdump-go rm build/ncmdump-go
# macOS arm64 # macOS arm64
echo "Building for macOS arm64..." echo "Building for macOS arm64..."
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-w -s" -o build/ncmdump-go github.com/taurusxin/ncmdump-go CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-w -s" -o build/ncmdump-go git.taurusxin.com/taurusxin/ncmdump-go
tar zcf build/ncmdump-go_darwin_arm64_$VERSION.tar.gz -C build ncmdump-go tar zcf build/ncmdump-go_darwin_arm64_$VERSION.tar.gz -C build ncmdump-go
rm build/ncmdump-go rm build/ncmdump-go
# Windows amd64 # Windows amd64
echo "Building for Windows amd64..." echo "Building for Windows amd64..."
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go.exe github.com/taurusxin/ncmdump-go CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-w -s" -o build/ncmdump-go.exe git.taurusxin.com/taurusxin/ncmdump-go
zip -q -j build/ncmdump-go_windows_amd64_$VERSION.zip ./build/ncmdump-go.exe zip -q -j build/ncmdump-go_windows_amd64_$VERSION.zip ./build/ncmdump-go.exe
rm build/ncmdump-go.exe rm build/ncmdump-go.exe

3
go.mod
View File

@@ -1,4 +1,4 @@
module github.com/taurusxin/ncmdump-go module git.taurusxin.com/taurusxin/ncmdump-go
go 1.23.0 go 1.23.0
@@ -11,6 +11,7 @@ require github.com/bogem/id3v2/v2 v2.1.4
require ( require (
github.com/TwiN/go-color v1.4.1 github.com/TwiN/go-color v1.4.1
github.com/go-flac/flacpicture v0.3.0 github.com/go-flac/flacpicture v0.3.0
github.com/go-flac/flacvorbis v0.2.0
github.com/go-flac/go-flac v1.0.0 github.com/go-flac/go-flac v1.0.0
) )

2
go.sum
View File

@@ -4,6 +4,8 @@ github.com/bogem/id3v2/v2 v2.1.4 h1:CEwe+lS2p6dd9UZRlPc1zbFNIha2mb2qzT1cCEoNWoI=
github.com/bogem/id3v2/v2 v2.1.4/go.mod h1:l+gR8MZ6rc9ryPTPkX77smS5Me/36gxkMgDayZ9G1vY= github.com/bogem/id3v2/v2 v2.1.4/go.mod h1:l+gR8MZ6rc9ryPTPkX77smS5Me/36gxkMgDayZ9G1vY=
github.com/go-flac/flacpicture v0.3.0 h1:LkmTxzFLIynwfhHiZsX0s8xcr3/u33MzvV89u+zOT8I= github.com/go-flac/flacpicture v0.3.0 h1:LkmTxzFLIynwfhHiZsX0s8xcr3/u33MzvV89u+zOT8I=
github.com/go-flac/flacpicture v0.3.0/go.mod h1:DPbrzVYQ3fJcvSgLFp9HXIrEQEdfdk/+m0nQCzwodZI= github.com/go-flac/flacpicture v0.3.0/go.mod h1:DPbrzVYQ3fJcvSgLFp9HXIrEQEdfdk/+m0nQCzwodZI=
github.com/go-flac/flacvorbis v0.2.0 h1:KH0xjpkNTXFER4cszH4zeJxYcrHbUobz/RticWGOESs=
github.com/go-flac/flacvorbis v0.2.0/go.mod h1:uIysHOtuU7OLGoCRG92bvnkg7QEqHx19qKRV6K1pBrI=
github.com/go-flac/go-flac v1.0.0 h1:6qI9XOVLcO50xpzm3nXvO31BgDgHhnr/p/rER/K/doY= github.com/go-flac/go-flac v1.0.0 h1:6qI9XOVLcO50xpzm3nXvO31BgDgHhnr/p/rER/K/doY=
github.com/go-flac/go-flac v1.0.0/go.mod h1:WnZhcpmq4u1UdZMNn9LYSoASpWOCMOoxXxcWEHSzkW8= github.com/go-flac/go-flac v1.0.0/go.mod h1:WnZhcpmq4u1UdZMNn9LYSoASpWOCMOoxXxcWEHSzkW8=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=

View File

@@ -2,8 +2,8 @@ package main
import ( import (
"fmt" "fmt"
"github.com/taurusxin/ncmdump-go/ncmcrypt" "git.taurusxin.com/taurusxin/ncmdump-go/ncmcrypt"
"github.com/taurusxin/ncmdump-go/utils" "git.taurusxin.com/taurusxin/ncmdump-go/utils"
"os" "os"
"path/filepath" "path/filepath"
@@ -59,7 +59,7 @@ func main() {
} }
if *showVersion { if *showVersion {
fmt.Println("ncmdump version 1.6.0") fmt.Println("ncmdump version 1.7.1")
os.Exit(0) os.Exit(0)
} }

View File

@@ -7,8 +7,9 @@ import (
"fmt" "fmt"
"github.com/bogem/id3v2/v2" "github.com/bogem/id3v2/v2"
"github.com/go-flac/flacpicture" "github.com/go-flac/flacpicture"
"github.com/go-flac/flacvorbis"
"github.com/go-flac/go-flac" "github.com/go-flac/go-flac"
"github.com/taurusxin/ncmdump-go/utils" "git.taurusxin.com/taurusxin/ncmdump-go/utils"
"io" "io"
"net/http" "net/http"
"os" "os"
@@ -184,6 +185,7 @@ func (ncm *NeteaseCloudMusic) FixMetadata(fetchAlbumImageFromRemote bool) (bool,
return false, err return false, err
} }
defer audioFile.Close() defer audioFile.Close()
audioFile.SetDefaultEncoding(id3v2.EncodingUTF8)
audioFile.SetTitle(ncm.mMetadata.mName) audioFile.SetTitle(ncm.mMetadata.mName)
audioFile.SetArtist(ncm.mMetadata.mArtist) audioFile.SetArtist(ncm.mMetadata.mArtist)
audioFile.SetAlbum(ncm.mMetadata.mAlbum) audioFile.SetAlbum(ncm.mMetadata.mAlbum)
@@ -217,12 +219,36 @@ func (ncm *NeteaseCloudMusic) FixMetadata(fetchAlbumImageFromRemote bool) (bool,
pictureMeta := pic.Marshal() pictureMeta := pic.Marshal()
audioFile.Meta = append(audioFile.Meta, &pictureMeta) audioFile.Meta = append(audioFile.Meta, &pictureMeta)
} }
generalMeta := &flac.MetaDataBlock{
Type: flac.VorbisComment, var cmts *flacvorbis.MetaDataBlockVorbisComment
Data: []byte(fmt.Sprintf("title=%s\nartist=%s\nalbum=%s", ncm.mMetadata.mName, ncm.mMetadata.mArtist, ncm.mMetadata.mAlbum)), var cmtIdx int
for idx, meta := range audioFile.Meta {
if meta.Type == flac.VorbisComment {
cmts, err = flacvorbis.ParseFromMetaDataBlock(*meta)
cmtIdx = idx
if err != nil {
return false, err
} }
audioFile.Meta = append(audioFile.Meta, generalMeta) }
}
if cmts == nil && cmtIdx > 0 {
cmts = flacvorbis.New()
}
_ = cmts.Add(flacvorbis.FIELD_TITLE, ncm.mMetadata.mName)
_ = cmts.Add(flacvorbis.FIELD_ARTIST, ncm.mMetadata.mArtist)
_ = cmts.Add(flacvorbis.FIELD_ALBUM, ncm.mMetadata.mAlbum)
cmtsmeta := cmts.Marshal()
if cmtIdx > 0 {
audioFile.Meta[cmtIdx] = &cmtsmeta
} else {
audioFile.Meta = append(audioFile.Meta, &cmtsmeta)
}
err = audioFile.Save(ncm.mDumpFilePath) err = audioFile.Save(ncm.mDumpFilePath)
if err != nil { if err != nil {
return false, err return false, err
} }