From 21bcb2ba238e07ed85be754d3f73b5c3bbba28f6 Mon Sep 17 00:00:00 2001 From: MasutaYunikon Date: Fri, 10 Apr 2026 21:00:24 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20organisation=20utilise=20l'extension=20d?= =?UTF-8?q?u=20fichier=20au=20lieu=20de=20tester=20si=20=C3=A7a=20existe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/organize.ts | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/server/organize.ts b/server/organize.ts index e4aac8c..a9525c8 100644 --- a/server/organize.ts +++ b/server/organize.ts @@ -64,7 +64,8 @@ export async function scanMediaPath( logger.info('organize', `Scan de la médiathèque : ${mediaPath}`) - // Map : nom_sur_disque → { hash, srcFilename, episodeId, season, episode } + // Map : nom_sans_extension → { hash, srcFilename, episodeId, season, episode } + // On indexe par nom sans extension pour matcher quelle que soit l'extension sur le disque const filenameIndex = new Map { + const base = filename.replace(/\.[^.]+$/, '') + filenameIndex.set(base, { ...entry, destFilename: destFilename ?? filename }) } + // 1. Nom brut source + idx(srcFilename) + + // 2. nfo_filename (sans extension — le swap se fera au moment du match) + if (ep.nfo_filename) idx(ep.nfo_filename) + // 3. original_filename - if (ep.original_filename) { - filenameIndex.set(ep.original_filename, { ...entry, destFilename: ep.original_filename }) - } + if (ep.original_filename) idx(ep.original_filename) - // 4. formatted_name + .mkv + // 4. formatted_name if (ep.formatted_name?.trim()) { - const fmtName = ep.formatted_name.replace(/[<>:"/\\|?*]/g, '').trim() + '.mkv' - filenameIndex.set(fmtName, { ...entry, destFilename: fmtName }) + const fmtBase = ep.formatted_name.replace(/[<>:"/\\|?*]/g, '').trim() + filenameIndex.set(fmtBase, { ...entry, destFilename: fmtBase }) } } } @@ -136,12 +137,18 @@ export async function scanMediaPath( const full = path.join(dir, entry.name) if (entry.isDirectory()) { walk(full) - } else if (entry.isFile() && entry.name.endsWith('.mkv')) { + } else if (entry.isFile() && /\.(mkv|mp4|avi|m4v|mov|wmv)$/i.test(entry.name)) { result.found++ - const match = filenameIndex.get(entry.name) + // Chercher par nom sans extension pour matcher quelle que soit l'extension + const nameWithoutExt = entry.name.replace(/\.[^.]+$/, '') + const match = filenameIndex.get(nameWithoutExt) if (!match) continue - const { hash, srcFilename, episodeId, season, episode, destFilename } = match + const { hash, srcFilename, episodeId, season, episode } = match + // Le destFilename prend l'extension réelle du fichier sur le disque + const realExt = path.extname(entry.name) + const destBase = match.destFilename.replace(/\.[^.]+$/, '') + const destFilename = destBase + realExt presentFiles.add(`${hash}:${episodeId}`) if (organized[hash]?.[String(episodeId)]) continue