Repository: yt-dlp
Issue: ID3v2.4 metadata list writing support
Labels: enhancement,triage

### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [X] I'm requesting a site-specific feature
- [X] I've verified that I have **updated yt-dlp to nightly or master** ([update instructions](https://github.com/yt-dlp/yt-dlp#update-channels))
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [ ] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

_No response_

### Example URLs

https://www.youtube.com/watch?v=QmnI9nJPs_E
https://www.youtube.com/watch?v=CkXbkVhrFU4

### Provide a description that is worded well enough to be understood

The ID3v2.4 spec states that in the case of a song with multiple artists or other tags with multiple values, they should be delimited with null characters. (Unicode 0x00 / Python `\u0000`). See the [id3 spec](https://id3.org/id3v2.4.0-frames) section 4.2 introduction. Please add the ability to encode information in this way (e.g. add a output template flag, or change the default delimiter from commas to null characters). A proposed solution is available here:
https://github.com/yt-dlp/yt-dlp/compare/master...MutantPiggieGolem1:yt-dlp:patch-2

(I made a feature request instead of a pr because I am not certain that my code complies with best practices, or is the correct approach for this problem)

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [ ] If using API, add `'verbose': True` to `YoutubeDL` params instead
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
[debug] Command-line config: ['https://www.youtube.com/watch?v=QmnI9nJPs_E', '-vU', '--progress', '-o', './%(id)s.%(ext)s', '-f', 'm4a/bestaudio/best', '-x', '--audio-quality', '0', '--audio-format', 'm4a', '--embed-metadata', '--output-na-placeholder', 'Unknown', '--parse-metadata', 'release_date:%(meta_date)s', '--parse-metadata', '%(artists)+l:%(meta_artist)s', '--embed-thumbnail', '--ppa', 'ffmpeg: -c:v mjpeg -vf crop="\'if(gt(ih,iw),iw,ih)\':\'if(gt(iw,ih),ih,iw)\'"', '-N', '4', '--external-downloader', 'aria2c', '--external-downloader-args', '--max-connection-per-server=16', '--no-overwrites']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out cp1252 (No VT), error cp1252 (No VT), screen cp1252 (No VT)
[debug] yt-dlp version stable@2024.12.13 from yt-dlp/yt-dlp [542166962] (win_exe)
[debug] Python 3.10.11 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1t  7 Feb 2023)
[debug] exe versions: ffmpeg 2023-01-16-git-01f46f18db-full_build-www.gyan.dev (setts), ffprobe 2023-01-16-git-01f46f18db-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.21.0, brotli-1.1.0, certifi-2024.08.30, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.32.3, sqlite3-3.40.1, urllib3-2.2.3, websockets-14.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
WARNING: External Downloader arguments given without specifying name. The arguments will be given to aria2c
[debug] Loaded 1837 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: stable@2024.12.13 from yt-dlp/yt-dlp
yt-dlp is up to date (stable@2024.12.13 from yt-dlp/yt-dlp)
[youtube] Extracting URL: https://www.youtube.com/watch?v=QmnI9nJPs_E
[youtube] QmnI9nJPs_E: Downloading webpage
[youtube] QmnI9nJPs_E: Downloading ios player API JSON
[youtube] QmnI9nJPs_E: Downloading mweb player API JSON
[debug] [youtube] Extracting signature function js_03dbdfab_107
[debug] Loading youtube-sigfuncs.js_03dbdfab_107 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig rOVGFBO1fnpq4VowB => iVX3HC88LHdogg
[debug] [youtube] Extracting signature function js_03dbdfab_103
[debug] Loading youtube-sigfuncs.js_03dbdfab_103 from cache
[debug] Loading youtube-nsig.03dbdfab from cache
[debug] [youtube] Decrypted nsig JHYFJ6_jdvzKqlN_m => WyB0jk7seawvKw
[youtube] QmnI9nJPs_E: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Searching for '(?P<meta_date>.+)' in '%(release_date)s'
[MetadataParser] Parsed meta_date from '%(release_date)s': '20240322'
[debug] Searching for '(?P<meta_artist>.+)' in '%(artists)+l'
[MetadataParser] Parsed meta_artist from '%(artists)+l': 'girl in red, Sabrina Carpenter'
[info] QmnI9nJPs_E: Downloading 1 format(s): 140
[info] Downloading video thumbnail 42 ...
[info] Writing video thumbnail 42 to: QmnI9nJPs_E.webp
[debug] Invoking aria2c downloader on "https://rr2---sn-nvopjoxu-25ve.googlevideo.com/videoplayback?expire=1734957265&ei=cQRpZ57MJruAsfIPgNiA6QY&ip=198.27.172.234&id=o-ABgVtdYN07MvGprEN4a5KAvR4BBlPHK3XJx-kWz3N7nQ&itag=140&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&met=1734935665%2C&mh=J-&mm=31%2C29&mn=sn-nvopjoxu-25ve%2Csn-o097znzk&ms=au%2Crdu&mv=m&mvi=2&pcm2cms=yes&pl=21&rms=au%2Cau&gcr=us&initcwndbps=4901250&bui=AfMhrI_I2OkVs8ELIeoHcOtM1XbPR78e-AgC1YJR2G2lH_BY99uuuGXcyLYXyNo29dQpOTHyjhM04Cxn&spc=x-caUITTvjqMZmgH7Xgeg9lR80dEnP4HJmiv4xxVFMBJ8IhdVt2l&vprv=1&svpuc=1&mime=audio%2Fmp4&rqh=1&gir=yes&clen=3019100&dur=186.377&lmt=1710543003824326&mt=1734935346&fvip=1&keepalive=yes&fexp=51326932%2C51335594%2C51371294&c=IOS&txp=2318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cgcr%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRgIhAPj6QzOZU3xvvq4B-Dcv6RkopnTfYZDuB_t9G1WIOQH5AiEA0Fxqq6QE1XaPvv4xliszI7yH2--YNp7VMKSWeK9rDdU%3D&lsparams=met%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpcm2cms%2Cpl%2Crms%2Cinitcwndbps&lsig=AGluJ3MwRgIhAKqerMN22lAzm64V4-CmnWwg5WHMGWZPhk07Skxo6jkiAiEA_M7M59_goBI1NOvucD712gfGQDWX7q8MZx4Ho1m07Ak%3D"
[download] QmnI9nJPs_E.m4a has already been downloaded
[download] 100% of    2.91MiB
[debug] ffmpeg command line: ffprobe -show_streams file:QmnI9nJPs_E.m4a
[ExtractAudio] Not converting audio QmnI9nJPs_E.m4a; file is already in target format m4a
[Metadata] Adding metadata to "QmnI9nJPs_E.m4a"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i file:QmnI9nJPs_E.m4a -map 0 -dn -ignore_unknown -vn -acodec copy -write_id3v1 1 -metadata "title=You Need Me Now?" -metadata "date=20240322" -metadata "description=Provided to YouTube by Columbia

