From df2fc35591eb3a1ec1f2585be481d10337f9c9c1 Mon Sep 17 00:00:00 2001 From: Snitch Team Date: Wed, 6 May 2026 10:10:11 +0200 Subject: [PATCH] feat(metadata): write source URL into dedicated tag Adds the originating URL to a dedicated metadata tag in addition to the existing COMMENT fallback: Vorbis SOURCE for FLAC, ID3 WOAS + TXXX/SOURCE for MP3, and 'source' for M4A. Improves compatibility with library managers like MusicBrainz Picard and Beets. Closes #605 --- backend/metadata.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/metadata.go b/backend/metadata.go index f438338a..251d7e86 100644 --- a/backend/metadata.go +++ b/backend/metadata.go @@ -171,6 +171,9 @@ func EmbedMetadata(filepath string, metadata Metadata, coverPath string) error { if metadata.UPC != "" { _ = cmt.Add(preferredUPCTagKey, metadata.UPC) } + if sourceURL := strings.TrimSpace(metadata.URL); sourceURL != "" { + _ = cmt.Add("SOURCE", sourceURL) + } if genreValues := SplitMetadataValues(metadata.Genre, separator); len(genreValues) > 0 { addVorbisTagValues(cmt, "GENRE", genreValues) @@ -1098,6 +1101,16 @@ func embedMetadataToMP3(filePath string, metadata Metadata, coverPath string) er }) } + if sourceURL := strings.TrimSpace(metadata.URL); sourceURL != "" { + tag.DeleteFrames("WOAS") + tag.AddFrame("WOAS", id3v2.UnknownFrame{Body: []byte(sourceURL)}) + tag.AddUserDefinedTextFrame(id3v2.UserDefinedTextFrame{ + Encoding: id3v2.EncodingUTF8, + Description: "SOURCE", + Value: sourceURL, + }) + } + if comment := resolveMetadataComment(metadata); comment != "" { tag.DeleteFrames(tag.CommonID("Comments")) tag.AddCommentFrame(id3v2.CommentFrame{ @@ -1229,6 +1242,9 @@ func embedMetadataToM4A(filePath string, metadata Metadata, coverPath string) er if comment := resolveMetadataComment(metadata); comment != "" { args = append(args, "-metadata", "comment="+comment) } + if sourceURL := strings.TrimSpace(metadata.URL); sourceURL != "" { + args = append(args, "-metadata", "source="+sourceURL) + } tmpOutputFile := strings.TrimSuffix(filePath, pathfilepath.Ext(filePath)) + ".tmp" + pathfilepath.Ext(filePath) defer func() {