Files
wiki/Catalogue-Self-Hosted/apps/app-jellyplist.md
T
2026-06-09 18:40:21 +02:00

7.7 KiB

title, created, updated, type, tags, confidence, contested, sources
title created updated type tags confidence contested sources
Jellyplist 2026-06-07 2026-06-07 app
catalogue
music
jellyfin
playlist
spotify
python
spotdl
medium false
https://selfh.st/apps/?tag=music
https://github.com/kamilkosek/jellyplist

📋 Jellyplist

Utilitaire de synchronisation de playlists Spotify vers un serveur Jellyfin : réplique vos playlists Spotify (ordre, ajouts, retraits) en s'appuyant sur app-spotizerr/spotDL pour télécharger les morceaux manquants. Archivé octobre 2025.

Métadonnée Valeur
Site web https://github.com/kamilkosek/jellyplist
GitHub https://github.com/kamilkosek/jellyplist
License GPL-3.0
Langage Python (Flask) + PostgreSQL + Redis
Étoiles 16
Dernière MAJ 2025-10-10 (archivé)
Catégorie cat-music

Description

Jellyplist était un « Spotify → Jellyfin bridge » : vous ajoutez une playlist Spotify dans Jellyplist, l'app la synchronise dans votre instance app-jellyfin en téléchargement les morceaux manquants via spotDL et en créant/met à jour une playlist m3u native côté Jellyfin. Le suivi de l'ordre, des ajouts/retraits était delta-based : l'app détecte les changements côté Spotify et les répercute.

Le projet a été archivé en octobre 2025 par son mainteneur (kamilkosek) qui explique sur le README : « Spotify a désactivé des fonctionnalités cruciales de leur API l'an dernier, et mes workarounds ne fonctionnent plus non plus. J'ai décidé d'archiver ce projet et de ne plus investir d'effort pour le faire fonctionner à nouveau. » Concrètement, l'API publique de Spotify a resserré ses conditions d'accès (notamment pour les apps non-commerciales, dont l'usage a été limité) et plusieurs endpoints ont changé. Jellyplist n'est plus utilisable en l'état avec un compte Spotify standard.

Pourquoi documenter un projet archivé ? Parce que (1) c'est un cas d'usage typique d'un pont self-hosted entre deux écosystèmes, (2) le code reste un excellent point de départ pour un fork (l'architecture Flask + PostgreSQL + Redis est saine), (3) l'auteur lui-même redirige vers app-spotizerr comme alternative recommandée, et (4) les concepts (sync delta, Lidarr integration, m3u preservation) restent valides et applicables à d'autres sources (Bandcamp, Apple Music, Tidal).

Si vous cherchez un équivalent moderne et maintenu : app-spotizerr (étoile Spotify → Jellyfin via m3u), le plugin officiel Jellyfin « SmartPlaylists » (règles dynamiques mais pas de sync Spotify), ou spotDL en CLI pour du download one-shot depuis URL Spotify.

Installation

Docker Compose (archive — à des fins de référence)

# docker-compose.yml — configuration Jellyplist (archivé)
services:
  redis:
    image: redis:7-alpine
    container_name: jellyplist-redis
    volumes:
      - redis_data:/data
    restart: unless-stopped

  postgres:
    container_name: jellyplist-postgres
    image: postgres:17.2
    environment:
      POSTGRES_USER: jellyplist
      POSTGRES_PASSWORD: jellyplist
      PGDATA: /data/postgres
    volumes:
      - /jellyplist_pgdata:/data/postgres
    restart: unless-stopped

  jellyplist:
    image: ghcr.io/kamilkosek/jellyplist:latest  # image encore pullable
    container_name: jellyplist
    depends_on:
      - postgres
      - redis
    ports:
      - "5055:5055"
    env_file: .env                            # voir ci-dessous
    volumes:
      - /jellyplist/cookies.txt:/jellyplist/cookies.txt
      - /data/music/library:/storage/media/music
    restart: unless-stopped

volumes:
  redis_data:

.env (référence)

JELLYFIN_SERVER_URL=http://192.168.1.10:8096
JELLYFIN_ADMIN_USER=admin
JELLYFIN_ADMIN_PASSWORD=***
SPOTIFY_CLIENT_ID=***
SPOTIFY_CLIENT_SECRET=***
SECRET_KEY=***
MUSIC_STORAGE_BASE_PATH=/storage/media/music
JELLYPLIST_DB_HOST=jellyplist-postgres
JELLYPLIST_DB_USER=jellyplist
JELLYPLIST_DB_PASSWORD=jellyplist
# optionnel : LIDARR_API_KEY, LIDARR_URL

Configuration

(Section conservée à titre de documentation du fonctionnement historique. Ne pas tenter de redéployer sans correctif API Spotify.)

  • Credentials Spotify : créer une app sur developer.spotify.com, récupérer Client ID + Secret. ⚠️ Depuis 2024, l'API publique restreint fortement l'usage hors-commercial — c'est la cause de l'archivage.
  • Auth Jellyfin : username/password admin (pas de token API pour profiter du refresh auto).
  • Dossier musique partagé : doit être le même path que la bibliothèque musicale Jellyfin, pour que les fichiers téléchargés soient scannés.
  • Cookies Spotify : cookies.txt au format Netscape pour spotDL, permet 256 kbps au lieu de 128 kbps.
  • Intégration Lidarr : envoi automatique des artistes/albums détectés comme manquants à app-lidarr pour acquisition.
  • Sync delta : détection des tracks ajoutés/retirés côté Spotify → ajout/suppression dans la playlist Jellyfin correspondante.

Alternatives

Open Source (maintenues)

  • app-spotizerr — alternative directe recommandée par l'auteur Jellyplist : API REST + UI web, génère des .m3u picked up par app-jellyfin.
  • spotDL — CLI Python de référence pour télécharger depuis URL Spotify, mature.
  • Jellyfin SmartPlaylists plugin (officiel) — playlists dynamiques basées sur règles, mais pas de sync Spotify.
  • jellyfin-smartlists-plugin (jyourstone) — fork plus avancé du précédent.
  • Plex-Trakt-Sync (autre écosystème) — concept similaire, pas directement applicable.

Propriétaires

  • Soundiiz — service web de transfert de playlists entre services, freemium, fermé.
  • TuneMyMusic — idem, freemium.
  • Spotlistr — équivalent plus ancien, fermé.

Sécurité

  • Projet archivé : ne pas déployer en production sans audit du code et correctifs pour la nouvelle API Spotify (les endpoints historiques utilisés par l'app sont en partie obsolètes).
  • Credentials Spotify : Client Secret dans .env à protéger (chmod 600), ne pas commit.
  • Cookies Spotify : fichier cookies.txt au format Netscape, contient votre session → accès complet à votre compte Spotify. À stocker de manière chiffrée et à régénérer régulièrement.
  • Password admin Jellyfin : Jellyplist utilise les credentials admin Jellyfin (pas juste un token), ce qui lui donne accès total à l'instance Jellyfin. Compromission de Jellyplist = compromission de Jellyfin. Isoler sur un réseau dédié ou utiliser un utilisateur Jellyfin dédié avec droits moindres (mais l'app requiert admin pour créer des playlists au nom de l'utilisateur).
  • PostgreSQL exposé : par défaut le port 5432 est mappé sur l'host, à supprimer (expose au lieu de ports) pour ne pas exposer la DB.
  • AGPL-3.0 : tout fork servi en réseau doit publier ses modifications.

Ressources

Pages Liées