diff --git a/algo/ncm/meta.go b/algo/ncm/meta.go index 866c344..f319780 100644 --- a/algo/ncm/meta.go +++ b/algo/ncm/meta.go @@ -1,6 +1,7 @@ package ncm import ( + "go.uber.org/zap" "strings" "unlock-music.dev/cli/algo/common" @@ -17,33 +18,49 @@ type ncmMeta interface { } type ncmMetaMusic struct { - Format string `json:"format"` - MusicName string `json:"musicName"` - Artist [][]interface{} `json:"artist"` - Album string `json:"album"` - AlbumPicDocID interface{} `json:"albumPicDocId"` - AlbumPic string `json:"albumPic"` - Flag int `json:"flag"` - Bitrate int `json:"bitrate"` - Duration int `json:"duration"` - Alias []interface{} `json:"alias"` - TransNames []interface{} `json:"transNames"` + logger *zap.Logger + + Format string `json:"format"` + MusicName string `json:"musicName"` + Artist interface{} `json:"artist"` + Album string `json:"album"` + AlbumPicDocID interface{} `json:"albumPicDocId"` + AlbumPic string `json:"albumPic"` + Flag int `json:"flag"` + Bitrate int `json:"bitrate"` + Duration int `json:"duration"` + Alias []interface{} `json:"alias"` + TransNames []interface{} `json:"transNames"` +} + +func newNcmMetaMusic(logger *zap.Logger) *ncmMetaMusic { + ncm := new(ncmMetaMusic) + ncm.logger = logger.With(zap.String("module", "ncmMetaMusic")) + return ncm } func (m *ncmMetaMusic) GetAlbumImageURL() string { return m.AlbumPic } -func (m *ncmMetaMusic) GetArtists() (artists []string) { - for _, artist := range m.Artist { - for _, item := range artist { - name, ok := item.(string) - if ok { +func (m *ncmMetaMusic) GetArtists() []string { + m.logger.Debug("ncm artists", zap.Any("artists", m.Artist)) + + var artists []string = nil + if jsonArtists, ok := m.Artist.([][]string); ok { + for _, artist := range jsonArtists { + for _, name := range artist { artists = append(artists, name) } } + } else if artist, ok := m.Artist.(string); ok { + // #78: artist is a string type. + // https://git.unlock-music.dev/um/cli/issues/78 + artists = []string{artist} + } else { + m.logger.Warn("unexpected artist type", zap.Any("artists", m.Artist)) } - return + return artists } func (m *ncmMetaMusic) GetTitle() string { diff --git a/algo/ncm/ncm.go b/algo/ncm/ncm.go index 5c35f77..79ae5fd 100644 --- a/algo/ncm/ncm.go +++ b/algo/ncm/ncm.go @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "fmt" + "go.uber.org/zap" "io" "net/http" "strings" @@ -30,11 +31,12 @@ var ( ) func NewDecoder(p *common.DecoderParams) common.Decoder { - return &Decoder{rd: p.Reader} + return &Decoder{rd: p.Reader, logger: p.Logger.With(zap.String("module", "ncm"))} } type Decoder struct { - rd io.ReadSeeker // rd is the original file reader + logger *zap.Logger + rd io.ReadSeeker // rd is the original file reader offset int cipher common.StreamDecoder @@ -74,7 +76,7 @@ func (d *Decoder) Validate() error { } if err := d.parseMeta(); err != nil { - return fmt.Errorf("parse meta failed: %w", err) + return fmt.Errorf("parse meta failed: %w (raw json=%s)", err, string(d.metaRaw)) } d.cipher = newNcmCipher(keyData) @@ -181,7 +183,7 @@ func (d *Decoder) readCoverData() error { func (d *Decoder) parseMeta() error { switch d.metaType { case "music": - d.meta = new(ncmMetaMusic) + d.meta = newNcmMetaMusic(d.logger) return json.Unmarshal(d.metaRaw, d.meta) case "dj": d.meta = new(ncmMetaDJ)