@bitmagic/cli 0.1.83-dev.0 → 0.1.83-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +70 -1
  2. package/assets/skills/publishing-to-steam/SKILL.md +218 -0
  3. package/dist/assets/vxl-summary.d.ts +6 -20
  4. package/dist/assets/vxl-summary.js +9 -100
  5. package/dist/assets/vxl-summary.js.map +1 -1
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.js +2 -0
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/check.js +5 -0
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/forge.js +1 -1
  12. package/dist/commands/forge.js.map +1 -1
  13. package/dist/commands/import.js +2 -4
  14. package/dist/commands/import.js.map +1 -1
  15. package/dist/commands/init.js +0 -3
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/ios.js +88 -136
  18. package/dist/commands/ios.js.map +1 -1
  19. package/dist/commands/promote.js +2 -4
  20. package/dist/commands/promote.js.map +1 -1
  21. package/dist/commands/publish.js +0 -1
  22. package/dist/commands/publish.js.map +1 -1
  23. package/dist/commands/steam-build.d.ts +67 -0
  24. package/dist/commands/steam-build.js +286 -0
  25. package/dist/commands/steam-build.js.map +1 -0
  26. package/dist/commands/steam-portal.d.ts +1 -0
  27. package/dist/commands/steam-portal.js +319 -0
  28. package/dist/commands/steam-portal.js.map +1 -0
  29. package/dist/commands/steam-upload.d.ts +37 -0
  30. package/dist/commands/steam-upload.js +172 -0
  31. package/dist/commands/steam-upload.js.map +1 -0
  32. package/dist/commands/steam.d.ts +1 -0
  33. package/dist/commands/steam.js +502 -0
  34. package/dist/commands/steam.js.map +1 -0
  35. package/dist/commands/verify.js +6 -0
  36. package/dist/commands/verify.js.map +1 -1
  37. package/dist/editor/asset-viewer.js +5 -4
  38. package/dist/editor/asset-viewer.js.map +1 -1
  39. package/dist/editor/game-info-panel.d.ts +2 -2
  40. package/dist/editor/game-info-panel.js +1 -2
  41. package/dist/editor/game-info-panel.js.map +1 -1
  42. package/dist/editor/game-info.d.ts +1 -3
  43. package/dist/editor/game-info.js +1 -2
  44. package/dist/editor/game-info.js.map +1 -1
  45. package/dist/editor/server.js +2 -3
  46. package/dist/editor/server.js.map +1 -1
  47. package/dist/editor/shell-page.js +9 -7
  48. package/dist/editor/shell-page.js.map +1 -1
  49. package/dist/forge/browser-host.d.ts +6 -12
  50. package/dist/forge/browser-host.js +5 -11
  51. package/dist/forge/browser-host.js.map +1 -1
  52. package/dist/ios/native-overrides.d.ts +27 -0
  53. package/dist/ios/native-overrides.js +87 -0
  54. package/dist/ios/native-overrides.js.map +1 -0
  55. package/dist/ios/record-validate.d.ts +1 -33
  56. package/dist/ios/record-validate.js +2 -100
  57. package/dist/ios/record-validate.js.map +1 -1
  58. package/dist/ios/store-bridge.d.ts +26 -0
  59. package/dist/ios/store-bridge.js +224 -0
  60. package/dist/ios/store-bridge.js.map +1 -0
  61. package/dist/ios/storekit-config.d.ts +15 -0
  62. package/dist/ios/storekit-config.js +106 -0
  63. package/dist/ios/storekit-config.js.map +1 -0
  64. package/dist/ios/xcode-template.d.ts +12 -3
  65. package/dist/ios/xcode-template.js +158 -27
  66. package/dist/ios/xcode-template.js.map +1 -1
  67. package/dist/package/collect-urls.d.ts +1 -1
  68. package/dist/package/collect-urls.js +10 -2
  69. package/dist/package/collect-urls.js.map +1 -1
  70. package/dist/package/offline-payload.d.ts +35 -0
  71. package/dist/package/offline-payload.js +142 -0
  72. package/dist/package/offline-payload.js.map +1 -0
  73. package/dist/package/packaged-check.d.ts +39 -0
  74. package/dist/package/packaged-check.js +104 -0
  75. package/dist/package/packaged-check.js.map +1 -0
  76. package/dist/package/transform.d.ts +4 -4
  77. package/dist/package/transform.js +3 -3
  78. package/dist/project/context.d.ts +7 -2
  79. package/dist/project/context.js +1 -2
  80. package/dist/project/context.js.map +1 -1
  81. package/dist/project/published-three.d.ts +14 -0
  82. package/dist/project/published-three.js +93 -0
  83. package/dist/project/published-three.js.map +1 -0
  84. package/dist/publish/bundle.d.ts +1 -1
  85. package/dist/publish/bundle.js +8 -3
  86. package/dist/publish/bundle.js.map +1 -1
  87. package/dist/publish/platform.d.ts +1 -1
  88. package/dist/publish/platform.js +1 -1
  89. package/dist/publish/source-zip.d.ts +0 -1
  90. package/dist/publish/source-zip.js +1 -2
  91. package/dist/publish/source-zip.js.map +1 -1
  92. package/dist/scaffold/aliases.js +8 -5
  93. package/dist/scaffold/aliases.js.map +1 -1
  94. package/dist/scaffold/engine-download.d.ts +1 -1
  95. package/dist/scaffold/engine-download.js +1 -1
  96. package/dist/scaffold/export-zip.d.ts +0 -1
  97. package/dist/scaffold/export-zip.js +3 -6
  98. package/dist/scaffold/export-zip.js.map +1 -1
  99. package/dist/scaffold/import-project.js +1 -1
  100. package/dist/scaffold/project-export.js +0 -1
  101. package/dist/scaffold/project-export.js.map +1 -1
  102. package/dist/scaffold/project-files.d.ts +0 -1
  103. package/dist/scaffold/project-files.js +8 -5
  104. package/dist/scaffold/project-files.js.map +1 -1
  105. package/dist/scaffold/project.d.ts +15 -4
  106. package/dist/scaffold/project.js +30 -13
  107. package/dist/scaffold/project.js.map +1 -1
  108. package/dist/scaffold/skill-files.js +3 -1
  109. package/dist/scaffold/skill-files.js.map +1 -1
  110. package/dist/scaffold/steam-skill-files.d.ts +2 -0
  111. package/dist/scaffold/steam-skill-files.js +7 -0
  112. package/dist/scaffold/steam-skill-files.js.map +1 -0
  113. package/dist/scaffold/suggest-template.js +0 -1
  114. package/dist/scaffold/suggest-template.js.map +1 -1
  115. package/dist/scaffold/unity-skill-files.js +1 -1
  116. package/dist/steam/art-generate.d.ts +55 -0
  117. package/dist/steam/art-generate.js +173 -0
  118. package/dist/steam/art-generate.js.map +1 -0
  119. package/dist/steam/art-render.d.ts +25 -0
  120. package/dist/steam/art-render.js +157 -0
  121. package/dist/steam/art-render.js.map +1 -0
  122. package/dist/steam/art-use.d.ts +20 -0
  123. package/dist/steam/art-use.js +84 -0
  124. package/dist/steam/art-use.js.map +1 -0
  125. package/dist/steam/art.d.ts +98 -0
  126. package/dist/steam/art.js +243 -0
  127. package/dist/steam/art.js.map +1 -0
  128. package/dist/steam/check.d.ts +21 -0
  129. package/dist/steam/check.js +113 -0
  130. package/dist/steam/check.js.map +1 -0
  131. package/dist/steam/config.d.ts +57 -0
  132. package/dist/steam/config.js +145 -0
  133. package/dist/steam/config.js.map +1 -0
  134. package/dist/steam/electron-cache.d.ts +11 -0
  135. package/dist/steam/electron-cache.js +105 -0
  136. package/dist/steam/electron-cache.js.map +1 -0
  137. package/dist/steam/fuses.d.ts +16 -0
  138. package/dist/steam/fuses.js +75 -0
  139. package/dist/steam/fuses.js.map +1 -0
  140. package/dist/steam/icon-files.d.ts +16 -0
  141. package/dist/steam/icon-files.js +70 -0
  142. package/dist/steam/icon-files.js.map +1 -0
  143. package/dist/steam/image-info.d.ts +16 -0
  144. package/dist/steam/image-info.js +89 -0
  145. package/dist/steam/image-info.js.map +1 -0
  146. package/dist/steam/launch-check.d.ts +12 -0
  147. package/dist/steam/launch-check.js +101 -0
  148. package/dist/steam/launch-check.js.map +1 -0
  149. package/dist/steam/media.d.ts +48 -0
  150. package/dist/steam/media.js +151 -0
  151. package/dist/steam/media.js.map +1 -0
  152. package/dist/steam/package-macos.d.ts +52 -0
  153. package/dist/steam/package-macos.js +268 -0
  154. package/dist/steam/package-macos.js.map +1 -0
  155. package/dist/steam/package-windows.d.ts +24 -0
  156. package/dist/steam/package-windows.js +84 -0
  157. package/dist/steam/package-windows.js.map +1 -0
  158. package/dist/steam/paths.d.ts +37 -0
  159. package/dist/steam/paths.js +45 -0
  160. package/dist/steam/paths.js.map +1 -0
  161. package/dist/steam/playtest-shots.d.ts +18 -0
  162. package/dist/steam/playtest-shots.js +83 -0
  163. package/dist/steam/playtest-shots.js.map +1 -0
  164. package/dist/steam/portal-recipes.d.ts +25 -0
  165. package/dist/steam/portal-recipes.js +61 -0
  166. package/dist/steam/portal-recipes.js.map +1 -0
  167. package/dist/steam/portal.d.ts +58 -0
  168. package/dist/steam/portal.js +340 -0
  169. package/dist/steam/portal.js.map +1 -0
  170. package/dist/steam/raster.d.ts +59 -0
  171. package/dist/steam/raster.js +285 -0
  172. package/dist/steam/raster.js.map +1 -0
  173. package/dist/steam/shell-files.d.ts +17 -0
  174. package/dist/steam/shell-files.js +268 -0
  175. package/dist/steam/shell-files.js.map +1 -0
  176. package/dist/steam/specs.d.ts +61 -0
  177. package/dist/steam/specs.js +103 -0
  178. package/dist/steam/specs.js.map +1 -0
  179. package/dist/steam/steampipe.d.ts +46 -0
  180. package/dist/steam/steampipe.js +170 -0
  181. package/dist/steam/steampipe.js.map +1 -0
  182. package/dist/steam/store-copy.d.ts +89 -0
  183. package/dist/steam/store-copy.js +221 -0
  184. package/dist/steam/store-copy.js.map +1 -0
  185. package/dist/steam/tags.d.ts +9 -0
  186. package/dist/steam/tags.js +49 -0
  187. package/dist/steam/tags.js.map +1 -0
  188. package/dist/steam/trailer.d.ts +34 -0
  189. package/dist/steam/trailer.js +141 -0
  190. package/dist/steam/trailer.js.map +1 -0
  191. package/dist/verify/browser.d.ts +11 -0
  192. package/dist/verify/browser.js +195 -152
  193. package/dist/verify/browser.js.map +1 -1
  194. package/dist/verify/classify.d.ts +11 -2
  195. package/dist/verify/classify.js +16 -4
  196. package/dist/verify/classify.js.map +1 -1
  197. package/dist/verify/mobile-parity.d.ts +1 -1
  198. package/dist/verify/mobile-parity.js +1 -1
  199. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-copy.js","sourceRoot":"","sources":["../../src/steam/store-copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function steamTagsCachePath(baseDir?: string): string;
