A Jennifer deck that reads and writes MP3
metadata and M3U playlists, in pure Jennifer: ID3v2.2, 2.3 and 2.4 tags
(unsynchronisation, compressed frames, all four text encodings, artwork),
ID3v1 and ID3v1.1 with the 192-entry genre table, MPEG frame headers with
Xing, Info and VBRI stream headers, and M3U / M3U8 playlists. One Tag
struct covers every tag version, for reading and for writing.
jvc add @deckyard/mp3jvc vendors the src/ subtree to vendor/deckyard/mp3/. Without jvc, copy
src/ (the entry module mp3.j and topics/) from a checkout or a
deckyard-mp3-<version>.tar.gz release archive into that directory.
Requires Jennifer 0.25.0 or newer, and runs on jennifer-tiny. No network,
subprocess or database; only open, save, writeFile, openPlaylist and
savePlaylist touch the disk, through fs.
use io;
import "@deckyard/mp3/" as mp3;
def track as mp3.Track init mp3.open("song.mp3");
io.printf("%s\n", mp3.describe($track));
# Maike Vandervaart - Ich war müde leer nicht mehr da 4:18 160 kbit/s VBR 44100 Hz stereo
def tag as mp3.Tag init $track.tag;
$tag.genre = "Ambient";
mp3.save(mp3.withTag($track, $tag), "song.mp3");
The book: guides, the on-disk
formats, and a cheatsheet of every export. Runnable programs are in
examples/.
Contributors: the gate is tools/check-all.sh.
LGPL-3.0-only, see LICENSE. Copyright (C) 2026 mplx <mplx@jennifer-lang.dev>.