diff --git a/.claude/commands/release.md b/.claude/commands/release.md index eb1047129b4..5857fe996ee 100644 --- a/.claude/commands/release.md +++ b/.claude/commands/release.md @@ -8,3 +8,11 @@ - Check `https://www.npmjs.com/package/remotion` to get the current version number - Run `bun set-version.ts `, where is the current version plus 1 - Run `NPM_CONFIG_TOKEN= bun run release` where is the NPM token we just created +- Generate a changelog in markdown and save it to `/tmp/release-.md`: + - Run `git log v..v --oneline` to get all commits + - Extract PR numbers from merge commits + - For each PR, run `gh pr view --json title,author,number,url --jq '"* \(.title) by @\(.author.login) in \(.url)"'` + - Categorize PRs into sections: "What's Changed" (features, fixes, improvements), "Internal" (dependency upgrades, tooling, infra), "Docs" (documentation changes), "Templates" (template changes) + - Check for new contributors by comparing authors against known contributors + - Add `**Full Changelog**: https://github.com/remotion-dev/remotion/compare/v...v` at the bottom + - Use the same format as previous GitHub releases (check with `gh release view v`) diff --git a/.claude/skills/add-cli-option/SKILL.md b/.claude/skills/add-cli-option/SKILL.md index 6d9f2ca5bf8..cf649cc87f8 100644 --- a/.claude/skills/add-cli-option/SKILL.md +++ b/.claude/skills/add-cli-option/SKILL.md @@ -75,17 +75,19 @@ For Studio options, this is typically in `packages/cli/src/studio.ts`. For rende - Add the setter signature to the `FlatConfig` type (either in the `RemotionConfigObject` global interface or the `FlatConfig` intersection) - Add the implementation to the `Config` object: `setMyFlagEnabled: myFlagOption.setConfig` -## 6. Update docs +## 6. Update docs — IMPORTANT, do not skip this step -In the relevant CLI command page: +**This step is mandatory.** Every new option must have its docs updated to use `` so the description is pulled from the option definition automatically (single source of truth). If converting an existing hardcoded flag, replace any hand-written description with the `` component. -- Add a `### \`--my-flag\`` section -- Use `` to pull the description from the option definition automatically -- The `id` matches the option's `cliFlag` value +**CLI command pages** (check all that apply — `cli/render.mdx`, `lambda/cli/render.mdx`, `cloudrun/cli/render.mdx`, `cli/benchmark.mdx`): + +- Add or update the `### \`--my-flag\`` section +- Use `` as the description body (no import needed — it's globally available) +- The `id` must match the option's `cliFlag` / `id` value **`packages/docs/docs/config.mdx`**: -- Add a `## \`setMyFlagEnabled()\`` section with: +- Add or update the `## \`setMyFlagEnabled()\`` section with: - `` for the description - A twoslash config example - A note that the CLI flag takes precedence diff --git a/bun.lock b/bun.lock index fdaea9ed43f..7361162aedf 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,7 @@ }, "packages/animated-emoji": { "name": "@remotion/animated-emoji", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -33,7 +33,7 @@ }, "packages/animation-utils": { "name": "@remotion/animation-utils", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -49,7 +49,7 @@ }, "packages/astro-example": { "name": "@remotion/astro-example", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@astrojs/react": "4.0.0", "@remotion/gif": "workspace:*", @@ -68,7 +68,7 @@ }, "packages/babel-loader": { "name": "@remotion/babel-loader", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@babel/core": "7.23.2", "@babel/plugin-proposal-class-properties": "7.14.5", @@ -92,7 +92,7 @@ }, "packages/bundler": { "name": "@remotion/bundler", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/media-parser": "workspace:*", "@remotion/studio": "workspace:*", @@ -119,7 +119,7 @@ }, "packages/captions": { "name": "@remotion/captions", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -128,7 +128,7 @@ }, "packages/cli": { "name": "@remotion/cli", - "version": "4.0.423", + "version": "4.0.424", "bin": { "remotion": "remotion-cli.js", "remotionb": "remotionb-cli.js", @@ -170,7 +170,7 @@ }, "packages/cloudrun": { "name": "@remotion/cloudrun", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@google-cloud/artifact-registry": "3.5.1", "@google-cloud/functions-framework": "3.4.6", @@ -196,39 +196,39 @@ }, "packages/compositor": { "name": "@remotion/compositor", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-darwin-arm64": { "name": "@remotion/compositor-darwin-arm64", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-darwin-x64": { "name": "@remotion/compositor-darwin-x64", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-linux-arm64-gnu": { "name": "@remotion/compositor-linux-arm64-gnu", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-linux-arm64-musl": { "name": "@remotion/compositor-linux-arm64-musl", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-linux-x64-gnu": { "name": "@remotion/compositor-linux-x64-gnu", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-linux-x64-musl": { "name": "@remotion/compositor-linux-x64-musl", - "version": "4.0.423", + "version": "4.0.424", }, "packages/compositor-win32-x64-msvc": { "name": "@remotion/compositor-win32-x64-msvc", - "version": "4.0.423", + "version": "4.0.424", }, "packages/convert": { "name": "@remotion/convert", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@mediabunny/mp3-encoder": "catalog:", "@mediafox/core": "^1.0.4", @@ -284,7 +284,7 @@ }, "packages/core": { "name": "remotion", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@happy-dom/global-registrator": "14.5.1", "@remotion/eslint-config-internal": "workspace:*", @@ -306,7 +306,7 @@ }, "packages/create-video": { "name": "create-video", - "version": "4.0.423", + "version": "4.0.424", "bin": { "create-video": "bin.js", }, @@ -329,7 +329,7 @@ }, "packages/design": { "name": "@remotion/design", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@radix-ui/react-select": "2.1.1", "@radix-ui/react-tabs": "^1.1.0", @@ -358,11 +358,11 @@ }, "packages/discord-poster": { "name": "@remotion/discord-poster", - "version": "4.0.423", + "version": "4.0.424", }, "packages/docs": { "name": "docs", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@algora/sdk": "^0.1.2", "@aws-sdk/s3-request-presigner": "catalog:", @@ -472,7 +472,7 @@ }, "packages/docusaurus-plugin": { "name": "@remotion/docusaurus-plugin", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@docusaurus/types": "3.6.0", "@types/dom-webcodecs": "catalog:", @@ -491,7 +491,7 @@ }, "packages/enable-scss": { "name": "@remotion/enable-scss", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "css-loader": "5.2.7", "sass-loader": "14.2.1", @@ -509,7 +509,7 @@ }, "packages/eslint-config": { "name": "@remotion/eslint-config", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/eslint-plugin": "workspace:*", @@ -526,7 +526,7 @@ }, "packages/eslint-config-flat": { "name": "@remotion/eslint-config-flat", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "typescript-eslint": "8.21.0", }, @@ -545,7 +545,7 @@ }, "packages/eslint-config-internal": { "name": "@remotion/eslint-config-internal", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@eslint/compat": "1.2.2", "@eslint/eslintrc": "3.1.0", @@ -564,7 +564,7 @@ }, "packages/eslint-plugin": { "name": "@remotion/eslint-plugin", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@typescript-eslint/utils": "5.19.0", }, @@ -579,7 +579,7 @@ }, "packages/example": { "name": "@remotion/example", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@mdx-js/loader": "^2.3.0", "@mdx-js/react": "^2.3.0", @@ -663,7 +663,7 @@ }, "packages/example-videos": { "name": "@remotion/example-videos", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -673,7 +673,7 @@ }, "packages/example-without-zod": { "name": "@remotion/example-without-zod", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/cli": "workspace:*", "react": "catalog:", @@ -683,7 +683,7 @@ }, "packages/fonts": { "name": "@remotion/fonts", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -695,7 +695,7 @@ }, "packages/gif": { "name": "@remotion/gif", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -715,7 +715,7 @@ }, "packages/google-fonts": { "name": "@remotion/google-fonts", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -729,7 +729,7 @@ }, "packages/install-whisper-cpp": { "name": "@remotion/install-whisper-cpp", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -741,7 +741,7 @@ }, "packages/it-tests": { "name": "@remotion/it-tests", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/bundler": "workspace:*", "@remotion/captions": "workspace:*", @@ -783,7 +783,7 @@ }, "packages/lambda": { "name": "@remotion/lambda", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@aws-sdk/client-cloudwatch-logs": "catalog:", "@aws-sdk/client-iam": "catalog:", @@ -826,7 +826,7 @@ }, "packages/lambda-client": { "name": "@remotion/lambda-client", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@aws-sdk/client-cloudwatch-logs": "catalog:", "@aws-sdk/client-iam": "catalog:", @@ -850,25 +850,25 @@ }, "packages/lambda-go": { "name": "@remotion/lambda-go", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "remotion": "workspace:*", }, }, "packages/lambda-go-example": { "name": "@remotion/lambda-go-example", - "version": "4.0.423", + "version": "4.0.424", }, "packages/lambda-php": { "name": "@remotion/lambda-php", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "remotion": "workspace:*", }, }, "packages/lambda-python": { "name": "@remotion/lambda-python", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "dotenv": "17.3.1", }, @@ -878,14 +878,14 @@ }, "packages/lambda-ruby": { "name": "@remotion/lambda-ruby", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "remotion": "workspace:*", }, }, "packages/layout-utils": { "name": "@remotion/layout-utils", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -894,7 +894,7 @@ }, "packages/licensing": { "name": "@remotion/licensing", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -905,7 +905,7 @@ }, "packages/light-leaks": { "name": "@remotion/light-leaks", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -923,7 +923,7 @@ }, "packages/lottie": { "name": "@remotion/lottie", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -943,7 +943,7 @@ }, "packages/mcp": { "name": "@remotion/mcp", - "version": "4.0.423", + "version": "4.0.424", "bin": { "remotion-mcp": "./dist/esm/index.mjs", }, @@ -960,7 +960,7 @@ }, "packages/media": { "name": "@remotion/media", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@mediabunny/ac3": "catalog:", "mediabunny": "catalog:", @@ -983,7 +983,7 @@ }, "packages/media-parser": { "name": "@remotion/media-parser", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/example-videos": "workspace:*", @@ -996,7 +996,7 @@ }, "packages/media-utils": { "name": "@remotion/media-utils", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/media-parser": "workspace:*", "@remotion/webcodecs": "workspace:*", @@ -1015,7 +1015,7 @@ }, "packages/motion-blur": { "name": "@remotion/motion-blur", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -1034,7 +1034,7 @@ }, "packages/noise": { "name": "@remotion/noise", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", "simplex-noise": "4.0.1", @@ -1047,7 +1047,7 @@ }, "packages/openai-whisper": { "name": "@remotion/openai-whisper", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -1060,7 +1060,7 @@ }, "packages/paths": { "name": "@remotion/paths", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1069,7 +1069,7 @@ }, "packages/player": { "name": "@remotion/player", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -1092,7 +1092,7 @@ }, "packages/player-example": { "name": "@remotion/player-example", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/bundler": "workspace:*", "@remotion/eslint-config-flat": "workspace:*", @@ -1113,7 +1113,7 @@ }, "packages/preload": { "name": "@remotion/preload", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1122,7 +1122,7 @@ }, "packages/promo-pages": { "name": "@remotion/promo-pages", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@mux/upchunk": "^3.5.0", "@remotion/animated-emoji": "workspace:*", @@ -1161,7 +1161,7 @@ }, "packages/react18-tests": { "name": "@remotion/react18-tests", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -1188,7 +1188,7 @@ }, "packages/renderer": { "name": "@remotion/renderer", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/licensing": "workspace:*", "@remotion/streaming": "workspace:*", @@ -1227,7 +1227,7 @@ }, "packages/rive": { "name": "@remotion/rive", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@rive-app/canvas-advanced": "2.31.5", "remotion": "workspace:*", @@ -1246,7 +1246,7 @@ }, "packages/rounded-text-box": { "name": "@remotion/rounded-text-box", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/layout-utils": "workspace:*", "@remotion/paths": "workspace:*", @@ -1259,7 +1259,7 @@ }, "packages/serverless": { "name": "@remotion/serverless", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/bundler": "workspace:*", "@remotion/licensing": "workspace:*", @@ -1274,7 +1274,7 @@ }, "packages/serverless-client": { "name": "@remotion/serverless-client", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/renderer": "workspace:*", @@ -1286,7 +1286,7 @@ }, "packages/shapes": { "name": "@remotion/shapes", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/paths": "workspace:*", }, @@ -1306,7 +1306,7 @@ }, "packages/skia": { "name": "@remotion/skia", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -1330,7 +1330,7 @@ }, "packages/skills": { "name": "@remotion/skills", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/bundler": "workspace:*", "@remotion/cli": "workspace:*", @@ -1348,7 +1348,7 @@ }, "packages/streaming": { "name": "@remotion/streaming", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1357,7 +1357,7 @@ }, "packages/studio": { "name": "@remotion/studio", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/media-utils": "workspace:*", "@remotion/player": "workspace:*", @@ -1388,7 +1388,7 @@ }, "packages/studio-server": { "name": "@remotion/studio-server", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@babel/parser": "7.24.1", "@remotion/bundler": "workspace:*", @@ -1414,7 +1414,7 @@ }, "packages/studio-shared": { "name": "@remotion/studio-shared", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -1427,7 +1427,7 @@ }, "packages/svg-3d-engine": { "name": "@remotion/svg-3d-engine", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/paths": "workspace:*", }, @@ -1439,7 +1439,7 @@ }, "packages/tailwind": { "name": "@remotion/tailwind", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "autoprefixer": "10.4.20", "css-loader": "5.2.7", @@ -1462,7 +1462,7 @@ }, "packages/tailwind-v4": { "name": "@remotion/tailwind-v4", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@tailwindcss/postcss": "4.1.1", "css-loader": "5.2.7", @@ -1506,7 +1506,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1524,7 +1524,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1550,7 +1550,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1570,7 +1570,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1587,7 +1587,7 @@ "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", }, }, "packages/template-music-visualization": { @@ -1599,7 +1599,7 @@ "@remotion/media": "workspace:*", "@remotion/media-utils": "workspace:*", "@remotion/zod-types": "workspace:*", - "mediabunny": "1.34.2", + "mediabunny": "1.34.4", "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", @@ -1610,7 +1610,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1646,7 +1646,7 @@ "dotenv": "17.3.1", "eslint": "9.19.0", "eslint-config-next": "15.1.6", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", "typescript-eslint": "8.46.0", }, @@ -1688,7 +1688,7 @@ "eslint": "9.19.0", "eslint-config-next": "15.1.6", "postcss": "8.4.47", - "prettier": "3.6.0", + "prettier": "3.8.1", "tailwindcss": "4.0.3", "typescript": "5.9.3", "typescript-eslint": "8.46.0", @@ -1725,7 +1725,7 @@ "dotenv": "17.3.1", "eslint": "9.19.0", "eslint-config-next": "15.1.6", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", "typescript-eslint": "8.46.0", }, @@ -1745,7 +1745,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -1808,7 +1808,7 @@ "eslint": "9.19.0", "eslint-config-next": "15.1.6", "postcss": "8.4.47", - "prettier": "3.6.0", + "prettier": "3.8.1", "raw-loader": "^4.0.2", "tailwindcss": "4.0.3", "tw-animate-css": "1.4.0", @@ -1843,7 +1843,7 @@ "dotenv": "17.3.1", "eslint": "9.19.0", "ora": "^9.0.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "prompts": "^2.4.2", "tsx": "^4.20.6", "typescript": "5.9.3", @@ -1887,7 +1887,7 @@ "@types/react-dom": "19.2.3", "dotenv": "17.3.1", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", }, @@ -1923,7 +1923,7 @@ "connect": "3.7.0", "eslint": "9.19.0", "lucide-react": "0.516.0", - "mediabunny": "1.34.2", + "mediabunny": "1.34.4", "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", @@ -1944,7 +1944,7 @@ "@vitejs/plugin-react-swc": "3.0.0", "autoprefixer": "10.4.16", "postcss": "8.4.31", - "prettier": "3.6.0", + "prettier": "3.8.1", "prettier-plugin-organize-imports": "3.2.3", "tailwindcss": "3.3.5", "typescript": "5.9.3", @@ -1972,7 +1972,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", }, @@ -1995,7 +1995,7 @@ "@types/dom-webcodecs": "0.1.11", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -2015,7 +2015,7 @@ "@remotion/eslint-config-flat": "workspace:*", "@types/react": "19.2.7", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -2046,7 +2046,7 @@ "@remotion/eslint-config-flat": "workspace:*", "bun": "1.3.3", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -2059,7 +2059,7 @@ "@remotion/media": "workspace:*", "@remotion/three": "workspace:*", "@remotion/zod-types": "workspace:*", - "mediabunny": "1.34.2", + "mediabunny": "1.34.4", "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", @@ -2072,7 +2072,7 @@ "@types/three": "0.170.0", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -2097,7 +2097,7 @@ "@types/react": "19.2.7", "@types/web": "0.0.166", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "typescript": "5.9.3", }, }, @@ -2122,7 +2122,7 @@ "@types/node": "20.12.14", "@types/react": "19.2.7", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", "zod": "3.22.3", @@ -2156,7 +2156,7 @@ "@types/node": "20.12.14", "@types/react": "19.2.7", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", }, @@ -2201,7 +2201,7 @@ "eslint": "9.19.0", "eslint-config-next": "15.1.6", "postcss": "8.4.47", - "prettier": "3.6.0", + "prettier": "3.8.1", "tailwindcss": "4.0.3", "turbo": "2.8.6", "typescript": "5.9.3", @@ -2210,7 +2210,7 @@ }, "packages/test-utils": { "name": "@remotion/test-utils", - "version": "4.0.423", + "version": "4.0.424", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -2222,7 +2222,7 @@ }, "packages/three": { "name": "@remotion/three", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -2249,7 +2249,7 @@ }, "packages/transitions": { "name": "@remotion/transitions", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/paths": "workspace:*", "@remotion/shapes": "workspace:*", @@ -2273,9 +2273,8 @@ }, "packages/web-renderer": { "name": "@remotion/web-renderer", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { - "@mediabunny/ac3": "catalog:", "@remotion/licensing": "workspace:*", "mediabunny": "catalog:", "remotion": "workspace:*", @@ -2306,7 +2305,7 @@ }, "packages/webcodecs": { "name": "@remotion/webcodecs", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/media-parser": "workspace:*", }, @@ -2323,7 +2322,7 @@ }, "packages/whisper-web": { "name": "@remotion/whisper-web", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -2335,7 +2334,7 @@ }, "packages/zod-types": { "name": "@remotion/zod-types", - "version": "4.0.423", + "version": "4.0.424", "dependencies": { "remotion": "workspace:*", }, @@ -2365,8 +2364,8 @@ "@aws-sdk/lib-storage": "3.986.0", "@aws-sdk/middleware-flexible-checksums": "3.972.5", "@aws-sdk/s3-request-presigner": "3.986.0", - "@mediabunny/ac3": "1.34.3", - "@mediabunny/mp3-encoder": "1.34.3", + "@mediabunny/ac3": "1.34.4", + "@mediabunny/mp3-encoder": "1.34.4", "@react-three/fiber": "9.2.0", "@types/bun": "1.3.3", "@types/dom-webcodecs": "0.1.11", @@ -2379,11 +2378,11 @@ "@vitejs/plugin-react": "4.1.0", "@vitest/browser-playwright": "4.0.9", "eslint": "9.19.0", - "mediabunny": "1.34.3", + "mediabunny": "1.34.4", "next": "16.1.5", "openai": "4.67.1", "playwright": "1.55.1", - "prettier": "3.6.0", + "prettier": "3.8.1", "react": "19.2.3", "react-dom": "19.2.3", "sharp": "0.34.5", @@ -3304,9 +3303,9 @@ "@mdx-js/react": ["@mdx-js/react@2.3.0", "", { "dependencies": { "@types/mdx": "2.0.5", "@types/react": "19.0.0" }, "peerDependencies": { "react": "19.0.0" } }, "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g=="], - "@mediabunny/ac3": ["@mediabunny/ac3@1.34.3", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-YpQN7dOQHbA3DX7Qt5DoWLcf8LDIHzO3i5jrl++GoCCbQQykS7L3Ea66oCKZCqlX42kLZhavPOgd0OXGFf+dEQ=="], + "@mediabunny/ac3": ["@mediabunny/ac3@1.34.4", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-x8mt6jbBl5iEIPPrKdhV9Ui3PnSv+jrtRekbWjdh4FYGwlqvLxko1HQgCSg8sCt/5da0A4XsfYI3X/CpL0heCg=="], - "@mediabunny/mp3-encoder": ["@mediabunny/mp3-encoder@1.34.3", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-be3vYjGKSWRzKMfajGbdej6IjEE7fLHIONbOy9jhUO+57OF8ZCVH3SpG6zEuyZdnsJonEVqnyBkQkchHB2Q+Fg=="], + "@mediabunny/mp3-encoder": ["@mediabunny/mp3-encoder@1.34.4", "", { "peerDependencies": { "mediabunny": "^1.0.0" } }, "sha512-k3DiqwSfjsX5WKqNgiGSqF90HPbHQ4qt8vaFRQloVwzIpvV+q5ivXpq0TEFMAzsRJKSKrRPYDiSJu7EdRui09g=="], "@mediafox/core": ["@mediafox/core@1.0.4", "", { "peerDependencies": { "mediabunny": "^1.23.0", "typescript": ">=5.0.0" } }, "sha512-1j8PKp835RUVzZt1vcymrgZqhaMobfP7SswbTisusvTgIZL8y5n2QFhSCnn7dze+a53VgnWyzkHOYdtVR1Gdew=="], @@ -6218,7 +6217,7 @@ "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], - "mediabunny": ["mediabunny@1.34.3", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-Jb0x3jyvadGVpo8aZSn53NZduPbPdbx9foQsAGOmKBz7Hai9B38Kf+7eXbxXFcXoXxcTyNaZeDhoA0agoBQldA=="], + "mediabunny": ["mediabunny@1.34.4", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-f1B95A60YoCsZQO/JQYxPDorybEz2Sjasf4RrpwGSMmJW6JVyhI/iJDri9LF6kk5WwUovF8oiTvRNM6xGjWo5w=="], "memfs": ["memfs@3.4.3", "", { "dependencies": { "fs-monkey": "1.0.3" } }, "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg=="], @@ -6762,7 +6761,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.6.0", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], "prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@3.2.4", "", { "peerDependencies": { "prettier": "3.6.0", "typescript": "5.8.2" } }, "sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog=="], @@ -10446,8 +10445,6 @@ "template-ai-video/uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], - "template-music-visualization/mediabunny": ["mediabunny@1.34.2", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-Mr9VhiqH2RRwc3vR6rk8ca/58HhstP+c25PjtZmZvmCw21ibWSNqpinvBREfJmY+hpNGnG9dUmbJ4WqLMDWO0g=="], - "template-next-app/@eslint/js": ["@eslint/js@9.38.0", "", {}, "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A=="], "template-next-app/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/type-utils": "8.46.0", "@typescript-eslint/utils": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA=="], @@ -10526,8 +10523,6 @@ "template-recorder/lucide-react": ["lucide-react@0.516.0", "", { "peerDependencies": { "react": "19.0.0" } }, "sha512-aybBJzLHcw1CIn3rUcRkztB37dsJATtpffLNX+0/w+ws2p21nYIlOwX/B5fqxq8F/BjqVemnJX8chKwRidvROg=="], - "template-recorder/mediabunny": ["mediabunny@1.34.2", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-Mr9VhiqH2RRwc3vR6rk8ca/58HhstP+c25PjtZmZvmCw21ibWSNqpinvBREfJmY+hpNGnG9dUmbJ4WqLMDWO0g=="], - "template-recorder/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "3.3.11", "picocolors": "1.1.1", "source-map-js": "1.2.1" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "template-recorder/prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@3.2.3", "", { "peerDependencies": { "prettier": "3.6.0", "typescript": "5.8.2" } }, "sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg=="], @@ -10546,8 +10541,6 @@ "template-still/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "template-three/mediabunny": ["mediabunny@1.34.2", "", { "dependencies": { "@types/dom-mediacapture-transform": "^0.1.11", "@types/dom-webcodecs": "0.1.13" } }, "sha512-Mr9VhiqH2RRwc3vR6rk8ca/58HhstP+c25PjtZmZvmCw21ibWSNqpinvBREfJmY+hpNGnG9dUmbJ4WqLMDWO0g=="], - "template-tts-azure/tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "0.25.0", "get-tsconfig": "4.8.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], "template-tts-google/@types/express": ["@types/express@4.17.13", "", { "dependencies": { "@types/body-parser": "1.19.1", "@types/express-serve-static-core": "4.17.35", "@types/qs": "6.9.7", "@types/serve-static": "1.13.10" } }, "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA=="], @@ -13432,8 +13425,6 @@ "teeny-request/https-proxy-agent/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "template-music-visualization/mediabunny/@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.13", "", {}, "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ=="], - "template-next-app-tailwind/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="], "template-next-app-tailwind/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg=="], @@ -13644,8 +13635,6 @@ "template-recorder/lucide-react/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], - "template-recorder/mediabunny/@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.13", "", {}, "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ=="], - "template-recorder/tailwindcss/postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "3.3.11", "picocolors": "1.1.1", "source-map-js": "1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], "template-recorder/tailwindcss/resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "2.15.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], @@ -13682,8 +13671,6 @@ "template-still/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "template-three/mediabunny/@types/dom-webcodecs": ["@types/dom-webcodecs@0.1.13", "", {}, "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ=="], - "template-tts-google/@types/express/@types/serve-static": ["@types/serve-static@1.13.10", "", { "dependencies": { "@types/mime": "1.3.2", "@types/node": "20.12.14" } }, "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ=="], "template-vercel/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="], diff --git a/package.json b/package.json index c4b50a24d23..af9afc16d5a 100644 --- a/package.json +++ b/package.json @@ -94,16 +94,16 @@ "react": "19.2.3", "react-dom": "19.2.3", "eslint": "9.19.0", - "prettier": "3.6.0", + "prettier": "3.8.1", "zod": "3.22.3", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", "@types/node": "20.12.14", "@types/web": "0.0.166", "@types/bun": "1.3.3", - "mediabunny": "1.34.3", - "@mediabunny/mp3-encoder": "1.34.3", - "@mediabunny/ac3": "1.34.3", + "mediabunny": "1.34.4", + "@mediabunny/mp3-encoder": "1.34.4", + "@mediabunny/ac3": "1.34.4", "next": "16.1.5", "three": "0.178.0", "sharp": "0.34.5", diff --git a/packages/animated-emoji/package.json b/packages/animated-emoji/package.json index a1a6df99f1a..0cdbedcca6c 100644 --- a/packages/animated-emoji/package.json +++ b/packages/animated-emoji/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/animated-emoji", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/animation-utils/package.json b/packages/animation-utils/package.json index 807b0eda3ff..416716e95f7 100644 --- a/packages/animation-utils/package.json +++ b/packages/animation-utils/package.json @@ -7,7 +7,7 @@ "name": "Chetan Karwa", "email": "cbkarwa@gmail.com" }, - "version": "4.0.423", + "version": "4.0.424", "description": "Helpers for animating CSS properties", "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/packages/astro-example/package.json b/packages/astro-example/package.json index d6c2a3407a5..f2405143ccb 100644 --- a/packages/astro-example/package.json +++ b/packages/astro-example/package.json @@ -5,7 +5,7 @@ "name": "@remotion/astro-example", "private": true, "type": "module", - "version": "4.0.423", + "version": "4.0.424", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/babel-loader/package.json b/packages/babel-loader/package.json index 2c1b53673fe..481ca431c91 100644 --- a/packages/babel-loader/package.json +++ b/packages/babel-loader/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/babel-loader" }, "name": "@remotion/babel-loader", - "version": "4.0.423", + "version": "4.0.424", "description": "Babel loader for Remotion", "main": "dist/index.js", "scripts": { diff --git a/packages/bugs/package.json b/packages/bugs/package.json index a85d659014f..d1256ac02bf 100644 --- a/packages/bugs/package.json +++ b/packages/bugs/package.json @@ -4,5 +4,5 @@ }, "name": "bugs", "private": true, - "version": "4.0.423" + "version": "4.0.424" } diff --git a/packages/bundler/package.json b/packages/bundler/package.json index bf147929730..063aff9937e 100644 --- a/packages/bundler/package.json +++ b/packages/bundler/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/bundler" }, "name": "@remotion/bundler", - "version": "4.0.423", + "version": "4.0.424", "description": "Bundle Remotion compositions using Webpack", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/captions/package.json b/packages/captions/package.json index 0f4f399a82b..58977912d88 100644 --- a/packages/captions/package.json +++ b/packages/captions/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/captions" }, "name": "@remotion/captions", - "version": "4.0.423", + "version": "4.0.424", "description": "Primitives for dealing with captions", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cli/package.json b/packages/cli/package.json index 645b4a4e415..39114eeb681 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cli" }, "name": "@remotion/cli", - "version": "4.0.423", + "version": "4.0.424", "description": "Control Remotion features using the `npx remotion` command", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cli/src/benchmark.ts b/packages/cli/src/benchmark.ts index 05187e26b61..5f27032ff2c 100644 --- a/packages/cli/src/benchmark.ts +++ b/packages/cli/src/benchmark.ts @@ -60,6 +60,8 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + pixelFormatOption, + browserExecutableOption, } = BrowserSafeApis.options; const getValidConcurrency = (cliConcurrency: number | string | null) => { @@ -200,10 +202,8 @@ export const benchmarkCommand = async ( const { inputProps, envVariables, - browserExecutable, proResProfile, frameRange: defaultFrameRange, - pixelFormat, everyNthFrame, ffmpegOverride, height, @@ -218,6 +218,13 @@ export const benchmarkCommand = async ( indent: false, }); + const pixelFormat = pixelFormatOption.getValue({ + commandLine: parsedCli, + }).value; + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; + Log.verbose( {indent: false, logLevel}, 'Entry point:', diff --git a/packages/cli/src/browser/ensure.ts b/packages/cli/src/browser/ensure.ts index 68535721d80..61dc7ca6493 100644 --- a/packages/cli/src/browser/ensure.ts +++ b/packages/cli/src/browser/ensure.ts @@ -1,20 +1,20 @@ import type {LogLevel} from '@remotion/renderer'; import {ensureBrowser} from '@remotion/renderer'; +import {BrowserSafeApis} from '@remotion/renderer/client'; import {defaultBrowserDownloadProgress} from '../browser-download-bar'; -import {getCliOptions} from '../get-cli-options'; import {Log} from '../log'; -import {quietFlagProvided} from '../parsed-cli'; +import {parsedCli, quietFlagProvided} from '../parsed-cli'; + +const {browserExecutableOption} = BrowserSafeApis.options; export const ENSURE_COMMAND = 'ensure'; export const ensureCommand = async (logLevel: LogLevel) => { const indent = false; - const {browserExecutable} = getCliOptions({ - isStill: false, - logLevel, - indent, - }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const status = await ensureBrowser({ browserExecutable, diff --git a/packages/cli/src/compositions.ts b/packages/cli/src/compositions.ts index 481ec206c3a..1ead340f8d9 100644 --- a/packages/cli/src/compositions.ts +++ b/packages/cli/src/compositions.ts @@ -29,6 +29,7 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + browserExecutableOption, } = BrowserSafeApis.options; export const listCompositionsCommand = async ( @@ -68,7 +69,6 @@ export const listCompositionsCommand = async ( ); const { - browserExecutable, envVariables, inputProps, ignoreCertificateErrors, @@ -80,6 +80,9 @@ export const listCompositionsCommand = async ( indent: false, }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const publicPath = publicPathOption.getValue({commandLine: parsedCli}).value; const timeoutInMilliseconds = delayRenderTimeoutInMillisecondsOption.getValue( { diff --git a/packages/cli/src/config/image-format.ts b/packages/cli/src/config/image-format.ts deleted file mode 100644 index 8a1ecb01eeb..00000000000 --- a/packages/cli/src/config/image-format.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type {StillImageFormat, VideoImageFormat} from '@remotion/renderer'; -import {RenderInternals} from '@remotion/renderer'; -import {truthy} from '../truthy'; - -let currentStillImageFormat: StillImageFormat | undefined; -let currentVideoImageFormat: VideoImageFormat | undefined; - -export const setStillImageFormat = (format: StillImageFormat) => { - if (typeof format === 'undefined') { - currentStillImageFormat = undefined; - return; - } - - if (!RenderInternals.validStillImageFormats.includes(format)) { - throw new TypeError( - [ - `Value ${format} is not valid as an image format.`, - // @ts-expect-error - format === 'jpg' ? 'Did you mean "jpeg"?' : null, - ] - .filter(truthy) - .join(' '), - ); - } - - currentStillImageFormat = format; -}; - -export const setVideoImageFormat = (format: VideoImageFormat) => { - if (typeof format === 'undefined') { - currentVideoImageFormat = undefined; - return; - } - - if (!RenderInternals.validVideoImageFormats.includes(format)) { - throw new TypeError( - [ - `Value ${format} is not valid as a video image format.`, - // @ts-expect-error - format === 'jpg' ? 'Did you mean "jpeg"?' : null, - ] - .filter(truthy) - .join(' '), - ); - } - - currentVideoImageFormat = format; -}; - -export const getUserPreferredStillImageFormat = () => { - return currentStillImageFormat; -}; - -export const getUserPreferredVideoImageFormat = () => { - return currentVideoImageFormat; -}; diff --git a/packages/cli/src/config/index.ts b/packages/cli/src/config/index.ts index 8cd755dbc74..4bd93e47209 100644 --- a/packages/cli/src/config/index.ts +++ b/packages/cli/src/config/index.ts @@ -1,5 +1,4 @@ import {getBrowser} from './browser'; -import {getBrowserExecutable} from './browser-executable'; import { getChromiumDisableWebSecurity, getIgnoreCertificateErrors, @@ -7,19 +6,12 @@ import { import {getConcurrency} from './concurrency'; import {getDotEnvLocation} from './env-file'; import {getRange, setFrameRangeFromCli} from './frame-range'; -import { - getUserPreferredStillImageFormat, - getUserPreferredVideoImageFormat, - setStillImageFormat, - setVideoImageFormat, -} from './image-format'; import {getShouldOutputImageSequence} from './image-sequence'; import {getOutputLocation} from './output-location'; import { defaultOverrideFunction, getWebpackOverrideFn, } from './override-webpack'; -import {getPixelFormat} from './pixel-format'; import { getRendererPortFromConfigFile, getRendererPortFromConfigFileAndCliFlag, @@ -45,7 +37,6 @@ import type { import type {HardwareAccelerationOption} from '@remotion/renderer/client'; import {BrowserSafeApis} from '@remotion/renderer/client'; import {StudioServerInternals} from '@remotion/studio-server'; -import {setBrowserExecutable} from './browser-executable'; import { getBufferStateDelayInMilliseconds, setBufferStateDelayInMilliseconds, @@ -71,7 +62,6 @@ import {getShouldOpenBrowser, setShouldOpenBrowser} from './open-browser'; import {setOutputLocation} from './output-location'; import type {WebpackOverrideFn} from './override-webpack'; import {overrideWebpackConfig} from './override-webpack'; -import {setPixelFormat} from './pixel-format'; import {setPort, setRendererPort, setStudioPort} from './preview-server'; import {setProResProfile} from './prores-profile'; import {getChromiumUserAgent, setChromiumUserAgent} from './user-agent'; @@ -130,6 +120,10 @@ const { forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, + pixelFormatOption, + browserExecutableOption, + stillImageFormatOption, + videoImageFormatOption, } = BrowserSafeApis.options; declare global { @@ -667,7 +661,7 @@ export const Config: FlatConfig = { setPublicDir: publicDirOption.setConfig, setEntryPoint, setLevel: logLevelOption.setConfig, - setBrowserExecutable, + setBrowserExecutable: browserExecutableOption.setConfig, setTimeoutInMilliseconds: delayRenderTimeoutInMillisecondsOption.setConfig, setDelayRenderTimeoutInMilliseconds: delayRenderTimeoutInMillisecondsOption.setConfig, @@ -691,8 +685,8 @@ export const Config: FlatConfig = { ); }, setJpegQuality: jpegQualityOption.setConfig, - setStillImageFormat, - setVideoImageFormat, + setStillImageFormat: stillImageFormatOption.setConfig, + setVideoImageFormat: videoImageFormatOption.setConfig, setMetadata, setEncodingMaxRate: encodingMaxRateOption.setConfig, setEncodingBufferSize: encodingBufferSizeOption.setConfig, @@ -705,7 +699,7 @@ export const Config: FlatConfig = { setOutputLocation, setOverwriteOutput: overwriteOption.setConfig, setChromeMode: chromeModeOption.setConfig, - setPixelFormat, + setPixelFormat: pixelFormatOption.setConfig, setCodec: videoCodecOption.setConfig, setCrf: crfOption.setConfig, setImageSequence, @@ -744,9 +738,7 @@ export const Config: FlatConfig = { export const ConfigInternals = { getRange, getBrowser, - getPixelFormat, getProResProfile, - getBrowserExecutable, getStudioPort, getRendererPortFromConfigFile, getRendererPortFromConfigFileAndCliFlag, @@ -757,8 +749,6 @@ export const ConfigInternals = { getStillFrame, getShouldOutputImageSequence, getDotEnvLocation, - getUserPreferredStillImageFormat, - getUserPreferredVideoImageFormat, getWebpackOverrideFn, getWebpackCaching, getOutputLocation, diff --git a/packages/cli/src/determine-image-format.ts b/packages/cli/src/determine-image-format.ts index 6354f6c5cb5..51706305513 100644 --- a/packages/cli/src/determine-image-format.ts +++ b/packages/cli/src/determine-image-format.ts @@ -1,4 +1,7 @@ -import type {StillImageFormat, VideoImageFormat} from '@remotion/renderer'; +import type {StillImageFormat} from '@remotion/renderer'; +import {BrowserSafeApis} from '@remotion/renderer/client'; + +const {cliFlag} = BrowserSafeApis.options.stillImageFormatOption; const deriveExtensionFromFilename = ( filename: string | null, @@ -29,15 +32,13 @@ const deriveExtensionFromFilename = ( export const determineFinalStillImageFormat = ({ downloadName, outName, - configImageFormat, - cliFlag, + configuredImageFormat, isLambda, fromUi, }: { downloadName: string | null; outName: string | null; - configImageFormat: StillImageFormat | null; - cliFlag: StillImageFormat | VideoImageFormat | null; + configuredImageFormat: StillImageFormat | null; isLambda: boolean; fromUi: StillImageFormat | null; }): {format: StillImageFormat; source: string} => { @@ -61,9 +62,12 @@ export const determineFinalStillImageFormat = ({ } if (downloadNameExtension) { - if (cliFlag && downloadNameExtension !== cliFlag) { + if ( + configuredImageFormat && + downloadNameExtension !== configuredImageFormat + ) { throw new TypeError( - `Image format mismatch: ${downloadName} was given as the download name, but --image-format=${cliFlag} was passed. The image formats must match.`, + `Image format mismatch: ${downloadName} was given as the download name, but the image format "${configuredImageFormat}" was configured via --${cliFlag} or Config.setStillImageFormat(). The image formats must match.`, ); } @@ -71,34 +75,17 @@ export const determineFinalStillImageFormat = ({ } if (outNameExtension) { - if (cliFlag && outNameExtension !== cliFlag) { + if (configuredImageFormat && outNameExtension !== configuredImageFormat) { throw new TypeError( - `Image format mismatch: ${outName} was given as the ${outNameDescription}, but --image-format=${cliFlag} was passed. The image formats must match.`, + `Image format mismatch: ${outName} was given as the ${outNameDescription}, but the image format "${configuredImageFormat}" was configured via --${cliFlag} or Config.setStillImageFormat(). The image formats must match.`, ); } return {format: outNameExtension, source: 'Out name extension'}; } - if (cliFlag === 'none') { - throw new TypeError( - 'The --image-format flag must not be "none" for stills.', - ); - } - - if (cliFlag !== null) { - return {format: cliFlag, source: '--image-format flag'}; - } - - if (configImageFormat !== null) { - // @ts-expect-error - if (configImageFormat === 'none') { - throw new Error( - 'The still simage format in the config file must not be "none"', - ); - } - - return {format: configImageFormat, source: 'Config file'}; + if (configuredImageFormat !== null) { + return {format: configuredImageFormat, source: `--${cliFlag} or config`}; } return {format: 'png', source: 'Default'}; diff --git a/packages/cli/src/extra-packages.ts b/packages/cli/src/extra-packages.ts index 6d0e839a152..66b29897bd5 100644 --- a/packages/cli/src/extra-packages.ts +++ b/packages/cli/src/extra-packages.ts @@ -1,6 +1,6 @@ export const EXTRA_PACKAGES: Record = { zod: '3.22.3', - mediabunny: '1.34.3', + mediabunny: '1.34.4', }; export const EXTRA_PACKAGES_DOCS: Record = { diff --git a/packages/cli/src/get-cli-options.ts b/packages/cli/src/get-cli-options.ts index 2e37b98ea24..6e54d4e276e 100644 --- a/packages/cli/src/get-cli-options.ts +++ b/packages/cli/src/get-cli-options.ts @@ -64,9 +64,7 @@ export const getCliOptions = (options: { ? true : ConfigInternals.getShouldOutputImageSequence(frameRange); - const pixelFormat = ConfigInternals.getPixelFormat(); const proResProfile = getProResProfile(); - const browserExecutable = ConfigInternals.getBrowserExecutable(); const disableWebSecurity = ConfigInternals.getChromiumDisableWebSecurity(); const ignoreCertificateErrors = ConfigInternals.getIgnoreCertificateErrors(); @@ -95,17 +93,14 @@ export const getCliOptions = (options: { options.logLevel, options.indent, ), - pixelFormat, proResProfile, everyNthFrame, stillFrame: ConfigInternals.getStillFrame(), - browserExecutable, userAgent, disableWebSecurity, ignoreCertificateErrors, ffmpegOverride: ConfigInternals.getFfmpegOverrideFunction(), height, width, - configFileImageFormat: ConfigInternals.getUserPreferredVideoImageFormat(), }; }; diff --git a/packages/cli/src/get-render-defaults.ts b/packages/cli/src/get-render-defaults.ts index b10d34769a4..1283dae671a 100644 --- a/packages/cli/src/get-render-defaults.ts +++ b/packages/cli/src/get-render-defaults.ts @@ -31,7 +31,10 @@ const { chromeModeOption, mediaCacheSizeInBytesOption, darkModeOption, + pixelFormatOption, publicLicenseKeyOption, + stillImageFormatOption, + videoImageFormatOption, } = BrowserSafeApis.options; export const getRenderDefaults = (): RenderDefaults => { @@ -43,7 +46,9 @@ export const getRenderDefaults = (): RenderDefaults => { const concurrency = RenderInternals.resolveConcurrency( ConfigInternals.getConcurrency(), ); - const pixelFormat = ConfigInternals.getPixelFormat(); + const pixelFormat = pixelFormatOption.getValue({ + commandLine: parsedCli, + }).value; const proResProfile = ConfigInternals.getProResProfile() ?? null; const x264Preset = x264Option.getValue({ @@ -122,8 +127,12 @@ export const getRenderDefaults = (): RenderDefaults => { }).value; const everyNthFrame = ConfigInternals.getEveryNthFrame(); - const stillImageFormat = ConfigInternals.getUserPreferredStillImageFormat(); - const videoImageFormat = ConfigInternals.getUserPreferredVideoImageFormat(); + const stillImageFormat = stillImageFormatOption.getValue({ + commandLine: parsedCli, + }).value; + const videoImageFormat = videoImageFormatOption.getValue({ + commandLine: parsedCli, + }).value; const disableWebSecurity = ConfigInternals.getChromiumDisableWebSecurity(); const ignoreCertificateErrors = ConfigInternals.getIgnoreCertificateErrors(); const darkMode = darkModeOption.getValue({ diff --git a/packages/cli/src/gpu.ts b/packages/cli/src/gpu.ts index 4042de1378e..b62ad0668be 100644 --- a/packages/cli/src/gpu.ts +++ b/packages/cli/src/gpu.ts @@ -16,20 +16,20 @@ const { headlessOption, chromeModeOption, darkModeOption, + browserExecutableOption, } = BrowserSafeApis.options; export const gpuCommand = async (logLevel: LogLevel) => { - const { - browserExecutable, - disableWebSecurity, - ignoreCertificateErrors, - userAgent, - } = getCliOptions({ - isStill: false, - logLevel, - indent: false, - }); + const {disableWebSecurity, ignoreCertificateErrors, userAgent} = + getCliOptions({ + isStill: false, + logLevel, + indent: false, + }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const enableMultiProcessOnLinux = enableMultiprocessOnLinuxOption.getValue({ commandLine: parsedCli, }).value; diff --git a/packages/cli/src/image-formats.ts b/packages/cli/src/image-formats.ts index 4ab7316a720..f5f7f1fd2f1 100644 --- a/packages/cli/src/image-formats.ts +++ b/packages/cli/src/image-formats.ts @@ -1,7 +1,7 @@ import type {VideoImageFormat} from '@remotion/renderer'; -import {RenderInternals} from '@remotion/renderer'; +import {BrowserSafeApis} from '@remotion/renderer/client'; import {NoReactAPIs} from '@remotion/renderer/pure'; -import {ConfigInternals} from './config'; +import type {ConfigInternals} from './config'; import {parsedCli} from './parsed-cli'; export const getVideoImageFormat = ({ @@ -15,22 +15,12 @@ export const getVideoImageFormat = ({ return uiImageFormat; } - if (typeof parsedCli['image-format'] !== 'undefined') { - if ( - !(RenderInternals.validVideoImageFormats as readonly string[]).includes( - parsedCli['image-format'] as string, - ) - ) { - throw new Error(`Invalid image format: ${parsedCli['image-format']}`); - } + const configured = BrowserSafeApis.options.videoImageFormatOption.getValue({ + commandLine: parsedCli, + }).value; - return parsedCli['image-format'] as VideoImageFormat; - } - - const configFileOption = ConfigInternals.getUserPreferredVideoImageFormat(); - - if (typeof configFileOption !== 'undefined') { - return configFileOption; + if (configured !== null) { + return configured; } if (NoReactAPIs.isAudioCodec(codec)) { diff --git a/packages/cli/src/parse-command-line.ts b/packages/cli/src/parse-command-line.ts index 67a498fead2..9223bbd8159 100644 --- a/packages/cli/src/parse-command-line.ts +++ b/packages/cli/src/parse-command-line.ts @@ -1,9 +1,7 @@ import type { AudioCodec, - BrowserExecutable, Codec, OpenGlRenderer, - PixelFormat, StillImageFormat, VideoImageFormat, } from '@remotion/renderer'; @@ -38,11 +36,15 @@ const { forceNewStudioOption, numberOfSharedAudioTagsOption, ipv4Option, + pixelFormatOption, + browserExecutableOption, } = BrowserSafeApis.options; export type CommandLineOptions = { - ['browser-executable']: BrowserExecutable; - ['pixel-format']: PixelFormat; + [browserExecutableOption.cliFlag]: TypeOfOption< + typeof browserExecutableOption + >; + [pixelFormatOption.cliFlag]: TypeOfOption; ['image-format']: VideoImageFormat | StillImageFormat; ['prores-profile']: _InternalTypes['ProResProfile']; [x264Option.cliFlag]: TypeOfOption; @@ -127,14 +129,6 @@ export type CommandLineOptions = { }; export const parseCommandLine = () => { - if (parsedCli['pixel-format']) { - Config.setPixelFormat(parsedCli['pixel-format']); - } - - if (parsedCli['browser-executable']) { - Config.setBrowserExecutable(parsedCli['browser-executable']); - } - if (typeof parsedCli['bundle-cache'] !== 'undefined') { Config.setCachingEnabled(parsedCli['bundle-cache'] !== 'false'); } diff --git a/packages/cli/src/render-flows/still.ts b/packages/cli/src/render-flows/still.ts index 694de99c8ae..5e2699d1eb4 100644 --- a/packages/cli/src/render-flows/still.ts +++ b/packages/cli/src/render-flows/still.ts @@ -11,6 +11,7 @@ import type { StillImageFormat, } from '@remotion/renderer'; import {RenderInternals} from '@remotion/renderer'; +import {BrowserSafeApis} from '@remotion/renderer/client'; import type { AggregateRenderProgress, JobProgressCallback, @@ -22,7 +23,6 @@ import {NoReactInternals} from 'remotion/no-react'; import {defaultBrowserDownloadProgress} from '../browser-download-bar'; import {chalk} from '../chalk'; import {registerCleanupJob} from '../cleanup-before-quit'; -import {ConfigInternals} from '../config'; import {determineFinalStillImageFormat} from '../determine-image-format'; import {getAndValidateAbsoluteOutputFile} from '../get-cli-options'; import {getCompositionWithDimensionOverride} from '../get-composition-with-dimension-override'; @@ -277,9 +277,10 @@ export const renderStillFlow = async ({ }); const {format: imageFormat, source} = determineFinalStillImageFormat({ - cliFlag: parsedCli['image-format'] ?? null, - configImageFormat: - ConfigInternals.getUserPreferredStillImageFormat() ?? null, + configuredImageFormat: + BrowserSafeApis.options.stillImageFormatOption.getValue({ + commandLine: parsedCli, + }).value, downloadName: null, outName: getUserPassedOutputLocation( argsAfterComposition, diff --git a/packages/cli/src/render-queue/process-still.ts b/packages/cli/src/render-queue/process-still.ts index 03e7f6ca49b..f212fceef58 100644 --- a/packages/cli/src/render-queue/process-still.ts +++ b/packages/cli/src/render-queue/process-still.ts @@ -2,7 +2,6 @@ import {BrowserSafeApis} from '@remotion/renderer/client'; import type {JobProgressCallback, RenderJob} from '@remotion/studio-server'; import {getRendererPortFromConfigFile} from '../config/preview-server'; import {convertEntryPointToServeUrl} from '../convert-entry-point-to-serve-url'; -import {getCliOptions} from '../get-cli-options'; import {parsedCli} from '../parsed-cli'; import {renderStillFlow} from '../render-flows/still'; @@ -11,6 +10,7 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + browserExecutableOption, } = BrowserSafeApis.options; export const processStill = async ({ @@ -30,11 +30,9 @@ export const processStill = async ({ throw new Error('Expected still job'); } - const {browserExecutable} = getCliOptions({ - isStill: true, - logLevel: job.logLevel, - indent: true, - }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const publicDir = publicDirOption.getValue({ commandLine: parsedCli, diff --git a/packages/cli/src/render-queue/process-video.ts b/packages/cli/src/render-queue/process-video.ts index 44752c27af9..0965f1e0b64 100644 --- a/packages/cli/src/render-queue/process-video.ts +++ b/packages/cli/src/render-queue/process-video.ts @@ -12,6 +12,7 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + browserExecutableOption, } = BrowserSafeApis.options; export const processVideoJob = async ({ @@ -41,11 +42,14 @@ export const processVideoJob = async ({ commandLine: parsedCli, }).value; - const {browserExecutable, ffmpegOverride} = getCliOptions({ + const {ffmpegOverride} = getCliOptions({ isStill: true, logLevel, indent: true, }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const fullEntryPoint = convertEntryPointToServeUrl(entryPoint); await renderVideoFlow({ remotionRoot, diff --git a/packages/cli/src/render.tsx b/packages/cli/src/render.tsx index f06687a09a5..a76148e5264 100644 --- a/packages/cli/src/render.tsx +++ b/packages/cli/src/render.tsx @@ -48,6 +48,8 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + pixelFormatOption, + browserExecutableOption, } = BrowserSafeApis.options; export const render = async ( @@ -93,7 +95,6 @@ export const render = async ( shouldOutputImageSequence, inputProps, envVariables, - browserExecutable, everyNthFrame, userAgent, disableWebSecurity, @@ -102,13 +103,18 @@ export const render = async ( width, ffmpegOverride, proResProfile, - pixelFormat, } = getCliOptions({ isStill: false, logLevel, indent: false, }); + const pixelFormat = pixelFormatOption.getValue({ + commandLine: parsedCli, + }).value; + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const x264Preset = x264Option.getValue({commandLine: parsedCli}).value; const audioBitrate = audioBitrateOption.getValue({ commandLine: parsedCli, diff --git a/packages/cli/src/still.ts b/packages/cli/src/still.ts index 297b1dfb89b..7bc43cc3389 100644 --- a/packages/cli/src/still.ts +++ b/packages/cli/src/still.ts @@ -30,6 +30,7 @@ const { askAIOption, experimentalClientSideRenderingOption, keyboardShortcutsOption, + browserExecutableOption, } = BrowserSafeApis.options; export const still = async ( @@ -70,7 +71,6 @@ export const still = async ( } const { - browserExecutable, envVariables, height, inputProps, @@ -85,6 +85,9 @@ export const still = async ( indent: false, }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; const jpegQuality = jpegQualityOption.getValue({ commandLine: parsedCli, }).value; diff --git a/packages/cli/src/test/pixel-format.test.ts b/packages/cli/src/test/pixel-format.test.ts index 6d538a3c5ef..6d8bbcaf364 100644 --- a/packages/cli/src/test/pixel-format.test.ts +++ b/packages/cli/src/test/pixel-format.test.ts @@ -1,8 +1,10 @@ import type {PixelFormat} from '@remotion/renderer'; +import {BrowserSafeApis} from '@remotion/renderer/client'; import {describe, expect, test} from 'bun:test'; -import {getPixelFormat, setPixelFormat} from '../config/pixel-format'; import {expectToThrow} from './expect-to-throw'; +const {pixelFormatOption} = BrowserSafeApis.options; + describe('pixel-format tests setPixelFormat', () => { // input format const validPixelFormats: PixelFormat[] = [ @@ -16,8 +18,10 @@ describe('pixel-format tests setPixelFormat', () => { ]; validPixelFormats.forEach((entry) => test(`test for ${entry}`, () => { - setPixelFormat(entry); - expect(getPixelFormat()).toEqual(entry); + pixelFormatOption.setConfig(entry); + expect(pixelFormatOption.getValue({commandLine: {}}).value).toEqual( + entry, + ); }), ); @@ -27,7 +31,7 @@ describe('pixel-format tests setPixelFormat', () => { test(`test for invalid input ${entry}`, () => expectToThrow( // @ts-expect-error - () => setPixelFormat(entry), + () => pixelFormatOption.setConfig(entry), new RegExp(`Value ${entry} is not valid as a pixel format.`), )), ); diff --git a/packages/cloudrun/container/package.json b/packages/cloudrun/container/package.json index 5dd45e8c713..325e7aa875e 100644 --- a/packages/cloudrun/container/package.json +++ b/packages/cloudrun/container/package.json @@ -1,6 +1,6 @@ { "name": "cloud-run-render", - "version": "4.0.423", + "version": "4.0.424", "description": "Render media and stills on GCP Cloud Run", "main": "dist/index.js", "scripts": { diff --git a/packages/cloudrun/package.json b/packages/cloudrun/package.json index 2dc4a3ba5af..593d50a0791 100644 --- a/packages/cloudrun/package.json +++ b/packages/cloudrun/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cloudrun" }, "name": "@remotion/cloudrun", - "version": "4.0.423", + "version": "4.0.424", "description": "Render Remotion videos on Google Cloud Run", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cloudrun/src/cli/commands/render/index.ts b/packages/cloudrun/src/cli/commands/render/index.ts index 4498621acff..395d9d2fb5f 100644 --- a/packages/cloudrun/src/cli/commands/render/index.ts +++ b/packages/cloudrun/src/cli/commands/render/index.ts @@ -38,6 +38,8 @@ const { metadataOption, mediaCacheSizeInBytesOption, darkModeOption, + pixelFormatOption, + browserExecutableOption, } = BrowserSafeApis.options; export const renderCommand = async ( @@ -69,20 +71,22 @@ export const renderCommand = async ( }, ); - const imageFormat = parsedCloudrunCli['image-format']; + const imageFormat = BrowserSafeApis.options.videoImageFormatOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; - const audioCodec = parsedCloudrunCli['audio-codec']; + const audioCodec = BrowserSafeApis.options.audioCodecOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; const { envVariables, frameRange, inputProps, - pixelFormat, proResProfile, everyNthFrame, height, width, - browserExecutable, disableWebSecurity, ignoreCertificateErrors, userAgent, @@ -92,6 +96,12 @@ export const renderCommand = async ( indent: false, }); + const pixelFormat = pixelFormatOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; + const browserExecutable = browserExecutableOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; const offthreadVideoCacheSizeInBytes = offthreadVideoCacheSizeInBytesOption.getValue({ commandLine: CliInternals.parsedCli, @@ -311,7 +321,7 @@ ${downloadName ? ` Downloaded File = ${downloadName}` : ''} outName, updateRenderProgress, jpegQuality, - audioCodec, + audioCodec: audioCodec ?? undefined, audioBitrate, videoBitrate, encodingMaxRate, @@ -320,7 +330,7 @@ ${downloadName ? ` Downloaded File = ${downloadName}` : ''} x264Preset, crf, pixelFormat, - imageFormat, + imageFormat: imageFormat ?? undefined, scale, everyNthFrame, numberOfGifLoops, diff --git a/packages/cloudrun/src/cli/commands/still.ts b/packages/cloudrun/src/cli/commands/still.ts index 09ee21ca6a9..4a7015b819c 100644 --- a/packages/cloudrun/src/cli/commands/still.ts +++ b/packages/cloudrun/src/cli/commands/still.ts @@ -24,6 +24,7 @@ const { binariesDirectoryOption, mediaCacheSizeInBytesOption, darkModeOption, + browserExecutableOption, } = BrowserSafeApis.options; export const stillCommand = async ( @@ -47,7 +48,6 @@ export const stillCommand = async ( stillFrame, height, width, - browserExecutable, userAgent, disableWebSecurity, ignoreCertificateErrors, @@ -57,6 +57,10 @@ export const stillCommand = async ( indent: false, }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; + let composition = args[1]; const enableMultiProcessOnLinux = enableMultiprocessOnLinuxOption.getValue({ @@ -158,15 +162,17 @@ export const stillCommand = async ( composition = compositionId; } + const {stillImageFormatOption} = BrowserSafeApis.options; + const {format: imageFormat, source: imageFormatReason} = CliInternals.determineFinalStillImageFormat({ downloadName, outName: outName ?? null, - cliFlag: CliInternals.parsedCli['image-format'] ?? null, + configuredImageFormat: stillImageFormatOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value, isLambda: true, fromUi: null, - configImageFormat: - ConfigInternals.getUserPreferredStillImageFormat() ?? null, }); Log.verbose( {indent: false, logLevel}, diff --git a/packages/cloudrun/src/shared/read-dir.ts b/packages/cloudrun/src/shared/read-dir.ts index 45e6bd4af82..35100a96aad 100644 --- a/packages/cloudrun/src/shared/read-dir.ts +++ b/packages/cloudrun/src/shared/read-dir.ts @@ -28,7 +28,6 @@ export async function readDirectory({ continue; } - if (fs.lstatSync(filePath).isSymbolicLink()) { const realPath = fs.realpathSync(filePath); diff --git a/packages/compositor-darwin-arm64/package.json b/packages/compositor-darwin-arm64/package.json index 831e12d0144..f548479c26a 100644 --- a/packages/compositor-darwin-arm64/package.json +++ b/packages/compositor-darwin-arm64/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-darwin-arm64" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-darwin-arm64", "os": [ "darwin" diff --git a/packages/compositor-darwin-x64/package.json b/packages/compositor-darwin-x64/package.json index 8f9df16cb7d..4f3b7142051 100644 --- a/packages/compositor-darwin-x64/package.json +++ b/packages/compositor-darwin-x64/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-darwin-x64" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-darwin-x64", "os": [ "darwin" diff --git a/packages/compositor-linux-arm64-gnu/package.json b/packages/compositor-linux-arm64-gnu/package.json index 4a081924b4d..223ef2b73b7 100644 --- a/packages/compositor-linux-arm64-gnu/package.json +++ b/packages/compositor-linux-arm64-gnu/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-arm64-gnu" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-linux-arm64-gnu", "os": [ "linux" diff --git a/packages/compositor-linux-arm64-musl/package.json b/packages/compositor-linux-arm64-musl/package.json index 53d3765888c..a006b2d6b0c 100644 --- a/packages/compositor-linux-arm64-musl/package.json +++ b/packages/compositor-linux-arm64-musl/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-arm64-musl" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-linux-arm64-musl", "os": [ "linux" diff --git a/packages/compositor-linux-x64-gnu/package.json b/packages/compositor-linux-x64-gnu/package.json index cb6646716b1..1e2f49cb6fb 100644 --- a/packages/compositor-linux-x64-gnu/package.json +++ b/packages/compositor-linux-x64-gnu/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-x64-gnu" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-linux-x64-gnu", "os": [ "linux" diff --git a/packages/compositor-linux-x64-musl/package.json b/packages/compositor-linux-x64-musl/package.json index b3d7d9b33c6..c104858d2bb 100644 --- a/packages/compositor-linux-x64-musl/package.json +++ b/packages/compositor-linux-x64-musl/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-x64-musl" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-linux-x64-musl", "os": [ "linux" diff --git a/packages/compositor-win32-x64-msvc/package.json b/packages/compositor-win32-x64-msvc/package.json index 3c79cf2f384..c911106f965 100644 --- a/packages/compositor-win32-x64-msvc/package.json +++ b/packages/compositor-win32-x64-msvc/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-win32-x64-msvc" }, - "version": "4.0.423", + "version": "4.0.424", "name": "@remotion/compositor-win32-x64-msvc", "os": [ "win32" diff --git a/packages/compositor/package.json b/packages/compositor/package.json index 2870a9d30fa..a30e8432641 100644 --- a/packages/compositor/package.json +++ b/packages/compositor/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor" }, "name": "@remotion/compositor", - "version": "4.0.423", + "version": "4.0.424", "description": "Rust binary for Remotion", "sideEffects": false, "scripts": { diff --git a/packages/convert/package.json b/packages/convert/package.json index 10b5b7b6446..b7299190817 100644 --- a/packages/convert/package.json +++ b/packages/convert/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/convert", - "version": "4.0.423", + "version": "4.0.424", "private": true, "sideEffects": false, "type": "module", diff --git a/packages/core/package.json b/packages/core/package.json index 842ba1590fd..0d506e75953 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/core" }, "name": "remotion", - "version": "4.0.423", + "version": "4.0.424", "description": "Make videos programmatically", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 3a960be26c0..88dac71b7ef 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -5,4 +5,4 @@ * @see [Documentation](https://remotion.dev/docs/version) * @returns {string} The current version of the remotion package */ -export const VERSION = '4.0.423'; +export const VERSION = '4.0.424'; diff --git a/packages/create-video/package.json b/packages/create-video/package.json index 3ec105c90c4..32167a2a939 100644 --- a/packages/create-video/package.json +++ b/packages/create-video/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/create-video" }, "name": "create-video", - "version": "4.0.423", + "version": "4.0.424", "description": "Create a new Remotion project", "main": "dist/index.js", "bin": { diff --git a/packages/create-video/src/pkg-managers.ts b/packages/create-video/src/pkg-managers.ts index 7b5fc2b5108..a74045692eb 100644 --- a/packages/create-video/src/pkg-managers.ts +++ b/packages/create-video/src/pkg-managers.ts @@ -19,7 +19,7 @@ const shouldUseBun = (): boolean => { const shouldUseYarn = (): boolean => { return Boolean( process.env.npm_execpath?.includes('yarn.js') || - process.env.npm_config_user_agent?.includes('yarn'), + process.env.npm_config_user_agent?.includes('yarn'), ); }; diff --git a/packages/design/package.json b/packages/design/package.json index 6f9b085c23e..ac5cc9e67e0 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/design", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/index.js", "types": "dist/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/design/src/Button.tsx b/packages/design/src/Button.tsx index 02c69ea6905..1ccb197e76c 100644 --- a/packages/design/src/Button.tsx +++ b/packages/design/src/Button.tsx @@ -123,7 +123,7 @@ export const Button: React.FC = ({ const innerContent = ( <> -
+
{children}
{loading ? ( diff --git a/packages/discord-poster/package.json b/packages/discord-poster/package.json index bf7057e89b1..07bd6fe5058 100644 --- a/packages/discord-poster/package.json +++ b/packages/discord-poster/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/discord-poster" }, "name": "@remotion/discord-poster", - "version": "4.0.423", + "version": "4.0.424", "license": "SEE LICENSE IN LICENSE.md", "type": "module", "scripts": { diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore index 16e618a66a5..787b85c5bb2 100644 --- a/packages/docs/.gitignore +++ b/packages/docs/.gitignore @@ -9,6 +9,9 @@ .cache-loader static/_raw +# Twoslash prewarm temp files +.twoslash-work-*.json + # Misc .DS_Store .env.local diff --git a/packages/docs/docs/cli/browser/ensure.mdx b/packages/docs/docs/cli/browser/ensure.mdx index ce7ede31bc7..5eb5952bd20 100644 --- a/packages/docs/docs/cli/browser/ensure.mdx +++ b/packages/docs/docs/cli/browser/ensure.mdx @@ -17,7 +17,7 @@ npx remotion browser ensure ### `--browser-executable` -[Path to a custom Chrome executable](/docs/config#setbrowserexecutable). If not specified and Remotion cannot find one, one will be downloaded by this command. + ### `--log` diff --git a/packages/docs/docs/cli/render.mdx b/packages/docs/docs/cli/render.mdx index e731ac95b46..77a4cc4d364 100644 --- a/packages/docs/docs/cli/render.mdx +++ b/packages/docs/docs/cli/render.mdx @@ -45,11 +45,11 @@ Inline JSON string isn't supported on Windows shells because it removes the `"` ### `--pixel-format` -[Set a custom pixel format. See here for available values.](/docs/config#setpixelformat) + ### `--image-format` -[`jpeg` or `png` - JPEG is faster, but doesn't support transparency.](/docs/config#setvideoimageformat) The default image format is `jpeg` since v1.1. + ### `--image-sequence-pattern` @@ -132,7 +132,7 @@ If you enable [hardware acceleration](/docs/hardware-acceleration), you cannot s ### `--browser-executable` -[Path to a Chrome executable](/docs/config#setbrowserexecutable). If not specified and Remotion cannot find one, it will download one during rendering. + ### `--chrome-mode` diff --git a/packages/docs/docs/cli/still.mdx b/packages/docs/docs/cli/still.mdx index 07f028928aa..dce0c253754 100644 --- a/packages/docs/docs/cli/still.mdx +++ b/packages/docs/docs/cli/still.mdx @@ -33,7 +33,7 @@ Inline JSON string isn't supported on Windows shells because it removes the `"` ### `--image-format` -`jpeg`, `png`, `webp` or `pdf`. The default is `png`. + ### `--config` @@ -61,7 +61,7 @@ Sets the output file path, as an alternative to the `output-location` positional ### `--browser-executable` -[Path to a Chrome executable](/docs/config#setbrowserexecutable). If not specified and Remotion cannot find one, it will download one during rendering. + ### `--scale` diff --git a/packages/docs/docs/cloudrun/cli/render.mdx b/packages/docs/docs/cloudrun/cli/render.mdx index af8348f5370..ad6a27ecc13 100644 --- a/packages/docs/docs/cloudrun/cli/render.mdx +++ b/packages/docs/docs/cloudrun/cli/render.mdx @@ -87,7 +87,7 @@ Before v4.0.76, this was "100%" by default. It is now aligned to the other serve ### `--image-format` -[`jpeg` or `png` - JPEG is faster, but doesn't support transparency.](/docs/config#setvideoimageformat) The default image format is `jpeg`. + ### `--scale` @@ -175,7 +175,7 @@ You will be responsible for ensuring that the render ID is unique, otherwise it ### `--pixel-format` -[Set a custom pixel format. See here for available values.](/docs/config#setpixelformat) + ### `--every-nth-frame` diff --git a/packages/docs/docs/cloudrun/cli/still.mdx b/packages/docs/docs/cloudrun/cli/still.mdx index 4b709e17a3b..d7e14c66c99 100644 --- a/packages/docs/docs/cloudrun/cli/still.mdx +++ b/packages/docs/docs/cloudrun/cli/still.mdx @@ -79,7 +79,7 @@ Specify a specific bucket name to be used for the output. The resulting Google C ### `--image-format` -[`jpeg` or `png` - JPEG is faster, but doesn't support transparency.](/docs/config#setstillimageformat) The default image format is `jpeg`. + ### `--scale` diff --git a/packages/docs/docs/config.mdx b/packages/docs/docs/config.mdx index 442545e5823..f36e664acf8 100644 --- a/packages/docs/docs/config.mdx +++ b/packages/docs/docs/config.mdx @@ -190,7 +190,7 @@ Config.setShouldOpenBrowser(false); ## `setBrowserExecutable()` -Set a custom Chrome or Chromium executable path. By default Remotion will try to find an existing version of Chrome on your system and if not found, it will download one. This flag is useful if you don't have Chrome installed in a standard location and you want to prevent downloading an additional browser or need [support for the H264 codec](/docs/html5-video#codec-support). + ```ts twoslash title="remotion.config.ts" import {Config} from '@remotion/cli/config'; @@ -519,8 +519,7 @@ In version 1.x, the default behavior was inverse - Remotion would not override b ## `setPixelFormat()` -Controls the pixel format in FFmpeg. [Read more about it here.](https://trac.ffmpeg.org/wiki/Chroma%20Subsampling) Acceptable values: `yuv420p`, `yuv422p`, `yuv444p`, `yuv420p10le`, `yuv422p10le`, `yuv444p10le`. Since v1.4, `yuva420p` is also supported for transparent WebM videos. Since v2.1.7, `yuva444p10le` is also supported for transparent ProRes videos -Default value: `yuv420p` + ```ts twoslash title="remotion.config.ts" import {Config} from '@remotion/cli/config'; diff --git a/packages/docs/docs/lambda/cli/render.mdx b/packages/docs/docs/lambda/cli/render.mdx index 0feab57317d..9b41b953d9a 100644 --- a/packages/docs/docs/lambda/cli/render.mdx +++ b/packages/docs/docs/lambda/cli/render.mdx @@ -174,11 +174,11 @@ Renamed to `jpegQuality` in `v4.0.0`. ### `--pixel-format` -[Set a custom pixel format. See here for available values.](/docs/config#setpixelformat) + ### `--image-format` -[`jpeg` or `png` - JPEG is faster, but doesn't support transparency.](/docs/config#setvideoimageformat) The default image format is `jpeg`. + ### `--scale` diff --git a/packages/docs/docs/lambda/cli/still.mdx b/packages/docs/docs/lambda/cli/still.mdx index ea80c79af71..533e0f1c657 100644 --- a/packages/docs/docs/lambda/cli/still.mdx +++ b/packages/docs/docs/lambda/cli/still.mdx @@ -90,6 +90,10 @@ How many times a single chunk is being retried if it fails to render. Default `1 The file name of the media output as stored in the S3 bucket. By default, it is `out` plus the appropriate file extension, for example: `out.png`. Must match `/([0-9a-zA-Z-!_.*'()/]+)/g`. +### `--image-format` + + + ### `--jpeg-quality` [Value between 0 and 100 for JPEG rendering quality](/docs/config#setjpegquality). Doesn't work when rendering an image format other than JPEG. diff --git a/packages/docs/docs/mediabunny/formats.mdx b/packages/docs/docs/mediabunny/formats.mdx index 5aff063cc1b..a10b66b4c62 100644 --- a/packages/docs/docs/mediabunny/formats.mdx +++ b/packages/docs/docs/mediabunny/formats.mdx @@ -61,6 +61,13 @@ This means that during rendering of Remotion videos server-side, HEVC videos can - `'pcm-f64be'` - 64-bit big-endian float PCM - `'ulaw'` - μ-law PCM - `'alaw'` - A-law PCM +- `'ac3'` - Dolby Digital (AC-3) +- `'eac3'` - Dolby Digital Plus (E-AC-3) + +:::note +AC-3 and E-AC-3 are not natively supported by WebCodecs. +Remotion registers a software decoder from [`@mediabunny/ac3`](https://www.npmjs.com/package/@mediabunny/ac3) to enable decoding of these codecs. +::: ## Compatibility table @@ -92,6 +99,8 @@ Not all codecs can be used with all containers. The following table specifies th | `'pcm-f64be'` | ✓ | ✓ | | | | | | | | | | `'ulaw'` | | ✓ | | | | | ✓ | | | | | `'alaw'` | | ✓ | | | | | ✓ | | | | +| `'ac3'` | ✓ | ✓ | ✓ | | | | | | | ✓ | +| `'eac3'` | ✓ | ✓ | ✓ | | | | | | | ✓ | ## CORS diff --git a/packages/docs/docs/mediabunny/version.mdx b/packages/docs/docs/mediabunny/version.mdx index 9862f36bb51..3cf1ef15c5f 100644 --- a/packages/docs/docs/mediabunny/version.mdx +++ b/packages/docs/docs/mediabunny/version.mdx @@ -10,7 +10,7 @@ The following package of Remotion is using [Mediabunny](https://mediabunny.dev): - [`@remotion/media`](/docs/media) - [`@remotion/media-utils`](/docs/media-utils) -The current version of Remotion uses version [`1.34.3`](https://github.com/Vanilagy/mediabunny/releases/tag/v1.34.3) of Mediabunny. +The current version of Remotion uses version [`1.34.4`](https://github.com/Vanilagy/mediabunny/releases/tag/v1.34.4) of Mediabunny. If you use Mediabunny as a direct dependency in your project, you can install it with the correct version using: @@ -25,7 +25,7 @@ Note that only from 4.0.355, Mediabunny is not bundled in with Remotion but load | Remotion Version | Mediabunny Version | | ---------------- | ------------------ | -| 4.0.424 | 1.34.3 | +| 4.0.424 | 1.34.4 | | 4.0.423 | 1.34.2 | | 4.0.408 | 1.29.0 | | 4.0.399 | 1.27.3 | diff --git a/packages/docs/package.json b/packages/docs/package.json index 99b4ece6e65..395b1b5a780 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -4,12 +4,12 @@ }, "name": "docs", "private": true, - "version": "4.0.423", + "version": "4.0.424", "scripts": { "formatting": "prettier --experimental-cli src --check", "docusaurus": "docusaurus", "start": "bun copy-raw-docs.ts && bun fetch-prompt-submissions.ts && bun update-prompt.ts && cd .. && bun run build && cd docs && docusaurus start --host 0.0.0.0", - "build-docs": "bun copy-raw-docs.ts && bun fetch-prompt-submissions.ts && DOCUSAURUS_IGNORE_SSG_WARNINGS=true docusaurus build && bun copy-convert.ts && bun count-pages.ts", + "build-docs": "bun copy-raw-docs.ts && bun fetch-prompt-submissions.ts && bun prewarm-twoslash.ts && DOCUSAURUS_IGNORE_SSG_WARNINGS=true docusaurus build && bun copy-convert.ts && bun count-pages.ts", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "serve": "docusaurus serve", diff --git a/packages/docs/prewarm-twoslash.ts b/packages/docs/prewarm-twoslash.ts new file mode 100644 index 00000000000..f96ea9b29ad --- /dev/null +++ b/packages/docs/prewarm-twoslash.ts @@ -0,0 +1,308 @@ +import {Glob} from 'bun'; +import {spawn} from 'child_process'; +import {createHash} from 'crypto'; +import { + existsSync, + mkdirSync, + readdirSync, + readFileSync, + unlinkSync, + writeFileSync, +} from 'fs'; +import {createRequire} from 'module'; +import {cpus} from 'os'; +import {join, resolve} from 'path'; + +const DOCS_ROOT = resolve(import.meta.dirname); +const CACHE_ROOT = join(DOCS_ROOT, 'node_modules', '.cache', 'twoslash'); +const WORKER_PATH = join(DOCS_ROOT, 'twoslash-worker.cjs'); +const NUM_WORKERS = cpus().length; + +const pluginDir = join(DOCS_ROOT, '..', 'docusaurus-plugin'); +const pluginRequire = createRequire(join(pluginDir, 'package.json')); +const shikiVersion = pluginRequire('@typescript/twoslash/package.json') + .version as string; +const tsVersion = pluginRequire('typescript/package.json').version as string; + +interface TwoslashBlock { + code: string; + lang: string; + cachePath: string; + sourceFiles: string[]; +} + +function computeCachePath(code: string): string { + const shasum = createHash('sha1'); + const codeSha = shasum + .update(`${code}-${shikiVersion}-${tsVersion}`) + .digest('hex'); + return join(CACHE_ROOT, `${codeSha}.json`); +} + +function addIncludes( + map: Map, + name: string, + code: string, +): void { + const lines: string[] = []; + code.split('\n').forEach((l) => { + const trimmed = l.trim(); + if (trimmed.startsWith('// - ')) { + const key = trimmed.split('// - ')[1].split(' ')[0]; + map.set(name + '-' + key, lines.join('\n')); + } else { + lines.push(l); + } + }); + map.set(name, lines.join('\n')); +} + +function replaceIncludes(map: Map, code: string): string { + const includesRegex = /\/\/ @include: (.*)$/gm; + const toReplace: [number, number, string][] = []; + + let match; + while ((match = includesRegex.exec(code)) !== null) { + if (match.index === includesRegex.lastIndex) { + includesRegex.lastIndex++; + } + + const key = match[1]; + const replaceWith = map.get(key); + if (!replaceWith) { + return code; + } + + toReplace.push([match.index, match[0].length, replaceWith]); + } + + let newCode = code.toString(); + toReplace.reverse().forEach((r) => { + newCode = + newCode.substring(0, r[0]) + r[2] + newCode.substring(r[0] + r[1]); + }); + return newCode; +} + +function extractTwoslashBlocks( + content: string, + filePath: string, + validCachePaths: Set, + cachePathToFiles: Map, +): TwoslashBlock[] { + const blocks: TwoslashBlock[] = []; + const includes = new Map(); + + const codeBlockRegex = /^```(\S*)(.*?)\n([\s\S]*?)^```$/gm; + + let match; + while ((match = codeBlockRegex.exec(content)) !== null) { + const lang = match[1]; + const meta = match[2].trim(); + const code = match[3]; + + if (lang === 'twoslash') { + const includeMatch = meta.match(/include\s+(\S+)/); + if (includeMatch) { + addIncludes(includes, includeMatch[1], code); + } + + continue; + } + + if (!meta.split(/\s+/).includes('twoslash')) { + continue; + } + + const importedCode = replaceIncludes(includes, code); + const cachePath = computeCachePath(importedCode); + validCachePaths.add(cachePath); + + // Track which files reference this cache path + const relPath = filePath.replace(DOCS_ROOT + '/', ''); + if (!cachePathToFiles.has(cachePath)) { + cachePathToFiles.set(cachePath, []); + } + cachePathToFiles.get(cachePath)!.push(relPath); + + if (existsSync(cachePath)) { + continue; + } + + blocks.push({code: importedCode, lang, cachePath, sourceFiles: []}); + } + + return blocks; +} + +interface TimingEntry { + cachePath: string; + ms: number; + error?: string; +} + +interface WorkerResult { + completed: number; + errors: number; + timings: TimingEntry[]; +} + +function runWorker( + workItems: TwoslashBlock[], + workerId: number, +): Promise { + return new Promise((resolvePromise, reject) => { + const tmpFile = join(DOCS_ROOT, `.twoslash-work-${workerId}.json`); + writeFileSync(tmpFile, JSON.stringify(workItems)); + + const child = spawn('node', [WORKER_PATH, tmpFile], { + cwd: DOCS_ROOT, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + let lastReport: WorkerResult = {completed: 0, errors: 0, timings: []}; + + child.stdout.on('data', (data: Buffer) => { + const lines = data.toString().trim().split('\n'); + for (const line of lines) { + try { + lastReport = JSON.parse(line); + } catch { + // ignore non-JSON output + } + } + }); + + child.stderr.on('data', () => {}); + + child.on('close', () => { + try { + unlinkSync(tmpFile); + } catch {} + resolvePromise(lastReport); + }); + + child.on('error', (err) => { + try { + unlinkSync(tmpFile); + } catch {} + reject(err); + }); + }); +} + +async function main() { + const startTime = performance.now(); + + const glob = new Glob('**/*.{mdx,md}'); + const dirs = ['docs', 'blog', 'learn', 'new-docs']; + + const allFiles: string[] = []; + for (const dir of dirs) { + const fullDir = join(DOCS_ROOT, dir); + if (!existsSync(fullDir)) continue; + for await (const file of glob.scan(fullDir)) { + allFiles.push(join(fullDir, file)); + } + } + + const allBlocks: TwoslashBlock[] = []; + const validCachePaths = new Set(); + const cachePathToFiles = new Map(); + for (const file of allFiles) { + const content = readFileSync(file, 'utf8'); + allBlocks.push( + ...extractTwoslashBlocks(content, file, validCachePaths, cachePathToFiles), + ); + } + + // Delete stale cache entries that no longer correspond to any twoslash block + if (existsSync(CACHE_ROOT)) { + const cachedFiles = readdirSync(CACHE_ROOT); + let staleCount = 0; + for (const file of cachedFiles) { + const fullPath = join(CACHE_ROOT, file); + if (!validCachePaths.has(fullPath)) { + unlinkSync(fullPath); + staleCount++; + } + } + + if (staleCount > 0) { + console.log(`Deleted ${staleCount} stale cache entries`); + } + } + + const uniqueBlocks = new Map(); + for (const block of allBlocks) { + if (!uniqueBlocks.has(block.cachePath)) { + block.sourceFiles = cachePathToFiles.get(block.cachePath) || []; + uniqueBlocks.set(block.cachePath, block); + } + } + + const uncachedBlocks = [...uniqueBlocks.values()]; + + if (uncachedBlocks.length === 0) { + const elapsed = ((performance.now() - startTime) / 1000).toFixed(1); + console.log(`All twoslash blocks are cached (${elapsed}s to scan)`); + return; + } + + console.log( + `${uncachedBlocks.length} twoslash blocks to type-check (${allFiles.length} files scanned)`, + ); + + if (!existsSync(CACHE_ROOT)) { + mkdirSync(CACHE_ROOT, {recursive: true}); + } + + const numWorkers = Math.min(NUM_WORKERS, uncachedBlocks.length); + console.log(`Launching ${numWorkers} workers...`); + + const chunks: TwoslashBlock[][] = Array.from({length: numWorkers}, () => []); + uncachedBlocks.forEach((block, i) => { + chunks[i % numWorkers].push(block); + }); + + const workerPromises = chunks.map((chunk, i) => runWorker(chunk, i)); + + const progressInterval = setInterval(() => { + try { + const cached = readdirSync(CACHE_ROOT).length; + const elapsed = ((performance.now() - startTime) / 1000).toFixed(0); + console.log(` ${elapsed}s elapsed, ~${cached} cached`); + } catch {} + }, 15000); + + const results = await Promise.all(workerPromises); + clearInterval(progressInterval); + + const totalCompleted = results.reduce((s, r) => s + r.completed, 0); + const totalErrors = results.reduce((s, r) => s + r.errors, 0); + const totalTime = ((performance.now() - startTime) / 1000).toFixed(1); + + // Collect all timings and sort by duration (slowest first) + const allTimings: (TimingEntry & {sourceFiles: string[]})[] = []; + for (const result of results) { + for (const t of result.timings) { + const files = cachePathToFiles.get(t.cachePath) || []; + allTimings.push({...t, sourceFiles: files}); + } + } + + allTimings.sort((a, b) => b.ms - a.ms); + + console.log(`\nTwoslash pre-warm: ${totalCompleted} blocks in ${totalTime}s using ${numWorkers} workers (${totalErrors} errors)`); + console.log(`\nSlowest snippets:`); + for (const t of allTimings.slice(0, 30)) { + const files = t.sourceFiles.join(', '); + const status = t.error ? ` ERROR: ${t.error}` : ''; + console.log(` ${t.ms}ms - ${files}${status}`); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/packages/docs/src/components/Options.tsx b/packages/docs/src/components/Options.tsx index e7bea2d043b..fc084094b91 100644 --- a/packages/docs/src/components/Options.tsx +++ b/packages/docs/src/components/Options.tsx @@ -6,12 +6,12 @@ import type {JSX} from 'react'; const options = Object.values(BrowserSafeApis.options); const getOption = (id: string): AnyRemotionOption => { - const option = options.find((o) => o.cliFlag === id); + const option = options.find((o) => o.id === id); if (!option) { throw new Error( `Unknown option "${id}". Available: ${options - .map((o) => o.cliFlag) + .map((o) => o.id) .join(', ')}`, ); } diff --git a/packages/docs/twoslash-worker.cjs b/packages/docs/twoslash-worker.cjs new file mode 100644 index 00000000000..e015ff252c5 --- /dev/null +++ b/packages/docs/twoslash-worker.cjs @@ -0,0 +1,66 @@ +const {createRequire} = require('module'); +const {writeFileSync, existsSync, mkdirSync, readFileSync} = require('fs'); +const {dirname, join} = require('path'); + +// Resolve from the docusaurus-plugin which has these as dependencies +const pluginDir = join(__dirname, '..', 'docusaurus-plugin'); +const pluginRequire = createRequire(join(pluginDir, 'package.json')); +const {runTwoSlash} = pluginRequire('shiki-twoslash'); +const {ScriptTarget, ModuleKind} = pluginRequire('typescript'); + +const settings = { + defaultCompilerOptions: { + types: ['node'], + target: ScriptTarget.ESNext, + module: ModuleKind.ESNext, + }, +}; + +// Read work items from the file passed as argument +const workFile = process.argv[2]; +const items = JSON.parse(readFileSync(workFile, 'utf8')); + +let completed = 0; +let errors = 0; +const timings = []; + +for (const item of items) { + const start = performance.now(); + try { + const results = runTwoSlash(item.code, item.lang, settings); + const dir = dirname(item.cachePath); + if (!existsSync(dir)) mkdirSync(dir, {recursive: true}); + writeFileSync(item.cachePath, JSON.stringify(results), 'utf8'); + completed++; + timings.push({ + cachePath: item.cachePath, + ms: Math.round(performance.now() - start), + }); + } catch (error) { + errors++; + timings.push({ + cachePath: item.cachePath, + ms: Math.round(performance.now() - start), + error: error.message.slice(0, 200), + }); + } + + // Report progress every 10 items + if ((completed + errors) % 10 === 0) { + process.stdout.write( + JSON.stringify({completed, errors, total: items.length, timings}) + + '\n', + ); + } +} + +// Final report +process.stdout.write( + JSON.stringify({ + completed, + errors, + total: items.length, + done: true, + timings, + }) + '\n', +); diff --git a/packages/docusaurus-plugin/package.json b/packages/docusaurus-plugin/package.json index 94ac49492c6..4fc42ba9116 100644 --- a/packages/docusaurus-plugin/package.json +++ b/packages/docusaurus-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/docusaurus-plugin", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/index.js", "types": "dist/index.d.ts", "sideEffects": false, diff --git a/packages/docusaurus-plugin/src/shiki.ts b/packages/docusaurus-plugin/src/shiki.ts index cc74667ff2b..35cf5652a6d 100644 --- a/packages/docusaurus-plugin/src/shiki.ts +++ b/packages/docusaurus-plugin/src/shiki.ts @@ -5,8 +5,8 @@ import type {Highlighter} from 'shiki'; import {getHighlighter} from 'shiki'; import type {UserConfigSettings} from 'shiki-twoslash'; import {renderCodeToHTML} from 'shiki-twoslash'; -import {visit} from 'unist-util-visit'; import type {BuildVisitor} from 'unist-util-visit'; +import {visit} from 'unist-util-visit'; import {cachedTwoslashCall} from './caching'; import {setupNodeForTwoslashException} from './exceptionMessageDOM'; diff --git a/packages/enable-scss/package.json b/packages/enable-scss/package.json index 497a5c7d8b6..ea33fa0885e 100644 --- a/packages/enable-scss/package.json +++ b/packages/enable-scss/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/enable-scss" }, "name": "@remotion/enable-scss", - "version": "4.0.423", + "version": "4.0.424", "description": "Enable SCSS support in Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/eslint-config-flat/package.json b/packages/eslint-config-flat/package.json index ab7c896b882..6835d9f9952 100644 --- a/packages/eslint-config-flat/package.json +++ b/packages/eslint-config-flat/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config-flat" }, "name": "@remotion/eslint-config-flat", - "version": "4.0.423", + "version": "4.0.424", "description": "Default configuration for Remotion templates (ESLint >= 9)", "main": "dist/esm/index.mjs", "type": "module", diff --git a/packages/eslint-config-internal/package.json b/packages/eslint-config-internal/package.json index f0f7d01c946..1fba753f471 100644 --- a/packages/eslint-config-internal/package.json +++ b/packages/eslint-config-internal/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config-internal" }, "name": "@remotion/eslint-config-internal", - "version": "4.0.423", + "version": "4.0.424", "license": "SEE LICENSE IN LICENSE.md", "main": "dist/index.js", "scripts": { diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 35cd072ea56..b555b7ebf11 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config" }, "name": "@remotion/eslint-config", - "version": "4.0.423", + "version": "4.0.424", "description": "Default configuration for Remotion templates (ESLint <= 8)", "main": "dist/index.js", "files": [ diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 85ef17d82df..a225cca0eb6 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-plugin" }, "name": "@remotion/eslint-plugin", - "version": "4.0.423", + "version": "4.0.424", "description": "Rules for writing Remotion code", "scripts": { "test": "node src/tests/execute.mjs", diff --git a/packages/example-videos/package.json b/packages/example-videos/package.json index 5209113e638..4a73cfd64b9 100644 --- a/packages/example-videos/package.json +++ b/packages/example-videos/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/example-videos" }, "name": "@remotion/example-videos", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/index.js", "types": "dist/index.d.ts", "sideEffects": false, diff --git a/packages/example-without-zod/package.json b/packages/example-without-zod/package.json index 71fa1d9b47c..82aa24d4acd 100644 --- a/packages/example-without-zod/package.json +++ b/packages/example-without-zod/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/example-without-zod", "private": true, - "version": "4.0.423", + "version": "4.0.424", "license": "SEE LICENSE IN LICENSE.md", "author": "Jonny Burger", "main": "dist/index.js", diff --git a/packages/example/package.json b/packages/example/package.json index ede99ba8bc0..d713e1701be 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/example", "private": true, - "version": "4.0.423", + "version": "4.0.424", "license": "SEE LICENSE IN LICENSE.md", "author": "Jonny Burger", "main": "dist/index.js", diff --git a/packages/fonts/package.json b/packages/fonts/package.json index d031930fe6b..d8229ab8d60 100644 --- a/packages/fonts/package.json +++ b/packages/fonts/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/fonts" }, "name": "@remotion/fonts", - "version": "4.0.423", + "version": "4.0.424", "description": "Helpers for loading local fonts into Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/gif/package.json b/packages/gif/package.json index 4d08fac5748..91fd9939f0d 100644 --- a/packages/gif/package.json +++ b/packages/gif/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/gif" }, "name": "@remotion/gif", - "version": "4.0.423", + "version": "4.0.424", "description": "Embed GIFs in a Remotion video", "sideEffects": false, "bugs": { diff --git a/packages/gif/src/lru/index.ts b/packages/gif/src/lru/index.ts index b9e684d27a2..72cb6a8c9a2 100644 --- a/packages/gif/src/lru/index.ts +++ b/packages/gif/src/lru/index.ts @@ -29,9 +29,9 @@ type MapValue = { expiry?: number; }; -export class QuickLRU - implements Iterable<[KeyType, ValueType]> -{ +export class QuickLRU implements Iterable< + [KeyType, ValueType] +> { /** The maximum number of milliseconds an item should remain in the cache. diff --git a/packages/google-fonts/package.json b/packages/google-fonts/package.json index 80f6e069c96..e1bc6bb302f 100644 --- a/packages/google-fonts/package.json +++ b/packages/google-fonts/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/google-fonts" }, "name": "@remotion/google-fonts", - "version": "4.0.423", + "version": "4.0.424", "description": "Use Google Fonts in Remotion", "main": "dist/cjs/index.js", "module": "dist/esm/index.mjs", diff --git a/packages/google-fonts/scripts/incompatible-fonts.ts b/packages/google-fonts/scripts/incompatible-fonts.ts index 51800eacca0..6bff67c45b9 100644 --- a/packages/google-fonts/scripts/incompatible-fonts.ts +++ b/packages/google-fonts/scripts/incompatible-fonts.ts @@ -3,118 +3,118 @@ export const incompatibleFonts = [ "Chiron Hei HK", "Chiron Sung HK", "Linefont", + "Material Icons Sharp", "Material Icons Outlined", - "Material Icons", "Material Icons Round", - "Material Icons Sharp", + "Material Icons", "Material Icons Two Tone", "Material Symbols", - "Material Symbols Outlined", - "Material Symbols Sharp", "Material Symbols Rounded", + "Material Symbols Sharp", + "Material Symbols Outlined", "Playwrite AR", "Playwrite AR Guides", - "Playwrite AT Guides", "Playwrite AT", - "Playwrite AU NSW", - "Playwrite AU NSW Guides", - "Playwrite AU QLD", + "Playwrite AT Guides", "Playwrite AU QLD Guides", + "Playwrite AU NSW Guides", "Playwrite AU SA", + "Playwrite AU NSW", "Playwrite AU SA Guides", + "Playwrite AU QLD", "Playwrite AU TAS", "Playwrite AU TAS Guides", "Playwrite AU VIC", + "Playwrite BE VLG", "Playwrite AU VIC Guides", "Playwrite BE VLG Guides", - "Playwrite BE VLG", - "Playwrite BE WAL", "Playwrite BE WAL Guides", "Playwrite BR", - "Playwrite CA", + "Playwrite BE WAL", "Playwrite BR Guides", - "Playwrite CA Guides", + "Playwrite CA", "Playwrite CL", + "Playwrite CA Guides", "Playwrite CL Guides", - "Playwrite CO", - "Playwrite CO Guides", "Playwrite CU", - "Playwrite CZ", + "Playwrite CO Guides", "Playwrite CU Guides", - "Playwrite DE Grund Guides", - "Playwrite CZ Guides", + "Playwrite CZ", "Playwrite DE Grund", + "Playwrite CZ Guides", + "Playwrite DE Grund Guides", "Playwrite DE LA", + "Playwrite CO", "Playwrite DE LA Guides", "Playwrite DE SAS", - "Playwrite DE SAS Guides", "Playwrite DE VA", "Playwrite DE VA Guides", - "Playwrite DK Uloopet", "Playwrite DK Loopet", "Playwrite DK Loopet Guides", + "Playwrite DE SAS Guides", "Playwrite DK Uloopet Guides", + "Playwrite DK Uloopet", "Playwrite ES", "Playwrite ES Deco", + "Playwrite ES Deco Guides", "Playwrite ES Guides", "Playwrite FR Moderne", "Playwrite FR Moderne Guides", "Playwrite FR Trad", - "Playwrite ES Deco Guides", - "Playwrite GB J Guides", + "Playwrite FR Trad Guides", "Playwrite GB J", + "Playwrite GB J Guides", "Playwrite GB S", + "Playwrite HR", "Playwrite GB S Guides", "Playwrite HR Guides", "Playwrite HR Lijeva", - "Playwrite HR", - "Playwrite FR Trad Guides", "Playwrite HR Lijeva Guides", "Playwrite HU", "Playwrite HU Guides", - "Playwrite ID", "Playwrite ID Guides", "Playwrite IE", "Playwrite IE Guides", "Playwrite IN", + "Playwrite ID", + "Playwrite IS Guides", "Playwrite IN Guides", "Playwrite IS", - "Playwrite IS Guides", "Playwrite IT Moderna", "Playwrite IT Moderna Guides", "Playwrite IT Trad", - "Playwrite IT Trad Guides", "Playwrite MX", - "Playwrite MX Guides", - "Playwrite NG Modern Guides", - "Playwrite NG Modern", + "Playwrite IT Trad Guides", + "Playwrite NL Guides", "Playwrite NL", "Playwrite NO", - "Playwrite NO Guides", - "Playwrite NL Guides", "Playwrite NZ", + "Playwrite NO Guides", + "Playwrite MX Guides", + "Playwrite NG Modern Guides", + "Playwrite NG Modern", "Playwrite NZ Basic", - "Playwrite NZ Basic Guides", - "Playwrite PE", + "Playwrite PL Guides", "Playwrite NZ Guides", "Playwrite PE Guides", + "Playwrite NZ Basic Guides", + "Playwrite PE", "Playwrite PL", - "Playwrite PL Guides", "Playwrite PT", - "Playwrite RO", "Playwrite PT Guides", - "Playwrite SK", - "Playwrite RO Guides", + "Playwrite TZ", "Playwrite SK Guides", + "Playwrite RO Guides", + "Playwrite SK", "Playwrite TZ Guides", "Playwrite US Modern", - "Playwrite US Modern Guides", "Playwrite US Trad", - "Playwrite TZ", - "Playwrite VN", + "Playwrite RO", + "Playwrite US Modern Guides", "Playwrite US Trad Guides", + "Playwrite VN", "Playwrite VN Guides", - "Playwrite ZA", "Playwrite ZA Guides", + "Playwrite ZA", "Wavefont" ]; \ No newline at end of file diff --git a/packages/install-whisper-cpp/package.json b/packages/install-whisper-cpp/package.json index 5586cb4720a..73e81145a15 100644 --- a/packages/install-whisper-cpp/package.json +++ b/packages/install-whisper-cpp/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/install-whisper-cpp" }, "name": "@remotion/install-whisper-cpp", - "version": "4.0.423", + "version": "4.0.424", "description": "Helpers for installing and using Whisper.cpp", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/it-tests/package.json b/packages/it-tests/package.json index 11e887f7e6e..daa3bac6721 100644 --- a/packages/it-tests/package.json +++ b/packages/it-tests/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/it-tests" }, "name": "@remotion/it-tests", - "version": "4.0.423", + "version": "4.0.424", "license": "SEE LICENSE IN LICENSE.md", "scripts": { "test": " node --test src/node-version/media-parser.mjs && bun test src/rendering --run", diff --git a/packages/it-tests/src/templates/validate-templates.test.ts b/packages/it-tests/src/templates/validate-templates.test.ts index 1276c9aa0da..85119d13233 100644 --- a/packages/it-tests/src/templates/validate-templates.test.ts +++ b/packages/it-tests/src/templates/validate-templates.test.ts @@ -48,7 +48,7 @@ describe('Templates should be valid', () => { expect(body.dependencies['@types/web']).toInclude('0.0.166'); } - expect(body.devDependencies.prettier).toMatch('3.6.0'); + expect(body.devDependencies.prettier).toMatch('3.8.1'); expect(body.private).toBe(true); expect(body.name).toStartWith('template-'); diff --git a/packages/lambda-client/package.json b/packages/lambda-client/package.json index 0c54b5a32b4..35cb8df3c2d 100644 --- a/packages/lambda-client/package.json +++ b/packages/lambda-client/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lambda-client" }, "name": "@remotion/lambda-client", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/cjs/index.js", "sideEffects": false, "scripts": { diff --git a/packages/lambda-client/src/is-in-lambda.ts b/packages/lambda-client/src/is-in-lambda.ts index c2901d5467b..c0889148316 100644 --- a/packages/lambda-client/src/is-in-lambda.ts +++ b/packages/lambda-client/src/is-in-lambda.ts @@ -1,5 +1,5 @@ export const isInsideLambda = () => Boolean( typeof process !== 'undefined' && - process?.env?.__RESERVED_IS_INSIDE_REMOTION_LAMBDA, + process?.env?.__RESERVED_IS_INSIDE_REMOTION_LAMBDA, ); diff --git a/packages/lambda-go-example/package.json b/packages/lambda-go-example/package.json index 9ad72320af0..1472e4e1e5a 100644 --- a/packages/lambda-go-example/package.json +++ b/packages/lambda-go-example/package.json @@ -4,8 +4,6 @@ }, "name": "@remotion/lambda-go-example", "private": true, - "version": "4.0.423", - "scripts": { - "lint": "node build.mjs" - } + "version": "4.0.424", + "scripts": {} } diff --git a/packages/lambda-go/package.json b/packages/lambda-go/package.json index 5404c36b411..6fa9dbedbf8 100644 --- a/packages/lambda-go/package.json +++ b/packages/lambda-go/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-go", "private": true, - "version": "4.0.423", + "version": "4.0.424", "scripts": { "lint": "node build.mjs", "publishprivate": "node publish.mjs" diff --git a/packages/lambda-go/version.go b/packages/lambda-go/version.go index 375477302d9..d64a2fb0879 100644 --- a/packages/lambda-go/version.go +++ b/packages/lambda-go/version.go @@ -1,3 +1,3 @@ package lambda_go_sdk; -const VERSION = "4.0.423" \ No newline at end of file +const VERSION = "4.0.424" \ No newline at end of file diff --git a/packages/lambda-php-example/composer.json b/packages/lambda-php-example/composer.json index 1a782c5d5d5..88c131a5811 100644 --- a/packages/lambda-php-example/composer.json +++ b/packages/lambda-php-example/composer.json @@ -19,6 +19,6 @@ ], "require": { "vlucas/phpdotenv": "^5.5", - "remotion/lambda": "4.0.423" + "remotion/lambda": "4.0.424" } } diff --git a/packages/lambda-php/composer.json b/packages/lambda-php/composer.json index 333aa86c4d6..0a1cc61b974 100644 --- a/packages/lambda-php/composer.json +++ b/packages/lambda-php/composer.json @@ -1,7 +1,7 @@ { "name": "remotion/lambda", "type": "library", - "version": "4.0.423", + "version": "4.0.424", "description": "A PHP library for working with Remotion Lambda", "license": "proprietary", "autoload": { diff --git a/packages/lambda-php/composer.lock b/packages/lambda-php/composer.lock index 082c04db2d9..477b81d4f03 100644 --- a/packages/lambda-php/composer.lock +++ b/packages/lambda-php/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "280ab9c7fda40490fd7afe90f75bda55", + "content-hash": "de2d3234d8b3ac7fce37dc7eace49d7c", "packages": [ { "name": "aws/aws-crt-php", diff --git a/packages/lambda-php/package.json b/packages/lambda-php/package.json index 93c7e7d9650..206fde5571b 100644 --- a/packages/lambda-php/package.json +++ b/packages/lambda-php/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-php", "private": true, - "version": "4.0.423", + "version": "4.0.424", "scripts": { "lint": "node build.mjs", "publishprivate": "node publish.mjs" diff --git a/packages/lambda-php/src/Semantic.php b/packages/lambda-php/src/Semantic.php index 873b8a90e60..b768135029e 100644 --- a/packages/lambda-php/src/Semantic.php +++ b/packages/lambda-php/src/Semantic.php @@ -4,5 +4,5 @@ class Semantic { - public const VERSION = "4.0.423"; + public const VERSION = "4.0.424"; } \ No newline at end of file diff --git a/packages/lambda-python/package.json b/packages/lambda-python/package.json index 8620a9dd200..0c24fcb1464 100644 --- a/packages/lambda-python/package.json +++ b/packages/lambda-python/package.json @@ -4,9 +4,8 @@ }, "name": "@remotion/lambda-python", "private": true, - "version": "4.0.423", + "version": "4.0.424", "scripts": { - "lint": "node build.mjs", "publishprivate": "node publish.mjs" }, "devDependencies": { diff --git a/packages/lambda-python/remotion_lambda/version.py b/packages/lambda-python/remotion_lambda/version.py index b0e2c524186..16fe619fd91 100644 --- a/packages/lambda-python/remotion_lambda/version.py +++ b/packages/lambda-python/remotion_lambda/version.py @@ -1,2 +1,2 @@ # pylint: disable=missing-module-docstring, missing-final-newline -VERSION = "4.0.423" \ No newline at end of file +VERSION = "4.0.424" \ No newline at end of file diff --git a/packages/lambda-ruby/lib/remotion_lambda/version.rb b/packages/lambda-ruby/lib/remotion_lambda/version.rb index 170513e3858..2082105a73f 100644 --- a/packages/lambda-ruby/lib/remotion_lambda/version.rb +++ b/packages/lambda-ruby/lib/remotion_lambda/version.rb @@ -1 +1 @@ -VERSION = "4.0.423" \ No newline at end of file +VERSION = "4.0.424" \ No newline at end of file diff --git a/packages/lambda-ruby/package.json b/packages/lambda-ruby/package.json index a2497a55fec..53ff4b1fc2d 100644 --- a/packages/lambda-ruby/package.json +++ b/packages/lambda-ruby/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-ruby", "private": true, - "version": "4.0.423", + "version": "4.0.424", "scripts": { "publishprivate": "bun publish.ts" }, diff --git a/packages/lambda-ruby/remotion_lambda.gemspec b/packages/lambda-ruby/remotion_lambda.gemspec index 444de1cef57..ceda4996bc8 100644 --- a/packages/lambda-ruby/remotion_lambda.gemspec +++ b/packages/lambda-ruby/remotion_lambda.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = "remotion_lambda" - s.version = "4.0.423" + s.version = "4.0.424" s.summary = "Remotion Lambda SDK" s.description = "A Ruby SDK for Remotion Lambda" s.authors = ["Jonny Burger"] diff --git a/packages/lambda/package.json b/packages/lambda/package.json index 5ad2c618cb0..48dc44167ae 100644 --- a/packages/lambda/package.json +++ b/packages/lambda/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lambda" }, "name": "@remotion/lambda", - "version": "4.0.423", + "version": "4.0.424", "description": "Render Remotion videos on AWS Lambda", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/lambda/src/cli/commands/render/render.ts b/packages/lambda/src/cli/commands/render/render.ts index 5d0cd75cca4..2922e30398e 100644 --- a/packages/lambda/src/cli/commands/render/render.ts +++ b/packages/lambda/src/cli/commands/render/render.ts @@ -56,6 +56,8 @@ const { metadataOption, mediaCacheSizeInBytesOption, darkModeOption, + pixelFormatOption, + browserExecutableOption, } = BrowserSafeApis.options; export const renderCommand = async ({ @@ -90,12 +92,10 @@ export const renderCommand = async ({ envVariables, frameRange, inputProps, - pixelFormat, proResProfile, everyNthFrame, height, width, - browserExecutable, ignoreCertificateErrors, userAgent, disableWebSecurity, @@ -105,6 +105,12 @@ export const renderCommand = async ({ indent: false, }); + const pixelFormat = pixelFormatOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; + const browserExecutable = browserExecutableOption.getValue({ + commandLine: CliInternals.parsedCli, + }).value; const x264Preset = x264Option.getValue({ commandLine: CliInternals.parsedCli, }).value; diff --git a/packages/lambda/src/cli/commands/still.ts b/packages/lambda/src/cli/commands/still.ts index 7003a601c1f..bffe16f3cb6 100644 --- a/packages/lambda/src/cli/commands/still.ts +++ b/packages/lambda/src/cli/commands/still.ts @@ -35,6 +35,7 @@ const { binariesDirectoryOption, mediaCacheSizeInBytesOption, darkModeOption, + browserExecutableOption, } = BrowserSafeApis.options; const { @@ -81,7 +82,6 @@ export const stillCommand = async ({ stillFrame, height, width, - browserExecutable, userAgent, disableWebSecurity, ignoreCertificateErrors, @@ -91,6 +91,10 @@ export const stillCommand = async ({ indent: false, }); + const browserExecutable = browserExecutableOption.getValue({ + commandLine: parsedCli, + }).value; + const region = getAwsRegion(); let composition = args[1]; @@ -206,15 +210,17 @@ export const stillCommand = async ({ const privacy = parsedLambdaCli.privacy ?? DEFAULT_OUTPUT_PRIVACY; validatePrivacy(privacy, true); + const {stillImageFormatOption} = BrowserSafeApis.options; + const {format: imageFormat, source: imageFormatReason} = determineFinalStillImageFormat({ downloadName, outName: outName ?? null, - cliFlag: parsedCli['image-format'] ?? null, + configuredImageFormat: stillImageFormatOption.getValue({ + commandLine: parsedCli, + }).value, isLambda: true, fromUi: null, - configImageFormat: - ConfigInternals.getUserPreferredStillImageFormat() ?? null, }); Log.info( diff --git a/packages/layout-utils/package.json b/packages/layout-utils/package.json index 677939a2d15..0b31582c852 100644 --- a/packages/layout-utils/package.json +++ b/packages/layout-utils/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/layout-utils" }, "name": "@remotion/layout-utils", - "version": "4.0.423", + "version": "4.0.424", "description": "Utilities for working with layouts", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/licensing/package.json b/packages/licensing/package.json index 72ca6b901a0..0ce33db0882 100644 --- a/packages/licensing/package.json +++ b/packages/licensing/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/licensing" }, "name": "@remotion/licensing", - "version": "4.0.423", + "version": "4.0.424", "description": "Manage your Remotion.pro license", "main": "dist", "sideEffects": false, diff --git a/packages/light-leaks/package.json b/packages/light-leaks/package.json index c6fb001c6ba..87541c74ba9 100644 --- a/packages/light-leaks/package.json +++ b/packages/light-leaks/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/light-leaks", - "version": "4.0.423", + "version": "4.0.424", "description": "Light leak effects for Remotion", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/lottie/package.json b/packages/lottie/package.json index 819abbd553e..487f7f8ecfe 100644 --- a/packages/lottie/package.json +++ b/packages/lottie/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lottie" }, "name": "@remotion/lottie", - "version": "4.0.423", + "version": "4.0.424", "description": "Include Lottie animations in Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 74559f16627..c64b374629b 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/mcp" }, "name": "@remotion/mcp", - "version": "4.0.423", + "version": "4.0.424", "description": "Remotion's Model Context Protocol", "main": "dist/esm/index.mjs", "sideEffects": false, diff --git a/packages/media-parser/package.json b/packages/media-parser/package.json index 4334909cbfd..9304342b1df 100644 --- a/packages/media-parser/package.json +++ b/packages/media-parser/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser" }, "name": "@remotion/media-parser", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/index.js", "sideEffects": false, "scripts": { diff --git a/packages/media-parser/src/version.ts b/packages/media-parser/src/version.ts index 31d01b4e7f0..00e70c3a84d 100644 --- a/packages/media-parser/src/version.ts +++ b/packages/media-parser/src/version.ts @@ -1,2 +1,2 @@ // Automatically generated on publish -export const VERSION = '4.0.423'; +export const VERSION = '4.0.424'; diff --git a/packages/media-utils/package.json b/packages/media-utils/package.json index 3f177376169..37a5ddbcc78 100644 --- a/packages/media-utils/package.json +++ b/packages/media-utils/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-utils" }, "name": "@remotion/media-utils", - "version": "4.0.423", + "version": "4.0.424", "description": "Utilities for working with media files", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/media/bundle.ts b/packages/media/bundle.ts index e8e1604e133..1e3c593af14 100644 --- a/packages/media/bundle.ts +++ b/packages/media/bundle.ts @@ -17,6 +17,7 @@ const output = await build({ 'react/jsx-dev-runtime', 'react-dom', 'mediabunny', + '@mediabunny/ac3', ], }); diff --git a/packages/media/package.json b/packages/media/package.json index 6d7e878b01b..39c4ed9287f 100644 --- a/packages/media/package.json +++ b/packages/media/package.json @@ -1,13 +1,12 @@ { "name": "@remotion/media", - "version": "4.0.423", + "version": "4.0.424", "main": "dist/index.js", "types": "dist/index.d.ts", "module": "dist/esm/index.mjs", "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media" }, - "sideEffects": false, "author": "Jonny Burger , Hunain Ahmed ", "bugs": { "url": "https://github.com/remotion-dev/remotion/issues" diff --git a/packages/media/src/index.ts b/packages/media/src/index.ts index 6bc908ec34d..71f3c206b20 100644 --- a/packages/media/src/index.ts +++ b/packages/media/src/index.ts @@ -1,3 +1,4 @@ +import {registerAc3Decoder} from '@mediabunny/ac3'; import {Audio} from './audio/audio'; import {Video} from './video/video'; /** @@ -15,3 +16,5 @@ export {AudioProps, FallbackHtml5AudioProps} from './audio/props'; export {MediaErrorAction} from './on-error'; export {FallbackOffthreadVideoProps, VideoProps} from './video/props'; export {Audio, Video}; + +registerAc3Decoder(); diff --git a/packages/motion-blur/package.json b/packages/motion-blur/package.json index 4db6d6f91ed..90a42ee8230 100644 --- a/packages/motion-blur/package.json +++ b/packages/motion-blur/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/motion-blur" }, "name": "@remotion/motion-blur", - "version": "4.0.423", + "version": "4.0.424", "description": "Motion blur effect for Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/noise/package.json b/packages/noise/package.json index 7af2cc2e66b..16532544201 100644 --- a/packages/noise/package.json +++ b/packages/noise/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/noise" }, "name": "@remotion/noise", - "version": "4.0.423", + "version": "4.0.424", "description": "Noise generation functions", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/openai-whisper/package.json b/packages/openai-whisper/package.json index 0a985c28737..d9cd0cdb8e9 100644 --- a/packages/openai-whisper/package.json +++ b/packages/openai-whisper/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/openai-whisper" }, "name": "@remotion/openai-whisper", - "version": "4.0.423", + "version": "4.0.424", "description": "Work with the output of the OpenAI Whisper API", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/paths/package.json b/packages/paths/package.json index 283ff9beec1..0ad7ce4bc42 100644 --- a/packages/paths/package.json +++ b/packages/paths/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/paths" }, "name": "@remotion/paths", - "version": "4.0.423", + "version": "4.0.424", "description": "Utilities for working with SVG paths", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/player-example/package.json b/packages/player-example/package.json index 696823bd040..9de714d0549 100644 --- a/packages/player-example/package.json +++ b/packages/player-example/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/player-example" }, "name": "@remotion/player-example", - "version": "4.0.423", + "version": "4.0.424", "private": true, "author": "Jonny Burger ", "maintainers": [ diff --git a/packages/player/package.json b/packages/player/package.json index 2d53992bffe..04c4be42547 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/player" }, "name": "@remotion/player", - "version": "4.0.423", + "version": "4.0.424", "description": "React component for embedding a Remotion preview into your app", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/player/src/PlayerUI.tsx b/packages/player/src/PlayerUI.tsx index c21e18d52ab..04a967d93fc 100644 --- a/packages/player/src/PlayerUI.tsx +++ b/packages/player/src/PlayerUI.tsx @@ -162,8 +162,8 @@ const PlayerUI: React.ForwardRefRenderFunction< return Boolean( document.fullscreenEnabled || - // @ts-expect-error Types not defined - document.webkitFullscreenEnabled, + // @ts-expect-error Types not defined + document.webkitFullscreenEnabled, ); }, []); diff --git a/packages/preload/package.json b/packages/preload/package.json index f96ed67d78a..f9809902268 100644 --- a/packages/preload/package.json +++ b/packages/preload/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/preload" }, "name": "@remotion/preload", - "version": "4.0.423", + "version": "4.0.424", "description": "Preloads assets for use in Remotion", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/promo-pages/package.json b/packages/promo-pages/package.json index 65cd55146bf..f9153e1f16d 100644 --- a/packages/promo-pages/package.json +++ b/packages/promo-pages/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/promo-pages", - "version": "4.0.423", + "version": "4.0.424", "publishConfig": { "access": "public" }, diff --git a/packages/promo-pages/src/components/experts.tsx b/packages/promo-pages/src/components/experts.tsx index bb40a05f8c5..f9c9d805b52 100644 --- a/packages/promo-pages/src/components/experts.tsx +++ b/packages/promo-pages/src/components/experts.tsx @@ -1,3 +1,3 @@ -export {ExpertsPageContent} from './experts/ExpertsPage'; export {experts} from './experts/experts-data'; export type {Expert} from './experts/experts-data'; +export {ExpertsPageContent} from './experts/ExpertsPage'; diff --git a/packages/promo-pages/src/components/experts/experts-data.tsx b/packages/promo-pages/src/components/experts/experts-data.tsx index 28f463d5637..f14fad2108f 100644 --- a/packages/promo-pages/src/components/experts/experts-data.tsx +++ b/packages/promo-pages/src/components/experts/experts-data.tsx @@ -585,11 +585,10 @@ export const experts: Expert[] = [ Pablituuu Studio , a premium AI-powered video editor. -
- I specialize in building complex Remotion applications integrated with AI - services like Gemini (for video analysis and highlights) and Deepgram - (for automated captions). I also focus on high-performance canvas - interactions using Fabric.js and cost-effective AI workflows. +
I specialize in building complex Remotion applications integrated + with AI services like Gemini (for video analysis and highlights) and + Deepgram (for automated captions). I also focus on high-performance + canvas interactions using Fabric.js and cost-effective AI workflows.
), }, diff --git a/packages/promo-pages/src/components/homepage/FreePricing.tsx b/packages/promo-pages/src/components/homepage/FreePricing.tsx index 23f6d9df65a..5331922d19d 100644 --- a/packages/promo-pages/src/components/homepage/FreePricing.tsx +++ b/packages/promo-pages/src/components/homepage/FreePricing.tsx @@ -383,8 +383,7 @@ export const CompanyPricing: React.FC = () => {
A $100/mo Minimum Spend applies.

- Developers working on automation projects do not require a - Seat. + Developers working on automation projects do not require a Seat.
{ > At this spend, you are eligible for the Enterprise License.
You can select it when setting up your license, or{' '} - + contact us . diff --git a/packages/promo-pages/src/components/homepage/InfoTooltip.tsx b/packages/promo-pages/src/components/homepage/InfoTooltip.tsx index 38a79ed96d2..6cc382504a9 100644 --- a/packages/promo-pages/src/components/homepage/InfoTooltip.tsx +++ b/packages/promo-pages/src/components/homepage/InfoTooltip.tsx @@ -17,9 +17,9 @@ export const InfoTooltip: React.FC = ({children}) => { ⓘ {isVisible && ( - - {children} - + + {children} + )} diff --git a/packages/promo-pages/src/components/homepage/VideoAppsShowcase.tsx b/packages/promo-pages/src/components/homepage/VideoAppsShowcase.tsx index 12cfed656ec..790d404699c 100644 --- a/packages/promo-pages/src/components/homepage/VideoAppsShowcase.tsx +++ b/packages/promo-pages/src/components/homepage/VideoAppsShowcase.tsx @@ -152,27 +152,27 @@ const VideoAppsShowcase: React.FC = () => { onClick={handlePlayPause} > {videoLoaded ? ( - setIsPlaying(true)} - /> - ) : ( - {videoApps[activeTab].title} - )} + setIsPlaying(true)} + /> + ) : ( + {videoApps[activeTab].title} + )} {/* Play/Pause Button - bottom left corner */}