Sign inSign up

pirus999/magic-lists-ai-curator

By pirus999

•Updated 22 days ago

The new Docker Repo for MagicLists with Jellyfin Support and other upgrades

Image
Integration & delivery
Machine learning & AI
Web servers
0

932

pirus999/magic-lists-ai-curator repository overview

AI-assisted playlists for your own music library.

MagicLists adds the kind of curated, evolving playlists you’d expect from Spotify or Apple Music—except it works entirely on your self-hosted Navidrome or Jellyfin server. No subscriptions, no renting your music back. Just smart mixes generated from the library you already own.

⁠What it does

  • 🎵 This Is (Artist) — Builds a definitive playlist for any artist in your library, combining hits, deep cuts, and featured appearances without duplicates.
  • 📻 Artist Radio — Automatically search for similar artists for your selected one, then create a distinctive mixed radio playlist from your selection.
  • 🎸 Genre Mix — Creates curated playlists from your complete genre collections, using AI to craft the perfect mix of tracks.
  • 🔄 Re-Discover — Rotates tracks you haven't played in a while, helping you fall back in love with your collection.
  • ⏰ Auto-Refresh — Keep playlists fresh with daily, weekly, or monthly updates.
  • 🐳 Quick Setup — Simple Docker install; get started in minutes.

⁠Why it matters

Navidrome and Jellyfin users already own their music. MagicLists brings modern curation tools into that world—so your playlists feel alive, not static, and your collection keeps surprising you.

⁠Get more Information on:

GitHub⁠

⁠Installation

Why this method? Your MagicLists container will be on the same network as Navidrome, making connection simple and reliable. This also enables future features like audio analysis that require local file access. You also could use this compose to spin up a Szandalone Container.

  1. Add MagicLists to your existing docker-compose.yml (the one that runs Navidrome):
   services:
     navidrome:
       # ... your existing Navidrome or Jellyfin config ...
     
     magiclists:
       image: pirus999/magic-lists-ai-curator:latest
       container_name: magiclists
       ports:
         - "4545:8000"
       environment:
         - SERVER_TYPE=navidrome # or jellyfin
         - NAVIDROME_URL=http://navidrome:4533 # for Jellyfin use: JELLYFIN_URL=http://jellyfin:8096
         - NAVIDROME_USERNAME=your_username # for Jellyfin use: JELLYFIN_USERNAME or JELLYFIN_API_KEY
         - NAVIDROME_PASSWORD=your_password # for Jellyfin use: JELLYFIN_PASSWORD or JELLYFIN_API_KEY
         - DATABASE_PATH=/app/data/magiclists.db # Required: Database location
           - AI_PROVIDER=google            # Optional: openrouter, groq, google, ollama
           - AI_API_KEY=your_google_api_key  # Optional, for OpenRouter/Groq/Google
           - AI_MODEL=gemini-3.5-flash # Select one from your AI provider
           - DESCRIPTION_AI_MODEL=gemma-4-26b-a4b-it # Optional, select a smaller model for Playlist descriptions
       volumes:
         - ./magiclists-data:/app/data          # Persist configuration
       restart: unless-stopped
  1. Update the environment variables with your Navidrome credentials
  2. Start the stack:
   docker-compose up -d
  1. Access MagicLists at http://localhost:4545⁠

Note: The NAVIDROME_URL uses the container name (navidrome) as the hostname. If your Navidrome service has a different name in your compose file, update this accordingly.

⁠Alternative: Standalone Docker Run Container

Use this if you can't or don't want to modify your existing Docker Compose setup.

