A lightweight command-line tool that reads local .lrc files or automatically downloads synchronized lyrics from LRCLIB and embeds them directly into your audio files' metadata.
Perfect for use with Lidarr, Navidrome, Jellyfin, Plex, or any music player that reads embedded lyrics.
- Scans your audio files and reads their metadata (Artist, Title, Album, Duration).
- Looks for a local
.lrcsidecar file with the same name. If found, it embeds it directly to save time. - If no local file exists, searches for synchronized lyrics on LRCLIB. Falls back to plain lyrics when synced aren't available.
- Embeds the lyrics permanently into the file's
LYRICStag — no separate.lrcfiles needed.
Supports FLAC, MP3, OGG, M4A/AAC, OPUS, and more (powered by TagLib).
Auto-sync lyrics every time Lidarr imports a new album.
Only one file to deploy — the binary is fully static with zero runtime dependencies.
Most common setup (Hotio or LinuxServer images on Alpine Linux).
sudo apt install build-essential docker.io # host prerequisites
git clone https://github.com/newtonsart/synclyr2metadata.git
cd synclyr2metadata
makeBuilds a static binary (~8MB) inside an Alpine Docker container. No modifications to your
docker-compose.ymlneeded.
Copy the binary into your Lidarr container's config volume:
cp synclyr2metadata /path/to/lidarr/config/scripts/Replace
/path/to/lidarr/configwith your actual Lidarr config mount (e.g../configor/opt/media-stack/config/lidarr).
- Open Lidarr UI → Settings → Connect → + → Custom Script.
- Configure:
- Name:
Sync Lyrics - On Release Import: ✓
- On Upgrade: ✓
- Path:
/config/scripts/synclyr2metadata
- Name:
- Click Test, then Save.
Logs are automatically generated in the same folder:
/config/scripts/synclyr2metadata.log(General execution log)/config/scripts/synclyr2metadata_plain.log(Tracks that only got plain/unsynced lyrics)/config/scripts/synclyr2metadata_missing.log(Tracks that couldn't be found on LRCLIB)---
For bare-metal or systemd-based Lidarr installations.
# Debian / Ubuntu
sudo apt install build-essential libcurl4-openssl-dev libtag1-dev
# Arch
sudo pacman -S base-devel curl taglib
# Then build
git clone https://github.com/newtonsart/synclyr2metadata.git
cd synclyr2metadata
make nativesudo make install # installs to /usr/local/binOr copy manually to a directory Lidarr can access:
cp synclyr2metadata /path/to/lidarr/scripts/- Open Lidarr UI → Settings → Connect → + → Custom Script.
- Configure:
- Name:
Sync Lyrics - On Release Import: ✓
- On Upgrade: ✓
- Path:
/path/to/synclyr2metadata
- Name:
- Click Test, then Save.
Logs are automatically generated in the same folder as the binary:
synclyr2metadata.logsynclyr2metadata_plain.logsynclyr2metadata_missing.log
You can also use synclyr2metadata directly from the command line:
# Sync a flat folder of audio files
./synclyr2metadata --folder "/path/to/downloaded_tracks"
# Sync a single album
./synclyr2metadata --album "/path/to/Artist/Album (2024)"
# Sync all albums from an artist
./synclyr2metadata --artist "/path/to/Artist" --threads 8
# Sync your entire library (Artist/Album structure)
./synclyr2metadata --library "/path/to/music" --threads 4
# Export paths of tracks that only got plain lyrics and tracks with missing lyrics
./synclyr2metadata --library "/path/to/music" --out-plain ./plain.txt --out-missing ./missing.txt
# Sync a directory and delete original .lrc sidecar files after embedding them
./synclyr2metadata --album "/path/to/downloaded_album" --clean-lrc| Option | Description |
|---|---|
--folder PATH |
Sync audio files directly in one folder, without requiring Artist/Album layout |
--album PATH |
Sync lyrics for a single album directory |
--artist PATH |
Sync all albums under an artist directory |
--library PATH |
Sync entire library (artist/album structure) |
--out-plain FILE |
Write paths of tracks falling back to unsynced lyrics to file |
--out-missing FILE |
Write paths of tracks not found on LRCLIB to file |
--force |
Overwrite existing embedded lyrics |
--clean-lrc |
Delete local .lrc file after successfully embedding it |
--threads N |
Parallel download threads (default: 4, max: 16) |
--help |
Show help |
If make native fails with fatal error: taglib/tag_c.h: No such file or directory,
install the native development dependencies first:
# Debian / Ubuntu
sudo apt install build-essential libcurl4-openssl-dev libtag1-dev
# Arch
sudo pacman -S base-devel curl taglibThe default make target builds in Docker and vendors/builds TagLib inside the
container, so these packages are only needed for make native.
═══ MF DOOM ═══
▶ MM.FOOD (2004) (26 tracks)
[ 1/26] Beef Rapp ✓ synced
[ 2/26] Hoe Cakes ✓ plain
[ 3/26] Potholderz ⊘ already has lyrics
[ 4/26] Unreleased Track ✗ not found
──────────────────────────────────────────────
✓ Synced: 22
✓ Plain: 1
⊘ Skipped: 1
✗ Not found: 2
──────────────────────────────────────────────