Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JellyTunes

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).

Features

  • YouTube downloads via yt-dlp — individual videos, and playlists expanded automatically. Optional --cookies support 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.m4a with 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 .lrc file 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's yt-dlp; config surface appears in the main menu under Add Music.

Install (anyone)

The plugin is published through a Jellyfin repository. Add the repository once, then install like any other plugin:

  1. In the Jellyfin web UI go to Dashboard → Plugins → Repositories.

  2. Click + Add, and enter the repository URL:

    https://raw.githubusercontent.com/uchumeow/jellytunes/main/manifest.json
    
  3. Save. Now go to Dashboard → Plugins → Catalog (or Repositories → browse) and find JellyTunes.

  4. Click Install and restart the server when prompted.

  5. Configure in Dashboard → My Plugins → JellyTunes (or Add Music in the main menu).

Manual install (optional)

Download Jellyfin.Plugin.JellyTunes_1.0.0.0.zip from the latest release, then:

  1. Copy the plugin folder to <data>/plugins/Jellyfin.Plugin.JellyTunes_1.0.0.0/.
  2. Restart the Jellyfin server.

Requirements

  • Jellyfin 10.11 or newer.
  • yt-dlp installed on the server (e.g. apt install yt-dlp or via pip), or point YtdlpPath at your own copy.

Configuration

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).

Lyrics

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).

After each import

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.m4aIsolation.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).

Backfill the rest of the library (scheduled task)

JellyTunes ships a scheduled task that scans your whole music library for tracks missing lyrics and fetches them:

  1. In the Jellyfin web UI go to Dashboard → Scheduled Tasks.
  2. Find Fetch Missing Lyrics (category Music).
  3. Click ▶ Run to start it now — it fetches lyrics for every track that has none (including ones you just imported), writing .lrc files next to the audio.
  4. 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 .lrc if a match looks wrong; JellyTunes won't overwrite an existing one.

Building from source

dotnet build -c Release

Produces Jellyfin.Plugin.JellyTunes.dll in bin/Release/net9.0/.

How it works

  1. A YouTube URL or uploaded file creates a job (Data/JobStore.cs, persisted to jobs.json).
  2. Services/DownloadService.cs runs yt-dlp (adding --cookies when CookiesPath is set and the file exists).
  3. Services/MetadataService.cs builds candidates from the filename and MusicBrainz.
  4. You review/approve in the web UI; Services/ImportService.cs moves the file into MusicPath/Artist/Album/, writes tags + cover art, fetches lyrics via Services/LyricsService.cs, and queues a library scan.

Acknowledgements

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages