fix(organize): sanitisation des caractères spéciaux dans les noms de dossiers

Le titre "Kaguya-sama : Love is War Henshū" contenait un ":" qui causait
une troncation du nom de dossier sur certains systèmes de fichiers.
sanitizeDirName() remplace ":" par " -" et supprime les autres caractères
interdits (<>"/\|?*).

feat(settings): option titres optimisés Plex (title_for_plex)

Nouveau toggle "Noms de dossiers" dans les paramètres. Quand activé,
utilise le champ title_for_plex de l'API Fankai pour les noms de dossiers
au lieu du titre brut — évite les caractères spéciaux incompatibles avec
Plex et les systèmes de fichiers Windows/NTFS.

enrichSeriesDataWithOriginalFilenames fetche maintenant /series/{id} pour
injecter title_for_plex dans chaque serieData avant de passer au worker.

fix(organize): retry sur les erreurs réseau dans enrichSeriesDataWithOriginalFilenames

2 tentatives avec 500ms d'attente entre les deux pour les erreurs réseau
ponctuelles sur /seasons/{id}/episodes — évite que formatted_name soit null
à cause d'un timeout isolé au démarrage.

fix(catalogue): activeTorrents filtre désormais uniquement state=downloading

Les torrents en seeding étaient inclus dans activeTorrents, forçant
computeSerieDownloadState à retourner "downloading" même pour les séries
entièrement importées. Les badges affichaient "EN COURS" au lieu de "IMPORTÉ".
This commit is contained in:
MasutaYunikon committed 2026-03-24 19:18:51 +01:00
1 parent 82a9d51731
commit c374ceb0a7
4 files changed
+64 -12

No files matched your search

+10 -3
View File
@@ -42,8 +42,8 @@ app.get('/api/settings', requireAuth, (_req, res) => {
res.json(readSettings())
})
app.post('/api/settings', requireAuth, (req, res) => {
const { mediaPath, completePath, organizeMode, category, nfoSupport, autoImport } = req.body
res.json(writeSettings({ mediaPath, completePath, organizeMode, category, nfoSupport, autoImport }))
const { mediaPath, completePath, organizeMode, category, nfoSupport, autoImport, usePlexTitles } = req.body
res.json(writeSettings({ mediaPath, completePath, organizeMode, category, nfoSupport, autoImport, usePlexTitles }))
})
// ── Torrent clients ────────────────────────────────────────────
@@ -284,6 +284,13 @@ async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise
for (const sd of seriesData) {
if (!sd) { results.push(sd); continue }
// Fetcher title_for_plex depuis l'API série
let title_for_plex: string | null = null
try {
const serieApi = await fankaiGet(`/series/${sd.id}`)
title_for_plex = serieApi.title_for_plex ?? null
} catch {}
const enrichedSeasons: any[] = []
for (const season of sd.seasons ?? []) {
let epsData: any[] = []
@@ -326,7 +333,7 @@ async function enrichSeriesDataWithOriginalFilenames(seriesData: any[]): Promise
enrichedSeasons.push({ ...season, episodes: enrichedEpisodes })
}
results.push({ ...sd, seasons: enrichedSeasons })
results.push({ ...sd, title_for_plex, seasons: enrichedSeasons })
}
return results