@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.
- package/README.md +70 -1
- package/assets/skills/publishing-to-steam/SKILL.md +218 -0
- package/dist/assets/vxl-summary.d.ts +6 -20
- package/dist/assets/vxl-summary.js +9 -100
- package/dist/assets/vxl-summary.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.js +5 -0
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/forge.js +1 -1
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/import.js +2 -4
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.js +0 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/ios.js +88 -136
- package/dist/commands/ios.js.map +1 -1
- package/dist/commands/promote.js +2 -4
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/publish.js +0 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/steam-build.d.ts +67 -0
- package/dist/commands/steam-build.js +286 -0
- package/dist/commands/steam-build.js.map +1 -0
- package/dist/commands/steam-portal.d.ts +1 -0
- package/dist/commands/steam-portal.js +319 -0
- package/dist/commands/steam-portal.js.map +1 -0
- package/dist/commands/steam-upload.d.ts +37 -0
- package/dist/commands/steam-upload.js +172 -0
- package/dist/commands/steam-upload.js.map +1 -0
- package/dist/commands/steam.d.ts +1 -0
- package/dist/commands/steam.js +502 -0
- package/dist/commands/steam.js.map +1 -0
- package/dist/commands/verify.js +6 -0
- package/dist/commands/verify.js.map +1 -1
- package/dist/editor/asset-viewer.js +5 -4
- package/dist/editor/asset-viewer.js.map +1 -1
- package/dist/editor/game-info-panel.d.ts +2 -2
- package/dist/editor/game-info-panel.js +1 -2
- package/dist/editor/game-info-panel.js.map +1 -1
- package/dist/editor/game-info.d.ts +1 -3
- package/dist/editor/game-info.js +1 -2
- package/dist/editor/game-info.js.map +1 -1
- package/dist/editor/server.js +2 -3
- package/dist/editor/server.js.map +1 -1
- package/dist/editor/shell-page.js +9 -7
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/forge/browser-host.d.ts +6 -12
- package/dist/forge/browser-host.js +5 -11
- package/dist/forge/browser-host.js.map +1 -1
- package/dist/ios/native-overrides.d.ts +27 -0
- package/dist/ios/native-overrides.js +87 -0
- package/dist/ios/native-overrides.js.map +1 -0
- package/dist/ios/record-validate.d.ts +1 -33
- package/dist/ios/record-validate.js +2 -100
- package/dist/ios/record-validate.js.map +1 -1
- package/dist/ios/store-bridge.d.ts +26 -0
- package/dist/ios/store-bridge.js +224 -0
- package/dist/ios/store-bridge.js.map +1 -0
- package/dist/ios/storekit-config.d.ts +15 -0
- package/dist/ios/storekit-config.js +106 -0
- package/dist/ios/storekit-config.js.map +1 -0
- package/dist/ios/xcode-template.d.ts +12 -3
- package/dist/ios/xcode-template.js +158 -27
- package/dist/ios/xcode-template.js.map +1 -1
- package/dist/package/collect-urls.d.ts +1 -1
- package/dist/package/collect-urls.js +10 -2
- package/dist/package/collect-urls.js.map +1 -1
- package/dist/package/offline-payload.d.ts +35 -0
- package/dist/package/offline-payload.js +142 -0
- package/dist/package/offline-payload.js.map +1 -0
- package/dist/package/packaged-check.d.ts +39 -0
- package/dist/package/packaged-check.js +104 -0
- package/dist/package/packaged-check.js.map +1 -0
- package/dist/package/transform.d.ts +4 -4
- package/dist/package/transform.js +3 -3
- package/dist/project/context.d.ts +7 -2
- package/dist/project/context.js +1 -2
- package/dist/project/context.js.map +1 -1
- package/dist/project/published-three.d.ts +14 -0
- package/dist/project/published-three.js +93 -0
- package/dist/project/published-three.js.map +1 -0
- package/dist/publish/bundle.d.ts +1 -1
- package/dist/publish/bundle.js +8 -3
- package/dist/publish/bundle.js.map +1 -1
- package/dist/publish/platform.d.ts +1 -1
- package/dist/publish/platform.js +1 -1
- package/dist/publish/source-zip.d.ts +0 -1
- package/dist/publish/source-zip.js +1 -2
- package/dist/publish/source-zip.js.map +1 -1
- package/dist/scaffold/aliases.js +8 -5
- package/dist/scaffold/aliases.js.map +1 -1
- package/dist/scaffold/engine-download.d.ts +1 -1
- package/dist/scaffold/engine-download.js +1 -1
- package/dist/scaffold/export-zip.d.ts +0 -1
- package/dist/scaffold/export-zip.js +3 -6
- package/dist/scaffold/export-zip.js.map +1 -1
- package/dist/scaffold/import-project.js +1 -1
- package/dist/scaffold/project-export.js +0 -1
- package/dist/scaffold/project-export.js.map +1 -1
- package/dist/scaffold/project-files.d.ts +0 -1
- package/dist/scaffold/project-files.js +8 -5
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.d.ts +15 -4
- package/dist/scaffold/project.js +30 -13
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/skill-files.js +3 -1
- package/dist/scaffold/skill-files.js.map +1 -1
- package/dist/scaffold/steam-skill-files.d.ts +2 -0
- package/dist/scaffold/steam-skill-files.js +7 -0
- package/dist/scaffold/steam-skill-files.js.map +1 -0
- package/dist/scaffold/suggest-template.js +0 -1
- package/dist/scaffold/suggest-template.js.map +1 -1
- package/dist/scaffold/unity-skill-files.js +1 -1
- package/dist/steam/art-generate.d.ts +55 -0
- package/dist/steam/art-generate.js +173 -0
- package/dist/steam/art-generate.js.map +1 -0
- package/dist/steam/art-render.d.ts +25 -0
- package/dist/steam/art-render.js +157 -0
- package/dist/steam/art-render.js.map +1 -0
- package/dist/steam/art-use.d.ts +20 -0
- package/dist/steam/art-use.js +84 -0
- package/dist/steam/art-use.js.map +1 -0
- package/dist/steam/art.d.ts +98 -0
- package/dist/steam/art.js +243 -0
- package/dist/steam/art.js.map +1 -0
- package/dist/steam/check.d.ts +21 -0
- package/dist/steam/check.js +113 -0
- package/dist/steam/check.js.map +1 -0
- package/dist/steam/config.d.ts +57 -0
- package/dist/steam/config.js +145 -0
- package/dist/steam/config.js.map +1 -0
- package/dist/steam/electron-cache.d.ts +11 -0
- package/dist/steam/electron-cache.js +105 -0
- package/dist/steam/electron-cache.js.map +1 -0
- package/dist/steam/fuses.d.ts +16 -0
- package/dist/steam/fuses.js +75 -0
- package/dist/steam/fuses.js.map +1 -0
- package/dist/steam/icon-files.d.ts +16 -0
- package/dist/steam/icon-files.js +70 -0
- package/dist/steam/icon-files.js.map +1 -0
- package/dist/steam/image-info.d.ts +16 -0
- package/dist/steam/image-info.js +89 -0
- package/dist/steam/image-info.js.map +1 -0
- package/dist/steam/launch-check.d.ts +12 -0
- package/dist/steam/launch-check.js +101 -0
- package/dist/steam/launch-check.js.map +1 -0
- package/dist/steam/media.d.ts +48 -0
- package/dist/steam/media.js +151 -0
- package/dist/steam/media.js.map +1 -0
- package/dist/steam/package-macos.d.ts +52 -0
- package/dist/steam/package-macos.js +268 -0
- package/dist/steam/package-macos.js.map +1 -0
- package/dist/steam/package-windows.d.ts +24 -0
- package/dist/steam/package-windows.js +84 -0
- package/dist/steam/package-windows.js.map +1 -0
- package/dist/steam/paths.d.ts +37 -0
- package/dist/steam/paths.js +45 -0
- package/dist/steam/paths.js.map +1 -0
- package/dist/steam/playtest-shots.d.ts +18 -0
- package/dist/steam/playtest-shots.js +83 -0
- package/dist/steam/playtest-shots.js.map +1 -0
- package/dist/steam/portal-recipes.d.ts +25 -0
- package/dist/steam/portal-recipes.js +61 -0
- package/dist/steam/portal-recipes.js.map +1 -0
- package/dist/steam/portal.d.ts +58 -0
- package/dist/steam/portal.js +340 -0
- package/dist/steam/portal.js.map +1 -0
- package/dist/steam/raster.d.ts +59 -0
- package/dist/steam/raster.js +285 -0
- package/dist/steam/raster.js.map +1 -0
- package/dist/steam/shell-files.d.ts +17 -0
- package/dist/steam/shell-files.js +268 -0
- package/dist/steam/shell-files.js.map +1 -0
- package/dist/steam/specs.d.ts +61 -0
- package/dist/steam/specs.js +103 -0
- package/dist/steam/specs.js.map +1 -0
- package/dist/steam/steampipe.d.ts +46 -0
- package/dist/steam/steampipe.js +170 -0
- package/dist/steam/steampipe.js.map +1 -0
- package/dist/steam/store-copy.d.ts +89 -0
- package/dist/steam/store-copy.js +221 -0
- package/dist/steam/store-copy.js.map +1 -0
- package/dist/steam/tags.d.ts +9 -0
- package/dist/steam/tags.js +49 -0
- package/dist/steam/tags.js.map +1 -0
- package/dist/steam/trailer.d.ts +34 -0
- package/dist/steam/trailer.js +141 -0
- package/dist/steam/trailer.js.map +1 -0
- package/dist/verify/browser.d.ts +11 -0
- package/dist/verify/browser.js +195 -152
- package/dist/verify/browser.js.map +1 -1
- package/dist/verify/classify.d.ts +11 -2
- package/dist/verify/classify.js +16 -4
- package/dist/verify/classify.js.map +1 -1
- package/dist/verify/mobile-parity.d.ts +1 -1
- package/dist/verify/mobile-parity.js +1 -1
- 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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
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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"}
|
package/dist/verify/browser.d.ts
CHANGED
|
@@ -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>;
|