Burning Bridges AI 如何打造固定派對場景影片效果(Silver Cup “Where She At?”)
Burning Bridges AI: Shipping a Locked Party-Scene Effect (Silver Cup “Where She At?”)
Burningbridgesvideoai.com 將 1–2 張成人照片製作成直向 AI 派對掃描影片,固定呈現水晶吊燈、銀杯及遮眼尋人的場景。產品部署於 Cloudflare Workers,透過 TryAllAPI 呼叫 Seedance 生成影片。單次購買無須建立帳戶,720p 影片售價由 $8.88 起。
How I shipped a 1–2 photo → vertical AI party-scan video product on Cloudflare Workers, with guest checkout and a video API aggregator instead of wiring every model vendor myself.
Some TikTok formats are scenes, not “styles.” The Burning Bridges party clip is one of those: crystal chandelier light, a silver cup in frame, a hand-over-eyes “where she at?” scan through the crowd. People wanted that beat with their own face — not a blank prompt box and a CapCut timeline.
I built burningbridgesvideoai.com for that job. Upload 1–2 adult photos, pay once, get a 720p MP4 with sound. No account required for a single pack. Product framing: independent fan tool — not affiliated with any label or artist. This post is the builder walkthrough: effect-niche product shape, stack, credit/payment loop, and how video generation goes through TryAllAPI into Seedance. Prices and model ids change; treat live site / console as source of truth.
Why lock the party effect (instead of “write your own prompt”)
Free-form video models are flexible and messy. For a viral-format product, mess kills conversion. Users bounce when they have to invent a storyboard, guess camera language, and still get the wrong roles.
So the homepage locks one effect:
- Photo 1 (required) = lead face / the person the scan centers on
- Photo 2 (optional) = a friend in the crowd — only with their permission
- Fixed multi-beat party motion (chandelier energy → silver cup → hand-over-eyes scan)
- Resolution / aspect knobs; not a free-form prompt IDE
That trade-off is intentional. Repeatable results beat infinite creative control when the job is “ship the recognizable format tonight.” One clear lead photo is enough. The UI refuses celebrity / MV stills on purpose — that copy is product policy, not decoration.
Live pricing on the create path (verified on the site while writing this): 720p from $8.88 (≈ 500 credits for one 720p), with multi-packs such as $16.99 and larger. Guest Stripe checkout is the default path for “I only want one video.”
Stack overview
I did not start from a blank framework. The site sits on a TanStack Start template I maintain (shipany-tanstack), deployed to Cloudflare Workers, with D1 for users / orders / credit ledger / generation tasks, and Stripe Checkout for packs.
| Layer | Choice | Role |
|---|---|---|
| Front / SSR | TanStack Start (Vite) | Landing, upload panel, generation status |
| Runtime | Cloudflare Workers | Edge deploy, secrets, API routes |
| DB | Cloudflare D1 | Credits, orders, task rows (table prefixes if DBs are shared) |
| Payments | Stripe Checkout | One-time packs + optional larger packs; guest checkout |
| Video upstream | TryAllAPI → Seedance | Async create + poll |
| Analytics | GA | Funnel sanity check |
The product pipeline in one line:
1–2 photos → locked party template prompt
→ check credits (else Stripe)
→ Worker creates Seedance task via TryAllAPI
→ poll until MP4 URL → store / show
→ on failure: refund credits
Demo clips on the homepage are self-generated samples hosted with the site, so visitors can judge the format before paying. Do not scrape other products’ CDN videos for demos — it is both unnecessary and a compliance mess.
Why a video API aggregator
Direct vendor onboarding for every video model means accounts, KYC, docs drift, and different async status machines. For a small indie product I wanted one API key in Workers Secrets, USD balance billed by usage, and a path to Seedance (and fallbacks) without rewriting the client each time the console UI changes.
That is what TryAllAPI is for on this project: aggregate models behind one base URL, keep the site focused on UX + credits + Stripe.
Operational checklist after register / top-up:
- Confirm available USD balance in the console (not only the checkout success page).
- Create a token in pay-as-you-go style billing.
- Enable the video / Seedance-related channel group on that token. Wrong group → “no available channel” even when the model id looks right.
- Prefer separate keys per product (
burningbridges-prodvs sandbox). - Put the key only in Workers Secrets (for example
TRYALLAPI_API_KEY). Never in the frontend bundle or a blog post.
Conceptually the call shape looks like this (field names follow the aggregator’s v3 contents API; always re-check current docs):
POST /api/v3/contents/generations/tasks
Authorization: Bearer <TRYALLAPI_API_KEY>
Content-Type: application/json
Accept-Encoding: identity
GET /api/v3/contents/generations/tasks/{id}
I send Accept-Encoding: identity from the Worker because some gateways behave badly with transparent decompression. Model ids used in production look like Seedance 2.x family strings — treat console ids as source of truth, not this paragraph.
Seedance parameters that matter for a party scan
A few details that bit me across this family of sites:
-
Pass
durationas an explicit integer. Some models default to “smart length.” Omitting duration can silently lengthen the clip and the bill. -
resolutionandratio. Cost tracks resolution tier and duration more than portrait vs landscape. Match whatever the create UI offers (often 480p/720p and 9:16 for Shorts). -
generate_audio. When the product ships “finished” downloads, leave audio on; creators who want a trending sound can mute later. -
Status machine. Expect something like
queued→running→succeeded/failed. Success URLs are often short-lived signed links — download/rehost on your side before handing the file to the user. -
Decent failure. On
supply_unavailableor hard failures: refund credits, show a short human message, log the detailed upstream error server-side, optionally fall back to another Seedance tier.
Rough mental model for upstream cost (illustrative only — use your own usage fields and invoices):
tokens ≈ duration_sec × width × height × fps / 1024
cost ≈ tokens × price_per_million_tokens
Price the site after you measure a few real 720p runs with retry margin, Stripe fees, and failed-job refunds — not from a spreadsheet fantasy of 0% failure.
Effect-specific notes:
- Lead vs optional friend. Same-person clones look wrong in a crowd scan; the optional photo is a second person, not a second angle of you.
- Original / AI ambient audio so the download feels finished; creators can mute and lay a trending sound later.
- Market as a fan-style party remake tool, not an official artist product.
Credits, Stripe, and the “can charge money” line
Demo UIs are easy. The line between toy and product is:
- User hits Create → check credit balance.
- If short → Stripe Checkout Session (guest allowed).
- Webhook (plus a return-URL sync check) grants credits.
- Pre-debit / lock credits, create upstream task, persist
task_idin D1. - Poll until done; succeed → show MP4; fail → refund credits.
Two books of account stay separate: USD balance at TryAllAPI (your cost) vs site credits (what you sold). Mixing them in one mental ledger is how you underprice or invent “mysterious” losses.
When several products share one Stripe account, isolate webhooks by endpoint or by metadata (site / product). Callbacks pointed at the wrong apex domain are a classic multi-site footgun.
Secrets stay in Workers: TRYALLAPI_API_KEY, STRIPE_SECRET_KEY, webhook secret, auth secrets. The browser only ever sees publishable Stripe keys if needed.
Deploy notes (Workers + D1)
Typical loop on this template family:
pnpm install
# wire D1 database_id, production env, custom domain in wrangler
pnpm cf:deploy
Before calling a deploy “done”:
- D1 binding is correct; shared DBs use table prefixes, not a new database per micro-idea (free-tier DB counts are limited).
-
AUTH_TRUSTED_ORIGINSand Stripe return / webhook URLs match the production HTTPS origin. - GA id is set for a coarse funnel (land → upload → pay → wait → download).
- One real end-to-end path on production or a staging Worker: upload → pay → render → download.
For this product, production origin is https://burningbridgesvideoai.com (alternate hostname exists for marketing, but keep auth/webhook allowlists aligned with what Checkout actually returns).
Product rules that are not optional
Face-based generation is not “just another SaaS CRUD app”:
- Require an explicit 18+ / rights-to-use confirmation on upload.
- Block minors and refuse celebrity / stranger misuse in copy and policy.
- Expect upstream safety refusals; refund and explain.
- Keep privacy policy honest about retention; do not train on user media by default.
- Market as an independent fan-style tool for a trend format — not as an official tie-in unless you actually have that deal.
- Use your own sample renders in marketing.
Those constraints belong in the product, not in a footnote you add after the first dispute email.
What I would reuse on the next party-format site
- Locked effect + guest one-time pack beats “sign up, subscribe, then maybe generate.”
- Credits with automatic refund on failed generation is table stakes for trust.
- Aggregator for video models keeps the Worker thin: create, poll, store, refund.
- Self-hosted samples sell the format faster than paragraphs of SEO copy.
- Measure the funnel before polishing prompt poetry — upload and payment drops usually matter more than another adjective in the storyboard.
If you want the consumer path: open burningbridgesvideoai.com, watch the sample, upload adult photos you have rights to (lead required; friend optional), pick your pack, pay once.
If you want the builder path: register at TryAllAPI, top up a small USD balance, create a token with the right video group, prove create+poll in a Worker, then wire credits and Stripe. Keep keys out of git. Make failure boring and refundable.
That is the whole product thesis in one sentence: template the party scene, sell the credits, outsource the GPU drama.
來源:DEV Community · dev.to


