fix: les series sans torrents sont bien organiser si importé manuellement

This commit is contained in:
MasutaYunikon committed 2026-04-11 12:12:31 +02:00
1 parent e02650d1cc
commit 66b0313ae9
1 file changed
+25 -30
+25 -30
View File
@@ -78,43 +78,38 @@ export async function scanMediaPath(
for (const sd of seriesData) { for (const sd of seriesData) {
for (const season of sd.seasons ?? []) { for (const season of sd.seasons ?? []) {
for (const ep of season.episodes ?? []) { for (const ep of season.episodes ?? []) {
for (const p of ep.paths ?? []) {
if (typeof p === 'string') continue
const hash = p.infohash?.toLowerCase()
if (!hash || !p.path) continue
const srcFilename = p.path.replace(/\\/g, '/').split('/').pop() // Helper : indexer par nom sans extension
if (!srcFilename) continue const idx = (filename: string, hash: string, destFilename?: string) => {
const base = filename.replace(/\.[^.]+$/, '')
const entry = { if (!base) return
filenameIndex.set(base, {
hash, hash,
srcFilename, srcFilename : filename,
episodeId : ep.id, episodeId : ep.id,
season : season.season_number, season : season.season_number,
episode : ep.episode_number, episode : ep.episode_number,
destFilename: srcFilename, destFilename: destFilename ?? filename,
} })
}
// Helper : indexer par nom sans extension // 1. Noms depuis les paths (avec vrai infohash)
const idx = (filename: string, destFilename?: string) => { for (const p of ep.paths ?? []) {
const base = filename.replace(/\.[^.]+$/, '') if (typeof p !== 'object' || !p.infohash || !p.path) continue
filenameIndex.set(base, { ...entry, destFilename: destFilename ?? filename }) const hash = p.infohash.toLowerCase()
} const srcFilename = p.path.replace(/\\/g, '/').split('/').pop()
if (!srcFilename) continue
idx(srcFilename, hash)
if (ep.nfo_filename) idx(ep.nfo_filename, hash, ep.nfo_filename)
}
// 1. Nom brut source // 2. original_filename et formatted_name — indexés même si paths est vide
idx(srcFilename) // (pour les séries sans torrent importées manuellement)
const fallbackHash = ep.paths?.[0]?.infohash?.toLowerCase() ?? 'manual'
// 2. nfo_filename (sans extension — le swap se fera au moment du match) if (ep.original_filename) idx(ep.original_filename, fallbackHash, ep.original_filename)
if (ep.nfo_filename) idx(ep.nfo_filename) if (ep.formatted_name?.trim()) {
const fmtBase = ep.formatted_name.replace(/[<>:"/\\|?*]/g, '').trim()
// 3. original_filename idx(fmtBase, fallbackHash, fmtBase)
if (ep.original_filename) idx(ep.original_filename)
// 4. formatted_name
if (ep.formatted_name?.trim()) {
const fmtBase = ep.formatted_name.replace(/[<>:"/\\|?*]/g, '').trim()
filenameIndex.set(fmtBase, { ...entry, destFilename: fmtBase })
}
} }
} }
} }