Bibliothèque personnelle de livres audio : parcourez votre bibliothèque, scrapez les métadonnées (Audible.fr / Lizzie.audio), éditez-les et envoyez vos fichiers vers 1Fichier avec notification Discord.
Application web full-stack composée d'un backend Symfony 8.1 / API Platform 5 (PHP >= 8.2) et d'un
frontend Vue 3 + Vite + TypeScript. En production, le build du frontend est copié dans backend/public
(monolithe servi par Symfony). Le thème visuel s'inspire de Diablo / Deckard Cain, l'interface est
entièrement en français.
⚠️ Projet personnel — usage privé, pas de contribution externe.
- Bibliothèque : vues « Sagas / Livres », regroupement par saga, recherche insensible à la casse et aux accents.
- Historique de navigation : bouton « Retour » global, recherche et mode de l'accueil conservés dans l'URL — le retour restaure l'état.
- Ajout d'un livre : dépôt du ZIP → recherche de métadonnées (Audible + Lizzie fusionnées) → édition → preview → envoi.
- File d'attente : envois séquentiels en arrière-plan, indépendants de la navigation — progression par item, pause/reprendre, réessai, réordonnancement.
- Téléchargement : lien 302 vers l'URL temporaire 1Fichier.
- Maintenance 1Fichier : pages « fichiers orphelins » (non référencés) et « intrus » (livres sans fichier).
- Notifications Discord : nouveau livre disponible + erreurs runtime (webhooks optionnels).
- PHP >= 8.2 (8.5 recommandé, cf.
backend/.php-version) avec l'extension intl - Composer
- Node.js 24 (via nvm) + npm
- Docker (PostgreSQL local via docker compose)
- Symfony CLI (
symfony serve)
git clone git@github.com:ilgazil/listen.git
cd listen
make install # composer install (backend) + npm install (frontend)
make db-up # PostgreSQL local (docker compose)
cp backend/.env backend/.env.local # puis renseigner les variables (voir Configuration)
make db-create # création de la base + migrationsEn dev, lancer deux terminaux :
make backend # API Symfony → http://localhost:8000
make frontend # Vite → http://localhost:5173 (proxy /api → localhost:8000)
make backendcharge automatiquementbackend/.php-local/(ini de dev : 1G mémoire / uploads 1G, requis pour les gros ZIP — le PHP de dev est limité à 128M / 2M par défaut).
Toutes les commandes passent par le Makefile (make help liste tout) :
| Cible | Rôle |
|---|---|
make install |
installe les dépendances (backend + frontend) |
make backend / make frontend |
serveurs de dev (Symfony :8000 / Vite :5173) |
make db-up / make db-create / make db-migrate |
base locale (docker, création, migrations) |
make test / make test-backend / make test-frontend |
tests (PHPUnit / Vitest) |
make lint / make format |
lint (container+yaml / eslint) et format (prettier) |
make build |
type-check + build frontend dans frontend/dist |
make check |
lint + tests + build (pré-déploiement) |
make deploy-dry / make deploy |
déploiement (simulation / réel) |
make ssh-key / make ssh-copy |
clé SSH de déploiement dédiée (une seule fois) |
Jamais de valeurs en dur ni de secrets committés — tout passe par des fichiers locaux gitignorés.
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL en dev (docker compose), MariaDB en prod |
APP_SECRET |
secret Symfony |
API_1FICHIER_TOKEN |
token API 1Fichier |
API_1FICHIER_APP_FOLDER_ID |
id du dossier applicatif 1Fichier |
DISCORD_NEW_BOOK_WEBHOOK |
(optionnel) webhook « nouveau livre disponible » |
DISCORD_SENTRY_WEBHOOK |
(optionnel) webhook des erreurs runtime |
APP_BASE_URL |
(optionnel) surcharge l'URL des liens Discord (sinon dérivée de la requête) |
CORS_ALLOW_ORIGIN |
origins autorisées (localhost par défaut) |
| Variable | Description |
|---|---|
VITE_API_BASE_URL |
(optionnel) base de l'API ; vide = relatif, proxifié par Vite vers localhost:8000 |
| Variable | Description |
|---|---|
PROD_HOST / PROD_SSH_USER / PROD_PORT |
accès SSH au serveur |
PROD_PATH |
chemin du vhost côté serveur |
PROD_URL |
(optionnel) URL publique, affichée dans le récapitulatif de déploiement |
PROD_PHP |
binaire PHP CLI du serveur (doit avoir intl) — chemin absolu recommandé : le CLI ssh est indépendant du PHP du vhost |
PROD_USE_COMPOSER |
1 = composer install sur le serveur, 0 = vendor envoyé tel quel |
DEPLOY_SSH_KEY |
clé privée dédiée au déploiement |
Le lock composer est résolu pour le PHP de prod (
config.platform.php: 8.5.0dansbackend/composer.json). Le PHP web du vhost doit être ≥ 8.5 avant de déployer (le garde-fou descripts/deploy.shcompare le pin au PHP CLI du serveur et échoue avant tout envoi en cas de décalage).
| Endpoint | Rôle |
|---|---|
GET /api/books (+ /{id}
6650
) |
bibliothèque (API Platform, ETag/304) |
GET /api/scrap?pattern=… |
recherche de métadonnées fusionnée Audible + Lizzie |
POST /api/upload |
envoi d'un ZIP + métadonnées → 1Fichier → Book → notif Discord |
GET /api/download/{id} |
302 vers l'URL temporaire 1Fichier |
GET/POST/DELETE /api/orphans… |
fichiers 1Fichier non référencés |
GET/DELETE /api/intruders… |
livres dont le fichier a disparu |
Le contrat détaillé (formes JSON, statuts HTTP) est dans backend/SPECS.md.
make test # backend (PHPUnit, 1Fichier mocké) + frontend (Vitest)
make lint # lint container/yaml + eslint
make check # lint + tests + buildmake ssh-keypuismake ssh-copy(une seule fois — dernière fois qu'un mot de passe est demandé).cp .deploy.env.example .deploy.envpuis renseigner les accès.make deploy-drypour simuler,make deploypour déployer (rsync des sources + build frontend, cache Symfony).
Le déploiement exige un arbre git propre ; les migrations Doctrine sont appliquées manuellement sur le serveur
(php bin/console doctrine:migrations:migrate).
backend/AGENTS.md— mode d'emploi opérationnel du backend ·backend/SPECS.md— contrat API & décisionsfrontend/AGENTS.md— mode d'emploi opérationnel du frontend ·frontend/SPECS.md— comportement & fonctionnalités cibles
Projet privé — tous droits réservés.