Docker Run If Navidrome is publicly accessible: Use your public Navidrome URL (e.g., https://music.yourdomain.com⁠):

   docker run -d \
      --name magiclists \
      -p 4545:8000 \
      -e NAVIDROME_URL=https://music.yourdomain.com \
      -e NAVIDROME_USERNAME=your_username \
      -e NAVIDROME_PASSWORD=your_password \
      -e DATABASE_PATH=/app/data/magiclists.db \
      -e AI_PROVIDER=openrouter \
      -e AI_API_KEY=your_openrouter_api_key \
      -e AI_MODEL=dots-studio/dots-3-note-preview:free \
      -v ./magiclists-data:/app/data \
      pirus999/magic-lists-ai-curator:latest 

⁠Environment

SectionVariableExample / DefaultWhat it doesRequired?
Server selectionSERVER_TYPEnavidrome (or jellyfin)Chooses which music server the app talks to.Yes – defaults to navidrome.
Navidrome settingsNAVIDROME_URLhttp://navidrome:4533Base URL of the Navidrome instance.Required if SERVER_TYPE=navidrome.
NAVIDROME_USERNAMEyour_navidrome_usernameNavidrome user name.Required if Navidrome.
NAVIDROME_PASSWORDyour_passwordNavidrome password (plain‑text – the container runs in a trusted environment).Required if Navidrome.
Jellyfin settingsJELLYFIN_URLhttp://jellyfin:8096Base URL of the Jellyfin instance.Required if SERVER_TYPE=jellyfin.
JELLYFIN_USERNAMEadminJellyfin user name.Required if Jellyfin.
JELLYFIN_PASSWORDpasswordJellyfin password.Required if Jellyfin.
JELLYFIN_API_KEY(empty)API key for token‑based auth (optional – password auth works too).Optional.
JELLYFIN_VERIFY_SSLtrueVerify TLS certs when using https. Set to false for self‑signed certs.Optional.
ListenBrainz Labs (artist‑radio)LISTENBRAINZ_LABS_URLhttps://labs.api.listenbrainz.orgEndpoint used for “artist radio” suggestions.Fixed – leave as‑is.
LISTENBRAINZ_TOKEN(empty)Personal token – only needed when you hit rate‑limits.Optional.
LISTENBRAINZ_TIMEOUT15 (seconds)HTTP timeout for ListenBrainz calls.Optional.
AI ProviderAI_PROVIDERgoogle (options: openrouter, groq, google, ollama)Which LLM service to call for playlist curation.Yes.
AI_API_KEYyour_api_key_hereProvider‑specific API key (OpenRouter, Groq, Google). Not needed for Ollama.Yes for all non‑Ollama providers.
LLM ModelAI_MODELgemini-3.5-flashThe “heavy” model that does the actual playlist generation / reasoning. Choose a model that matches the provider you picked.Yes.
Description‑only ModelDESCRIPTION_AI_MODELgemma-4-26b-a4b-itA cheaper / faster model used only for short description generation (e.g., “Genre Mix”, “This is a playlist” text). If left empty, AI_MODEL is reused.Optional.
Ollama‑specific settings (ignored unless AI_PROVIDER=ollama)OLLAMA_BASE_URLhttp://localhost:11434/v1/chat/completionsURL of the local Ollama server. Adjust when running inside Docker (host.docker.internal) or via a separate compose service.Optional – required for Ollama.
OLLAMA_TIMEOUT180 (seconds)HTTP request timeout for Ollama. Raise for slow CPUs or huge prompts.Optional.
OLLAMA_MAX_TRACKS150Hard cap on how many tracks are sent to the LLM (prevents context‑size overflow). Leave empty for the automatic dynamic limit.Optional.
Filesystem & persistenceDATABASE_PATH/app/data/magiclists.dbWhere the SQLite DB lives inside the container. For Docker you normally mount a volume at /app/data.Yes – defaults to the internal path.
LoggingLOG_LEVELINFO (options: ERROR, INFO, DEBUG)Verbosity of the app’s log output.Optional.
Navidrome library filterNAVIDROME_LIBRARY_ID(empty)If you have multiple Navidrome libraries, set the ID to limit the app to one.Optional.

⁠License

MIT License

⁠Support

⁠View README⁠ on GitHub

No Warranty: This software is provided "as is" without warranty of any kind, express or implied.

User Responsibility: You are solely responsible for:

  • Ensuring you have proper rights to any music content processed through this application
  • Any data transmitted to third-party AI services
  • Backup of your music library before use
  • Any modifications made to your playlists or library

Limitation of Liability: The developers shall not be liable for any damages including but not limited to data loss, corruption of music libraries, or any other direct or indirect damages arising from use of this software.

Third-party Services: This application integrates with external AI services. Your use of these services is subject to their respective terms of service.

By using this software, you acknowledge and accept these terms.

Tag summary

Content type

Image

Digest

sha256:e9672d183…

Size

140.3 MB

Last updated

22 days ago

docker pull pirus999/magic-lists-ai-curator