myst-cli
Version:
Command line tools for MyST
53 lines (52 loc) • 1.93 kB
JavaScript
import fs from 'node:fs';
import path from 'node:path';
import which from 'which';
import { makeExecutable } from 'myst-cli-utils';
import { RuleId } from 'myst-common';
import { addWarningForFile } from './addWarningForFile.js';
function createFfmpegLogger(session) {
const logger = {
debug(data) {
const line = data.trim();
session.log.debug(line);
},
error(data) {
const line = data.trim();
if (!line)
return;
// All ffmpeg logging comes through as errors, convert all to debug
session.log.debug(data);
},
};
return logger;
}
export function isFfmpegAvailable() {
return !!which.sync('ffmpeg', { nothrow: true });
}
export async function convert(inputExtension, outputExtension, session, input, writeFolder) {
if (!fs.existsSync(input))
return null;
const { name, ext } = path.parse(input);
if (ext !== inputExtension)
return null;
const filename = `${name}${outputExtension}`;
const output = path.join(writeFolder, filename);
const inputFormatUpper = inputExtension.slice(1).toUpperCase();
const outputFormat = outputExtension.slice(1);
if (fs.existsSync(output)) {
session.log.debug(`Cached file found for converted ${inputFormatUpper}: ${input}`);
}
else {
const ffmpegCommand = `ffmpeg -i ${input} -crf 18 -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" ${output}`;
session.log.debug(`Executing: ${ffmpegCommand}`);
const exec = makeExecutable(ffmpegCommand, createFfmpegLogger(session));
try {
await exec();
}
catch (err) {
addWarningForFile(session, input, `Could not convert from ${inputFormatUpper} to ${outputFormat.toUpperCase()} - ${err}`, 'error', { ruleId: RuleId.imageFormatConverts });
return null;
}
}
return filename;
}