Files
story-studio/remotion/node_modules/@remotion/cli/dist/render-flows/still.js
2026-02-21 10:33:18 +01:00

295 lines
12 KiB
JavaScript

"use strict";
// Prints to CLI and also reports back to browser
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderStillFlow = void 0;
const renderer_1 = require("@remotion/renderer");
const node_fs_1 = require("node:fs");
const node_path_1 = __importDefault(require("node:path"));
const no_react_1 = require("remotion/no-react");
const browser_download_bar_1 = require("../browser-download-bar");
const chalk_1 = require("../chalk");
const cleanup_before_quit_1 = require("../cleanup-before-quit");
const config_1 = require("../config");
const determine_image_format_1 = require("../determine-image-format");
const get_cli_options_1 = require("../get-cli-options");
const get_composition_with_dimension_override_1 = require("../get-composition-with-dimension-override");
const make_link_1 = require("../hyperlinks/make-link");
const log_1 = require("../log");
const make_on_download_1 = require("../make-on-download");
const on_artifact_1 = require("../on-artifact");
const parsed_cli_1 = require("../parsed-cli");
const progress_bar_1 = require("../progress-bar");
const progress_types_1 = require("../progress-types");
const setup_cache_1 = require("../setup-cache");
const should_use_non_overlaying_logger_1 = require("../should-use-non-overlaying-logger");
const truthy_1 = require("../truthy");
const user_passed_output_location_1 = require("../user-passed-output-location");
const add_log_to_aggregate_progress_1 = require("./add-log-to-aggregate-progress");
const renderStillFlow = async ({ remotionRoot, fullEntryPoint, entryPointReason, remainingArgs, browser, browserExecutable, chromiumOptions, envVariables, height, serializedInputPropsWithCustomSchema, overwrite, port, publicDir, puppeteerTimeout, jpegQuality, scale, stillFrame, width, compositionIdFromUi, imageFormatFromUi, logLevel, onProgress, indent, addCleanupCallback, cancelSignal, outputLocationFromUi, offthreadVideoCacheSizeInBytes, binariesDirectory, publicPath, chromeMode, offthreadVideoThreads, audioLatencyHint, mediaCacheSizeInBytes, askAIEnabled, experimentalClientSideRenderingEnabled, keyboardShortcutsEnabled, }) => {
var _a, _b;
const isVerbose = renderer_1.RenderInternals.isEqualOrBelowLogLevel(logLevel, 'verbose');
log_1.Log.verbose({ indent, logLevel }, chalk_1.chalk.gray(`Entry point = ${fullEntryPoint} (${entryPointReason})`));
const aggregate = (0, progress_types_1.initialAggregateRenderProgress)();
const updatesDontOverwrite = (0, should_use_non_overlaying_logger_1.shouldUseNonOverlayingLogger)({ logLevel });
const renderProgress = (0, progress_bar_1.createOverwriteableCliOutput)({
quiet: (0, parsed_cli_1.quietFlagProvided)(),
cancelSignal,
updatesDontOverwrite: (0, should_use_non_overlaying_logger_1.shouldUseNonOverlayingLogger)({ logLevel }),
indent,
});
const updateRenderProgress = ({ newline, printToConsole, }) => {
const { output, progress, message } = (0, progress_bar_1.makeRenderingAndStitchingProgress)({
prog: aggregate,
isUsingParallelEncoding: false,
});
if (printToConsole) {
renderProgress.update(updatesDontOverwrite ? message : output, newline);
}
onProgress({ message, value: progress, ...aggregate });
};
function updateBrowserProgress(progress) {
aggregate.browser = progress;
onProgress({
message: `Downloading ${chromeMode === 'chrome-for-testing' ? 'Chrome for Testing' : 'Headless Shell'} ${Math.round(progress.progress * 100)}%`,
value: 0,
...aggregate,
});
}
const onBrowserDownload = (0, browser_download_bar_1.defaultBrowserDownloadProgress)({
quiet: (0, parsed_cli_1.quietFlagProvided)(),
indent,
logLevel,
onProgress: updateBrowserProgress,
});
await renderer_1.RenderInternals.internalEnsureBrowser({
browserExecutable,
indent,
logLevel,
onBrowserDownload,
chromeMode,
});
const browserInstance = renderer_1.RenderInternals.internalOpenBrowser({
browser,
browserExecutable,
chromiumOptions,
forceDeviceScaleFactor: scale,
indent,
viewport: null,
logLevel,
onBrowserDownload,
chromeMode,
});
const { cleanup: cleanupBundle, urlOrBundle } = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
fullPath: fullEntryPoint,
remotionRoot,
publicDir,
onProgress: ({ copying, bundling }) => {
aggregate.bundling = bundling;
aggregate.copyingState = copying;
updateRenderProgress({
newline: false,
printToConsole: true,
});
},
indentOutput: indent,
logLevel,
onDirectoryCreated: (dir) => {
(0, cleanup_before_quit_1.registerCleanupJob)(`Delete ${dir}`, () => {
renderer_1.RenderInternals.deleteDirectory(dir);
});
},
quietProgress: updatesDontOverwrite,
quietFlag: (0, parsed_cli_1.quietFlagProvided)(),
outDir: null,
// Not needed for still
gitSource: null,
bufferStateDelayInMilliseconds: null,
maxTimelineTracks: null,
publicPath,
audioLatencyHint,
experimentalClientSideRenderingEnabled,
askAIEnabled,
keyboardShortcutsEnabled,
});
const server = await renderer_1.RenderInternals.prepareServer({
offthreadVideoThreads: offthreadVideoThreads !== null && offthreadVideoThreads !== void 0 ? offthreadVideoThreads : renderer_1.RenderInternals.DEFAULT_RENDER_FRAMES_OFFTHREAD_VIDEO_THREADS,
indent,
port,
remotionRoot,
logLevel,
webpackConfigOrServeUrl: urlOrBundle,
offthreadVideoCacheSizeInBytes,
binariesDirectory,
forceIPv4: false,
});
addCleanupCallback(`Close server`, () => server.closeServer(false));
addCleanupCallback(`Cleanup bundle`, () => cleanupBundle());
const puppeteerInstance = await browserInstance;
addCleanupCallback(`Close browser`, () => puppeteerInstance.close({ silent: false }));
const { compositionId, config, reason, argsAfterComposition } = await (0, get_composition_with_dimension_override_1.getCompositionWithDimensionOverride)({
height,
width,
args: remainingArgs,
compositionIdFromUi,
browserExecutable,
chromiumOptions,
envVariables,
indent,
serializedInputPropsWithCustomSchema,
port,
puppeteerInstance,
serveUrlOrWebpackUrl: urlOrBundle,
timeoutInMilliseconds: puppeteerTimeout,
logLevel,
server,
offthreadVideoCacheSizeInBytes,
offthreadVideoThreads,
binariesDirectory,
onBrowserDownload,
chromeMode,
mediaCacheSizeInBytes,
});
const { format: imageFormat, source } = (0, determine_image_format_1.determineFinalStillImageFormat)({
cliFlag: (_a = parsed_cli_1.parsedCli['image-format']) !== null && _a !== void 0 ? _a : null,
configImageFormat: (_b = config_1.ConfigInternals.getUserPreferredStillImageFormat()) !== null && _b !== void 0 ? _b : null,
downloadName: null,
outName: (0, user_passed_output_location_1.getUserPassedOutputLocation)(argsAfterComposition, outputLocationFromUi),
isLambda: false,
fromUi: imageFormatFromUi,
});
const relativeOutputLocation = (0, user_passed_output_location_1.getOutputLocation)({
compositionId,
defaultExtension: imageFormat,
args: argsAfterComposition,
type: 'asset',
outputLocationFromUi,
compositionDefaultOutName: config.defaultOutName,
});
const absoluteOutputLocation = (0, get_cli_options_1.getAndValidateAbsoluteOutputFile)(relativeOutputLocation, overwrite, logLevel);
const exists = (0, node_fs_1.existsSync)(absoluteOutputLocation);
(0, node_fs_1.mkdirSync)(node_path_1.default.join(absoluteOutputLocation, '..'), {
recursive: true,
});
(0, progress_bar_1.printFact)('info')({
indent,
left: 'Composition',
link: 'https://remotion.dev/docs/terminology/composition',
logLevel,
right: [compositionId, isVerbose ? `(${reason})` : null]
.filter(truthy_1.truthy)
.join(' '),
color: 'gray',
});
(0, progress_bar_1.printFact)('info')({
indent,
left: 'Format',
logLevel,
right: [imageFormat, isVerbose ? `(${source})` : null]
.filter(truthy_1.truthy)
.join(' '),
color: 'gray',
});
(0, progress_bar_1.printFact)('info')({
indent,
left: 'Output',
logLevel,
right: relativeOutputLocation,
color: 'gray',
});
const renderStart = Date.now();
aggregate.rendering = {
frames: 0,
doneIn: null,
totalFrames: 1,
timeRemainingInMilliseconds: null,
};
updateRenderProgress({
newline: false,
printToConsole: true,
});
const onDownload = (0, make_on_download_1.makeOnDownload)({
downloads: aggregate.downloads,
indent,
logLevel,
updateRenderProgress,
updatesDontOverwrite,
isUsingParallelEncoding: false,
});
const { onArtifact } = (0, on_artifact_1.handleOnArtifact)({
artifactState: aggregate.artifactState,
compositionId,
onProgress: (progress) => {
aggregate.artifactState = progress;
updateRenderProgress({
newline: false,
printToConsole: true,
});
},
});
await renderer_1.RenderInternals.internalRenderStill({
composition: config,
frame: stillFrame,
output: absoluteOutputLocation,
serveUrl: urlOrBundle,
jpegQuality,
envVariables,
imageFormat,
serializedInputPropsWithCustomSchema,
chromiumOptions,
timeoutInMilliseconds: puppeteerTimeout,
scale,
browserExecutable,
overwrite,
onDownload,
port,
puppeteerInstance,
server,
cancelSignal,
indent,
onBrowserLog: null,
logLevel,
serializedResolvedPropsWithCustomSchema: no_react_1.NoReactInternals.serializeJSONWithSpecialTypes({
indent: undefined,
staticBase: null,
data: config.props,
}).serializedString,
offthreadVideoCacheSizeInBytes,
binariesDirectory,
onBrowserDownload,
onArtifact,
chromeMode,
offthreadVideoThreads,
mediaCacheSizeInBytes,
onLog: ({ logLevel: logLogLevel, previewString, tag }) => {
(0, add_log_to_aggregate_progress_1.addLogToAggregateProgress)({
logs: aggregate.logs,
logLogLevel,
previewString,
tag,
logLevel,
});
updateRenderProgress({
newline: false,
printToConsole: true,
});
},
licenseKey: null,
isProduction: null,
});
aggregate.rendering = {
frames: 1,
doneIn: Date.now() - renderStart,
totalFrames: 1,
timeRemainingInMilliseconds: null,
};
updateRenderProgress({
newline: true,
printToConsole: true,
});
log_1.Log.info({ indent, logLevel }, chalk_1.chalk.blue(`${(exists ? '○' : '+').padEnd(progress_bar_1.LABEL_WIDTH)} ${(0, make_link_1.makeHyperlink)({ url: 'file://' + absoluteOutputLocation, text: relativeOutputLocation, fallback: relativeOutputLocation })}`));
};
exports.renderStillFlow = renderStillFlow;