Files
ripsort/internal/metadata/vobis.go

58 lines
1.3 KiB
Go

package metadata
import (
"log/slog"
"strconv"
"github.com/go-flac/flacvorbis/v2"
"github.com/go-flac/go-flac/v2"
)
func updateFlacMetadata(m Metadata, input, output string) error {
f, err := flac.ParseFile(input)
if err != nil {
return err
}
vorbisMeta := createVorbisMetaBlock(m)
meta := vorbisMeta.Marshal()
replaced := false
for i, block := range f.Meta {
if block.Type == flac.VorbisComment {
f.Meta[i] = &meta
replaced = true
break
}
}
if !replaced {
f.Meta = append(f.Meta, &meta)
}
return f.Save(output)
}
func createVorbisMetaBlock(m Metadata) flacvorbis.MetaDataBlockVorbisComment {
vorbisMeta := flacvorbis.New()
vorbisMeta.Add(flacvorbis.FIELD_TITLE, m.Title)
vorbisMeta.Add(flacvorbis.FIELD_ALBUM, m.Album)
vorbisMeta.Add("COMMENT", m.Comment)
vorbisMeta.Add("TRACKNUMBER", strconv.Itoa(m.Track))
vorbisMeta.Add("TOTALTRACKS", strconv.Itoa(m.TotalTracks))
vorbisMeta.Add("DISCNUMBER", strconv.Itoa(m.Disc))
vorbisMeta.Add("TOTALDISCS", strconv.Itoa(m.TotalDiscs))
for _, artist := range m.Artist {
vorbisMeta.Add(flacvorbis.FIELD_ARTIST, artist)
slog.Debug("Added ARTIST filed to metadata", "artist", artist)
}
for _, albumArtist := range m.AlbumArtist {
vorbisMeta.Add("ALBUMARTIST", albumArtist)
}
return *vorbisMeta
}