A Jellyfin server plugin that adds YouTube downloads and local uploads straight into your music library. Queue a YouTube URL (or upload an audio file), review the metadata suggestions, approve, and JellyTunes organizes the track into your music tree with tags and cover art — then triggers a library scan.
Targets Jellyfin 10.11 server (net9.0).
- YouTube downloads via
yt-dlp— individual videos, and playlists expanded automatically. Optional--cookiessupport for age-restricted or login-only content. - Local uploads — upload audio files directly from the web UI.
- Metadata suggestions — filename heuristics plus MusicBrainz lookup; browse candidates per track.
- Review & approve — a queue of candidates with artist/title/album editing, then a one-click import.
- Music library integration — files are organized as
Artist/Album/Track.m4awith embedded tags and cover art, then Jellyfin rescans the library. - Automatic lyrics — after each import JellyTunes fetches lyrics from LRCLIB and saves them as a
.lrcfile next to the track. A scheduled task lets you backfill lyrics for the rest of your library (including songs you just imported). - Server-side queue — jobs persist across restarts (
jobs.json) and run on the server'syt-dlp; config surface appears in the main menu under Add Music.
The plugin is published through a Jellyfin repository. Add the repository once, then install like any other plugin:
-
In the Jellyfin web UI go to Dashboard → Plugins → Repositories.
-
Click + Add, and enter the repository URL:
https://raw.githubusercontent.com/uchumeow/jellytunes/main/manifest.json -
Save. Now go to Dashboard → Plugins → Catalog (or Repositories → browse) and find JellyTunes.
-
Click Install and restart the server when prompted.
-
Configure in Dashboard → My Plugins → JellyTunes (or Add Music in the main menu).
Download Jellyfin.Plugin.JellyTunes_1.0.0.0.zip from the latest release, then:
- Copy the plugin folder to
<data>/plugins/Jellyfin.Plugin.JellyTunes_1.0.0.0/. - Restart the Jellyfin server.
- Jellyfin 10.11 or newer.
- yt-dlp installed on the server (e.g.
apt install yt-dlpor via pip), or pointYtdlpPathat your own copy.
| Setting | Description |
|---|---|
MusicPath |
Root of your music library where imports are organized. |
YtdlpPath |
Path or command name for yt-dlp (default yt-dlp). |
CookiesPath |
Optional path to a Netscape cookies.txt passed to yt-dlp --cookies. |
MusicBrainzContact |
Contact email sent in MusicBrainz API requests. |
DownloadTimeoutMinutes |
Per-download timeout in minutes. |
MaxUploadMb |
Maximum upload size in megabytes. |
AutoFetchLyrics |
Fetch lyrics from LRCLIB right after each import (default on). |
JellyTunes fetches lyrics for the tracks you import so they show up in the Jellyfin web/desktop players (toggle under Lyrics in the player view).
By default, AutoFetchLyrics is on: whenever you approve an import, JellyTunes asks LRCLIB for the approved artist/title/album and writes a sidecar .lrc file next to the track (e.g. Isolation.m4a → Isolation.lrc). If lyrics were found, the result message notes Lyrics fetched; if not, it notes the reason. Turn it off with the Fetch lyrics (LRCLIB) right after each import checkbox on the Add Music config page (or the AutoFetchLyrics setting).
JellyTunes ships a scheduled task that scans your whole music library for tracks missing lyrics and fetches them:
- In the Jellyfin web UI go to Dashboard → Scheduled Tasks.
- Find Fetch Missing Lyrics (category Music).
- Click ▶ Run to start it now — it fetches lyrics for every track that has none (including ones you just imported), writing
.lrcfiles next to the audio. - The task also runs daily by default; after it finishes it triggers a library scan so Jellyfin picks up the new files.
The task skips tracks that already have lyrics (embedded or sidecar) and logs a summary like Fetch Missing Lyrics finished: 1 saved, 140 not found, 355 skipped.
Tip: fetch is best-effort from LRCLIB. Niche or unreleased tracks may have no lyrics yet — the task simply counts them as not found and moves on. Delete any sidecar
.lrcif a match looks wrong; JellyTunes won't overwrite an existing one.
dotnet build -c ReleaseProduces Jellyfin.Plugin.JellyTunes.dll in bin/Release/net9.0/.
- A YouTube URL or uploaded file creates a job (
Data/JobStore.cs, persisted tojobs.json). Services/DownloadService.csrunsyt-dlp(adding--cookieswhenCookiesPathis set and the file exists).Services/MetadataService.csbuilds candidates from the filename and MusicBrainz.- You review/approve in the web UI;
Services/ImportService.csmoves the file intoMusicPath/Artist/Album/, writes tags + cover art, fetches lyrics viaServices/LyricsService.cs, and queues a library scan.