Skip to content

Support multi-value TXXX/WXXX frames in ID3v2#11

Open
Rouzax wants to merge 3 commits into
LMS-Community:masterfrom
Rouzax:master
Open

Support multi-value TXXX/WXXX frames in ID3v2#11
Rouzax wants to merge 3 commits into
LMS-Community:masterfrom
Rouzax:master

Conversation

@Rouzax
Copy link
Copy Markdown

@Rouzax Rouzax commented May 12, 2026

Summary

  • Add null-separated multi-value support to the TXXX/WXXX handler in id3.c
  • Returns arrayref when multiple values present, scalar when single (no behavior change for existing files)
  • Mirrors the existing STRINGLIST handler pattern for standard text frames (TPE1, TALB, etc.)
  • Enables plural tags like TXXX:ALBUMARTISTS (written by Picard) to reach LMS as arrays

Context

Part of LMS-Community/slimserver#1555 (display_artist support). Vorbis/FLAC already deliver multi-value tags correctly; this closes the MP3 gap.

Forum discussion (post #133 in the thread): https://forums.lyrion.org/forum/user-forums/ripping-encoding-transcoding-tagging/1816764-lms-metadata-scaan-overrides-local-tags

Test plan

  • Four new MP3 test fixtures covering: 2 values, 3 values, empty slot, single value
  • 12 new test cases added to mp3.t
  • All 413 tests pass (401 existing + 12 new)
  • Single-value TXXX regression: existing tests at lines 329, 525, 933 still pass as scalars

Rouzax added 3 commits May 12, 2026 14:26
Four fixtures covering null-separated multi-value TXXX fields
(2-value, 3-value, empty-slot, and single-value regression guard)
plus the Python script that generates them.

Signed-off-by: Rouzax <GitHub@mgdn.nl>
ID3v2.4 allows null-separated multiple strings in TXXX value fields.
Audio::Scan previously read only the first value. Add a loop mirroring
the existing STRINGLIST handler for standard text frames: returns an
arrayref when multiple values are present, scalar when single.

This enables plural tags like TXXX:ALBUMARTISTS written by Picard
to reach consumers as arrays instead of being truncated.

Signed-off-by: Rouzax <GitHub@mgdn.nl>
Tests cover: two values, three values, empty slot skipping,
and existing single-value regression (covered by pre-existing tests).

Signed-off-by: Rouzax <GitHub@mgdn.nl>
@michaelherger
Copy link
Copy Markdown
Member

Please note that we won't have new binaries for all possible platforms "automatically". I tend to only update recent, popular platforms by default. But I understand the change doesn't break existing installations, but rather adds a missing "feature" (support for multiple values). Therefore for users of outdated versions of this library nothing will change - neither good or bad.

@Rouzax
Copy link
Copy Markdown
Author

Rouzax commented May 13, 2026

Thanks for the note on platform coverage. That's completely fine.

The change is indeed additive only. Installations running an older Audio-Scan will keep getting a single scalar for TXXX frames, exactly as today. Nothing breaks for them.

On the slimserver side, the code that consumes these tags already needs to handle both scalars and arrayrefs anyway (some tag types already return arrays). So the scanner will work correctly regardless of which Audio-Scan version is installed: arrayref means multi-value support is available, scalar means it falls back to current behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants