@remotion/cli 3.3.75 → 3.3.77

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.
Files changed (158) hide show
  1. package/dist/config/still-frame.js +5 -1
  2. package/dist/convert-entry-point-to-serve-url.d.ts +1 -0
  3. package/dist/convert-entry-point-to-serve-url.js +15 -0
  4. package/dist/editor/components/Checkbox.d.ts +5 -0
  5. package/dist/editor/components/Checkbox.js +38 -0
  6. package/dist/editor/components/CollapsableOptions.d.ts +6 -0
  7. package/dist/editor/components/CollapsableOptions.js +35 -0
  8. package/dist/editor/components/CurrentCompositionSideEffects.d.ts +3 -0
  9. package/dist/editor/components/CurrentCompositionSideEffects.js +43 -0
  10. package/dist/editor/components/InlineAction.d.ts +5 -0
  11. package/dist/editor/components/InlineAction.js +34 -0
  12. package/dist/editor/components/Modals.d.ts +2 -0
  13. package/dist/editor/components/Modals.js +23 -0
  14. package/dist/editor/components/RenderButton.d.ts +6 -0
  15. package/dist/editor/components/RenderButton.js +67 -0
  16. package/dist/editor/components/RenderModal/CrfSetting.d.ts +15 -0
  17. package/dist/editor/components/RenderModal/CrfSetting.js +43 -0
  18. package/dist/editor/components/RenderModal/EnforceAudioTrackSetting.d.ts +5 -0
  19. package/dist/editor/components/RenderModal/EnforceAudioTrackSetting.js +14 -0
  20. package/dist/editor/components/RenderModal/FrameRangeSetting.d.ts +8 -0
  21. package/dist/editor/components/RenderModal/FrameRangeSetting.js +42 -0
  22. package/dist/editor/components/RenderModal/MutedSetting.d.ts +5 -0
  23. package/dist/editor/components/RenderModal/MutedSetting.js +14 -0
  24. package/dist/editor/components/RenderModal/NumberOfLoopsSetting.d.ts +5 -0
  25. package/dist/editor/components/RenderModal/NumberOfLoopsSetting.js +26 -0
  26. package/dist/editor/components/RenderModal/NumberSetting.d.ts +9 -0
  27. package/dist/editor/components/RenderModal/NumberSetting.js +26 -0
  28. package/dist/editor/components/RenderModal/QualitySetting.d.ts +5 -0
  29. package/dist/editor/components/RenderModal/QualitySetting.js +27 -0
  30. package/dist/editor/components/RenderModal/RenderErrorModal.d.ts +5 -0
  31. package/dist/editor/components/RenderModal/RenderErrorModal.js +64 -0
  32. package/dist/editor/components/RenderModal/RenderModal.d.ts +28 -0
  33. package/dist/editor/components/RenderModal/RenderModal.js +484 -0
  34. package/dist/editor/components/RenderModal/RenderModalAdvanced.d.ts +11 -0
  35. package/dist/editor/components/RenderModal/RenderModalAdvanced.js +15 -0
  36. package/dist/editor/components/RenderModal/RenderModalAudio.d.ts +13 -0
  37. package/dist/editor/components/RenderModal/RenderModalAudio.js +22 -0
  38. package/dist/editor/components/RenderModal/RenderModalBasic.d.ts +24 -0
  39. package/dist/editor/components/RenderModal/RenderModalBasic.js +87 -0
  40. package/dist/editor/components/RenderModal/RenderModalGif.d.ts +9 -0
  41. package/dist/editor/components/RenderModal/RenderModalGif.js +16 -0
  42. package/dist/editor/components/RenderModal/RenderModalHr.d.ts +2 -0
  43. package/dist/editor/components/RenderModal/RenderModalHr.js +18 -0
  44. package/dist/editor/components/RenderModal/RenderModalPicture.d.ts +28 -0
  45. package/dist/editor/components/RenderModal/RenderModalPicture.js +51 -0
  46. package/dist/editor/components/RenderModal/ScaleSetting.d.ts +5 -0
  47. package/dist/editor/components/RenderModal/ScaleSetting.js +11 -0
  48. package/dist/editor/components/RenderModal/human-readable-audio-codecs.d.ts +2 -0
  49. package/dist/editor/components/RenderModal/human-readable-audio-codecs.js +18 -0
  50. package/dist/editor/components/RenderModal/human-readable-codec.d.ts +2 -0
  51. package/dist/editor/components/RenderModal/human-readable-codec.js +36 -0
  52. package/dist/editor/components/RenderModal/layout.d.ts +5 -0
  53. package/dist/editor/components/RenderModal/layout.js +31 -0
  54. package/dist/editor/components/RenderQueue/CircularProgress.d.ts +5 -0
  55. package/dist/editor/components/RenderQueue/CircularProgress.js +18 -0
  56. package/dist/editor/components/RenderQueue/RenderQueueError.d.ts +5 -0
  57. package/dist/editor/components/RenderQueue/RenderQueueError.js +26 -0
  58. package/dist/editor/components/RenderQueue/RenderQueueItem.d.ts +5 -0
  59. package/dist/editor/components/RenderQueue/RenderQueueItem.js +39 -0
  60. package/dist/editor/components/RenderQueue/RenderQueueItemCancelButton.d.ts +5 -0
  61. package/dist/editor/components/RenderQueue/RenderQueueItemCancelButton.js +22 -0
  62. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.d.ts +5 -0
  63. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +27 -0
  64. package/dist/editor/components/RenderQueue/RenderQueueOutputName.d.ts +5 -0
  65. package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +24 -0
  66. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.d.ts +5 -0
  67. package/dist/editor/components/RenderQueue/RenderQueueProgressMessage.js +27 -0
  68. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.d.ts +5 -0
  69. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +23 -0
  70. package/dist/editor/components/RenderQueue/RenderQueueRepeat.d.ts +5 -0
  71. package/dist/editor/components/RenderQueue/RenderQueueRepeat.js +22 -0
  72. package/dist/editor/components/RenderQueue/actions.d.ts +49 -0
  73. package/dist/editor/components/RenderQueue/actions.js +98 -0
  74. package/dist/editor/components/RenderQueue/context.d.ts +19 -0
  75. package/dist/editor/components/RenderQueue/context.js +56 -0
  76. package/dist/editor/components/RenderQueue/index.d.ts +2 -0
  77. package/dist/editor/components/RenderQueue/index.js +18 -0
  78. package/dist/editor/components/RenderQueue/item-style.d.ts +2 -0
  79. package/dist/editor/components/RenderQueue/item-style.js +21 -0
  80. package/dist/editor/components/RenderToolbarIcon.d.ts +2 -0
  81. package/dist/editor/components/RenderToolbarIcon.js +78 -0
  82. package/dist/editor/components/RendersTab.d.ts +6 -0
  83. package/dist/editor/components/RendersTab.js +43 -0
  84. package/dist/editor/components/SegmentedControl.d.ts +16 -0
  85. package/dist/editor/components/SegmentedControl.js +63 -0
  86. package/dist/editor/components/SidebarContent.d.ts +5 -0
  87. package/dist/editor/components/SidebarContent.js +52 -0
  88. package/dist/editor/components/Tabs/index.d.ts +11 -0
  89. package/dist/editor/components/Tabs/index.js +51 -0
  90. package/dist/editor/helpers/client-id.d.ts +17 -0
  91. package/dist/editor/helpers/client-id.js +46 -0
  92. package/dist/editor/helpers/use-file-existence.d.ts +1 -0
  93. package/dist/editor/helpers/use-file-existence.js +66 -0
  94. package/dist/editor/icons/RenderStillIcon.d.ts +3 -0
  95. package/dist/editor/icons/RenderStillIcon.js +8 -0
  96. package/dist/editor/icons/audio.d.ts +2 -0
  97. package/dist/editor/icons/audio.js +6 -0
  98. package/dist/editor/icons/file.d.ts +2 -0
  99. package/dist/editor/icons/file.js +6 -0
  100. package/dist/editor/icons/frame.d.ts +2 -0
  101. package/dist/editor/icons/frame.js +6 -0
  102. package/dist/editor/icons/gear.d.ts +2 -0
  103. package/dist/editor/icons/gear.js +6 -0
  104. package/dist/editor/icons/gif.d.ts +2 -0
  105. package/dist/editor/icons/gif.js +6 -0
  106. package/dist/editor/icons/render.d.ts +5 -0
  107. package/dist/editor/icons/render.js +8 -0
  108. package/dist/editor/icons/video.d.ts +5 -0
  109. package/dist/editor/icons/video.js +8 -0
  110. package/dist/ffmpeg.d.ts +2 -0
  111. package/dist/ffmpeg.js +21 -0
  112. package/dist/file-watcher.d.ts +9 -0
  113. package/dist/file-watcher.js +35 -0
  114. package/dist/gcp-command.d.ts +1 -0
  115. package/dist/gcp-command.js +27 -0
  116. package/dist/get-default-out-name.d.ts +5 -0
  117. package/dist/get-default-out-name.js +10 -0
  118. package/dist/preview-server/api-routes.d.ts +4 -0
  119. package/dist/preview-server/api-routes.js +17 -0
  120. package/dist/preview-server/api-types.d.ts +27 -0
  121. package/dist/preview-server/api-types.js +2 -0
  122. package/dist/preview-server/file-existence-watchers.d.ts +13 -0
  123. package/dist/preview-server/file-existence-watchers.js +62 -0
  124. package/dist/preview-server/handler.d.ts +9 -0
  125. package/dist/preview-server/handler.js +34 -0
  126. package/dist/preview-server/parse-body.d.ts +2 -0
  127. package/dist/preview-server/parse-body.js +16 -0
  128. package/dist/preview-server/render-queue/get-default-video-contexts.d.ts +10 -0
  129. package/dist/preview-server/render-queue/get-default-video-contexts.js +13 -0
  130. package/dist/preview-server/render-queue/job.d.ts +114 -0
  131. package/dist/preview-server/render-queue/job.js +2 -0
  132. package/dist/preview-server/render-queue/make-retry-payload.d.ts +3 -0
  133. package/dist/preview-server/render-queue/make-retry-payload.js +79 -0
  134. package/dist/preview-server/render-queue/open-directory-in-finder.d.ts +1 -0
  135. package/dist/preview-server/render-queue/open-directory-in-finder.js +34 -0
  136. package/dist/preview-server/render-queue/process-still.d.ts +8 -0
  137. package/dist/preview-server/render-queue/process-still.js +47 -0
  138. package/dist/preview-server/render-queue/process-video.d.ts +8 -0
  139. package/dist/preview-server/render-queue/process-video.js +64 -0
  140. package/dist/preview-server/render-queue/queue.d.ts +21 -0
  141. package/dist/preview-server/render-queue/queue.js +185 -0
  142. package/dist/preview-server/routes/add-render.d.ts +3 -0
  143. package/dist/preview-server/routes/add-render.js +68 -0
  144. package/dist/preview-server/routes/cancel-render.d.ts +3 -0
  145. package/dist/preview-server/routes/cancel-render.js +9 -0
  146. package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
  147. package/dist/preview-server/routes/open-in-file-explorer.js +14 -0
  148. package/dist/preview-server/routes/remove-render.d.ts +3 -0
  149. package/dist/preview-server/routes/remove-render.js +9 -0
  150. package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
  151. package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
  152. package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
  153. package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
  154. package/dist/render-flows/render.d.ts +46 -0
  155. package/dist/render-flows/render.js +279 -0
  156. package/dist/render-flows/still.d.ts +29 -0
  157. package/dist/render-flows/still.js +171 -0
  158. package/package.json +6 -6
