- Port par défaut 3001 → 9898 - Volume /app/data → /config (entrypoint, docker-compose, README) - Normalisation titres Kaï/Kai dans index.ts (catalogue + déduplication + serie detail) - Fix pagination GitLab NFO (per_page=100 → loop multi-pages) - Fix _is_bonus_filename avec word boundaries (\b) — évite faux positifs "national"→"ona" - Fix dossier Bonus/Specials exclus : récupère flottants (7,5/19,5) et S00Exx → saison 0 - _EP_FLOAT_PATTERN supporte virgules (7,5) en plus des points (7.5) - Ajout strict_season dans find_episode/resolve_ep — évite collision ep1 S1 vs ep1 S2 (JoJo Parties) - Ajout SEASON_EP_OFFSET pour Hokuto No Ken (saison 02 torrent → +16 offset API) - Fallback non-strict si strict_season échoue (Hokuto ep 5-16 S1) - Fix collect_covered_episodes : fallback torrent.serie_id si absent dans resolved_episodes - Fix s6_verify : get_all_specials + compteur S00 séparé, déduplication Kaï/Kai, format OK/TOTAL - Ajout MANUAL_TORRENTS dans s4 (MHA Film 4 You're Next URL Nyaa) - Injection torrents locaux manquants dans pipeline (Reborn! Kaï via fichier local) - Fix s5 : résolution directe torrents manuels season_number=0 - Fix s2 : pack_saga_slash et pack_partie_slash → pack_integrale, lookahead (?<!/) sur episode_num_tiret_apres - Fix s5 skip condition : re-résoudre si resolved_count < files_count (Fairy Tail) - README : note hardlinks volumes multiples, port, chemins config
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
/**
|
|
* secret.ts
|
|
* =========
|
|
* Génère et persiste le JWT secret dans data/secret.key
|
|
* Si JWT_SECRET est défini en variable d'environnement, il est utilisé tel quel.
|
|
* Sinon, on lit data/secret.key — s'il n'existe pas, on en génère un et on le sauvegarde.
|
|
*/
|
|
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import crypto from 'crypto'
|
|
|
|
const SECRET_PATH = path.join(process.cwd(), 'config', 'secret.key')
|
|
|
|
function generateSecret(): string {
|
|
return crypto.randomBytes(48).toString('hex')
|
|
}
|
|
|
|
function loadOrCreateSecret(): string {
|
|
// 1. Variable d'environnement — priorité absolue
|
|
if (process.env.JWT_SECRET && process.env.JWT_SECRET !== 'fankarr-secret-change-me') {
|
|
return process.env.JWT_SECRET
|
|
}
|
|
|
|
// 2. Fichier existant
|
|
if (fs.existsSync(SECRET_PATH)) {
|
|
const secret = fs.readFileSync(SECRET_PATH, 'utf-8').trim()
|
|
if (secret.length > 0) return secret
|
|
}
|
|
|
|
// 3. Génération + sauvegarde
|
|
const secret = generateSecret()
|
|
try {
|
|
fs.mkdirSync(path.dirname(SECRET_PATH), { recursive: true })
|
|
fs.writeFileSync(SECRET_PATH, secret, { encoding: 'utf-8', mode: 0o600 })
|
|
console.log('[auth] JWT secret généré et sauvegardé dans data/secret.key')
|
|
} catch (err) {
|
|
console.error('[auth] Impossible de sauvegarder le secret:', err)
|
|
}
|
|
|
|
return secret
|
|
}
|
|
|
|
export const JWT_SECRET: string = loadOrCreateSecret() |