Skip to content

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

Merged
ralph-irving merged 3 commits into
LMS-Community:masterfrom
Rouzax:master
Jun 5, 2026
Merged

Support multi-value TXXX/WXXX frames in ID3v2#11
ralph-irving merged 3 commits into
LMS-Community:masterfrom
Rouzax:master

Conversation

@Rouzax

@Rouzax Rouzax commented May 12, 2026

Copy link
Copy Markdown

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

Rouzax commented May 13, 2026

Copy link
Copy Markdown
Author

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.

@ralph-irving
ralph-irving merged commit bcfd472 into LMS-Community:master Jun 5, 2026
2 checks passed
@ralph-irving

Copy link
Copy Markdown

I plan to review another PR from Andy's Audio::Scan repository and include it here before making another release. andygrundman#16

@Rouzax

Rouzax commented Aug 17, 2026

Copy link
Copy Markdown
Author

Any update on this one? You mentioned wanting to include andygrundman#16 before making another release.

Asking because the Audio::Scan bundled with slimserver is still 1.10, in both public/9.2 (be3d0ef82) and the display_artist branch, so multi-value TXXX frames still come back as the first value only. On an MP3 library that means ALBUMARTISTS and MUSICBRAINZ_ALBUMARTISTID both truncate, which leaves the plural artist tag work in LMS-Community/slimserver#1576 unavailable to MP3 users.

No rush intended, I mostly want to know whether to plan around it.

@michaelherger

Copy link
Copy Markdown
Member

What Perl version on what platform are you using? We are at Audio::Scan v1.13 for the most popular platforms.

@Rouzax

Rouzax commented Aug 17, 2026

Copy link
Copy Markdown
Author

What Perl version on what platform are you using? We are at Audio::Scan v1.13 for the most popular platforms.

I see that I'm at Audio::Scan: 1.11 on my prodcution server

Lyrion Music Server Status
Lyrion Music Server Version: 9.1.1 - 1779815526 @ Wed Jun 17 12:31:55 CUT 2026
Hostname: LMS
Server IP Address: 192.168.2.12
Server HTTP Port Number: 9000
Operating system: Windows 2022 Server (64-bit) - EN - cp1252
Platform Architecture: 8664
Database Version: SQLite
Total Players Recognized: 2
 
Perl and Module Versions
Perl Version: 5.32.1 - MSWin32-x64-multi-thread
Audio::Scan: 1.11
DBD::SQLite: 1.66 (sqlite 3.32.3)
IO::Socket::SSL: 2.069
Mozilla::CA: 20200520
Net::SSLeay: 1.90 - OpenSSL 1.1.1i 8 Dec 2020

@michaelherger

Copy link
Copy Markdown
Member

Windows is at v1.13 on 9.2. See:

https://github.com/LMS-Community/slimserver/blob/public/9.2/CPAN/arch/5.32/MSWin32-x64-multi-thread/Audio/Scan.pm#L5

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.

3 participants