feat: tag wav files with id3 and info chunks

This commit is contained in:
Mathis Maquenne
2026-08-05 22:51:43 +02:00
parent b804c5e288
commit 84dd371fdd
4 changed files with 540 additions and 31 deletions
+34 -30
View File
@@ -14,68 +14,72 @@ type id3v2Tagger struct {
func (t *id3v2Tagger) write(m Metadata) error {
defer t.tag.Close()
applyID3Frames(t.tag, m)
return t.tag.Save()
}
func applyID3Frames(tag *id3v2.Tag, m Metadata) {
if m.Album != nil {
year := m.Album.ReleaseDate
if parts := strings.Split(year, "-"); len(parts) == 3 {
year = parts[0]
}
t.addTag("TRCK", m.TrackNumber)
t.addTag("TPE2", m.Album.Artist)
t.addTag("TALB", m.Album.Title)
t.addTag("TPUB", m.Album.Label)
t.addTag("TDOR", m.Album.OriginalReleaseDate)
t.addTag("TYER", year)
t.addComment(m.Album.ProducerLine)
t.addTag("TCOP", m.Album.Copyright)
addID3Text(tag, "TRCK", m.TrackNumber)
addID3Text(tag, "TPE2", m.Album.Artist)
addID3Text(tag, "TALB", m.Album.Title)
addID3Text(tag, "TPUB", m.Album.Label)
addID3Text(tag, "TDOR", m.Album.OriginalReleaseDate)
addID3Text(tag, "TYER", year)
addID3Comment(tag, m.Album.ProducerLine)
addID3Text(tag, "TCOP", m.Album.Copyright)
}
t.addTag("TPE1", m.Artists)
t.addTag("TIT2", m.Title)
t.addTag("TCOM", m.Composers)
t.addTag("TEXT", m.Lyricists)
t.addTag("TCON", m.Genre)
addID3Text(tag, "TPE1", m.Artists)
addID3Text(tag, "TIT2", m.Title)
addID3Text(tag, "TCOM", m.Composers)
addID3Text(tag, "TEXT", m.Lyricists)
addID3Text(tag, "TCON", m.Genre)
if duration, err := strconv.Atoi(m.Duration); err == nil {
t.addTag("TLEN", strconv.Itoa(duration*1000))
addID3Text(tag, "TLEN", strconv.Itoa(duration*1000))
}
t.addTag("TBPM", m.BPM)
t.addTag("TKEY", m.Key)
t.addTXXX("GAIN", m.Gain)
t.addTXXX("ISRC", m.ISRC)
addID3Text(tag, "TBPM", m.BPM)
addID3Text(tag, "TKEY", m.Key)
addID3TXXX(tag, "GAIN", m.Gain)
addID3TXXX(tag, "ISRC", m.ISRC)
if len(m.Cover) > 0 {
t.tag.AddAttachedPicture(id3v2.PictureFrame{
Encoding: t.tag.DefaultEncoding(),
tag.AddAttachedPicture(id3v2.PictureFrame{
Encoding: tag.DefaultEncoding(),
MimeType: "image/jpeg",
PictureType: id3v2.PTFrontCover,
Description: "Cover",
Picture: m.Cover,
})
}
return t.tag.Save()
}
func (t *id3v2Tagger) addTag(name, value string) {
func addID3Text(tag *id3v2.Tag, name, value string) {
if value != "" {
t.tag.AddTextFrame(name, t.tag.DefaultEncoding(), value)
tag.AddTextFrame(name, tag.DefaultEncoding(), value)
}
}
func (t *id3v2Tagger) addComment(value string) {
func addID3Comment(tag *id3v2.Tag, value string) {
if value != "" {
t.tag.AddCommentFrame(id3v2.CommentFrame{
Encoding: t.tag.DefaultEncoding(),
tag.AddCommentFrame(id3v2.CommentFrame{
Encoding: tag.DefaultEncoding(),
Language: "eng",
Text: value,
})
}
}
func (t *id3v2Tagger) addTXXX(description, value string) {
func addID3TXXX(tag *id3v2.Tag, description, value string) {
if value != "" {
t.tag.AddUserDefinedTextFrame(id3v2.UserDefinedTextFrame{
Encoding: t.tag.DefaultEncoding(),
tag.AddUserDefinedTextFrame(id3v2.UserDefinedTextFrame{
Encoding: tag.DefaultEncoding(),
Description: description,
Value: value,
})