@remotion/cli 3.2.30 → 3.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.d.ts +1 -0
- package/dist/bundle.js +32 -0
- package/dist/config/bundle-out-dir.d.ts +2 -0
- package/dist/config/bundle-out-dir.js +12 -0
- package/dist/config/crf.d.ts +1 -2
- package/dist/config/crf.js +1 -9
- package/dist/config/get-public-path.d.ts +2 -0
- package/dist/config/get-public-path.js +12 -0
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.js +8 -4
- package/dist/editor/components/Button.d.ts +4 -0
- package/dist/editor/components/Button.js +24 -0
- package/dist/editor/components/PreviewZoomControls.d.ts +2 -0
- package/dist/editor/components/PreviewZoomControls.js +49 -0
- package/dist/editor/helpers/normalize-wheel.d.ts +5 -0
- package/dist/editor/helpers/normalize-wheel.js +20 -0
- package/dist/get-cli-options.d.ts +3 -1
- package/dist/get-cli-options.js +13 -9
- package/dist/get-final-output-codec.js +3 -0
- package/dist/get-network-address.d.ts +1 -0
- package/dist/get-network-address.js +16 -0
- package/dist/get-render-media-options.js +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/list-of-remotion-packages.js +2 -0
- package/dist/parse-command-line.js +6 -0
- package/dist/prepare-entry-point.d.ts +12 -0
- package/dist/prepare-entry-point.js +37 -0
- package/dist/preview-server/dev-middleware/setup-hooks.js +15 -4
- package/dist/preview-server/hot-middleware/index.js +1 -2
- package/dist/preview.js +9 -1
- package/dist/print-help.js +2 -0
- package/dist/validate-image-format.js +1 -1
- package/dist/webpack-cache.d.ts +12 -0
- package/dist/webpack-cache.js +66 -0
- package/package.json +8 -8
package/dist/bundle.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const bundleCommand: (remotionRoot: string) => Promise<void>;
|
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bundleCommand = void 0;
|
|
4
|
+
const get_cli_options_1 = require("./get-cli-options");
|
|
5
|
+
const initialize_render_cli_1 = require("./initialize-render-cli");
|
|
6
|
+
const log_1 = require("./log");
|
|
7
|
+
const parse_command_line_1 = require("./parse-command-line");
|
|
8
|
+
const prepare_entry_point_1 = require("./prepare-entry-point");
|
|
9
|
+
const bundleCommand = async (remotionRoot) => {
|
|
10
|
+
const file = parse_command_line_1.parsedCli._[1];
|
|
11
|
+
if (!file) {
|
|
12
|
+
log_1.Log.error('No entry point specified. Pass more arguments:');
|
|
13
|
+
log_1.Log.error(' npx remotion bundle [entry-point]');
|
|
14
|
+
log_1.Log.error('Documentation: https://www.remotion.dev/docs/cli/bundle');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
await (0, initialize_render_cli_1.initializeRenderCli)(remotionRoot, 'bundle');
|
|
18
|
+
const { publicPath, bundleOutDir } = await (0, get_cli_options_1.getCliOptions)({
|
|
19
|
+
isLambda: false,
|
|
20
|
+
type: 'get-compositions-or-bundle',
|
|
21
|
+
});
|
|
22
|
+
const { urlOrBundle } = await (0, prepare_entry_point_1.prepareEntryPoint)({
|
|
23
|
+
file,
|
|
24
|
+
otherSteps: [],
|
|
25
|
+
outDir: bundleOutDir,
|
|
26
|
+
publicPath,
|
|
27
|
+
remotionRoot,
|
|
28
|
+
});
|
|
29
|
+
log_1.Log.info();
|
|
30
|
+
log_1.Log.info(urlOrBundle);
|
|
31
|
+
};
|
|
32
|
+
exports.bundleCommand = bundleCommand;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setBundleDir = exports.getBundleOutDir = void 0;
|
|
4
|
+
let bundleOutDir = null;
|
|
5
|
+
const getBundleOutDir = () => {
|
|
6
|
+
return bundleOutDir;
|
|
7
|
+
};
|
|
8
|
+
exports.getBundleOutDir = getBundleOutDir;
|
|
9
|
+
const setBundleDir = (path) => {
|
|
10
|
+
bundleOutDir = path;
|
|
11
|
+
};
|
|
12
|
+
exports.setBundleDir = setBundleDir;
|
package/dist/config/crf.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Crf } from '@remotion/renderer';
|
|
2
2
|
export declare const setCrf: (newCrf: Crf) => void;
|
|
3
3
|
export declare const getCrfOrUndefined: () => Crf;
|
|
4
|
-
export declare const getActualCrf: (codec: Codec) => number;
|
package/dist/config/crf.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const renderer_1 = require("@remotion/renderer");
|
|
3
|
+
exports.getCrfOrUndefined = exports.setCrf = void 0;
|
|
5
4
|
let currentCrf;
|
|
6
5
|
const setCrf = (newCrf) => {
|
|
7
6
|
if (typeof newCrf !== 'number' && newCrf !== undefined) {
|
|
@@ -14,10 +13,3 @@ const getCrfOrUndefined = () => {
|
|
|
14
13
|
return currentCrf;
|
|
15
14
|
};
|
|
16
15
|
exports.getCrfOrUndefined = getCrfOrUndefined;
|
|
17
|
-
const getActualCrf = (codec) => {
|
|
18
|
-
var _a;
|
|
19
|
-
const crf = (_a = (0, exports.getCrfOrUndefined)()) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.getDefaultCrfForCodec(codec);
|
|
20
|
-
renderer_1.RenderInternals.validateSelectedCrfAndCodecCombination(crf, codec);
|
|
21
|
-
return crf;
|
|
22
|
-
};
|
|
23
|
-
exports.getActualCrf = getActualCrf;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setPublicPath = exports.getPublicPath = void 0;
|
|
4
|
+
let publicPath = null;
|
|
5
|
+
const getPublicPath = () => {
|
|
6
|
+
return publicPath;
|
|
7
|
+
};
|
|
8
|
+
exports.getPublicPath = getPublicPath;
|
|
9
|
+
const setPublicPath = (path) => {
|
|
10
|
+
publicPath = path;
|
|
11
|
+
};
|
|
12
|
+
exports.setPublicPath = setPublicPath;
|
package/dist/config/index.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export declare const ConfigInternals: {
|
|
|
10
10
|
getOutputCodecOrUndefined: () => import("@remotion/renderer").CodecOrUndefined;
|
|
11
11
|
getCustomFfmpegExecutable: () => import("@remotion/renderer").FfmpegExecutable;
|
|
12
12
|
getBrowser: () => import("@remotion/renderer").Browser | null;
|
|
13
|
-
getActualCrf: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
|
|
14
13
|
getPixelFormat: () => "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
15
14
|
getProResProfile: () => "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
|
|
16
15
|
getShouldOverwrite: ({ defaultValue, }: {
|
|
@@ -48,5 +47,8 @@ export declare const ConfigInternals: {
|
|
|
48
47
|
getKeyboardShortcutsEnabled: () => boolean;
|
|
49
48
|
getPublicDir: () => string | null;
|
|
50
49
|
getFfmpegOverrideFunction: () => import("@remotion/renderer").FfmpegOverrideFn;
|
|
50
|
+
getAudioBitrate: () => string | null;
|
|
51
|
+
getVideoBitrate: () => string | null;
|
|
52
|
+
getCrfOrUndefined: () => import("@remotion/renderer").Crf;
|
|
51
53
|
};
|
|
52
54
|
export declare const overrideRemotion: () => void;
|
package/dist/config/index.js
CHANGED
|
@@ -31,7 +31,6 @@ const browser_executable_1 = require("./browser-executable");
|
|
|
31
31
|
const chromium_flags_1 = require("./chromium-flags");
|
|
32
32
|
const codec_1 = require("./codec");
|
|
33
33
|
const concurrency_1 = require("./concurrency");
|
|
34
|
-
const crf_1 = require("./crf");
|
|
35
34
|
const env_file_1 = require("./env-file");
|
|
36
35
|
const every_nth_frame_1 = require("./every-nth-frame");
|
|
37
36
|
const ffmpeg_executable_1 = require("./ffmpeg-executable");
|
|
@@ -52,11 +51,12 @@ const scale_1 = require("./scale");
|
|
|
52
51
|
const still_frame_1 = require("./still-frame");
|
|
53
52
|
const timeout_1 = require("./timeout");
|
|
54
53
|
const webpack_caching_1 = require("./webpack-caching");
|
|
54
|
+
const bitrate_1 = require("./bitrate");
|
|
55
55
|
const browser_executable_2 = require("./browser-executable");
|
|
56
56
|
const chromium_flags_2 = require("./chromium-flags");
|
|
57
57
|
const codec_2 = require("./codec");
|
|
58
58
|
const concurrency_2 = require("./concurrency");
|
|
59
|
-
const
|
|
59
|
+
const crf_1 = require("./crf");
|
|
60
60
|
const enforce_audio_track_1 = require("./enforce-audio-track");
|
|
61
61
|
const env_file_2 = require("./env-file");
|
|
62
62
|
const every_nth_frame_2 = require("./every-nth-frame");
|
|
@@ -123,9 +123,11 @@ exports.Config = {
|
|
|
123
123
|
setPixelFormat: pixel_format_2.setPixelFormat,
|
|
124
124
|
setOutputFormat: codec_2.setOutputFormat,
|
|
125
125
|
setCodec: codec_2.setCodec,
|
|
126
|
-
setCrf:
|
|
126
|
+
setCrf: crf_1.setCrf,
|
|
127
127
|
setImageSequence: image_sequence_2.setImageSequence,
|
|
128
128
|
setProResProfile: prores_profile_2.setProResProfile,
|
|
129
|
+
setAudioBitrate: bitrate_1.setAudioBitrate,
|
|
130
|
+
setVideoBitrate: bitrate_1.setVideoBitrate,
|
|
129
131
|
overrideFfmpegCommand: ffmpeg_override_1.setFfmpegOverrideFunction,
|
|
130
132
|
},
|
|
131
133
|
};
|
|
@@ -135,7 +137,6 @@ exports.ConfigInternals = {
|
|
|
135
137
|
getOutputCodecOrUndefined: codec_1.getOutputCodecOrUndefined,
|
|
136
138
|
getCustomFfmpegExecutable: ffmpeg_executable_1.getCustomFfmpegExecutable,
|
|
137
139
|
getBrowser: browser_1.getBrowser,
|
|
138
|
-
getActualCrf: crf_1.getActualCrf,
|
|
139
140
|
getPixelFormat: pixel_format_1.getPixelFormat,
|
|
140
141
|
getProResProfile: prores_profile_1.getProResProfile,
|
|
141
142
|
getShouldOverwrite: overwrite_1.getShouldOverwrite,
|
|
@@ -171,6 +172,9 @@ exports.ConfigInternals = {
|
|
|
171
172
|
getKeyboardShortcutsEnabled: keyboard_shortcuts_1.getKeyboardShortcutsEnabled,
|
|
172
173
|
getPublicDir: public_dir_1.getPublicDir,
|
|
173
174
|
getFfmpegOverrideFunction: ffmpeg_override_1.getFfmpegOverrideFunction,
|
|
175
|
+
getAudioBitrate: bitrate_1.getAudioBitrate,
|
|
176
|
+
getVideoBitrate: bitrate_1.getVideoBitrate,
|
|
177
|
+
getCrfOrUndefined: crf_1.getCrfOrUndefined,
|
|
174
178
|
};
|
|
175
179
|
const overrideRemotion = () => {
|
|
176
180
|
Object.assign(remotion_1.Config, exports.Config);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Button = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const colors_1 = require("../helpers/colors");
|
|
6
|
+
const layout_1 = require("./layout");
|
|
7
|
+
const container = {
|
|
8
|
+
padding: 10,
|
|
9
|
+
cursor: 'pointer',
|
|
10
|
+
fontSize: 14,
|
|
11
|
+
};
|
|
12
|
+
const button = {
|
|
13
|
+
border: `1px solid ${colors_1.INPUT_BORDER_COLOR_UNHOVERED}`,
|
|
14
|
+
borderRadius: 4,
|
|
15
|
+
backgroundColor: colors_1.INPUT_BACKGROUND,
|
|
16
|
+
appearance: 'none',
|
|
17
|
+
fontFamily: 'inherit',
|
|
18
|
+
fontSize: 14,
|
|
19
|
+
color: 'white',
|
|
20
|
+
};
|
|
21
|
+
const Button = ({ children, ...props }) => {
|
|
22
|
+
return ((0, jsx_runtime_1.jsx)("button", { ...props, style: button, type: "button", children: (0, jsx_runtime_1.jsx)(layout_1.Row, { style: container, children: children }) }));
|
|
23
|
+
};
|
|
24
|
+
exports.Button = Button;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PreviewZoomControls = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const minus_1 = require("../icons/minus");
|
|
7
|
+
const plus_1 = require("../icons/plus");
|
|
8
|
+
const preview_size_1 = require("../state/preview-size");
|
|
9
|
+
const ControlButton_1 = require("./ControlButton");
|
|
10
|
+
const layout_1 = require("./layout");
|
|
11
|
+
const container = {
|
|
12
|
+
color: 'black',
|
|
13
|
+
flexDirection: 'row',
|
|
14
|
+
display: 'flex',
|
|
15
|
+
};
|
|
16
|
+
const buttonStyle = {
|
|
17
|
+
fontSize: 24,
|
|
18
|
+
};
|
|
19
|
+
const iconStyle = {
|
|
20
|
+
color: 'white',
|
|
21
|
+
width: 14,
|
|
22
|
+
};
|
|
23
|
+
const PreviewZoomControls = () => {
|
|
24
|
+
const { size, setSize } = (0, react_1.useContext)(preview_size_1.PreviewSizeContext);
|
|
25
|
+
const onZoomOutClicked = (0, react_1.useCallback)(() => {
|
|
26
|
+
setSize((z) => {
|
|
27
|
+
// TODO: Don't assume 1
|
|
28
|
+
const newSize = Number((z.size === 'auto' ? 1 : z.size - preview_size_1.ZOOM_BUTTON_STEP).toFixed(2));
|
|
29
|
+
return { ...z, size: Math.max(preview_size_1.PREVIEW_MIN_ZOOM, newSize) };
|
|
30
|
+
});
|
|
31
|
+
}, [setSize]);
|
|
32
|
+
const onZoomInClicked = (0, react_1.useCallback)(() => {
|
|
33
|
+
setSize((z) => {
|
|
34
|
+
// TODO: Don't assume 1
|
|
35
|
+
if (z.size === 'auto')
|
|
36
|
+
return {
|
|
37
|
+
size: 1 + preview_size_1.ZOOM_BUTTON_STEP,
|
|
38
|
+
translation: {
|
|
39
|
+
x: 0,
|
|
40
|
+
y: 0,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const newSize = Number((Number(z) + preview_size_1.ZOOM_BUTTON_STEP).toFixed(2));
|
|
44
|
+
return { ...z, size: Math.min(preview_size_1.PREVIEW_MAX_ZOOM, newSize) };
|
|
45
|
+
});
|
|
46
|
+
}, [setSize]);
|
|
47
|
+
return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(ControlButton_1.ControlButton, { onClick: onZoomOutClicked, style: buttonStyle, title: "Zoom out preview", role: 'ControlButton', type: "button", disabled: size.size !== 'auto' && preview_size_1.PREVIEW_MIN_ZOOM === size.size, children: (0, jsx_runtime_1.jsx)(minus_1.Minus, { style: iconStyle }) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(ControlButton_1.ControlButton, { onClick: onZoomInClicked, style: buttonStyle, title: "Zoom in preview", role: 'button', type: "button", disabled: size.size !== 'auto' && preview_size_1.PREVIEW_MAX_ZOOM === size.size, children: (0, jsx_runtime_1.jsx)(plus_1.Plus, { style: iconStyle }) })] }));
|
|
48
|
+
};
|
|
49
|
+
exports.PreviewZoomControls = PreviewZoomControls;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeWheel = void 0;
|
|
4
|
+
// Taken from https://github.com/tldraw/tldraw/blob/254dfdfd77c4abde53240f7d8ca3558e08688493/packages/core/src/hooks/useZoomEvents.ts which is adapted from https://stackoverflow.com/a/13650579
|
|
5
|
+
const MAX_ZOOM_STEP = 10;
|
|
6
|
+
function normalizeWheel(event) {
|
|
7
|
+
const { deltaY, deltaX } = event;
|
|
8
|
+
let deltaZ = 0;
|
|
9
|
+
if (event.ctrlKey || event.metaKey) {
|
|
10
|
+
const signY = Math.sign(event.deltaY);
|
|
11
|
+
const absDeltaY = Math.abs(event.deltaY);
|
|
12
|
+
let dy = deltaY;
|
|
13
|
+
if (absDeltaY > MAX_ZOOM_STEP) {
|
|
14
|
+
dy = MAX_ZOOM_STEP * signY;
|
|
15
|
+
}
|
|
16
|
+
deltaZ = dy;
|
|
17
|
+
}
|
|
18
|
+
return { deltaX, deltaY, deltaZ };
|
|
19
|
+
}
|
|
20
|
+
exports.normalizeWheel = normalizeWheel;
|
|
@@ -21,7 +21,7 @@ export declare const getCliOptions: (options: {
|
|
|
21
21
|
envVariables: Record<string, string>;
|
|
22
22
|
quality: number | undefined;
|
|
23
23
|
browser: import("@remotion/renderer").Browser;
|
|
24
|
-
crf:
|
|
24
|
+
crf: import("@remotion/renderer").Crf | null;
|
|
25
25
|
pixelFormat: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
26
26
|
imageFormat: "png" | "jpeg" | "none";
|
|
27
27
|
proResProfile: "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
|
|
@@ -40,4 +40,6 @@ export declare const getCliOptions: (options: {
|
|
|
40
40
|
enforceAudioTrack: boolean;
|
|
41
41
|
publicDir: string | null;
|
|
42
42
|
ffmpegOverride: import("@remotion/renderer").FfmpegOverrideFn;
|
|
43
|
+
audioBitrate: string | null;
|
|
44
|
+
videoBitrate: string | null;
|
|
43
45
|
}>;
|
package/dist/get-cli-options.js
CHANGED
|
@@ -80,13 +80,10 @@ const getAndValidateShouldOutputImageSequence = async ({ frameRange, isLambda, }
|
|
|
80
80
|
}
|
|
81
81
|
return shouldOutputImageSequence;
|
|
82
82
|
};
|
|
83
|
-
const
|
|
83
|
+
const getCrf = (shouldOutputImageSequence) => {
|
|
84
84
|
const crf = shouldOutputImageSequence
|
|
85
85
|
? null
|
|
86
|
-
: config_1.ConfigInternals.
|
|
87
|
-
if (crf !== null) {
|
|
88
|
-
renderer_1.RenderInternals.validateSelectedCrfAndCodecCombination(crf, codec);
|
|
89
|
-
}
|
|
86
|
+
: config_1.ConfigInternals.getCrfOrUndefined();
|
|
90
87
|
return crf;
|
|
91
88
|
};
|
|
92
89
|
const getAndValidatePixelFormat = (codec) => {
|
|
@@ -94,9 +91,8 @@ const getAndValidatePixelFormat = (codec) => {
|
|
|
94
91
|
renderer_1.RenderInternals.validateSelectedPixelFormatAndCodecCombination(pixelFormat, codec);
|
|
95
92
|
return pixelFormat;
|
|
96
93
|
};
|
|
97
|
-
const
|
|
94
|
+
const getProResProfile = () => {
|
|
98
95
|
const proResProfile = config_1.ConfigInternals.getProResProfile();
|
|
99
|
-
renderer_1.RenderInternals.validateSelectedCodecAndProResCombination(actualCodec, proResProfile);
|
|
100
96
|
return proResProfile;
|
|
101
97
|
};
|
|
102
98
|
const getAndValidateImageFormat = ({ shouldOutputImageSequence, codec, pixelFormat, }) => {
|
|
@@ -128,14 +124,20 @@ const getCliOptions = async (options) => {
|
|
|
128
124
|
const overwrite = config_1.ConfigInternals.getShouldOverwrite({
|
|
129
125
|
defaultValue: !options.isLambda,
|
|
130
126
|
});
|
|
131
|
-
const crf =
|
|
127
|
+
const crf = getCrf(shouldOutputImageSequence);
|
|
128
|
+
const videoBitrate = config_1.ConfigInternals.getVideoBitrate();
|
|
129
|
+
renderer_1.RenderInternals.validateQualitySettings({
|
|
130
|
+
crf,
|
|
131
|
+
codec: options.codec,
|
|
132
|
+
videoBitrate,
|
|
133
|
+
});
|
|
132
134
|
const pixelFormat = getAndValidatePixelFormat(options.codec);
|
|
133
135
|
const imageFormat = getAndValidateImageFormat({
|
|
134
136
|
shouldOutputImageSequence,
|
|
135
137
|
codec: options.codec,
|
|
136
138
|
pixelFormat,
|
|
137
139
|
});
|
|
138
|
-
const proResProfile =
|
|
140
|
+
const proResProfile = getProResProfile();
|
|
139
141
|
const browserExecutable = config_1.ConfigInternals.getBrowserExecutable();
|
|
140
142
|
const ffmpegExecutable = config_1.ConfigInternals.getCustomFfmpegExecutable();
|
|
141
143
|
const ffprobeExecutable = config_1.ConfigInternals.getCustomFfprobeExecutable();
|
|
@@ -179,6 +181,8 @@ const getCliOptions = async (options) => {
|
|
|
179
181
|
enforceAudioTrack: config_1.ConfigInternals.getEnforceAudioTrack(),
|
|
180
182
|
publicDir: config_1.ConfigInternals.getPublicDir(),
|
|
181
183
|
ffmpegOverride: config_1.ConfigInternals.getFfmpegOverrideFunction(),
|
|
184
|
+
audioBitrate: config_1.ConfigInternals.getAudioBitrate(),
|
|
185
|
+
videoBitrate,
|
|
182
186
|
};
|
|
183
187
|
};
|
|
184
188
|
exports.getCliOptions = getCliOptions;
|
|
@@ -44,6 +44,9 @@ const getFinalOutputCodec = ({ cliFlag, configFile, downloadName, outName, }) =>
|
|
|
44
44
|
if (cliFlag && derivedOutNameCodec !== cliFlag) {
|
|
45
45
|
throw new TypeError(`The out name is ${outName} but --codec=${cliFlag} was passed. The out name implies a codec of ${derivedOutNameCodec} which does not align with the --codec flag.`);
|
|
46
46
|
}
|
|
47
|
+
if (configFile && derivedOutNameCodec !== configFile) {
|
|
48
|
+
throw new TypeError(`The out name is ${outName} but ${configFile} was set as the codec in the config file. The out name implies a codec of ${derivedOutNameCodec} which does not align with the codec set in the config file.`);
|
|
49
|
+
}
|
|
47
50
|
return {
|
|
48
51
|
codec: derivedOutNameCodec,
|
|
49
52
|
reason: 'derived from out name',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getNetworkAddress: () => string | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getNetworkAddress = void 0;
|
|
4
|
+
const os_1 = require("os");
|
|
5
|
+
const getNetworkAddress = () => {
|
|
6
|
+
for (const interfaceDetails of Object.values((0, os_1.networkInterfaces)())) {
|
|
7
|
+
if (!interfaceDetails)
|
|
8
|
+
continue;
|
|
9
|
+
for (const details of interfaceDetails) {
|
|
10
|
+
const { address, family, internal } = details;
|
|
11
|
+
if (family === 'IPv4' && !internal)
|
|
12
|
+
return address;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
exports.getNetworkAddress = getNetworkAddress;
|
|
@@ -5,7 +5,7 @@ const renderer_1 = require("@remotion/renderer");
|
|
|
5
5
|
const config_1 = require("./config");
|
|
6
6
|
const get_cli_options_1 = require("./get-cli-options");
|
|
7
7
|
const getRenderMediaOptions = async ({ outputLocation, config, serveUrl, codec, }) => {
|
|
8
|
-
const { proResProfile, concurrency, frameRange, overwrite, inputProps, envVariables, quality, crf, pixelFormat, imageFormat, browserExecutable, ffmpegExecutable, ffprobeExecutable, scale, chromiumOptions, port, numberOfGifLoops, everyNthFrame, muted, enforceAudioTrack, ffmpegOverride, } = await (0, get_cli_options_1.getCliOptions)({
|
|
8
|
+
const { proResProfile, concurrency, frameRange, overwrite, inputProps, envVariables, quality, crf, pixelFormat, imageFormat, browserExecutable, ffmpegExecutable, ffprobeExecutable, scale, chromiumOptions, port, numberOfGifLoops, everyNthFrame, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, } = await (0, get_cli_options_1.getCliOptions)({
|
|
9
9
|
isLambda: false,
|
|
10
10
|
type: 'series',
|
|
11
11
|
codec,
|
|
@@ -39,6 +39,8 @@ const getRenderMediaOptions = async ({ outputLocation, config, serveUrl, codec,
|
|
|
39
39
|
concurrency,
|
|
40
40
|
serveUrl,
|
|
41
41
|
codec,
|
|
42
|
+
audioBitrate,
|
|
43
|
+
videoBitrate,
|
|
42
44
|
};
|
|
43
45
|
};
|
|
44
46
|
exports.getRenderMediaOptions = getRenderMediaOptions;
|
package/dist/index.d.ts
CHANGED
|
@@ -80,7 +80,7 @@ export declare const CliInternals: {
|
|
|
80
80
|
envVariables: Record<string, string>;
|
|
81
81
|
quality: number | undefined;
|
|
82
82
|
browser: import("@remotion/renderer").Browser;
|
|
83
|
-
crf:
|
|
83
|
+
crf: import("@remotion/renderer").Crf | null;
|
|
84
84
|
pixelFormat: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
85
85
|
imageFormat: "png" | "jpeg" | "none";
|
|
86
86
|
proResProfile: "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
|
|
@@ -99,6 +99,8 @@ export declare const CliInternals: {
|
|
|
99
99
|
enforceAudioTrack: boolean;
|
|
100
100
|
publicDir: string | null;
|
|
101
101
|
ffmpegOverride: import("@remotion/renderer").FfmpegOverrideFn;
|
|
102
|
+
audioBitrate: string | null;
|
|
103
|
+
videoBitrate: string | null;
|
|
102
104
|
}>;
|
|
103
105
|
parseCommandLine: () => void;
|
|
104
106
|
loadConfig: (remotionRoot: string) => Promise<string | null>;
|
|
@@ -130,6 +130,12 @@ const parseCommandLine = () => {
|
|
|
130
130
|
if (typeof exports.parsedCli['public-dir'] !== 'undefined') {
|
|
131
131
|
config_1.Config.Bundling.setPublicDir(exports.parsedCli['public-dir']);
|
|
132
132
|
}
|
|
133
|
+
if (typeof exports.parsedCli['audio-bitrate'] !== 'undefined') {
|
|
134
|
+
config_1.Config.Output.setAudioBitrate(exports.parsedCli['audio-bitrate']);
|
|
135
|
+
}
|
|
136
|
+
if (typeof exports.parsedCli['video-bitrate'] !== 'undefined') {
|
|
137
|
+
config_1.Config.Output.setVideoBitrate(exports.parsedCli['video-bitrate']);
|
|
138
|
+
}
|
|
133
139
|
};
|
|
134
140
|
exports.parseCommandLine = parseCommandLine;
|
|
135
141
|
const quietFlagProvided = () => exports.parsedCli.quiet || exports.parsedCli.q;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RenderStep } from './step';
|
|
2
|
+
export declare const prepareEntryPoint: ({ file, otherSteps, publicPath, outDir, remotionRoot, }: {
|
|
3
|
+
file: string;
|
|
4
|
+
otherSteps: RenderStep[];
|
|
5
|
+
outDir: string | null;
|
|
6
|
+
publicPath: string | null;
|
|
7
|
+
remotionRoot: string;
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
urlOrBundle: string;
|
|
10
|
+
steps: RenderStep[];
|
|
11
|
+
shouldDelete: boolean;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.prepareEntryPoint = void 0;
|
|
7
|
+
const renderer_1 = require("@remotion/renderer");
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const process_1 = require("process");
|
|
11
|
+
const log_1 = require("./log");
|
|
12
|
+
const setup_cache_1 = require("./setup-cache");
|
|
13
|
+
const prepareEntryPoint = async ({ file, otherSteps, publicPath, outDir, remotionRoot, }) => {
|
|
14
|
+
if (renderer_1.RenderInternals.isServeUrl(file)) {
|
|
15
|
+
return { urlOrBundle: file, steps: otherSteps, shouldDelete: false };
|
|
16
|
+
}
|
|
17
|
+
const joined = path_1.default.resolve(process.cwd(), file);
|
|
18
|
+
try {
|
|
19
|
+
const stats = await (0, promises_1.stat)(joined);
|
|
20
|
+
if (stats.isDirectory()) {
|
|
21
|
+
return { urlOrBundle: joined, steps: otherSteps, shouldDelete: false };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
log_1.Log.error(`No file or directory exists at ${joined}.`);
|
|
26
|
+
(0, process_1.exit)(1);
|
|
27
|
+
}
|
|
28
|
+
const urlOrBundle = await (0, setup_cache_1.bundleOnCliOrTakeServeUrl)({
|
|
29
|
+
fullPath: joined,
|
|
30
|
+
steps: ['bundling', ...otherSteps],
|
|
31
|
+
outDir,
|
|
32
|
+
publicPath,
|
|
33
|
+
remotionRoot,
|
|
34
|
+
});
|
|
35
|
+
return { urlOrBundle, steps: ['bundling', ...otherSteps], shouldDelete: true };
|
|
36
|
+
};
|
|
37
|
+
exports.prepareEntryPoint = prepareEntryPoint;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setupHooks = void 0;
|
|
4
4
|
const log_1 = require("../../log");
|
|
5
|
+
const truthy_1 = require("../../truthy");
|
|
5
6
|
const is_color_supported_1 = require("./is-color-supported");
|
|
6
7
|
function setupHooks(context) {
|
|
7
8
|
function invalid() {
|
|
@@ -21,13 +22,23 @@ function setupHooks(context) {
|
|
|
21
22
|
}
|
|
22
23
|
logger.log('Compilation finished');
|
|
23
24
|
const statsOptions = {
|
|
24
|
-
preset: '
|
|
25
|
+
preset: 'errors-warnings',
|
|
25
26
|
colors: is_color_supported_1.isColorSupported,
|
|
26
27
|
};
|
|
27
28
|
const printedStats = stats.toString(statsOptions);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const lines = printedStats
|
|
30
|
+
.split('\n')
|
|
31
|
+
.map((a) => a.trimEnd())
|
|
32
|
+
.filter(truthy_1.truthy)
|
|
33
|
+
.map((a) => {
|
|
34
|
+
if (a.startsWith('webpack compiled')) {
|
|
35
|
+
return `Built in ${stats.endTime - stats.startTime}ms`;
|
|
36
|
+
}
|
|
37
|
+
return a;
|
|
38
|
+
})
|
|
39
|
+
.join('\n');
|
|
40
|
+
if (lines) {
|
|
41
|
+
log_1.Log.info(lines);
|
|
31
42
|
}
|
|
32
43
|
context.callbacks = [];
|
|
33
44
|
callbacks.forEach((callback) => {
|
|
@@ -24,7 +24,7 @@ const webpackHotMiddleware = (compiler) => {
|
|
|
24
24
|
compiler.hooks.done.tap('remotion', onDone);
|
|
25
25
|
function onInvalid() {
|
|
26
26
|
latestStats = null;
|
|
27
|
-
log_1.Log.info('
|
|
27
|
+
log_1.Log.info('Building...');
|
|
28
28
|
eventStream === null || eventStream === void 0 ? void 0 : eventStream.publish({
|
|
29
29
|
action: 'building',
|
|
30
30
|
});
|
|
@@ -114,7 +114,6 @@ function publishStats(action, statsResult, eventStream) {
|
|
|
114
114
|
if (bundles.length === 1 && !name && statsResult.compilation) {
|
|
115
115
|
name = statsResult.compilation.name || '';
|
|
116
116
|
}
|
|
117
|
-
log_1.Log.info(`webpack built in ${_stats.time}ms`);
|
|
118
117
|
eventStream === null || eventStream === void 0 ? void 0 : eventStream.publish({
|
|
119
118
|
name,
|
|
120
119
|
action,
|
package/dist/preview.js
CHANGED
|
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.previewCommand = void 0;
|
|
7
7
|
const better_opn_1 = __importDefault(require("better-opn"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const chalk_1 = require("./chalk");
|
|
9
10
|
const config_1 = require("./config");
|
|
10
11
|
const get_env_1 = require("./get-env");
|
|
11
12
|
const get_input_props_1 = require("./get-input-props");
|
|
13
|
+
const get_network_address_1 = require("./get-network-address");
|
|
12
14
|
const log_1 = require("./log");
|
|
13
15
|
const parse_command_line_1 = require("./parse-command-line");
|
|
14
16
|
const start_server_1 = require("./preview-server/start-server");
|
|
@@ -68,7 +70,13 @@ const previewCommand = async (remotionRoot) => {
|
|
|
68
70
|
webpackOverride: config_1.ConfigInternals.getWebpackOverrideFn(),
|
|
69
71
|
});
|
|
70
72
|
setLiveEventsListener(liveEventsServer);
|
|
71
|
-
|
|
73
|
+
const networkAddress = (0, get_network_address_1.getNetworkAddress)();
|
|
74
|
+
if (networkAddress) {
|
|
75
|
+
log_1.Log.info(`Server ready - Local: ${chalk_1.chalk.underline(`http://localhost:${port}`)}, Network: ${chalk_1.chalk.underline(`http://${networkAddress}:${port}`)}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
log_1.Log.info(`Running on http://localhost:${port}`);
|
|
79
|
+
}
|
|
72
80
|
(0, better_opn_1.default)(`http://localhost:${port}`);
|
|
73
81
|
await new Promise(noop);
|
|
74
82
|
};
|
package/dist/print-help.js
CHANGED
|
@@ -31,6 +31,8 @@ const printHelp = () => {
|
|
|
31
31
|
['--overwrite', 'Overwrite if file exists, default true'],
|
|
32
32
|
['--sequence', 'Output as an image sequence'],
|
|
33
33
|
['--codec', 'Video of audio codec'],
|
|
34
|
+
['--audio-bitrate', 'Customize the output audio bitrate'],
|
|
35
|
+
['--video-bitrate', 'Customize the output video bitrate'],
|
|
34
36
|
['--crf', 'FFMPEG CRF value, controls quality, see docs for info'],
|
|
35
37
|
['--browser-executable', 'Custom path for browser executable'],
|
|
36
38
|
['--frames', 'Render a portion or a still of a video'],
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validateImageFormat = void 0;
|
|
4
4
|
const log_1 = require("./log");
|
|
5
5
|
const validateImageFormat = (imageFormat, outName) => {
|
|
6
|
-
if (imageFormat === 'png' &&
|
|
6
|
+
if (imageFormat === 'png' && (outName === null || outName === void 0 ? void 0 : outName.endsWith('.png'))) {
|
|
7
7
|
log_1.Log.warn(`Rendering a PNG, expected a .png extension but got ${outName}`);
|
|
8
8
|
}
|
|
9
9
|
if (imageFormat === 'jpeg' &&
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare type Environment = 'development' | 'production';
|
|
2
|
+
declare global {
|
|
3
|
+
namespace NodeJS {
|
|
4
|
+
interface ProcessVersions {
|
|
5
|
+
pnp?: string;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare const clearCache: (environment: Environment, inputProps: object | null) => Promise<void>;
|
|
10
|
+
export declare const getWebpackCacheName: (environment: Environment, inputProps: object | null) => string;
|
|
11
|
+
export declare const cacheExists: (environment: Environment, inputProps: object | null) => boolean;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cacheExists = exports.getWebpackCacheName = exports.clearCache = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const remotion_1 = require("remotion");
|
|
10
|
+
// Inlined from https://github.com/webpack/webpack/blob/4c2ee7a4ddb8db2362ca83b6c4190523387ba7ee/lib/config/defaults.js#L265
|
|
11
|
+
// An algorithm to determine where Webpack will cache the depencies
|
|
12
|
+
const getWebpackCacheDir = () => {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
let dir = cwd;
|
|
15
|
+
for (;;) {
|
|
16
|
+
try {
|
|
17
|
+
if (fs_1.default.statSync(path_1.default.join(dir, 'package.json')).isFile()) {
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
// eslint-disable-next-line no-empty
|
|
21
|
+
}
|
|
22
|
+
catch (e) { }
|
|
23
|
+
const parent = path_1.default.dirname(dir);
|
|
24
|
+
if (dir === parent) {
|
|
25
|
+
dir = undefined;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
dir = parent;
|
|
29
|
+
}
|
|
30
|
+
if (!dir) {
|
|
31
|
+
return path_1.default.resolve(cwd, '.cache/webpack');
|
|
32
|
+
}
|
|
33
|
+
if (process.versions.pnp === '1') {
|
|
34
|
+
return path_1.default.resolve(dir, '.pnp/.cache/webpack');
|
|
35
|
+
}
|
|
36
|
+
if (process.versions.pnp === '3') {
|
|
37
|
+
return path_1.default.resolve(dir, '.yarn/.cache/webpack');
|
|
38
|
+
}
|
|
39
|
+
return path_1.default.resolve(dir, 'node_modules/.cache/webpack');
|
|
40
|
+
};
|
|
41
|
+
const remotionCacheLocation = (environment, inputProps) => {
|
|
42
|
+
return path_1.default.join(getWebpackCacheDir(), (0, exports.getWebpackCacheName)(environment, inputProps));
|
|
43
|
+
};
|
|
44
|
+
const clearCache = (environment, inputProps) => {
|
|
45
|
+
var _a;
|
|
46
|
+
return ((_a = fs_1.default.promises.rm) !== null && _a !== void 0 ? _a : fs_1.default.promises.rmdir)(remotionCacheLocation(environment, inputProps), {
|
|
47
|
+
recursive: true,
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
exports.clearCache = clearCache;
|
|
51
|
+
const getWebpackCacheName = (environment, inputProps) => {
|
|
52
|
+
// In development, let's reset the cache when input props
|
|
53
|
+
// are changing, because they are injected using Webpack and if changed,
|
|
54
|
+
// it will get the cached version
|
|
55
|
+
if (environment === 'development') {
|
|
56
|
+
return `remotion-v3-${environment}-${(0, remotion_1.random)(JSON.stringify(inputProps))}`;
|
|
57
|
+
}
|
|
58
|
+
// In production, the cache is independent from input props because
|
|
59
|
+
// they are passed over URL params. Speed is mostly important in production.
|
|
60
|
+
return `remotion-v3-${environment}`;
|
|
61
|
+
};
|
|
62
|
+
exports.getWebpackCacheName = getWebpackCacheName;
|
|
63
|
+
const cacheExists = (environment, inputProps) => {
|
|
64
|
+
return fs_1.default.existsSync(remotionCacheLocation(environment, inputProps));
|
|
65
|
+
};
|
|
66
|
+
exports.cacheExists = cacheExists;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remotion/cli",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.32",
|
|
4
4
|
"description": "CLI for Remotion",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
"author": "Jonny Burger <jonny@remotion.dev>",
|
|
24
24
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@remotion/bundler": "3.2.
|
|
27
|
-
"@remotion/media-utils": "3.2.
|
|
28
|
-
"@remotion/player": "3.2.
|
|
29
|
-
"@remotion/renderer": "3.2.
|
|
26
|
+
"@remotion/bundler": "3.2.32",
|
|
27
|
+
"@remotion/media-utils": "3.2.32",
|
|
28
|
+
"@remotion/player": "3.2.32",
|
|
29
|
+
"@remotion/renderer": "3.2.32",
|
|
30
30
|
"better-opn": "2.1.1",
|
|
31
31
|
"dotenv": "9.0.2",
|
|
32
32
|
"memfs": "3.4.3",
|
|
33
33
|
"minimist": "1.2.6",
|
|
34
|
-
"remotion": "3.2.
|
|
34
|
+
"remotion": "3.2.32",
|
|
35
35
|
"semver": "7.3.5",
|
|
36
36
|
"source-map": "0.6.1"
|
|
37
37
|
},
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"react": "^18.0.0",
|
|
59
59
|
"react-dom": "^18.0.0",
|
|
60
60
|
"typescript": "^4.7.0",
|
|
61
|
-
"vitest": "
|
|
61
|
+
"vitest": "0.18.0"
|
|
62
62
|
},
|
|
63
63
|
"keywords": [
|
|
64
64
|
"remotion",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "4f7ab3637405d140041f898f95f78c99943d1b40"
|
|
75
75
|
}
|