Skip to content

Commit 7df8177

Browse files
committed
chore: naming, defaults in one spot
1 parent 73e8574 commit 7df8177

File tree

7 files changed

+121
-84
lines changed

7 files changed

+121
-84
lines changed

packages/core/src/app/Project.ts

+25-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {SceneDescription} from '../scenes';
44
import {CanvasColorSpace, Color, Vector2} from '../types';
55
import {Logger} from './Logger';
66

7+
// TODO(refactor): check if we can get rid of this
78
export interface Versions {
89
core: string;
910
two: string | null;
@@ -34,6 +35,7 @@ export type ExporterSettings =
3435
name: '@revideo/core/wasm';
3536
};
3637

38+
// Project settings that are used internally
3739
export interface ProjectSettings {
3840
shared: {
3941
background: Color;
@@ -52,11 +54,12 @@ export interface ProjectSettings {
5254
};
5355
}
5456

57+
// Project settings as they are provided by the user (can be serialized)
5558
export interface UserProjectSettings {
5659
shared: {
5760
range: [number, number];
58-
background: string | null;
59-
size: {x: number; y: number};
61+
background: string | null; // changed from Color to string
62+
size: {x: number; y: number}; // changed from Vector2 to object
6063
};
6164
rendering: {
6265
exporter: ExporterSettings;
@@ -70,6 +73,22 @@ export interface UserProjectSettings {
7073
};
7174
}
7275

76+
/**
77+
* Settings that can be passed to the renderVideo / renderPartialVideo functions
78+
*/
79+
80+
export type RenderVideoUserProjectSettings = {
81+
range?: UserProjectSettings['shared']['range'];
82+
background?: UserProjectSettings['shared']['background'];
83+
size?: UserProjectSettings['shared']['size'];
84+
85+
exporter?: UserProjectSettings['rendering']['exporter'];
86+
};
87+
88+
/**
89+
* Settings that can be passed to the createProject function
90+
*/
91+
7392
export type PartialUserProjectSettings = {
7493
shared?: Partial<UserProjectSettings['shared']>;
7594
rendering?: Partial<UserProjectSettings['rendering']>;
@@ -113,6 +132,10 @@ export interface UserProject {
113132
settings?: PartialUserProjectSettings;
114133
}
115134

135+
/**
136+
* Internal project that includes legacy properties that can't be changed by the user
137+
* as well as defaulted properties in case the user didn't provide them.
138+
*/
116139
export interface Project extends Omit<UserProject, 'settings'> {
117140
name: string;
118141
settings: ProjectSettings;

packages/core/src/app/makeProject.ts

+24-24
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,44 @@ import {
88
createVersionObject,
99
} from './Project';
1010

11+
export const defaultUserProjectSettings: UserProjectSettings = {
12+
shared: {
13+
background: 'FFFFFF00',
14+
range: [0, Infinity],
15+
size: {x: 1920, y: 1080},
16+
},
17+
rendering: {
18+
exporter: {
19+
name: '@revideo/core/wasm',
20+
},
21+
fps: 30,
22+
resolutionScale: 1,
23+
colorSpace: 'srgb',
24+
},
25+
preview: {
26+
fps: 30,
27+
resolutionScale: 1,
28+
},
29+
};
30+
1131
export function makeProject(project: UserProject): Project {
1232
// Don't delete, has side effects
1333
// TODO(konsti): Figure out how to get rid of this
1434
void DefaultPlugin;
1535

16-
const defaultSettings: UserProjectSettings = {
17-
shared: {
18-
background: 'FFFFFF00',
19-
range: [0, Infinity],
20-
size: {x: 1920, y: 1080},
21-
},
22-
rendering: {
23-
exporter: {
24-
name: '@revideo/core/wasm',
25-
},
26-
fps: 30,
27-
resolutionScale: 1,
28-
colorSpace: 'srgb',
29-
},
30-
preview: {
31-
fps: 30,
32-
resolutionScale: 1,
33-
},
34-
};
35-
3636
const settings = {
37-
...defaultSettings,
37+
...defaultUserProjectSettings,
3838
...project.settings,
3939
shared: {
40-
...defaultSettings.shared,
40+
...defaultUserProjectSettings.shared,
4141
...project.settings?.shared,
4242
},
4343
rendering: {
44-
...defaultSettings.rendering,
44+
...defaultUserProjectSettings.rendering,
4545
...project.settings?.rendering,
4646
},
4747
preview: {
48-
...defaultSettings.preview,
48+
...defaultUserProjectSettings.preview,
4949
...project.settings?.preview,
5050
},
5151
};

packages/ffmpeg/src/ffmpeg-exporter-server.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import {
2-
FFmpegExporterClient,
3-
type FfmpegExporterOptions,
4-
type RendererResult,
5-
type RendererSettings,
1+
import type {
2+
FfmpegExporterOptions,
3+
RendererResult,
4+
RendererSettings,
65
} from '@revideo/core';
76
import {EventName, sendEvent} from '@revideo/telemetry';
87
import * as ffmpeg from 'fluent-ffmpeg';
@@ -41,7 +40,7 @@ export class FFmpegExporterServer {
4140
private readonly format: FfmpegExporterOptions['format'];
4241

4342
public constructor(settings: FFmpegExporterSettings) {
44-
if (settings.exporter.name !== FFmpegExporterClient.id) {
43+
if (settings.exporter.name !== '@revideo/core/ffmpeg') {
4544
throw new Error('Invalid exporter');
4645
}
4746

packages/renderer/client/render.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import {
22
Color,
33
Project,
4+
RenderVideoUserProjectSettings,
45
Renderer,
5-
UserProjectSettings,
66
Vector2,
77
getFullRenderingSettings,
88
} from '@revideo/core';
@@ -22,9 +22,7 @@ export const render = async (
2222
workerId: number,
2323
totalNumOfWorkers: number,
2424
hiddenFolderId: string,
25-
projectRenderSettings: Partial<
26-
UserProjectSettings['shared'] & UserProjectSettings['rendering']
27-
>,
25+
projectRenderSettings: Required<RenderVideoUserProjectSettings>,
2826
) => {
2927
try {
3028
const renderer = new Renderer(project);
@@ -33,8 +31,8 @@ export const render = async (
3331
await getGlobalFirstAndLastFrame(
3432
project,
3533
renderer,
36-
projectRenderSettings.range?.[0] ?? 0,
37-
projectRenderSettings.range?.[1] ?? Infinity,
34+
projectRenderSettings.range[0],
35+
projectRenderSettings.range[1],
3836
);
3937
const {firstWorkerFrame, lastWorkerFrame} =
4038
await getWorkerFirstAndLastFrame(

packages/renderer/server/render-video.ts

+34-33
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import {FfmpegExporterOptions, UserProjectSettings} from '@revideo/core';
1+
import {
2+
FfmpegExporterOptions,
3+
RenderVideoUserProjectSettings,
4+
} from '@revideo/core';
25
import {
36
FfmpegSettings,
47
audioCodecs,
@@ -15,27 +18,13 @@ import * as fs from 'fs';
1518
import * as os from 'os';
1619
import * as path from 'path';
1720
import puppeteer, {Browser, PuppeteerLaunchOptions} from 'puppeteer';
18-
import {getParamDefaultsAndCheckValidity} from 'validate-settings';
21+
import {
22+
getParamDefaultsAndCheckValidity,
23+
getRenderVideoUserProjectSettingsDefault,
24+
} from 'validate-settings';
1925
import {InlineConfig, ServerOptions, ViteDevServer, createServer} from 'vite';
2026
import {rendererPlugin} from './renderer-plugin';
2127

22-
/**
23-
* We pass a lot of render settings to the client side of the renderer
24-
* via the URL. This function builds the URL with the necessary parameters.
25-
*/
26-
function buildUrl(
27-
port: number,
28-
fileName: string,
29-
workerId: number,
30-
totalNumOfWorkers: number,
31-
hiddenFolderId: string,
32-
) {
33-
const fileNameEscaped = encodeURIComponent(fileName);
34-
const hiddenFolderIdEscaped = encodeURIComponent(hiddenFolderId);
35-
36-
return `http://localhost:${port}/render?fileName=${fileNameEscaped}&workerId=${workerId}&totalNumOfWorkers=${totalNumOfWorkers}&hiddenFolderId=${hiddenFolderIdEscaped}`;
37-
}
38-
3928
export interface RenderSettings {
4029
// Name of the video file (default is 'video.mp4')
4130
outFile?: `${string}.mp4` | `${string}.webm` | `${string}.mov`;
@@ -50,12 +39,7 @@ export interface RenderSettings {
5039
workers?: number;
5140
logProgress?: boolean;
5241

53-
renderSettings: Partial<UserProjectSettings['shared']> &
54-
Partial<Omit<UserProjectSettings['rendering'], 'exporter'>> &
55-
Omit<
56-
UserProjectSettings['rendering'],
57-
'fps' | 'resolutionScale' | 'colorSpace'
58-
>;
42+
projectSettings?: RenderVideoUserProjectSettings;
5943

6044
/**
6145
* When using multiple workers, this is the port of the first worker.
@@ -74,6 +58,23 @@ export interface RenderSettings {
7458
progressCallback?: (worker: number, progress: number) => void;
7559
}
7660

61+
/**
62+
* We pass a lot of render settings to the client side of the renderer
63+
* via the URL. This function builds the URL with the necessary parameters.
64+
*/
65+
function buildUrl(
66+
port: number,
67+
fileName: string,
68+
workerId: number,
69+
totalNumOfWorkers: number,
70+
hiddenFolderId: string,
71+
) {
72+
const fileNameEscaped = encodeURIComponent(fileName);
73+
const hiddenFolderIdEscaped = encodeURIComponent(hiddenFolderId);
74+
75+
return `http://localhost:${port}/render?fileName=${fileNameEscaped}&workerId=${workerId}&totalNumOfWorkers=${totalNumOfWorkers}&hiddenFolderId=${hiddenFolderIdEscaped}`;
76+
}
77+
7778
/**
7879
* Starts the vite server and creates a puppeteer browser instance
7980
*/
@@ -95,10 +96,10 @@ async function initBrowserAndServer(
9596
plugins: [
9697
motionCanvas({project: resolvedProjectPath, output: outputFolderName}),
9798
rendererPlugin(
99+
getRenderVideoUserProjectSettingsDefault(settings.projectSettings),
98100
variables,
99101
settings.ffmpeg,
100102
projectFile,
101-
settings.renderSettings,
102103
),
103104
],
104105
...settings.viteConfig,
@@ -367,20 +368,20 @@ async function cleanup(
367368
await Promise.all([...folderCleanupPromises, ...fileCleanupPromises]);
368369
}
369370

370-
interface RenderVideoParams {
371-
projectFile: string;
372-
variables?: Record<string, unknown>;
373-
settings?: RenderSettings;
374-
}
375-
376371
const defaultSettings: RenderSettings = {
377-
renderSettings: {
372+
projectSettings: {
378373
exporter: {
379374
name: '@revideo/core/wasm',
380375
},
381376
},
382377
};
383378

379+
interface RenderVideoParams {
380+
projectFile: string;
381+
variables?: Record<string, unknown>;
382+
settings?: RenderSettings;
383+
}
384+
384385
/**
385386
* Renders a video to a file.
386387
* @param projectFile - Path to the project.ts file.

packages/renderer/server/renderer-plugin.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import {RenderVideoUserProjectSettings} from '@revideo/core';
12
import {FfmpegSettings, ffmpegSettings} from '@revideo/ffmpeg';
23
import * as fs from 'fs';
34
import * as path from 'path';
4-
import {RenderSettings} from 'render-video';
55
import {Plugin} from 'vite';
66

77
const RendererPath = path.resolve(__dirname, '../renderer.html');
@@ -31,10 +31,10 @@ function escapeSpecialChars(_: string, value: string) {
3131
}
3232

3333
export function rendererPlugin(
34+
projectSettings: Required<RenderVideoUserProjectSettings>,
3435
variables?: Record<string, unknown>,
3536
customFfmpegSettings?: FfmpegSettings,
3637
projectFile?: string,
37-
projectRenderSettings?: RenderSettings['renderSettings'],
3838
): Plugin {
3939
if (customFfmpegSettings?.ffmpegPath) {
4040
ffmpegSettings.setFfmpegPath(customFfmpegSettings.ffmpegPath);
@@ -46,8 +46,8 @@ export function rendererPlugin(
4646
ffmpegSettings.setLogLevel(customFfmpegSettings.ffmpegLogLevel);
4747
}
4848

49-
const projectRenderSettingsString = projectRenderSettings
50-
? JSON.stringify(projectRenderSettings)
49+
const projectSettingsString = projectSettings
50+
? JSON.stringify(projectSettings)
5151
: JSON.stringify({});
5252

5353
return {
@@ -77,7 +77,7 @@ export function rendererPlugin(
7777
// Overwrite project name so that the rendered videos don't overwrite each other
7878
project.name = fileName;
7979
80-
render(project, workerId, totalNumOfWorkers, hiddenFolderId, JSON.parse(\`${projectRenderSettingsString}\`));
80+
render(project, workerId, totalNumOfWorkers, hiddenFolderId, JSON.parse(\`${projectSettingsString}\`));
8181
`;
8282
}
8383
},

0 commit comments

Comments
 (0)