You Need Me Now? ▒ girl in red ▒ Sabrina Carpenter

You Need Me Now?

 2024 Columbia Records, a Division of Sony Music Entertainment, under exclusive license from world in red

Released on: 2024-03-22

Associated  Performer: girl in red & Sabrina Carpenter
Vocal, Composer, Lyricist: Marie Ulven
Bass, Guitar, Programmer, Synthesizer, Composer, Lyricist, Producer, Recording  Engineer: Matias Tellez
Guitar, Programmer, Synthesizer, Vocal: Mari Persen
Drums: Erlend Hisdal
Vocal  Producer: Julian Bunetta
Assistant  Engineer: Andreas Aunedi H▒vset
Assistant  Engineer: Quentin Adrianasitera
Assistant  Engineer: James Pinfield-Wells
Mixing  Engineer: Mark \"Spike\" Stent
Assistant  Engineer: Matt Wolach
Assistant  Engineer: Kieran Beardmore
Mastering  Engineer: John Greenham
Assistant  Engineer: Tess Greenham

Auto-generated by YouTube." -metadata "synopsis=Provided to YouTube by Columbia

You Need Me Now? ▒ girl in red ▒ Sabrina Carpenter

You Need Me Now?

 2024 Columbia Records, a Division of Sony Music Entertainment, under exclusive license from world in red

Released on: 2024-03-22

Associated  Performer: girl in red & Sabrina Carpenter
Vocal, Composer, Lyricist: Marie Ulven
Bass, Guitar, Programmer, Synthesizer, Composer, Lyricist, Producer, Recording  Engineer: Matias Tellez
Guitar, Programmer, Synthesizer, Vocal: Mari Persen
Drums: Erlend Hisdal
Vocal  Producer: Julian Bunetta
Assistant  Engineer: Andreas Aunedi H▒vset
Assistant  Engineer: Quentin Adrianasitera
Assistant  Engineer: James Pinfield-Wells
Mixing  Engineer: Mark \"Spike\" Stent
Assistant  Engineer: Matt Wolach
Assistant  Engineer: Kieran Beardmore
Mastering  Engineer: John Greenham
Assistant  Engineer: Tess Greenham

Auto-generated by YouTube." -metadata "purl=https://www.youtube.com/watch?v=QmnI9nJPs_E" -metadata "comment=https://www.youtube.com/watch?v=QmnI9nJPs_E" -metadata "artist=girl in red, Sabrina Carpenter" -metadata "album=You Need Me Now?" -movflags +faststart -c:v mjpeg -vf "crop='if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'" file:QmnI9nJPs_E.temp.m4a
[ThumbnailsConvertor] Converting thumbnail "QmnI9nJPs_E.webp" to png
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -f image2 -pattern_type none -i file:QmnI9nJPs_E.webp -update 1 -movflags +faststart -c:v mjpeg -vf "crop='if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'" file:QmnI9nJPs_E.png
[EmbedThumbnail] mutagen: Adding thumbnail to "QmnI9nJPs_E.m4a"
```