mirror of
https://git.unlock-music.dev/um/cli.git
synced 2025-08-13 14:43:16 +08:00
fix(ncm): Handle mixed-type artist field in metadata parsing
The current implementation for parsing artist metadata in `ncmMetaMusic.GetArtists` does not handle cases where the "artist" JSON field is a list containing mixed-type inner lists. For certain NCM files (often those with FLAC format), the artist data is structured as `[["Artist Name", 12345]]`. The existing type assertion for `[][]string` fails for this structure because the inner slice is of type `[]interface{}`, not `[]string`. This results in the artist metadata being dropped during the conversion process. This commit enhances the `GetArtists` method by adding a new case to the `type switch` to specifically handle the `[]interface{}` type. The new logic iterates through the nested structure and correctly extracts the artist name, which is assumed to be the first string element in each inner slice. This fix improves compatibility with a wider range of NCM files and ensures artist metadata is reliably parsed, preventing data loss for affected files.
This commit is contained in:
parent
0a94383ba3
commit
20b746bee5
@ -43,23 +43,42 @@ func (m *ncmMetaMusic) GetAlbumImageURL() string {
|
||||
return m.AlbumPic
|
||||
}
|
||||
|
||||
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)
|
||||
func (m *ncmMetaMusic) GetArtists() []string {
|
||||
m.logger.Debug("ncm artists raw", zap.Any("artists", m.Artist))
|
||||
var artists []string
|
||||
switch v := m.Artist.(type) {
|
||||
|
||||
// Case 1: Handles the format [['artistA'], ['artistB']]
|
||||
case [][]string:
|
||||
for _, artistSlice := range v {
|
||||
artists = append(artists, artistSlice...)
|
||||
}
|
||||
|
||||
// Case 2: Handles the simple format "artistA"
|
||||
// Ref: https://git.unlock-music.dev/um/cli/issues/78
|
||||
case string:
|
||||
artists = []string{v}
|
||||
|
||||
// Case 3: Handles the mixed-type format [['artistA', 12345], ['artistB', 67890]]
|
||||
// This is the key fix for correctly parsing artist info from certain files.
|
||||
case []interface{}:
|
||||
for _, item := range v {
|
||||
if innerSlice, ok := item.([]interface{}); ok {
|
||||
if len(innerSlice) > 0 {
|
||||
// Assume the first element is the artist's name.
|
||||
if artistName, ok := innerSlice[0].(string); ok {
|
||||
artists = append(artists, artistName)
|
||||
}
|
||||
}
|
||||
} 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 {
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
// Log a warning if the artist type is unexpected and not handled.
|
||||
m.logger.Warn("unexpected artist type", zap.Any("artists", m.Artist))
|
||||
}
|
||||
|
||||
return artists
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user