@@ -0,0 +1,10 @@
1
+ import type { Codec } from '@remotion/renderer';
2
+ import type { RenderType } from '../../editor/components/RenderModal/RenderModalAdvanced';
3
+ export declare const getDefaultCodecs: ({ defaultCodec, isStill, }: {
4
+ defaultCodec: Codec;
5
+ isStill: boolean;
6
+ }) => {
7
+ initialAudioCodec: Codec;
8
+ initialVideoCodec: Codec;
9
+ initialRenderType: RenderType;
10
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultCodecs = void 0;
4
+ const client_1 = require("@remotion/renderer/client");
5
+ const getDefaultCodecs = ({ defaultCodec, isStill, }) => {
6
+ const isAudioCodec = client_1.BrowserSafeApis.isAudioCodec(defaultCodec);
7
+ return {
8
+ initialAudioCodec: isAudioCodec ? defaultCodec : 'mp3',
9
+ initialVideoCodec: isAudioCodec ? 'h264' : defaultCodec,
10
+ initialRenderType: isStill ? 'still' : isAudioCodec ? 'audio' : 'video',
11
+ };
12
+ };
13
+ exports.getDefaultCodecs = getDefaultCodecs;
@@ -0,0 +1,114 @@
1
+ import type { AudioCodec, Codec, makeCancelSignal, PixelFormat, ProResProfile, StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
+ declare type RenderJobDynamicStatus = {
3
+ status: 'done';
4
+ } | {
5
+ status: 'running';
6
+ progress: number;
7
+ message: string;
8
+ } | {
9
+ status: 'idle';
10
+ } | {
11
+ status: 'failed';
12
+ error: {
13
+ message: string;
14
+ stack: string | undefined;
15
+ };
16
+ };
17
+ export declare type JobProgressCallback = (options: {
18
+ progress: number;
19
+ message: string;
20
+ }) => void;
21
+ declare type RenderJobDynamicFields = {
22
+ type: 'still';
23
+ imageFormat: StillImageFormat;
24
+ quality: number | null;
25
+ frame: number;
26
+ scale: number;
27
+ } | {
28
+ type: 'video';
29
+ imageFormat: VideoImageFormat;
30
+ quality: number | null;
31
+ scale: number;
32
+ codec: Codec;
33
+ audioCodec: AudioCodec;
34
+ concurrency: number;
35
+ crf: number | null;
36
+ startFrame: number;
37
+ endFrame: number;
38
+ muted: boolean;
39
+ enforceAudioTrack: boolean;
40
+ proResProfile: ProResProfile | null;
41
+ pixelFormat: PixelFormat;
42
+ audioBitrate: string | null;
43
+ videoBitrate: string | null;
44
+ everyNthFrame: number;
45
+ numberOfGifLoops: number | null;
46
+ delayRenderTimeout: number;
47
+ };
48
+ export declare type RenderJob = {
49
+ startedAt: number;
50
+ compositionId: string;
51
+ id: string;
52
+ outName: string;
53
+ deletedOutputLocation: boolean;
54
+ verbose: boolean;
55
+ cancelToken: ReturnType<typeof makeCancelSignal>;
56
+ } & RenderJobDynamicStatus & RenderJobDynamicFields;
57
+ export declare type RenderJobWithCleanup = RenderJob & {
58
+ cleanup: (() => void)[];
59
+ };
60
+ declare type AddRenderRequestDynamicFields = {
61
+ type: 'still';
62
+ imageFormat: StillImageFormat;
63
+ quality: number | null;
64
+ frame: number;
65
+ scale: number;
66
+ verbose: boolean;
67
+ } | {
68
+ type: 'video';
69
+ codec: Codec;
70
+ audioCodec: AudioCodec;
71
+ imageFormat: VideoImageFormat;
72
+ quality: number | null;
73
+ scale: number;
74
+ verbose: boolean;
75
+ concurrency: number;
76
+ crf: number | null;
77
+ startFrame: number;
78
+ endFrame: number;
79
+ muted: boolean;
80
+ enforceAudioTrack: boolean;
81
+ proResProfile: ProResProfile | null;
82
+ pixelFormat: PixelFormat;
83
+ audioBitrate: string | null;
84
+ videoBitrate: string | null;
85
+ everyNthFrame: number;
86
+ numberOfGifLoops: number | null;
87
+ delayRenderTimeout: number;
88
+ };
89
+ export declare type CancelRenderRequest = {
90
+ jobId: string;
91
+ };
92
+ export declare type CancelRenderResponse = {};
93
+ export declare type AddRenderRequest = {
94
+ compositionId: string;
95
+ outName: string;
96
+ } & AddRenderRequestDynamicFields;
97
+ export declare type RemoveRenderRequest = {
98
+ jobId: string;
99
+ };
100
+ export declare type OpenInFileExplorerRequest = {
101
+ directory: string;
102
+ };
103
+ export declare type SubscribeToFileExistenceRequest = {
104
+ file: string;
105
+ clientId: string;
106
+ };
107
+ export declare type SubscribeToFileExistenceResponse = {
108
+ exists: boolean;
109
+ };
110
+ export declare type UnsubscribeFromFileExistenceRequest = {
111
+ file: string;
112
+ clientId: string;
113
+ };
114
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import type { RenderModalState } from '../../editor/state/modals';
2
+ import type { RenderJob } from './job';
3
+ export declare const makeRetryPayload: (job: RenderJob) => RenderModalState;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRetryPayload = void 0;
4
+ const get_default_video_contexts_1 = require("./get-default-video-contexts");
5
+ const makeRetryPayload = (job) => {
6
+ var _a, _b, _c;
7
+ const defaults = window.remotion_renderDefaults;
8
+ if (!defaults) {
9
+ throw new Error('defaults not set');
10
+ }
11
+ if (job.type === 'still') {
12
+ const { initialAudioCodec, initialRenderType, initialVideoCodec } = (0, get_default_video_contexts_1.getDefaultCodecs)({
13
+ defaultCodec: defaults.codec,
14
+ isStill: true,
15
+ });
16
+ return {
17
+ type: 'render',
18
+ compositionId: job.compositionId,
19
+ initialFrame: job.frame,
20
+ initialStillImageFormat: job.imageFormat,
21
+ // TODO: Take from config
22
+ initialVideoImageFormat: 'jpeg',
23
+ initialQuality: (_a = job.quality) !== null && _a !== void 0 ? _a : defaults.quality,
24
+ initialOutName: job.outName,
25
+ initialScale: job.scale,
26
+ initialVerbose: job.verbose,
27
+ initialAudioCodec,
28
+ initialRenderType,
29
+ initialVideoCodec,
30
+ initialConcurrency: defaults.concurrency,
31
+ maxConcurrency: defaults.maxConcurrency,
32
+ minConcurrency: defaults.minConcurrency,
33
+ initialMuted: defaults.muted,
34
+ initialEnforceAudioTrack: defaults.enforceAudioTrack,
35
+ initialProResProfile: defaults.proResProfile,
36
+ initialPixelFormat: defaults.pixelFormat,
37
+ initialAudioBitrate: defaults.audioBitrate,
38
+ initialVideoBitrate: defaults.videoBitrate,
39
+ initialEveryNthFrame: defaults.everyNthFrame,
40
+ initialNumberOfGifLoops: defaults.numberOfGifLoops,
41
+ initialDelayRenderTimeout: defaults.delayRenderTimeout,
42
+ };
43
+ }
44
+ if (job.type === 'video') {
45
+ const { initialAudioCodec, initialRenderType, initialVideoCodec } = (0, get_default_video_contexts_1.getDefaultCodecs)({
46
+ defaultCodec: defaults.codec,
47
+ isStill: false,
48
+ });
49
+ return {
50
+ type: 'render',
51
+ compositionId: job.compositionId,
52
+ // TODO: Take from config
53
+ initialStillImageFormat: 'png',
54
+ initialVideoImageFormat: job.imageFormat,
55
+ initialQuality: (_b = job.quality) !== null && _b !== void 0 ? _b : defaults.quality,
56
+ initialOutName: job.outName,
57
+ initialScale: job.scale,
58
+ initialVerbose: job.verbose,
59
+ initialFrame: 0,
60
+ initialConcurrency: job.concurrency,
61
+ maxConcurrency: defaults.maxConcurrency,
62
+ minConcurrency: defaults.minConcurrency,
63
+ initialMuted: job.muted,
64
+ initialAudioCodec,
65
+ initialEnforceAudioTrack: job.enforceAudioTrack,
66
+ initialRenderType,
67
+ initialVideoCodec,
68
+ initialProResProfile: (_c = job.proResProfile) !== null && _c !== void 0 ? _c : defaults.proResProfile,
69
+ initialPixelFormat: job.pixelFormat,
70
+ initialAudioBitrate: job.audioBitrate,
71
+ initialVideoBitrate: job.videoBitrate,
72
+ initialEveryNthFrame: job.everyNthFrame,
73
+ initialNumberOfGifLoops: job.numberOfGifLoops,
74
+ initialDelayRenderTimeout: job.delayRenderTimeout,
75
+ };
76
+ }
77
+ throw new Error(`Job ${JSON.stringify(job)} Not implemented`);
78
+ };
79
+ exports.makeRetryPayload = makeRetryPayload;
@@ -0,0 +1 @@
1
+ export declare const openDirectoryInFinder: (dirToOpen: string) => Promise<void>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openDirectoryInFinder = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const os_1 = require("os");
6
+ const truthy_1 = require("../../truthy");
7
+ const openDirectoryInFinder = (dirToOpen) => {
8
+ const command = (0, os_1.platform)() === 'darwin'
9
+ ? 'open'
10
+ : (0, os_1.platform)() === 'linux'
11
+ ? 'xdg-open'
12
+ : 'start';
13
+ const p = (0, child_process_1.spawn)(command, [(0, os_1.platform)() === 'darwin' ? '-R' : null, dirToOpen].filter(truthy_1.truthy));
14
+ const stderrChunks = [];
15
+ p.stderr.on('data', (d) => stderrChunks.push(d));
16
+ return new Promise((resolve, reject) => {
17
+ p.on('exit', (code) => {
18
+ if (code === 0) {
19
+ resolve();
20
+ }
21
+ else {
22
+ const message = Buffer.concat(stderrChunks).toString('utf-8');
23
+ reject(new Error(message));
24
+ }
25
+ });
26
+ p.on('error', (err) => {
27
+ p.kill();
28
+ if (err) {
29
+ reject(err);
30
+ }
31
+ });
32
+ });
33
+ };
34
+ exports.openDirectoryInFinder = openDirectoryInFinder;
@@ -0,0 +1,8 @@
1
+ import type { JobProgressCallback, RenderJob } from './job';
2
+ export declare const processStill: ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }: {
3
+ job: RenderJob;
4
+ remotionRoot: string;
5
+ entryPoint: string;
6
+ onProgress: JobProgressCallback;
7
+ addCleanupCallback: (cb: () => void) => void;
8
+ }) => Promise<void>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processStill = void 0;
4
+ const convert_entry_point_to_serve_url_1 = require("../../convert-entry-point-to-serve-url");
5
+ const get_cli_options_1 = require("../../get-cli-options");
6
+ const still_1 = require("../../render-flows/still");
7
+ const processStill = async ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }) => {
8
+ var _a;
9
+ if (job.type !== 'still') {
10
+ throw new Error('Expected still job');
11
+ }
12
+ const { publicDir, browserExecutable, chromiumOptions, envVariables, inputProps, port, browser, puppeteerTimeout, } = await (0, get_cli_options_1.getCliOptions)({
13
+ isLambda: false,
14
+ type: 'still',
15
+ remotionRoot,
16
+ });
17
+ const fullEntryPoint = (0, convert_entry_point_to_serve_url_1.convertEntryPointToServeUrl)(entryPoint);
18
+ await (0, still_1.renderStillFlow)({
19
+ remotionRoot,
20
+ browser,
21
+ browserExecutable,
22
+ chromiumOptions,
23
+ entryPointReason: 'same as preview',
24
+ envVariables,
25
+ height: null,
26
+ fullEntryPoint,
27
+ inputProps,
28
+ overwrite: true,
29
+ port,
30
+ publicDir,
31
+ puppeteerTimeout,
32
+ quality: (_a = job.quality) !== null && _a !== void 0 ? _a : undefined,
33
+ remainingArgs: [],
34
+ scale: job.scale,
35
+ stillFrame: job.frame,
36
+ width: null,
37
+ compositionIdFromUi: job.compositionId,
38
+ imageFormatFromUi: job.imageFormat,
39
+ logLevel: job.verbose ? 'verbose' : 'info',
40
+ onProgress,
41
+ indentOutput: true,
42
+ addCleanupCallback,
43
+ cancelSignal: job.cancelToken.cancelSignal,
44
+ });
45
+ // TODO: Accept CLI options
46
+ };
47
+ exports.processStill = processStill;
@@ -0,0 +1,8 @@
1
+ import type { JobProgressCallback, RenderJob } from './job';
2
+ export declare const processVideoJob: ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }: {
3
+ job: RenderJob;
4
+ remotionRoot: string;
5
+ entryPoint: string;
6
+ onProgress: JobProgressCallback;
7
+ addCleanupCallback: (cb: () => void) => void;
8
+ }) => Promise<void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processVideoJob = void 0;
4
+ const convert_entry_point_to_serve_url_1 = require("../../convert-entry-point-to-serve-url");
5
+ const get_cli_options_1 = require("../../get-cli-options");
6
+ const render_1 = require("../../render-flows/render");
7
+ const processVideoJob = async ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }) => {
8
+ var _a, _b;
9
+ if (job.type !== 'video') {
10
+ throw new Error('Expected video job');
11
+ }
12
+ // TODO: Change until none can be derived from UI
13
+ const { publicDir, browserExecutable, chromiumOptions, envVariables, inputProps, port, browser, ffmpegOverride, } = await (0, get_cli_options_1.getCliOptions)({
14
+ isLambda: false,
15
+ type: 'still',
16
+ remotionRoot,
17
+ });
18
+ const fullEntryPoint = (0, convert_entry_point_to_serve_url_1.convertEntryPointToServeUrl)(entryPoint);
19
+ await (0, render_1.renderCompFlow)({
20
+ remotionRoot,
21
+ browser,
22
+ browserExecutable,
23
+ chromiumOptions,
24
+ entryPointReason: 'same as preview',
25
+ envVariables,
26
+ height: null,
27
+ fullEntryPoint,
28
+ inputProps,
29
+ overwrite: true,
30
+ port,
31
+ publicDir,
32
+ puppeteerTimeout: job.delayRenderTimeout,
33
+ quality: (_a = job.quality) !== null && _a !== void 0 ? _a : undefined,
34
+ remainingArgs: [],
35
+ scale: job.scale,
36
+ width: null,
37
+ compositionIdFromUi: job.compositionId,
38
+ logLevel: job.verbose ? 'verbose' : 'info',
39
+ onProgress,
40
+ indent: true,
41
+ concurrency: job.concurrency,
42
+ everyNthFrame: job.everyNthFrame,
43
+ frameRange: [job.startFrame, job.endFrame],
44
+ quiet: false,
45
+ shouldOutputImageSequence: false,
46
+ addCleanupCallback,
47
+ outputLocationFromUI: job.outName,
48
+ uiCodec: job.codec,
49
+ uiImageFormat: job.imageFormat,
50
+ cancelSignal: job.cancelToken.cancelSignal,
51
+ crf: job.crf,
52
+ ffmpegOverride,
53
+ audioBitrate: job.audioBitrate,
54
+ muted: job.muted,
55
+ enforceAudioTrack: job.enforceAudioTrack,
56
+ proResProfile: (_b = job.proResProfile) !== null && _b !== void 0 ? _b : undefined,
57
+ pixelFormat: job.pixelFormat,
58
+ videoBitrate: job.videoBitrate,
59
+ numberOfGifLoops: job.numberOfGifLoops,
60
+ audioCodec: job.audioCodec,
61
+ });
62
+ // TODO: Accept CLI options
63
+ };
64
+ exports.processVideoJob = processVideoJob;
@@ -0,0 +1,21 @@
1
+ import type { JobProgressCallback, RenderJob, RenderJobWithCleanup } from './job';
2
+ export declare const getRenderQueue: () => RenderJob[];
3
+ export declare const notifyClientsOfJobUpdate: () => void;
4
+ export declare const processJob: ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }: {
5
+ job: RenderJob;
6
+ remotionRoot: string;
7
+ entryPoint: string;
8
+ onProgress: JobProgressCallback;
9
+ addCleanupCallback: (cb: () => void) => void;
10
+ }) => Promise<void>;
11
+ export declare const addJob: ({ job, entryPoint, remotionRoot, }: {
12
+ job: RenderJobWithCleanup;
13
+ entryPoint: string;
14
+ remotionRoot: string;
15
+ }) => void;
16
+ export declare const removeJob: (jobId: string) => void;
17
+ export declare const cancelJob: (jobId: string) => void;
18
+ export declare const processJobIfPossible: ({ remotionRoot, entryPoint, }: {
19
+ remotionRoot: string;
20
+ entryPoint: string;
21
+ }) => Promise<void>;
@@ -0,0 +1,185 @@
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.processJobIfPossible = exports.cancelJob = exports.removeJob = exports.addJob = exports.processJob = exports.notifyClientsOfJobUpdate = exports.getRenderQueue = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const chalk_1 = require("../../chalk");
9
+ const file_watcher_1 = require("../../file-watcher");
10
+ const log_1 = require("../../log");
11
+ const live_events_1 = require("../live-events");
12
+ const process_still_1 = require("./process-still");
13
+ const process_video_1 = require("./process-video");
14
+ let jobQueue = [];
15
+ const updateJob = (id, updater) => {
16
+ jobQueue = jobQueue.map((j) => {
17
+ if (id === j.id) {
18
+ return updater(j);
19
+ }
20
+ return j;
21
+ });
22
+ (0, exports.notifyClientsOfJobUpdate)();
23
+ };
24
+ const getRenderQueue = () => {
25
+ return jobQueue.map((j) => {
26
+ const { cleanup, ...rest } = j;
27
+ return rest;
28
+ });
29
+ };
30
+ exports.getRenderQueue = getRenderQueue;
31
+ const notifyClientsOfJobUpdate = () => {
32
+ (0, live_events_1.waitForLiveEventsListener)().then((listener) => {
33
+ listener.sendEventToClient({
34
+ type: 'render-queue-updated',
35
+ queue: (0, exports.getRenderQueue)(),
36
+ });
37
+ });
38
+ };
39
+ exports.notifyClientsOfJobUpdate = notifyClientsOfJobUpdate;
40
+ const processJob = async ({ job, remotionRoot, entryPoint, onProgress, addCleanupCallback, }) => {
41
+ if (job.type === 'still') {
42
+ await (0, process_still_1.processStill)({
43
+ job,
44
+ remotionRoot,
45
+ entryPoint,
46
+ onProgress,
47
+ addCleanupCallback,
48
+ });
49
+ return;
50
+ }
51
+ if (job.type === 'video') {
52
+ await (0, process_video_1.processVideoJob)({
53
+ job,
54
+ remotionRoot,
55
+ entryPoint,
56
+ onProgress,
57
+ addCleanupCallback,
58
+ });
59
+ return;
60
+ }
61
+ throw new Error(`Unknown job ${JSON.stringify(job)}`);
62
+ };
63
+ exports.processJob = processJob;
64
+ const addJob = ({ job, entryPoint, remotionRoot, }) => {
65
+ jobQueue.push(job);
66
+ (0, exports.processJobIfPossible)({ entryPoint, remotionRoot });
67
+ (0, exports.notifyClientsOfJobUpdate)();
68
+ };
69
+ exports.addJob = addJob;
70
+ const removeJob = (jobId) => {
71
+ jobQueue = jobQueue.filter((job) => {
72
+ if (job.id === jobId) {
73
+ job.cleanup.forEach((c) => {
74
+ c();
75
+ });
76
+ return false;
77
+ }
78
+ return true;
79
+ });
80
+ (0, exports.notifyClientsOfJobUpdate)();
81
+ };
82
+ exports.removeJob = removeJob;
83
+ const cancelJob = (jobId) => {
84
+ for (const job of jobQueue) {
85
+ if (job.id === jobId) {
86
+ if (job.status !== 'running') {
87
+ throw new Error('Job is not running');
88
+ }
89
+ job.cancelToken.cancel();
90
+ break;
91
+ }
92
+ }
93
+ };
94
+ exports.cancelJob = cancelJob;
95
+ const processJobIfPossible = async ({ remotionRoot, entryPoint, }) => {
96
+ const nextJob = jobQueue.find((q) => {
97
+ return q.status === 'idle';
98
+ });
99
+ if (!nextJob) {
100
+ return;
101
+ }
102
+ const jobCleanups = [];
103
+ try {
104
+ updateJob(nextJob.id, (job) => {
105
+ return {
106
+ ...job,
107
+ status: 'running',
108
+ progress: 0,
109
+ message: 'Starting job...',
110
+ };
111
+ });
112
+ const startTime = Date.now();
113
+ log_1.Log.info(chalk_1.chalk.gray('╭─ Starting render '));
114
+ await (0, exports.processJob)({
115
+ job: nextJob,
116
+ entryPoint,
117
+ remotionRoot,
118
+ onProgress: ({ message, progress }) => {
119
+ updateJob(nextJob.id, (job) => {
120
+ // Ignore late callbacks of progress updates after cancelling
121
+ if (job.status === 'failed' || job.status === 'done') {
122
+ return job;
123
+ }
124
+ return {
125
+ ...job,
126
+ status: 'running',
127
+ progress,
128
+ message,
129
+ };
130
+ });
131
+ },
132
+ addCleanupCallback: (cleanup) => {
133
+ jobCleanups.push(cleanup);
134
+ },
135
+ });
136
+ log_1.Log.info(chalk_1.chalk.gray('╰─ Done in ' + (Date.now() - startTime) + 'ms.'));
137
+ const { unwatch } = (0, file_watcher_1.installFileWatcher)({
138
+ file: path_1.default.resolve(remotionRoot, nextJob.outName),
139
+ onChange: (type) => {
140
+ if (type === 'created') {
141
+ updateJob(nextJob.id, (job) => ({
142
+ ...job,
143
+ deletedOutputLocation: false,
144
+ }));
145
+ }
146
+ if (type === 'deleted') {
147
+ updateJob(nextJob.id, (job) => ({
148
+ ...job,
149
+ deletedOutputLocation: true,
150
+ }));
151
+ }
152
+ },
153
+ });
154
+ updateJob(nextJob.id, (job) => ({
155
+ ...job,
156
+ status: 'done',
157
+ cleanup: [...job.cleanup, unwatch],
158
+ }));
159
+ }
160
+ catch (err) {
161
+ // TODO: Tell to look in preview to find the error
162
+ log_1.Log.error(chalk_1.chalk.gray('╰─ Render failed:'), err);
163
+ updateJob(nextJob.id, (job) => {
164
+ return {
165
+ ...job,
166
+ status: 'failed',
167
+ error: {
168
+ message: err.message,
169
+ stack: err.stack,
170
+ },
171
+ };
172
+ });
173
+ (0, live_events_1.waitForLiveEventsListener)().then((listener) => {
174
+ listener.sendEventToClient({
175
+ type: 'render-job-failed',
176
+ compositionId: nextJob.compositionId,
177
+ error: err,
178
+ });
179
+ });
180
+ }
181
+ finally {
182
+ await Promise.all(jobCleanups.map((c) => c()));
183
+ }
184
+ };
185
+ exports.processJobIfPossible = processJobIfPossible;
@@ -0,0 +1,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { AddRenderRequest } from '../render-queue/job';
3
+ export declare const handleAddRender: ApiHandler<AddRenderRequest, undefined>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleAddRender = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const queue_1 = require("../render-queue/queue");
6
+ const handleAddRender = ({ input, entryPoint, remotionRoot, }) => {
7
+ const id = String(Math.random()).replace('0.', '');
8
+ if (input.type === 'video') {
9
+ (0, queue_1.addJob)({
10
+ entryPoint,
11
+ remotionRoot,
12
+ job: {
13
+ cleanup: [],
14
+ codec: input.codec,
15
+ audioCodec: input.audioCodec,
16
+ compositionId: input.compositionId,
17
+ deletedOutputLocation: false,
18
+ type: 'video',
19
+ status: 'idle',
20
+ id,
21
+ imageFormat: input.imageFormat,
22
+ outName: input.outName,
23
+ quality: input.quality,
24
+ scale: input.scale,
25
+ startedAt: Date.now(),
26
+ verbose: input.verbose,
27
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
28
+ concurrency: input.concurrency,
29
+ crf: input.crf,
30
+ endFrame: input.endFrame,
31
+ startFrame: input.startFrame,
32
+ muted: input.muted,
33
+ enforceAudioTrack: input.enforceAudioTrack,
34
+ proResProfile: input.proResProfile,
35
+ pixelFormat: input.pixelFormat,
36
+ audioBitrate: input.audioBitrate,
37
+ videoBitrate: input.videoBitrate,
38
+ everyNthFrame: input.everyNthFrame,
39
+ numberOfGifLoops: input.numberOfGifLoops,
40
+ delayRenderTimeout: input.delayRenderTimeout,
41
+ },
42
+ });
43
+ }
44
+ if (input.type === 'still') {
45
+ (0, queue_1.addJob)({
46
+ job: {
47
+ compositionId: input.compositionId,
48
+ id: String(Math.random()).replace('0.', ''),
49
+ startedAt: Date.now(),
50
+ type: 'still',
51
+ outName: input.outName,
52
+ status: 'idle',
53
+ imageFormat: input.imageFormat,
54
+ quality: input.quality,
55
+ frame: input.frame,
56
+ scale: input.scale,
57
+ cleanup: [],
58
+ deletedOutputLocation: false,
59
+ verbose: input.verbose,
60
+ cancelToken: (0, renderer_1.makeCancelSignal)(),
61
+ },
62
+ entryPoint,
63
+ remotionRoot,
64
+ });
65
+ }
66
+ return Promise.resolve(undefined);
67
+ };
68
+ exports.handleAddRender = handleAddRender;
@@ -0,0 +1,3 @@
1
+ import type { ApiHandler } from '../api-types';
2
+ import type { CancelRenderRequest, CancelRenderResponse } from '../render-queue/job';
3
+ export declare const handleCancelRender: ApiHandler<CancelRenderRequest, CancelRenderResponse>;