Phase 1: lock cron, reload chaud, argon2, providers, IMDb lookup, cache LRU, /health, /metrics, rate limit, UI dark, biome
This commit is contained in:
80
README.md
80
README.md
@@ -128,35 +128,77 @@ Réponse JSON :
|
||||
|
||||
L'ancien chemin `/api.php` est aussi exposé pour compatibilité.
|
||||
|
||||
### `GET /search?query=<requête>`
|
||||
Mêmes données que `/api?t=search` mais rendues en HTML (vignettes posters,
|
||||
panneau d'info, liens IMDb/TMDb cliquables). Compat : `/search.php`.
|
||||
Réponses cachées en mémoire (LRU 1000 entrées, TTL 1h). Reload automatique
|
||||
des chunks de recherche après chaque cron (watcher `fs.watch`).
|
||||
|
||||
### `GET /`
|
||||
Page d'index protégée par mot de passe + listing des fichiers du projet.
|
||||
### `GET /api?t=imdb&q=<imdb_id>`
|
||||
Lookup direct par IMDb ID (`tt0133093`). Renvoie le détail movie ou tv
|
||||
correspondant, avec note IMDb fusionnée. Utilise les mappings
|
||||
`imdb2movie.json` / `imdb2tv.json` chargés en mémoire.
|
||||
|
||||
### `GET /api?t=providers&type=movie|tv&q=<id>`
|
||||
Watch providers JustWatch par pays (FR, US, etc.) — données déjà téléchargées
|
||||
par le cron, exposées sous le format TMDB original.
|
||||
|
||||
### `GET /` — Interface web
|
||||
SPA vanilla JS (zéro build), thème sombre. Une barre de recherche, grille de
|
||||
posters, modal de détail avec tagline/overview/budget/revenue/providers FR.
|
||||
Accepte requêtes texte (`Inception 2010`), IMDb IDs (`tt0133093`) et URLs
|
||||
TMDB collées (`themoviedb.org/movie/27205`).
|
||||
|
||||
### `GET /admin`
|
||||
Listing protégé des fichiers du projet (mot de passe argon2id).
|
||||
Pour générer un nouveau hash :
|
||||
```bash
|
||||
node tools/hashPassword.js 'mon-mot-de-passe'
|
||||
```
|
||||
Puis copier la sortie dans `.env` sous `ADMIN_PASSWORD_HASH=`.
|
||||
|
||||
### `GET /health`
|
||||
JSON liveness/readiness : status, uptime, mémoire, nombre de notes IMDb
|
||||
chargées. Renvoie 503 si l'index IMDb n'a pas pu être chargé.
|
||||
|
||||
### `GET /metrics`
|
||||
Format Prometheus standard : `http_requests_total`, `http_request_duration_seconds`,
|
||||
`search_cache_hits_total`, `search_cache_misses_total`, `imdb_ratings_total`,
|
||||
`search_workers`, plus métriques process par défaut (CPU, RSS, event loop).
|
||||
|
||||
### Rate limit
|
||||
50 requêtes/seconde par IP par défaut (configurable via `RATE_LIMIT_PER_SEC`).
|
||||
`/health` et `/metrics` exemptés.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
proxytmdb/
|
||||
├── server.js # Bootstrap Fastify
|
||||
├── config.js # Constantes, ports, chemins
|
||||
├── server.js # Bootstrap Fastify + rate limit + sessions
|
||||
├── config.js # Constantes, ports, chemins, env vars
|
||||
├── biome.json # Lint + format
|
||||
├── public/ # SPA vanilla JS (UI publique)
|
||||
│ ├── index.html
|
||||
│ ├── style.css
|
||||
│ └── app.js
|
||||
├── lib/
|
||||
│ ├── paths.js # Layout disque <type>/<floor(id/1000)>/<id>.json
|
||||
│ ├── paths.js # Layout <type>/<floor(id/1000)>/<id>.json
|
||||
│ ├── mbLevenshtein.js # Levenshtein UTF-8 par codepoint
|
||||
│ ├── titleFilter.js # Translit ligatures + filtre Latin/chiffres
|
||||
│ ├── queryParser.js # Extraction annee/episode/titre
|
||||
│ ├── imdbRatings.js # Index IMDb en memoire (Map)
|
||||
│ ├── imdbMapping.js # Mapping IMDb -> TMDb id
|
||||
│ ├── http.js # fetch + retry + concurrence limitee
|
||||
│ ├── format.js # Devises et runtime
|
||||
│ ├── searchEngine.js # Pool de 8 workers persistants
|
||||
│ ├── lockFile.js # Lock file PID-based pour le cron
|
||||
│ ├── password.js # Argon2id hash + verify
|
||||
│ ├── metrics.js # Counters/Histograms Prometheus
|
||||
│ ├── searchEngine.js # Pool workers + watcher reload chaud
|
||||
│ └── searchWorker.js # Worker thread (1 chunk de la base)
|
||||
├── routes/
|
||||
│ ├── index.js # Login + listing protege
|
||||
│ ├── api.js # Endpoints JSON
|
||||
│ └── search.js # Vue HTML
|
||||
│ ├── api.js # /api (movie/tv/imdb/providers/search) + cache LRU
|
||||
│ ├── admin.js # /admin (login argon2 + listing)
|
||||
│ └── health.js # /health + /metrics
|
||||
├── cron/
|
||||
│ ├── runAll.js # Pipeline complet
|
||||
│ ├── runAll.js # Pipeline complet (avec lock file)
|
||||
│ ├── run.sh # Wrapper nvm pour crontab
|
||||
│ ├── imdbRatings.js # title.ratings.tsv.gz
|
||||
│ ├── tmdbExports.js # Exports quotidiens TMDB
|
||||
│ ├── tmdbSync.js # Sync incrementale via /changes
|
||||
@@ -164,12 +206,24 @@ proxytmdb/
|
||||
│ ├── tmdb2imdb.js # Mappings bidirectionnels
|
||||
│ ├── buildSearch.js # Chunks de recherche
|
||||
│ └── ambiguity.js # Detection des doublons
|
||||
├── tools/
|
||||
│ └── hashPassword.js # Outil CLI pour generer un hash argon2
|
||||
├── test/
|
||||
│ └── helpers.test.js # Tests unitaires
|
||||
├── tmdbintegral/ # Donnees (gitignore)
|
||||
└── imdbratings.tsv # Donnees IMDb (gitignore)
|
||||
```
|
||||
|
||||
## Qualité de code
|
||||
|
||||
Lint + format avec **Biome** (config dans `biome.json`) :
|
||||
|
||||
```bash
|
||||
npm run lint # Verifie sans modifier
|
||||
npm run format # Formate uniquement (write)
|
||||
npm run fix # Lint + format + auto-fix
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user