Projets Personnels · Développement

NSupySonic

Ma bibliothèque Deezer en application auto-hébergée : archivage FLAC, lecture hors-ligne, web et Android.

  • Python (Flask, Gunicorn)
  • Svelte + Vite
  • Rust / WebAssembly
  • Kotlin (Android)
  • PostgreSQL
  • FFmpeg (FLAC → Opus)
  • Docker, GitHub Actions

Contexte

NSupySonic (Nyaker's Supysonic) est né d'un fork de supysonic, un serveur Subsonic écrit en Python. Je voulais garder la main sur ma musique : chaque titre écouté sur Deezer est récupéré une seule fois en FLAC, archivé sur mon serveur et servi depuis mon disque, même le jour où Deezer ne répond plus. Le fork est devenu une application à part entière, que j'utilise au quotidien.

Description

  • Un serveur Python (Flask) sert l'API Subsonic sur /rest et une API JSON pour le lecteur web ; un proxy Deezer transforme le compte en bibliothèque locale, avec synchronisation bidirectionnelle des playlists et favoris.
  • Un lecteur web en Svelte, installable comme une application (PWA), pensé pour la vitesse : listes virtualisées, file d'attente éditable, paroles synchronisées, égaliseur, fondu enchaîné et mode hors-ligne.
  • Une application Android native en Kotlin qui embarque le lecteur et ajoute ce que le navigateur ne sait pas faire : service média, notification, écran de verrouillage et commandes Bluetooth.
  • Une analyse audio en Rust compilée en WebAssembly (tempo, temps forts, genre) pilote des animations WebGL2 synchronisées à la musique.

En détail

Technologies

  • Python (Flask, Gunicorn)
  • Svelte + Vite
  • Rust / WebAssembly
  • Kotlin (Android)
  • PostgreSQL
  • FFmpeg (FLAC → Opus)
  • Docker, GitHub Actions

Fonctionnalités clés

  • Archivage FLAC à la première écoute, transcodage Opus à la demande
  • Fonctionne sans Deezer pour tout ce qui est déjà archivé
  • Écoute partagée synchronisée à la milliseconde près (lien ou QR code)
  • Télécommande d'un lecteur depuis un autre appareil, avec niveaux de droits
  • Podcasts, export ZIP, envoi de fichiers personnels
  • Compatible avec tous les clients Subsonic (Symfonium, DSub…)

Qualité et déploiement

  • Suite de tests automatisés (API, sécurité, schéma, résilience)
  • CI GitHub Actions : tests, build de l'APK Android, image Docker multi-architecture (amd64 + arm64) publiée sur ghcr.io
  • Déploiement en une commande avec Docker Compose

Sécurité

  • Le cookie Deezer est traité comme un mot de passe : jamais versionné ni inclus dans l'image
  • Connexion Deezer dans l'app Android via la page officielle, sans jamais voir le mot de passe
  • Liens de télécommande et d'écoute partagée révocables et expirables

Code source

Disponible sur GitHub (licence AGPL-3.0)