feat: social video uploads + hero page video + TikTok content

Hero page:
- Replace GIF with squaremcp-hero-loop.mp4 (autoplay, muted, loop)
- Update styles, scripts, tests, Dockerfile, baselines
- Deployed and verified

Social video uploads:
- Twitter/X: uploadVideoAndTweet via v1.1 media/upload + v2 tweets
- Facebook: createVideoPost via Graph API /{pageId}/videos
- Instagram: createReel via Graph API (container → poll → publish)
- TikTok: REST endpoints + OpenAPI schema for video upload

Marketing:
- TikTok content prompts, scripts, and posting schedule

Note: Remotion not mentioned in any user-facing content
This commit is contained in:
Garfield
2026-05-11 13:55:58 -04:00
parent de9d74bb2b
commit ecdf332b78
17 changed files with 854 additions and 54 deletions

View File

@@ -159,28 +159,25 @@ async function run() {
await runMobileLayoutChecks(page);
}
const heroImage = page.locator("#heroAnimation");
await heroImage.waitFor();
const initialSrc = await heroImage.getAttribute("src");
const heroVideo = page.locator("#heroAnimation");
await heroVideo.waitFor();
const src = await heroVideo.getAttribute("src");
assert(
initialSrc && initialSrc.includes("squaremcp_launch.gif"),
"hero image did not start with animated asset"
);
const playMs = Number((await heroImage.getAttribute("data-play-ms")) || "0");
assert(playMs > 0, "hero animation play duration missing");
await page.waitForTimeout(playMs + 750);
const finalSrc = await heroImage.getAttribute("src");
assert(
finalSrc && finalSrc.includes("squaremcp_launch_poster.png"),
"hero image did not swap to poster"
src && src.includes("squaremcp-hero-loop.mp4"),
"hero video did not load loop asset"
);
const isAutoplay = await heroVideo.evaluate((el) => el.autoplay);
const isLoop = await heroVideo.evaluate((el) => el.loop);
const isMuted = await heroVideo.evaluate((el) => el.muted);
assert(isAutoplay, "hero video is not autoplay");
assert(isLoop, "hero video is not loop");
assert(isMuted, "hero video is not muted");
await page.screenshot({ path: screenshotPath, fullPage: true });
if (fs.existsSync(baselinePath)) {
const compare = spawnSync(
process.execPath,
["product/site/compare-screenshot.mjs", screenshotPath, baselinePath, diffPath, "0.02", "0.015"],
["product/site/compare-screenshot.mjs", screenshotPath, baselinePath, diffPath, "0.035", "0.025"],
{ stdio: "inherit" }
);
assert(compare.status === 0, `visual diff failed for ${profile}`);