2
+ /** Tag names from the endpoint's `[{tagid, name}]` shape. Pure. */
3
+ export declare function parseTagList(value: unknown): string[] | null;
4
+ /** Every Steam tag, lowercased, or null when the list is unavailable. */
5
+ export declare function loadSteamTags(options?: {
6
+ fetchImpl?: typeof globalThis.fetch;
7
+ cachePath?: string;
8
+ now?: number;
9
+ }): Promise<ReadonlySet<string> | null>;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Steam's own tag list, so `steam check` can refuse a tag Steamworks would not offer. Fetched
3
+ * from the store's public endpoint and cached for a week under `~/.bitmagic/cache/`; offline, the
4
+ * check simply skips tag names rather than failing on a missing network.
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as os from 'os';
8
+ import * as path from 'path';
9
+ import { readJsonFile, writeJsonAtomic } from '../atomic-json.js';
10
+ const TAGS_URL = 'https://store.steampowered.com/tagdata/populartags/english';
11
+ const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
12
+ export function steamTagsCachePath(baseDir = path.join(os.homedir(), '.bitmagic')) {
13
+ return path.join(baseDir, 'cache', 'steam-tags.json');
14
+ }
15
+ /** Tag names from the endpoint's `[{tagid, name}]` shape. Pure. */
16
+ export function parseTagList(value) {
17
+ if (!Array.isArray(value))
18
+ return null;
19
+ const names = value
20
+ .map((entry) => (typeof entry === 'object' && entry !== null ? entry.name : undefined))
21
+ .filter((name) => typeof name === 'string' && name.length > 0);
22
+ return names.length > 0 ? names : null;
23
+ }
24
+ /** Every Steam tag, lowercased, or null when the list is unavailable. */
25
+ export async function loadSteamTags(options = {}) {
26
+ const cachePath = options.cachePath ?? steamTagsCachePath();
27
+ const now = options.now ?? Date.now();
28
+ const cached = readJsonFile(cachePath);
29
+ const cachedTags = parseTagList(cached?.tags);
30
+ if (cachedTags !== null && typeof cached?.fetchedAt === 'number' && now - cached.fetchedAt < MAX_AGE_MS) {
31
+ return new Set(cachedTags.map((tag) => tag.toLowerCase()));
32
+ }
33
+ try {
34
+ const response = await (options.fetchImpl ?? globalThis.fetch)(TAGS_URL, { signal: AbortSignal.timeout(15_000) });
35
+ if (!response.ok)
36
+ throw new Error(`HTTP ${response.status}`);
37
+ const tags = parseTagList(await response.json());
38
+ if (tags === null)
39
+ throw new Error('unexpected shape');
40
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
41
+ writeJsonAtomic(cachePath, { fetchedAt: now, tags: tags.map((name) => ({ name })) });
42
+ return new Set(tags.map((tag) => tag.toLowerCase()));
43
+ }
44
+ catch {
45
+ // A stale list still beats none.
46
+ return cachedTags !== null ? new Set(cachedTags.map((tag) => tag.toLowerCase())) : null;
47
+ }
48
+ }
49
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/steam/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type VideoProbe } from './media.js';
2
+ export interface TrailerProblem {
3
+ level: 'error' | 'warning';
4
+ message: string;
5
+ }
6
+ /** What Steam would object to in `probe`. Pure. */
7
+ export declare function trailerProblems(probe: VideoProbe, file: string): TrailerProblem[];
8
+ /** The end card: the logo over a darkened frame, an optional tagline and call to action under it. */
9
+ export declare function endCardHtml(options: {
10
+ width: number;
11
+ height: number;
12
+ logoUrl: string;
13
+ tagline?: string;
14
+ cta?: string;
15
+ fontUrl: string | null;
16
+ }): string;
17
+ /** The output frame rate: the source's own when Steam takes it, else the nearer of 30 and 60. */
18
+ export declare function targetFps(fps: number): number;
19
+ export interface SteamTrailerResult {
20
+ file: string;
21
+ probe: VideoProbe;
22
+ problems: TrailerProblem[];
23
+ }
24
+ export declare function makeSteamTrailer(options: {
25
+ video: string;
26
+ out: string;
27
+ endCard: {
28
+ seconds: number;
29
+ logoPng: Buffer;
30
+ tagline?: string;
31
+ cta?: string;
32
+ } | null;
33
+ log: (message: string) => void;
34
+ }): Promise<SteamTrailerResult>;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `bitmagic steam trailer` — a trailer Steam will accept: at most 1920x1080, 30 or 60 fps, H.264
3
+ * and AAC, a high bit rate, and an end card that ends on the game's logo instead of pointing
4
+ * players at another storefront.
5
+ *
6
+ * Why this exists rather than uploading the `bitmagic trailer` render as is: that render is cut
7
+ * for bitmagic.ai and social, and typically ends on "Play free at bitmagic.ai" with a corner
8
+ * watermark — copy a Steam reviewer flags, and wrong for a paid game. The trailer lane's own cut
9
+ * without its titles is the right source; this adds a Steam end card from the store kit's logo.
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { fileURLToPath } from 'url';
14
+ import { ensureFfmpeg, runFfmpeg } from '@bitmagic/asset-core/trailer';
15
+ import { CliError } from '../errors.js';
16
+ import { probeVideo } from './media.js';
17
+ import { RasterSession, dataUrlFor } from './raster.js';
18
+ import { TRAILER_RULES } from './specs.js';
19
+ /** What Steam would object to in `probe`. Pure. */
20
+ export function trailerProblems(probe, file) {
21
+ const problems = [];
22
+ const ext = path.extname(file).slice(1).toLowerCase();
23
+ if (!TRAILER_RULES.containers.includes(ext)) {
24
+ problems.push({ level: 'error', message: `.${ext} is not a container Steam takes (mp4, mov, wmv).` });
25
+ }
26
+ if (probe.width > TRAILER_RULES.maxWidth || probe.height > TRAILER_RULES.maxHeight) {
27
+ problems.push({ level: 'error', message: `${probe.width}x${probe.height} is larger than Steam's 1920x1080.` });
28
+ }
29
+ if (probe.width < 1280 || probe.height < 720) {
30
+ problems.push({ level: 'warning', message: `${probe.width}x${probe.height} will look soft on the store page; 1920x1080 is expected.` });
31
+ }
32
+ if (!TRAILER_RULES.frameRates.some((rate) => Math.abs(rate - probe.fps) < 0.05)) {
33
+ problems.push({ level: 'error', message: `${probe.fps} fps; Steam takes 30/29.97 or 60/59.94.` });
34
+ }
35
+ if (probe.bitrateKbps < TRAILER_RULES.minBitrateKbps) {
36
+ problems.push({ level: 'warning', message: `${probe.bitrateKbps} kbit/s; Steam asks for ${TRAILER_RULES.minBitrateKbps}+ so its own transcode stays sharp.` });
37
+ }
38
+ if (probe.videoCodec !== 'h264') {
39
+ problems.push({ level: 'warning', message: `${probe.videoCodec} video; Steam prefers H.264.` });
40
+ }
41
+ if (probe.audioCodec === null) {
42
+ problems.push({ level: 'warning', message: 'No audio track. A silent trailer is allowed but sells far less.' });
43
+ }
44
+ else if (probe.audioCodec !== 'aac') {
45
+ problems.push({ level: 'warning', message: `${probe.audioCodec} audio; Steam prefers AAC.` });
46
+ }
47
+ return problems;
48
+ }
49
+ function bundledFontDataUrl() {
50
+ const file = fileURLToPath(new URL('../../assets/fonts/NotoSans-Bold.ttf', import.meta.url));
51
+ return fs.existsSync(file) ? `data:font/ttf;base64,${fs.readFileSync(file).toString('base64')}` : null;
52
+ }
53
+ function escapeHtml(text) {
54
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
55
+ }
56
+ /** The end card: the logo over a darkened frame, an optional tagline and call to action under it. */
57
+ export function endCardHtml(options) {
58
+ const { width, height } = options;
59
+ const font = options.fontUrl ? `@font-face{font-family:'CardFont';src:url('${options.fontUrl}')}` : '';
60
+ const unit = height / 1080;
61
+ return `<!doctype html><html><head><meta charset="utf-8"><style>
62
+ ${font}
63
+ html,body{margin:0;width:${width}px;height:${height}px;overflow:hidden;background:transparent}
64
+ .shade{position:absolute;inset:0;background:radial-gradient(ellipse at 50% 45%, rgba(0,0,0,0.35) 0%, rgba(0,0,0,0.7) 100%)}
65
+ .stack{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:${Math.round(28 * unit)}px}
66
+ .logo{max-width:${Math.round(width * 0.58)}px;max-height:${Math.round(height * 0.46)}px;filter:drop-shadow(0 ${Math.round(8 * unit)}px ${Math.round(24 * unit)}px rgba(0,0,0,0.6))}
67
+ .tag{font-family:'CardFont','Helvetica Neue',Arial,sans-serif;font-weight:700;color:#fff;font-size:${Math.round(46 * unit)}px;letter-spacing:${(1.5 * unit).toFixed(1)}px;text-shadow:0 ${Math.round(3 * unit)}px ${Math.round(10 * unit)}px rgba(0,0,0,0.8)}
68
+ .cta{font-family:'CardFont','Helvetica Neue',Arial,sans-serif;font-weight:700;color:#111;background:#fff;border-radius:${Math.round(40 * unit)}px;padding:${Math.round(14 * unit)}px ${Math.round(38 * unit)}px;font-size:${Math.round(36 * unit)}px}
69
+ </style></head><body><div class="shade"></div><div class="stack">
70
+ <img class="logo" src="${options.logoUrl}">
71
+ ${options.tagline ? `<div class="tag">${escapeHtml(options.tagline)}</div>` : ''}
72
+ ${options.cta ? `<div class="cta">${escapeHtml(options.cta)}</div>` : ''}
73
+ </div></body></html>`;
74
+ }
75
+ /** The output frame rate: the source's own when Steam takes it, else the nearer of 30 and 60. */
76
+ export function targetFps(fps) {
77
+ const nearest = [...TRAILER_RULES.frameRates].sort((a, b) => Math.abs(a - fps) - Math.abs(b - fps))[0];
78
+ if (Math.abs(nearest - fps) < 0.05)
79
+ return nearest;
80
+ return fps > 45 ? 60 : 30;
81
+ }
82
+ export async function makeSteamTrailer(options) {
83
+ ensureFfmpeg(['ffmpeg', 'ffprobe']);
84
+ if (!fs.existsSync(options.video))
85
+ throw new CliError(`No video at ${options.video}.`);
86
+ const source = await probeVideo(options.video);
87
+ if (source.durationSec <= 0)
88
+ throw new CliError(`${options.video} has no duration ffprobe can read.`);
89
+ fs.mkdirSync(path.dirname(options.out), { recursive: true });
90
+ const scale = Math.min(1, TRAILER_RULES.maxWidth / source.width, TRAILER_RULES.maxHeight / source.height);
91
+ // Even dimensions: yuv420p cannot encode an odd width or height.
92
+ const width = Math.round((source.width * scale) / 2) * 2;
93
+ const height = Math.round((source.height * scale) / 2) * 2;
94
+ const fps = targetFps(source.fps);
95
+ const inputs = ['-i', options.video];
96
+ let filter = `[0:v]scale=${width}:${height}:flags=lanczos,fps=${fps},format=yuv420p[base]`;
97
+ let cardPath = null;
98
+ if (options.endCard !== null) {
99
+ const seconds = Math.min(options.endCard.seconds, source.durationSec);
100
+ const start = Math.max(0, source.durationSec - seconds);
101
+ const session = await RasterSession.open('bitmagic steam trailer');
102
+ try {
103
+ const png = await session.render(endCardHtml({
104
+ width,
105
+ height,
106
+ logoUrl: dataUrlFor(options.endCard.logoPng),
107
+ ...(options.endCard.tagline ? { tagline: options.endCard.tagline } : {}),
108
+ ...(options.endCard.cta ? { cta: options.endCard.cta } : {}),
109
+ fontUrl: bundledFontDataUrl(),
110
+ }), width, height, { transparent: true });
111
+ cardPath = `${options.out}.endcard.png`;
112
+ fs.writeFileSync(cardPath, png);
113
+ }
114
+ finally {
115
+ await session.close();
116
+ }
117
+ inputs.push('-loop', '1', '-t', seconds.toFixed(3), '-i', cardPath);
118
+ filter = `[0:v]scale=${width}:${height}:flags=lanczos,fps=${fps}[v];`
119
+ + `[1:v]format=rgba,fade=t=in:st=0:d=0.7:alpha=1,setpts=PTS+${start.toFixed(3)}/TB[card];`
120
+ + `[v][card]overlay=0:0:eof_action=pass,format=yuv420p[base]`;
121
+ }
122
+ options.log(`Encoding ${width}x${height} at ${fps} fps${options.endCard ? ' with the Steam end card' : ''}…`);
123
+ try {
124
+ await runFfmpeg([
125
+ '-hide_banner', '-loglevel', 'error', '-y', ...inputs,
126
+ '-filter_complex', filter,
127
+ '-map', '[base]', '-map', '0:a?',
128
+ '-c:v', 'libx264', '-profile:v', 'high', '-preset', 'slow', '-crf', '16',
129
+ '-c:a', 'aac', '-b:a', '192k', '-ar', '48000', '-ac', '2',
130
+ '-movflags', '+faststart',
131
+ options.out,
132
+ ]);
133
+ }
134
+ finally {
135
+ if (cardPath !== null)
136
+ fs.rmSync(cardPath, { force: true });
137
+ }
138
+ const probe = await probeVideo(options.out);
139
+ return { file: options.out, probe, problems: trailerProblems(probe, options.out) };
140
+ }
141
+ //# sourceMappingURL=trailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailer.js","sourceRoot":"","sources":["../../src/steam/trailer.ts"],"names":[],"mappings":"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"}
@@ -102,3 +102,14 @@ export declare class VerifyBrowserSession {
102
102
  close(): Promise<void>;
103
103
  check(options: HeadlessCheckOptions): Promise<VerifyObservations>;
104
104
  }
105
+ /**
106
+ * One check on a page that already exists: arm the probes, `navigate` (a `goto` for verify, a
107
+ * `reload` for a packaged desktop app that loaded its own page before anything could attach),
108
+ * start the game the way a player does, settle, and observe. Split from
109
+ * {@link VerifyBrowserSession.check} so `bitmagic steam build` can hold the real Electron app to
110
+ * the same verdict a browser tab gets.
111
+ */
112
+ export declare function observeGamePage(page: Page, options: HeadlessCheckOptions, viewport: {
113
+ width: number;
114
+ height: number;
115
+ }, navigate: (page: Page) => Promise<unknown>): Promise<VerifyObservations>;