diff --git a/photo-gallery-app/backend/scripts/reprocess_uploads.js b/photo-gallery-app/backend/scripts/reprocess_uploads.js index 749d0b9..5b4b77e 100644 --- a/photo-gallery-app/backend/scripts/reprocess_uploads.js +++ b/photo-gallery-app/backend/scripts/reprocess_uploads.js @@ -61,14 +61,25 @@ const isHeifBuffer = (buffer) => buffer && buffer.length >= 12 && HEIF_BRANDS.ha function parseBaseName(doc) { const raw = path.basename(doc.filename || doc.path || '', path.extname(doc.filename || doc.path || '')); // Strip any trailing brace artifacts from older filenames - const cleaned = raw.endsWith('}') ? raw.slice(0, -1) : raw; - const match = raw.match(/^(.*?)(-md|-sm)?$/); - const base = match ? match[1] : raw; - return cleaned !== raw ? cleaned : base; + const cleaned = raw.replace(/[}]+$/, ''); + const match = cleaned.match(/^(.*?)(-md|-sm)?$/); + return match ? match[1] : cleaned; +} + +function deriveCandidateBases(baseName) { + const bases = new Set(); + bases.add(baseName); + // If name starts with a leading timestamp and dash, also try the suffix (original filename) + const tsMatch = baseName.match(/^(\d{8,})-(.+)$/); + if (tsMatch) { + bases.add(tsMatch[2]); + } + return Array.from(bases); } function sourceCandidates(doc) { const baseName = parseBaseName(doc); + const candidateBases = deriveCandidateBases(baseName); const preferred = new Set(); const fromDocPath = doc.path ? doc.path.replace(/^\/+/, '') : ''; const fromDocFile = doc.filename ? path.join('uploads', doc.filename) : ''; @@ -76,14 +87,16 @@ function sourceCandidates(doc) { .filter(Boolean) .forEach(rel => preferred.add(path.join(UPLOAD_DIR, rel.replace(/^uploads[\\/]/, '')))); - // Look for any common source extension using the base name - for (const ext of SOURCE_EXTS) { - preferred.add(path.join(UPLOAD_DIR, `${baseName}${ext}`)); - } - // Also check variant-style names in case only a variant exists - for (const ext of SOURCE_EXTS) { - preferred.add(path.join(UPLOAD_DIR, `${baseName}-md${ext}`)); - preferred.add(path.join(UPLOAD_DIR, `${baseName}-sm${ext}`)); + // Look for any common source extension using candidate base names + for (const base of candidateBases) { + for (const ext of SOURCE_EXTS) { + preferred.add(path.join(UPLOAD_DIR, `${base}${ext}`)); + } + // Also check variant-style names in case only a variant exists + for (const ext of SOURCE_EXTS) { + preferred.add(path.join(UPLOAD_DIR, `${base}-md${ext}`)); + preferred.add(path.join(UPLOAD_DIR, `${base}-sm${ext}`)); + } } return Array.from(preferred); }