41 lines
1 KiB
JavaScript
41 lines
1 KiB
JavaScript
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
|
|
};
|