const path = require('path'); const crypto = require('crypto'); function toPosix(p) { return p.split(path.sep).join('/'); } function sha256(s) { return crypto.createHash('sha256').update(s).digest('hex'); } function inferMimeFromExt(ext) { switch (ext.toLowerCase()) { case '.jpg': case '.jpeg': return 'image/jpeg'; case '.png': return 'image/png'; case '.webp': return 'image/webp'; case '.heic': case '.heif': return 'image/heic'; case '.mp4': return 'video/mp4'; case '.mov': return 'video/quicktime'; case '.m4v': return 'video/x-m4v'; default: return 'application/octet-stream'; } } function parseExifDateUtc(s) { if (!s) return null; const re = /^(\d{4}):(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})$/; const m = re.exec(s); if (!m) return null; const dt = new Date(Date.UTC(+m[1], +m[2]-1, +m[3], +m[4], +m[5], +m[6])); return dt.toISOString(); } module.exports = { toPosix, sha256, inferMimeFromExt, parseExifDateUtc };