UNPKG

myst-cli

Version:
53 lines (52 loc) 1.93 kB
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; }