enigma-bbs/util/exiftool2desc.js

95 lines
2.1 KiB
JavaScript
Executable File

#!/usr/bin/env node
/* jslint node: true */
/* eslint-disable no-console */
'use strict';
// :TODO: Make this it's own sep tool/repo
const exiftool = require('exiftool');
const fs = require('fs');
const moment = require('moment');
const TOOL_VERSION = '1.0.0.0';
// map fileTypes -> handlers
const FILETYPE_HANDLERS = {};
[ 'AIFF', 'APE', 'FLAC', 'OGG', 'MP3' ].forEach(ext => FILETYPE_HANDLERS[ext] = audioFile);
[ 'PDF', 'DOC', 'DOCX', 'DOCM', 'ODB', 'ODC', 'ODF', 'ODG', 'ODI', 'ODP', 'ODS', 'ODT' ].forEach(ext => FILETYPE_HANDLERS[ext] = documentFile);
[ 'PNG', 'JPEG', 'GIF', 'WEBP', 'XCF' ].forEach(ext => FILETYPE_HANDLERS[ext] = imageFile);
function audioFile(metadata) {
let desc = `${metadata.artist||'Unknown Artist'} - ${metadata.title||'Unknown'} (`;
if(metadata.year) {
desc += `${metadata.year}, `;
}
desc += `${metadata.audioBitrate})`;
return desc;
}
function documentFile(metadata) {
let desc = `${metadata.author||'Unknown Author'} - ${metadata.title||'Unknown'}`;
const created = moment(metadata.createdate);
if(created.isValid()) {
desc += ` (${created.format('YYYY')})`;
}
return desc;
}
function imageFile(metadata) {
let desc = `${metadata.fileType} image (`;
if(metadata.animationIterations) {
desc += 'Animated, ';
}
desc += `${metadata.imageSize}px`;
const created = moment(metadata.createdate);
if(created.isValid()) {
desc += `, ${created.format('YYYY')})`;
} else {
desc += ')';
}
return desc;
}
function main() {
const argv = exports.argv = require('minimist')(process.argv.slice(2), {
alias : {
h : 'help',
v : 'version',
}
});
if(argv.version) {
console.info(TOOL_VERSION);
return 0;
}
if(0 === argv._.length || argv.help) {
console.info('usage: exiftool2desc.js [--version] [--help] PATH');
return 0;
}
const path = argv._[0];
fs.readFile(path, (err, data) => {
if(err) {
return -1;
}
exiftool.metadata(data, (err, metadata) => {
if(err) {
return -1;
}
const handler = FILETYPE_HANDLERS[metadata.fileType];
if(!handler) {
return -1;
}
console.info(handler(metadata));
return 0;
});
});
}
return main();