@wji.ai/cli 0.8.2 → 0.9.0
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/dist/index.js +889 -13
- package/package.json +10 -9
- package/skill/backreel/SKILL.md +69 -3
- package/skill/backreel/reference/jobs.md +154 -0
- package/skill/npc-character/SKILL.md +1 -1
- package/skill/short-drama/SKILL.md +9 -2
- package/skill/short-drama/examples/night-shift/project.json +5 -4
- package/skill/short-drama/reference/cinematography-low-key.md +5 -6
- package/skill/short-drama/reference/cinematography.md +1 -1
- package/skill/short-drama/reference/craft-motion.md +21 -1
- package/skill/short-drama/reference/craft-shots.md +24 -0
- package/skill/short-drama/reference/schema.md +5 -1
- package/skill/short-drama/reference/stage-characters.md +26 -16
- package/skill/short-drama/reference/stage-storyboard.md +31 -5
- package/skill/short-drama/reference/workspace-layout.md +1 -1
- package/skill/short-drama/scripts/selftest.mjs +117 -8
- package/skill/short-drama/scripts/short-drama.mjs +235 -26
- package/skill/wji/SKILL.md +5 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wji.ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Command line interface for the WJI AI platform",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "WJI AI",
|
|
@@ -28,18 +28,19 @@
|
|
|
28
28
|
"README.md"
|
|
29
29
|
],
|
|
30
30
|
"engines": {
|
|
31
|
-
"node": ">=
|
|
31
|
+
"node": ">=22.23.4"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup && chmod +x dist/index.js",
|
|
35
|
+
"dev": "tsup --watch",
|
|
36
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
37
|
+
"start": "node dist/index.js",
|
|
38
|
+
"prepublishOnly": "pnpm run build"
|
|
32
39
|
},
|
|
33
40
|
"dependencies": {
|
|
34
41
|
"commander": "^12.1.0"
|
|
35
42
|
},
|
|
36
43
|
"publishConfig": {
|
|
37
44
|
"access": "public"
|
|
38
|
-
},
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "tsup && chmod +x dist/index.js",
|
|
41
|
-
"dev": "tsup --watch",
|
|
42
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
43
|
-
"start": "node dist/index.js"
|
|
44
45
|
}
|
|
45
|
-
}
|
|
46
|
+
}
|
package/skill/backreel/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: backreel
|
|
3
|
-
description: Run a creator's works on Backreel (the film / short-drama showcase and crowdfunding site that shares accounts with WJI) with the `wji` CLI — create and publish a post (作品), prepare and upload cover / portrait / LookBook images at the right size and ratio, add cast and crew credits, upload and maintain episode videos (分集 via BytePlus VOD), set who can watch each episode, run a crowdfunding campaign with donation tiers and offline supporters, read donation records,
|
|
3
|
+
description: Run a creator's works on Backreel (the film / short-drama showcase and crowdfunding site that shares accounts with WJI) with the `wji` CLI — create and publish a post (作品), prepare and upload cover / portrait / LookBook images at the right size and ratio, add cast and crew credits, upload and maintain episode videos (分集 via BytePlus VOD), set who can watch each episode, run a crowdfunding campaign with donation tiers and offline supporters, read donation records, answer enquiries (查詢 / 合作邀請 / 投資 / 授權) — reply, accept or decline, grant partner access — write blog posts (文章 / 作品動態) on a profile or under a project, and work the Job Plaza (接單廣場) — post a job, place a sealed bid, award it, then run the contract: payment plan, project credits, milestones, top-ups, change requests and disputes. Use whenever a task mentions Backreel, a Backreel post / work / reel, its episodes, trailer, cover or poster sizes, crowdfunding / 眾籌 / 捐款, supporters, enquiries / 查詢 on a creator's work, a Backreel blog post, project update or behind-the-scenes note, or a Backreel job, bid, quote, contract / 合約, milestone or dispute.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Backreel
|
|
@@ -148,6 +148,70 @@ accept, decline or grant on your own judgement. Read
|
|
|
148
148
|
[reference/enquiries.md](reference/enquiries.md) for triage and reply
|
|
149
149
|
patterns.
|
|
150
150
|
|
|
151
|
+
## 6. Blog posts (文章 / 作品動態)
|
|
152
|
+
|
|
153
|
+
Anyone can write a post on their profile, or under one of **their own**
|
|
154
|
+
projects as a project update. Posts are drafts until published, and
|
|
155
|
+
published posts go live straight away (admins can hide them afterwards).
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
wji br blog create --title "殺青了!拍攝第 21 天" --body @update.md \
|
|
159
|
+
--post <postId> --tags "幕後, 殺青" --cover ./still.jpg # draft
|
|
160
|
+
wji br blog get <blogId> # body prints back as Markdown
|
|
161
|
+
wji br blog update <blogId> --body @update.md --excerpt "一句話摘要"
|
|
162
|
+
wji br blog publish <blogId> # | unpublish — back to drafts
|
|
163
|
+
wji br blog list --mine # yours, drafts and hidden included
|
|
164
|
+
wji br blog list --post <postId> # a project's updates
|
|
165
|
+
wji br blog list --official # Backreel press releases
|
|
166
|
+
wji br blog delete <blogId> -y
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`--body` is Markdown by default (`## heading`, `- list`, `**bold**`,
|
|
170
|
+
`[link](https://…)`, ``; blank line between paragraphs) —
|
|
171
|
+
pass `--html` to send HTML. Only full `http(s)` links survive; site paths
|
|
172
|
+
like `(/blog)` are removed. `--post none` moves a post back to the profile;
|
|
173
|
+
`--cover none` clears the cover. If `publish` reports the post is hidden, an
|
|
174
|
+
admin hid it — tell the user the reason; republishing does not unhide it.
|
|
175
|
+
Publishing is outward-facing: show the user the title and body first.
|
|
176
|
+
|
|
177
|
+
Official press releases are written with the private `wji-admin backreel
|
|
178
|
+
blog` commands, not here.
|
|
179
|
+
|
|
180
|
+
## 7. Job Plaza and contracts (接單廣場 / 合約)
|
|
181
|
+
|
|
182
|
+
Someone posts a job, creators bid (sealed), the poster awards one bid and a
|
|
183
|
+
contract is drafted. The contract has 2–3 payments, at least 25% in WJI
|
|
184
|
+
credits; the poster funds the credits into a project workspace, the creator
|
|
185
|
+
delivers payment by payment.
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
wji br job list -k teaser # open jobs; --mine for yours
|
|
189
|
+
wji br job create "30s teaser" --category advertising --brief @brief.md \
|
|
190
|
+
--deliverables "1 × 30s" --budget 8000-12000 --currency HKD --credits 30000 --deadline 2026-12-01
|
|
191
|
+
wji br job bid <jobId> --price 9000 --currency HKD --credits 30000 --days 14 --pitch @pitch.md
|
|
192
|
+
wji br job bids <jobId> ; wji br job award <bidId> -y # poster
|
|
193
|
+
wji br contract plan <id> --credits 30000 --payment "Draft|2026-12-08|4000" --payment "Final|2026-12-20|5000"
|
|
194
|
+
wji br contract accept <id> ; wji br contract fund <id> -y
|
|
195
|
+
wji br contract submit <id> 1 --note "First cut" --link https://…
|
|
196
|
+
wji br contract approve <id> 1 # | revise <id> 1 --note "…"
|
|
197
|
+
wji br contract get <id> # what to do next
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Contract commands take the contract id or the job id. Top-ups, change
|
|
201
|
+
requests, cancelling and disputes are in
|
|
202
|
+
[reference/jobs.md](reference/jobs.md) — read it before any contract step.
|
|
203
|
+
Act as an organization with `--org <orgId>` (`wji br org` lists yours).
|
|
204
|
+
|
|
205
|
+
## Profile, organizations and history
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
wji br org # organizations you belong to, with your role
|
|
209
|
+
wji br org get <orgId> # an org's public page
|
|
210
|
+
wji br about --text @about.md --region HK # your profile; --org <orgId> for an org you manage
|
|
211
|
+
wji br history # what you've viewed; rm <id> | clear -y
|
|
212
|
+
wji br create "Harbour" --org <orgId> # publish as an org (only the author can change it later)
|
|
213
|
+
```
|
|
214
|
+
|
|
151
215
|
## Credits
|
|
152
216
|
|
|
153
217
|
```bash
|
|
@@ -160,8 +224,10 @@ wji br credit rm <postId> 3 -y
|
|
|
160
224
|
|
|
161
225
|
## Rules of thumb
|
|
162
226
|
|
|
163
|
-
- **Ask before anything outward-facing**: publishing, unpublishing, deleting,
|
|
164
|
-
replying to or deciding an enquiry, granting access, turning donations on
|
|
227
|
+
- **Ask before anything outward-facing**: publishing (posts and blog posts), unpublishing, deleting,
|
|
228
|
+
replying to or deciding an enquiry, granting access, turning donations on, posting a job,
|
|
229
|
+
bidding, awarding, sending / accepting a plan, funding, approving a payment, top-ups,
|
|
230
|
+
change requests, cancelling and disputes (most of these move WJI credits).
|
|
165
231
|
Draft edits are safe to make and show.
|
|
166
232
|
- Generating images (e.g. the AI poster) spends WJI credits — confirm first.
|
|
167
233
|
- Episode uploads go to the live VOD space even from a test post; don't
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Job Plaza and job contracts
|
|
2
|
+
|
|
3
|
+
The Job Plaza (接單廣場) is where someone who needs a film, ad or short drama
|
|
4
|
+
**posts a job**, creators **place sealed bids**, and the poster **awards one**.
|
|
5
|
+
Award drafts a **contract**; the contract carries the work through a payment
|
|
6
|
+
plan, project credits held in a WJI workspace, milestones and, if needed, a
|
|
7
|
+
dispute.
|
|
8
|
+
|
|
9
|
+
Everything is `wji br job …` and `wji br contract …`. Add `--json` for ids.
|
|
10
|
+
|
|
11
|
+
## Who can do what
|
|
12
|
+
|
|
13
|
+
| Step | Who | Command |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| post / edit / close / reopen / cancel a job | the poster (or a member of the posting org) | `br job create`, `set`, `close`, `reopen`, `cancel` |
|
|
16
|
+
| see bids on a job | the poster only — bids are sealed | `br job bids <jobId>` |
|
|
17
|
+
| bid, change, withdraw | any creator (verified only, if the job says so) | `br job bid`, `bid-set`, `withdraw` |
|
|
18
|
+
| award | the poster | `br job award <bidId>` |
|
|
19
|
+
| plan | either side; sending counts as your acceptance | `br contract plan` |
|
|
20
|
+
| accept the other side's plan | the side that didn't send it | `br contract accept` |
|
|
21
|
+
| fund | poster | `br contract fund` |
|
|
22
|
+
| submit a payment | creator | `br contract submit` |
|
|
23
|
+
| approve / revise | poster | `br contract approve`, `revise` |
|
|
24
|
+
| mark cash paid / received | poster / creator | `br contract paid`, `received` |
|
|
25
|
+
| top up project credits | creator | `br contract topup` |
|
|
26
|
+
| change request | creator proposes, poster accepts or declines | `br contract change …` |
|
|
27
|
+
| dispute | either side | `br contract dispute`, `statement` |
|
|
28
|
+
|
|
29
|
+
`wji br org` lists the organizations you can act for; pass `--org <orgId>` to
|
|
30
|
+
`job create`, `job bid`, `br create` or `blog create` to act as one.
|
|
31
|
+
|
|
32
|
+
## Posting a job
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
wji br job create "30s product teaser" --category advertising \
|
|
36
|
+
--brief @brief.md --deliverables "1 × 30s, 16:9 and 9:16" \
|
|
37
|
+
--budget 8000-12000 --currency HKD --credits 30000 \
|
|
38
|
+
--duration 30 --resolution 1080p --upscale --model seedance-2.5 \
|
|
39
|
+
--deadline 2026-12-01 --delivery 2026-12-20 --verified-only
|
|
40
|
+
wji br job list --mine # yours, every status
|
|
41
|
+
wji br job get <jobId>
|
|
42
|
+
wji br job close <jobId> # stop bids early | reopen | cancel
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- Amounts are typed in `--currency` and stored in USD; everyone sees them in
|
|
46
|
+
their own display currency.
|
|
47
|
+
- `--duration` takes `90`, `3m`, `1h30m` or `2:30`. `--resolution` is
|
|
48
|
+
480p / 720p / 1080p / 2k / 4k; `--upscale` says upscaling to it is fine.
|
|
49
|
+
- The bid deadline is at most 90 days out. Posting is public right away —
|
|
50
|
+
confirm the text with the user first.
|
|
51
|
+
|
|
52
|
+
## Bidding
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
wji br job list -k teaser --category advertising --sort budget
|
|
56
|
+
wji br job quota # bids left this month, per identity
|
|
57
|
+
wji br job bid <jobId> --price 9000 --currency HKD --credits 30000 \
|
|
58
|
+
--days 14 --pitch @pitch.md --work <postId> --work <postId>
|
|
59
|
+
wji br job bids # your bids and their status
|
|
60
|
+
wji br job bid-set <bidId> --price 8500 ; wji br job withdraw <bidId>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Each identity (you, each org) has a monthly bid quota (VIP unlimited). Bids
|
|
64
|
+
are sealed: only the poster sees them. A bid can show up to 3 of the
|
|
65
|
+
bidder's published Backreel works.
|
|
66
|
+
|
|
67
|
+
## Award → contract
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
wji br job bids <jobId> # poster: compare
|
|
71
|
+
wji br job award <bidId> -y # declines the others, drafts the contract
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`award` prints the contract id. Every `br contract` command takes the
|
|
75
|
+
contract id **or the job id**.
|
|
76
|
+
|
|
77
|
+
## The payment plan
|
|
78
|
+
|
|
79
|
+
2 or 3 payments, each with a title, due date and cash amount. At least 25% of
|
|
80
|
+
the contract total must be WJI credits (credits ÷ credits-per-USD, frozen at
|
|
81
|
+
250 per US$ when the plan locks).
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
wji br contract plan <id> --currency HKD --credits 30000 \
|
|
85
|
+
--payment "Draft|2026-12-08|4000|First cut at 720p" \
|
|
86
|
+
--payment "Final|2026-12-20|5000|Final 1080p with sound"
|
|
87
|
+
wji br contract get <id> # totals, payments, what to do next
|
|
88
|
+
wji br contract accept <id> # the other side locks it
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- `--payment "Title|YYYY-MM-DD|cash[|credits[|deliverable]]"`. Without
|
|
92
|
+
`--payment`, `plan` keeps the current payments and only changes what you
|
|
93
|
+
pass (e.g. `--credits`).
|
|
94
|
+
- Credits are released **all at once** by default (`--release upfront`); with
|
|
95
|
+
`--release milestones` each payment carries its own credits (4th field).
|
|
96
|
+
- Sending a plan counts as your acceptance; the other side accepts or sends
|
|
97
|
+
back an edited one.
|
|
98
|
+
|
|
99
|
+
## Funding and production
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
wji br contract fund <id> -y # poster: takes the credits from the poster's WJI balance
|
|
103
|
+
wji br contract submit <id> 1 --note "First cut" --link https://…
|
|
104
|
+
wji br contract revise <id> 1 --note "Tighter opening" # 2 revisions included per payment
|
|
105
|
+
wji br contract approve <id> 1 # starts the next payment; the last one completes the contract
|
|
106
|
+
wji br contract paid <id> 1 ; wji br contract received <id> 1 # cash is paid off-platform
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- Funding creates a WJI workspace owned by the poster with the creator as
|
|
110
|
+
editor. Generations there spend only the project credits; nobody can spend
|
|
111
|
+
them elsewhere. `contract get` shows credits left and the workspace id.
|
|
112
|
+
- A submitted payment auto-approves after 7 days if the poster does nothing.
|
|
113
|
+
- On completion the poster's unused credits go to the creator; on cancel
|
|
114
|
+
they go back to the poster. Creator top-ups that weren't used always go
|
|
115
|
+
back to the creator.
|
|
116
|
+
|
|
117
|
+
## When the budget runs out
|
|
118
|
+
|
|
119
|
+
- 5% overdraft is automatic; both sides are told at 80% and when it's used up.
|
|
120
|
+
- The creator can add their own credits: `wji br contract topup <id> 5000`.
|
|
121
|
+
- If the poster changed the scope or asked for a third revision, the creator
|
|
122
|
+
asks for more:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
wji br contract change request <id> --credits 10000 --cash 100 --reason scope --note "Two extra scenes"
|
|
126
|
+
wji br contract change accept <id> --note "OK" # poster; takes the credits from their balance
|
|
127
|
+
wji br contract change decline <id> --note "…" # | withdraw (creator)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Extra cash also needs ≥25% in credits; the CLI checks before sending.
|
|
131
|
+
|
|
132
|
+
## Cancelling, silence and disputes
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
wji br contract cancel <id> --reason "…" # planning/funding: immediate; production: the other side confirms
|
|
136
|
+
wji br contract cancel <id> --decline # | --withdraw
|
|
137
|
+
wji br contract dispute <id> --reason @what-happened.md -y
|
|
138
|
+
wji br contract statement <id> --text @my-side.md --link https://…
|
|
139
|
+
wji br contract dispute <id> --withdraw # only the side that raised it
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
- A dispute stops generation in the project workspace and pauses due dates
|
|
143
|
+
until a WJI admin decides: continue, or cancel and split the poster's unused
|
|
144
|
+
credits. The admin side is `wji-admin backreel contracts`.
|
|
145
|
+
- If the creator does nothing for 14 days after a due date, `contract get`
|
|
146
|
+
says so to the poster and `cancel` goes through immediately.
|
|
147
|
+
|
|
148
|
+
## Rules
|
|
149
|
+
|
|
150
|
+
- Ask before every outward or money step: posting a job, bidding, awarding,
|
|
151
|
+
sending or accepting a plan, funding, approving, top-ups, change requests,
|
|
152
|
+
cancelling and disputes.
|
|
153
|
+
- Server errors are Chinese (e.g. `至少 25% 的合約總值須以 WJI 積分支付`); relay
|
|
154
|
+
them and say what to change.
|
|
@@ -21,7 +21,7 @@ NPC is addressed by id, `@handle` or name.
|
|
|
21
21
|
permission; it starts private), then upload the headshot and at least one
|
|
22
22
|
scene image on the web — live stages need both:
|
|
23
23
|
```bash
|
|
24
|
-
wji npc handle nagi.npc # is the handle free?
|
|
24
|
+
wji npc handle nagi.npc # is the handle free? (system / brand names like admin, official, npccity are reserved)
|
|
25
25
|
wji npc create "NAGI" --role "Radio Host" --genre "Lo-fi" --handle nagi.npc
|
|
26
26
|
```
|
|
27
27
|
The handle is fixed from here on; the name is stored in capitals.
|
|
@@ -138,6 +138,7 @@ ending), change the guideline first, then the episodes.
|
|
|
138
138
|
```bash
|
|
139
139
|
node {baseDir}/scripts/short-drama.mjs init <dir> --title "<title>" --episodes N --minutes M --genre "<genre>" --register 台湾国语 [--adapt 抽核] [--ratio 9:16] [--video h3|seedance|seedance2|seedance2fast|wan] [--resolution 480P|…] [--accent "台湾口音国语"] [--style photoreal|realistic|ghibli] [--references sheets|keyframes] [--duration auto|fixed] [--look "<lens phrase>"] [--cinematography low-key|sweet-romance|period-nostalgia|costume-idol|costume-dark|scifi-hard|scifi-soft|none] [--action gun-fu|hk-kungfu|wuxia-fantasy|historical-realist|bullet-time|superhero|street-brawl|car-chase|none] [--violence blood|implied] [--grammar drama|action|faceslap|comedy] [--comedy slapstick|deadpan|romcom|none] [--composition standard|art-first] [--story revenge,sweet,…] [--market mainland|overseas] [--format short|medium|movie] [--lang zh] [--image-lang en|zh]
|
|
140
140
|
# --image-lang zh: character / scene / prop image prompts in Chinese (the default is English)
|
|
141
|
+
# --foreground low|medium|high: how often cuts shoot past a foreground (default medium; high for 唯美 / 美感优先)
|
|
141
142
|
# params.camera (body / lens / aperture) is edited in project.json
|
|
142
143
|
```
|
|
143
144
|
An existing `project.json` means a resumed run: `validate` and `manifest` tell you where it stands.
|
|
@@ -297,14 +298,20 @@ Read `{baseDir}/reference/stage-storyboard.md`.
|
|
|
297
298
|
Every cut is a set-up, so besides its beats and framing it carries the **lens** (`focal`, or let the
|
|
298
299
|
shot size pick it), the **key light relative to the camera** (`light.direction` from the vocabulary
|
|
299
300
|
plus `light.note` saying what it picks out, what fills the shadow side and how it changes over the
|
|
300
|
-
cut) and the **foreground**
|
|
301
|
+
cut) and the **foreground** if the story gives one a reason (`params.foregroundLevel`: `low` / `medium` / `high`). All three are gated and all three go into the
|
|
301
302
|
prompt, alongside the camera package and each speaker's delivery.
|
|
302
303
|
|
|
304
|
+
**Everyone on screen is alive** (gate `idle-motion`, sheets mode): a model freezes whoever the prompt gives no
|
|
305
|
+
motion. In a cut with two or more visible people, all but the one carrying the action get a small
|
|
306
|
+
motion in `idle` (`"still"` when keeping still is the performance). See `craft-motion.md`.
|
|
307
|
+
|
|
308
|
+
**Two people talking** (gate `two-person-framing`, sheets mode): a two-shot once, then over-the-shoulder (`ots`) for the exchange, a clean single for the punchline. A single names only its person; every look states a screen direction (`eyeline`); the sides stay locked. See `reference/craft-shots.md`.
|
|
309
|
+
|
|
303
310
|
**Every cut is lit and composed in the preset's look.** Read the preset's guide
|
|
304
311
|
(`{baseDir}/reference/cinematography-<preset>.md`) before the first storyboard. Name the source
|
|
305
312
|
in `light.source`, stage the person against it, and choose the camera side that gives the
|
|
306
313
|
preset's preferred direction (the table in `cinematography.md`). Compose as the guide says,
|
|
307
|
-
|
|
314
|
+
and stay within the preset's stop (T2.8; T2 for `sweet-romance` and `costume-idol`, which
|
|
308
315
|
start on a T1.3 package and name their bokeh; T4 for `period-nostalgia`). Both costume presets (`costume-idol`, `costume-dark`) also need a 全景 / 大全景 with negative
|
|
309
316
|
space in every segment.
|
|
310
317
|
For `sweet-romance` and `costume-idol`, shoot the 甜宠 set pieces (心动对视, 回眸, 共伞…) as
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"videoResolution": "768P",
|
|
13
13
|
"references": "keyframes",
|
|
14
14
|
"style": "realistic",
|
|
15
|
-
"register": "大陆普通话"
|
|
15
|
+
"register": "大陆普通话",
|
|
16
|
+
"foregroundLevel": "high"
|
|
16
17
|
},
|
|
17
18
|
"source": {
|
|
18
19
|
"kind": "original",
|
|
@@ -278,7 +279,7 @@
|
|
|
278
279
|
"image": {
|
|
279
280
|
"prompt": "Portrait of a young East Asian woman in her mid-twenties, contemporary 2020s Chinese city, night-shift convenience store clerk, slim and upright, hair pulled into a loose low ponytail, faded navy jacket over a striped store uniform, faint shadows under alert eyes, thin lips pressed together, three-quarter view bust, plain neutral background, soft directional key light from the upper left with a cool fill, shallow depth of field",
|
|
280
281
|
"negativePrompt": "plastic skin, over-smoothed face, perfectly symmetrical face, doll-like features, dead eyes without highlights, helmet hair, flat textureless fabric, stiff mannequin pose, logo, brand name, text, watermark",
|
|
281
|
-
"sheet": "Single character
|
|
282
|
+
"sheet": "Single character sheet on ONE 16:9 landscape canvas, three panels left to right, grey-white seamless studio background, studio lighting. semi-realistic character illustration, painterly rendering with soft blended edges and visible brush texture, anatomically grounded. LEFT: one headshot, the face filling the full height of the panel, facial features large and clear. CENTER: full-body front view, the face completely covered by a flat grey box so no facial features are visible. RIGHT: full-body back view, same height and body proportions as the front view, feet on the same ground line. Subject: a young East Asian woman in her mid-twenties, contemporary Chinese night-shift convenience store clerk, faded navy jacket over a striped uniform, alert tired eyes. Same costume on both full-body views. No side view, no extra characters, no scenery, no text, no watermark.",
|
|
282
283
|
"tags": [
|
|
283
284
|
"semi-realistic",
|
|
284
285
|
"painterly",
|
|
@@ -442,7 +443,7 @@
|
|
|
442
443
|
"image": {
|
|
443
444
|
"prompt": "Portrait of an East Asian man in his early sixties, contemporary 2020s China, retired security guard, stocky build with a slight stoop, grey close-cropped crew cut, washed-out grey zip jacket, thick fingers, deep crow's feet, weathered skin with uneven tone and visible pores, three-quarter view bust, plain neutral background, soft directional key light from the upper left with a cool fill, shallow depth of field",
|
|
444
445
|
"negativePrompt": "plastic skin, over-smoothed face, perfectly symmetrical face, young face, dead eyes without highlights, helmet hair, flat textureless fabric, stiff mannequin pose, logo, brand name, text, watermark",
|
|
445
|
-
"sheet": "Single character
|
|
446
|
+
"sheet": "Single character sheet on ONE 16:9 landscape canvas, three panels left to right, grey-white seamless studio background, studio lighting. semi-realistic character illustration, painterly rendering with soft blended edges and visible brush texture, anatomically grounded. LEFT: one headshot, the face filling the full height of the panel, facial features large and clear. CENTER: full-body front view, the face completely covered by a flat grey box so no facial features are visible. RIGHT: full-body back view, same height and body proportions as the front view, feet on the same ground line. Subject: a stocky East Asian man in his early sixties, contemporary retired security guard, grey crew cut, washed-out grey zip jacket, slight stoop. Same costume on both full-body views. No side view, no extra characters, no scenery, no text, no watermark.",
|
|
446
447
|
"tags": [
|
|
447
448
|
"semi-realistic",
|
|
448
449
|
"painterly",
|
|
@@ -538,7 +539,7 @@
|
|
|
538
539
|
"image": {
|
|
539
540
|
"prompt": "Portrait of a tall thin East Asian man around forty, contemporary 2020s Chinese city at night, black hooded raincoat zipped to the chin, hood pulled low so only the jaw and unshaven stubble show, rain beading on the wet plastic, three-quarter view bust, plain neutral background, hard cool rim light from behind and a dim key from the left, shallow depth of field",
|
|
540
541
|
"negativePrompt": "plastic skin, over-smoothed face, perfectly symmetrical face, full face clearly visible, dead eyes, dry raincoat, flat textureless fabric, stiff mannequin pose, logo, brand name, text, watermark",
|
|
541
|
-
"sheet": "Single character
|
|
542
|
+
"sheet": "Single character sheet on ONE 16:9 landscape canvas, three panels left to right, grey-white seamless studio background, studio lighting. semi-realistic character illustration, painterly rendering with soft blended edges and visible brush texture, anatomically grounded. LEFT: one headshot, the face filling the full height of the panel, facial features large and clear. CENTER: full-body front view, the face completely covered by a flat grey box so no facial features are visible. RIGHT: full-body back view, same height and body proportions as the front view, feet on the same ground line. Subject: a tall thin East Asian man around forty, contemporary, black hooded raincoat with the hood low over the face, stubble. Same costume on both full-body views. No side view, no extra characters, no scenery, no text, no watermark.",
|
|
542
543
|
"tags": [
|
|
543
544
|
"semi-realistic",
|
|
544
545
|
"painterly",
|
|
@@ -78,13 +78,12 @@ the negative space is usually the dark part of the frame.
|
|
|
78
78
|
- Write the placement into `frame`: `she sits in the lower-left third, the unlit shelves filling
|
|
79
79
|
the right two-thirds of the frame`.
|
|
80
80
|
|
|
81
|
-
**前景 — a foreground layer.**
|
|
82
|
-
glass, a door frame, a hanging lamp, the shoulder of the other person (an
|
|
83
|
-
it from the scene's anchors where you can, so it also carries continuity.
|
|
84
|
-
|
|
85
|
-
of focus. Aim higher than that minimum in this look.
|
|
81
|
+
**前景 — a foreground layer.** Where the story gives a reason, shoot *past* something: the edge of a
|
|
82
|
+
shelf, rain on the glass, a door frame, a hanging lamp, the shoulder of the other person (an
|
|
83
|
+
over-the-shoulder). Take it from the scene's anchors where you can, so it also carries continuity.
|
|
84
|
+
`params.foregroundLevel` sets how often; this look suits `medium` or `high`.
|
|
86
85
|
|
|
87
|
-
**Three layers.** A defocused foreground, the person in the shadow in the mid-ground, and a
|
|
86
|
+
**Three layers, when a cut has a foreground.** A defocused foreground, the person in the shadow in the mid-ground, and a
|
|
88
87
|
practical in the background that falls into bokeh. That depth is what the wide aperture exists for.
|
|
89
88
|
|
|
90
89
|
## 4. Lens — wide open, chosen per scene
|
|
@@ -46,7 +46,7 @@ storyboard (stage 5).
|
|
|
46
46
|
| `scenes[].lighting[].prompt` | the preset's `framePhrase`, plus the sources that light the space | `scene-design` |
|
|
47
47
|
| every `cut.frame` | the `framePhrase`, the direction phrase, `light.source` verbatim, the camera phrase, the foreground | `photography` |
|
|
48
48
|
| every `cut.light` | `direction` (never one of the preset's `bannedLight` on a person), `source`, `note` | `photography` |
|
|
49
|
-
| each segment | at least `preferredShare` of the cuts with people keyed from `preferredLight`;
|
|
49
|
+
| each segment | at least `preferredShare` of the cuts with people keyed from `preferredLight`; the episode's foreground share within `params.foregroundLevel` | `photography` |
|
|
50
50
|
| every `cut.aperture` / `params.camera.aperture` | `maxStop` or faster | `photography` |
|
|
51
51
|
| video prompt, `sheets` mode | the Look line carries the preset's `videoPhrase` (for `wan`: a `画面:` line with `videoPhraseZh`). `prompt segment` writes it for you | `video-prompt` |
|
|
52
52
|
|
|
@@ -19,7 +19,27 @@ text for a machine, not prose for a reader.
|
|
|
19
19
|
what is received → one or two visible signals in a channel the size can read (gaze, breath,
|
|
20
20
|
body set, object handling) → the decision (an action taken or withheld) → the landing at the
|
|
21
21
|
end boundary. A wide cannot carry an eyelid; a close-up cannot carry a full-body retreat.
|
|
22
|
-
Keeping still is a valid performance when it is the character's strategy
|
|
22
|
+
Keeping still is a valid performance when it is the character's strategy — and even then they
|
|
23
|
+
breathe and blink (`idle: "still"`).
|
|
24
|
+
|
|
25
|
+
### Everyone on screen is alive (gate `idle-motion`, sheets mode)
|
|
26
|
+
|
|
27
|
+
A model freezes whoever the prompt gives no motion, so a sub-character stands in the background like
|
|
28
|
+
a photo. `motion` is the one action that carries the cut; everyone else who is visible gets a small
|
|
29
|
+
motion of their own in `cut.idle: { C02: "shifts her weight, picking at her sleeve" }`. The skeleton
|
|
30
|
+
writes it into the shot. The rule, per cut with two or more visible people: all but the one carrying
|
|
31
|
+
the action have one (an over-the-shoulder's shoulder does not count). Give the speaker one too when
|
|
32
|
+
they would otherwise only talk.
|
|
33
|
+
|
|
34
|
+
- **Take it from why they are there.** Waiting: shifts weight, fiddles with a strap, checks the door.
|
|
35
|
+
Working: the work carries on. Listening: a small nod, the eyes moving over the other's face. Tense:
|
|
36
|
+
a tightening jaw, a thumb rubbing a finger. Do not reuse one motion across people or cuts: two people
|
|
37
|
+
breathing in time reads as a loop.
|
|
38
|
+
- **Small enough not to steal the cut:** one motion, in place. A line, a moving mouth or a change of
|
|
39
|
+
place is a cut's action, not an idle (gated, as is a length over 90 characters).
|
|
40
|
+
- **It must not break the boundaries:** hands, held props and positions end where `end` says.
|
|
41
|
+
- **Crowds and extras** with no sheet go in `background` as a motion, not a list of people: "shoppers
|
|
42
|
+
drifting past far behind her".
|
|
23
43
|
4. **Camera** — `cameraNote`. A lock-off is written like a move: the framing, **what still moves
|
|
24
44
|
inside it**, how long it holds (`hold`). An empty camera line is read as "free to drift", and
|
|
25
45
|
the model grows a push-in nobody asked for. A move names its `motivation` (reveal / pressure
|
|
@@ -88,6 +88,30 @@ adjective:
|
|
|
88
88
|
tighter) is a statement of power — make it on purpose.
|
|
89
89
|
- **Over-the-shoulder** names whose shoulder is in the foreground (`foreground`); that decides
|
|
90
90
|
whose shot it is.
|
|
91
|
+
|
|
92
|
+
### Two people talking
|
|
93
|
+
|
|
94
|
+
A model puts into the shot everyone the shot names, and "looking at him" gives it no direction. In
|
|
95
|
+
sheets mode the gate `two-person-framing` holds every two-person segment to these, and `prompt
|
|
96
|
+
segment` writes the phrases for you:
|
|
97
|
+
|
|
98
|
+
- **Default pattern:** a two-shot once to set who stands where → **over-the-shoulder**, alternating,
|
|
99
|
+
for the exchange → a **clean single** for the punchline or the biggest reaction. A reaction lands
|
|
100
|
+
harder alone, so do not put every shot over a shoulder.
|
|
101
|
+
- **A single is single.** `characters` holds one person, the shot opens `Only @imageK in frame.`, and
|
|
102
|
+
the rest of the shot never describes the other person. Their reaction gets its own cut.
|
|
103
|
+
- **Every look has a direction.** `eyeline: { C01: "screen-left down" }` — `screen-left` or
|
|
104
|
+
`screen-right`, then `level`, `up` or `down`. The direction is toward the other person, so it follows
|
|
105
|
+
from the side they stand on. `"away screen-left"` is a deliberate look elsewhere; `"task"` keeps the
|
|
106
|
+
eyes on what the hands are doing. Height comes from the blocking: a person kneeling looks up, the
|
|
107
|
+
one standing looks down.
|
|
108
|
+
- **The sides are locked.** `axis.screenLeft` / `screenRight` become a `Sides:` line in the prompt, and
|
|
109
|
+
every shot holds them. Moving a person across needs `axisSide: cross` with a `note`.
|
|
110
|
+
- **Over-the-shoulder is its own setting.** `ots: "C01"` is the person whose shoulder is near the lens;
|
|
111
|
+
`characters` holds both people. The prompt says their face is not visible, so only one face is left
|
|
112
|
+
for the lip-sync and the eyes. It counts as a foreground for `params.foregroundLevel`, and that person
|
|
113
|
+
needs no `eyeline`. When one person is much lower, shoot up past the low shoulder or down past the
|
|
114
|
+
high one, and keep the sides.
|
|
91
115
|
- **Crossing the axis** is legal with a neutral shot, an in-shot crossing, a deliberate
|
|
92
116
|
disorientation or a re-established geography — `axisSide: cross` with a `note` that says which;
|
|
93
117
|
the new working side is then inherited by the cuts after it.
|
|
@@ -66,6 +66,7 @@ All commands accept either the directory or the `project.json` path.
|
|
|
66
66
|
| `lookPhraseZh` | empty | the same look phrase in the drama's language, gated in a **Chinese** prompt (`wan`) where the English `lookPhrase` would be both out of place and extra length for the content filter to judge |
|
|
67
67
|
| `speechLeadSeconds` | 0.5 | added to a cut's dialogue seconds before the fit check — the mouth opens after the cut starts; also where a line starts in the `full` soundtrack prompt |
|
|
68
68
|
| `audioTrack` | `post` | where the soundtrack is made. **`post`** (the default): the clips carry dialogue, ambience and in-picture sfx but **no music** (`No music.` / `non_diegetic_music: N/A` / `无配乐`) and no `post: true` sfx — music and sound design cannot carry across separately generated segments, so they are made once over the **edited episode**, on its timecode (`prompt score E01`, then `mix-over-video.md`); no per-segment audio node. `bed` (ambience + sfx + timed music, no voices) / `full` (the bed plus every line in the connected `@Audio1..3` voices — at most three speakers): a Seed Audio node per segment, music in the clip prompt. `none`: no soundtrack work |
|
|
69
|
+
| `foregroundLevel` | `medium`; `high` for 唯美 / 美感优先 (`composition: art-first`, `cinematography: sweet-romance` or `costume-idol`, a genre naming 唯美 or 美感) | how often a cut shoots past a foreground, measured across the episode: `low` up to 25 % of the cuts, `medium` 25–50 %, `high` 50 % or more (gate `photography`; `--foreground` at init). Which cuts: `stage-storyboard.md` |
|
|
69
70
|
| `scoreFps` | 24 | frame rate `prompt score` writes SMPTE `HH:MM:SS:FF` at (`--fps` overrides); set it to the edit's real fps |
|
|
70
71
|
| `subtitles` | false | `true` drops the subtitles-off sentence requirement from the prompts |
|
|
71
72
|
| `maxFrameChars` | 900 | frames longer than this are flagged as padding (advisory) |
|
|
@@ -190,7 +191,7 @@ id or list) and `gag` (`setup` / `build` / `punchline`) with `runningGag`.
|
|
|
190
191
|
| `profile.evidence[]` | source | verbatim quotes, never translated |
|
|
191
192
|
| `image.prompt` | **`params.imagePromptLang`** (English by default) | portrait prompt; **no names or aliases**; must state ethnicity and era |
|
|
192
193
|
| `image.negativePrompt` | `imagePromptLang` | style-dependent, see stage-characters |
|
|
193
|
-
| `image.sheet` | `imagePromptLang` | 16:9 three-
|
|
194
|
+
| `image.sheet` | `imagePromptLang` | 16:9 three-panel sheet (headshot filling the height, front full body with the face covered by a grey box, back full body), grey-white studio background, studio lighting; no names; contains the style's render phrase (`STYLE_PRESETS[style].render`, or `.renderZh` in Chinese) |
|
|
194
195
|
| `voice.prompt` | English | ≤400 characters, a static voice identity, **no quoted lines** |
|
|
195
196
|
| `voice.videoDirection` | **English** | ≤160 characters, one clause: how they speak (pace, where the voice sits, what it does at the end of a phrase, accent). It is pasted beside **every line this character says** in a video prompt, and gated there — compress `voice.prompt`, do not repeat it |
|
|
196
197
|
| `identityEn` | **English** | ≤80 characters, the name-free way a prompt refers to this person (`the woman in her mid thirties in headphones`). Distinct per character; no names. Used to attribute dialogue in `keyframes` mode and anywhere a `@imageK` label is not available |
|
|
@@ -324,6 +325,9 @@ Duration: `Σ lines (chars ÷ charsPerSecond) + Σ actions × actionSeconds`.
|
|
|
324
325
|
| `prompt` | the video prompt, shape by `params.video` (below); gate `prompt-hygiene` (no `…`, no ids / paths / notes, subtitles off unless `params.subtitles`, H3 lips-closed clause, sheets-mode `@imageK` per shot) |
|
|
325
326
|
| `segments[].axis` | `{ between: [C01, C02], workingSide, screenLeft, screenRight }`, required when two or more people appear in the segment |
|
|
326
327
|
| `segments[].grammar` / `exceptions` | `grammar` (a string or an array) says how the segment is cut — `drama` · `action` · `faceslap` · `comedy`; missing, it is `params.grammar`; the old `action: true` means `action`. Each grammar's rules apply (gates `grammar`, `action`, `faceslap`, `comedy`; advisory `action-advice`, `grammar-advice`) and the prompt carries each grammar's line. `exceptions: [{ rule, reason }]` waives one rule for this segment when the user asks — rules `open-wide` `one-move` `impact-reaction` `no-graphic` `reveal-insert` `reaction-chain` `punchline-reaction` `setup-first` (the old `actionExceptions` still works) |
|
|
328
|
+
| `cuts[].idle` | sheets mode: `{ <id>: "shifts her weight" }`, a small motion in place for a person other than the one carrying the action, or `"still"` (breathing and blinking only). In a cut with two or more visible people, all but one need one (gate `idle-motion`) |
|
|
329
|
+
| `cuts[].eyeline` | sheets mode, two-person segments, **required**: `{ <id>: "screen-left\|screen-right level\|up\|down" }` for everyone on screen, or `"away screen-left"`, or `"task"` (gate `two-person-framing`) |
|
|
330
|
+
| `cuts[].ots` | the person whose shoulder is near the lens in an over-the-shoulder; `characters` holds both people; counts as a foreground; that person needs no `eyeline` |
|
|
327
331
|
| `segments[].sound` | `{ ambience, sfx: [{ cut, event, post? }], music }` — ambience identical across a scene's segments; `music` is `N/A`, an intent string, or `{ intent, cues: [{ at: <cut number \| "10.5s">, do: enter \| swell \| duck \| drop \| silence \| out, note }] }` — gate `sound`. An sfx with `post: true` is **sound design outside the story world** (stinger, riser, whoosh, impact hit, reverse cymbal) — never in the clip prompt, made over the edit. In `audioTrack: post` the `music` is the **spotting intent** for the episode score: it never enters the clip, and `prompt score E01` lays it, the post sfx, the lines and the scene beds on the episode timeline. In `bed` / `full`, `prompt audio E01-01` derives the segment's Seed Audio soundtrack prompt from it (timecoded `[start s:end s]` ambience / sfx / music, plus the lines with `--full`) — gate `audio-track` |
|
|
328
332
|
| `wji.assets.edit` / `wji.assets.mix` (episode) | `audioTrack: post` only — the locked edit of the episode (clips cut together, no music) and the final mixed episode (edit + score + sound design). `manifest` asks for the edit once every clip is bound, then for the mix |
|
|
329
333
|
| `segments[].refOverride[]` | optional — the Director pins this segment's **picture** references instead of the derived set (environment, people, props): `[{ entity, asset?: "sheet" \| "headshot" \| "lighting:<state>", faceOf?, why?, use?, zh? }]` in the order they will be connected (`@image1…`). `faceOf: "C01"` says this picture supplies that character's face, so their lines bind to it even when a body sheet of theirs comes later. Voices and the previous clip are still appended after the pictures. An empty array means "derived" |
|
|
@@ -61,23 +61,32 @@ the `seedNote` and `render dialogue` puts them beside each line for the polish p
|
|
|
61
61
|
**must** ban `photorealistic`. Both gated. Always add `logo, brand name, text` — a "store
|
|
62
62
|
uniform" comes back wearing a real chain's badge otherwise (seen in testing), and a real brand
|
|
63
63
|
on a character is a problem in every shot after it.
|
|
64
|
-
- `image.sheet`: the
|
|
64
|
+
- `image.sheet`: the three-panel sheet, written out in full every time. Left to right on
|
|
65
|
+
one 16:9 canvas, grey-white seamless studio background, studio lighting:
|
|
65
66
|
|
|
66
67
|
```
|
|
67
|
-
|
|
68
|
-
│
|
|
69
|
-
│
|
|
70
|
-
│
|
|
71
|
-
│
|
|
72
|
-
|
|
73
|
-
RIGHT-BOTTOM: 4–5 small detail studies;
|
|
74
|
-
the detail studies give way, not the figures
|
|
68
|
+
┌────────────┬────────────┬────────────┐
|
|
69
|
+
│ headshot │ front │ back │ ONE 16:9 canvas
|
|
70
|
+
│ face fills│ full body │ full body │ grey-white studio background
|
|
71
|
+
│ the height│ grey box │ │ studio lighting
|
|
72
|
+
│ │ over face │ │
|
|
73
|
+
└────────────┴────────────┴────────────┘
|
|
75
74
|
```
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
```
|
|
77
|
+
Single character sheet on ONE 16:9 landscape canvas, three panels left to right,
|
|
78
|
+
grey-white seamless studio background, studio lighting. <style render phrase>.
|
|
79
|
+
LEFT: one headshot, the face filling the full height of the panel, facial features
|
|
80
|
+
large and clear. CENTER: full-body front view, the face completely covered by a flat
|
|
81
|
+
grey box so no facial features are visible. RIGHT: full-body back view, same height
|
|
82
|
+
and body proportions as the front view, feet on the same ground line. Subject:
|
|
83
|
+
<ethnicity, age, era, identity, hair, outfit>. Same costume on both full-body views.
|
|
84
|
+
No side view, no extra characters, no scenery, no text, no watermark.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The face lives only in the left headshot. The center panel is the costume and the body.
|
|
88
|
+
Copy the style render phrase verbatim (`STYLE_PRESETS[style].render` — `node scripts/short-drama.mjs`
|
|
89
|
+
exports it). Gated: `16:9`, render phrase, no names.
|
|
81
90
|
|
|
82
91
|
## Voice
|
|
83
92
|
|
|
@@ -167,9 +176,10 @@ invents a voice that fits it, which is why the headshot must be approved first.
|
|
|
167
176
|
one reference, so pass only the headshot node. About 3.6 credits a sample.
|
|
168
177
|
|
|
169
178
|
Generate headshots first (a set of headshots is a batch — quote the total), **look at them**
|
|
170
|
-
(download and open), then sheets and voices from the approved headshots. Check a sheet for:
|
|
171
|
-
face
|
|
172
|
-
|
|
179
|
+
(download and open), then sheets and voices from the approved headshots. Check a sheet for: the
|
|
180
|
+
headshot face fills the panel height, the front full body has its face covered by a flat grey
|
|
181
|
+
box, the back full body matches that height, grey-white studio background. Regenerate rather
|
|
182
|
+
than accept a sheet with a visible face on the front body — every shot inherits it. Listen to the voice
|
|
173
183
|
before you attach it: the age and the weight of the voice should match the face.
|
|
174
184
|
|
|
175
185
|
Attach and bind:
|
|
@@ -163,11 +163,37 @@ tables are in `cinematography.md` and the preset's guide.
|
|
|
163
163
|
|
|
164
164
|
### Foreground
|
|
165
165
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
166
|
+
`foreground` names what sits between the lens and the subject — a console edge, a curtain of rain
|
|
167
|
+
off an awning, a blurred shoulder, a doorframe — and the frame prompt says it is thrown out of focus.
|
|
168
|
+
`""` is a deliberately clean frame.
|
|
169
|
+
|
|
170
|
+
**How often** is `params.foregroundLevel`, gated across the episode so scenes can differ:
|
|
171
|
+
|
|
172
|
+
| Level | Cuts with a foreground | Use |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| `low` | up to 25 % | clean, direct, face-led; only where the story asks for one |
|
|
175
|
+
| `medium` (default) | 25–50 % | where the story or the shot type gives a reason |
|
|
176
|
+
| `high` (default for 唯美 / 美感优先) | 50 % or more | a layered, voyeuristic or crowded look; soft, composed beauty |
|
|
177
|
+
|
|
178
|
+
唯美 / 美感优先 means `composition: art-first`, `cinematography: sweet-romance` or `costume-idol`, or a genre
|
|
179
|
+
that says 唯美 or 美感. Naming `foregroundLevel` overrides this.
|
|
180
|
+
|
|
181
|
+
**Which cuts** — story first, then shot type, then shot size. Remove it in your head: if the audience
|
|
182
|
+
loses no meaning, shoot the cut clean.
|
|
183
|
+
|
|
184
|
+
1. **Story decides whether.** Threat (the barrel in front of him), watching or hiding (a doorframe, a
|
|
185
|
+
curtain), trapped or outnumbered (bodies closing in), distance between two people, power (the
|
|
186
|
+
powerful one's shoulder or weapon), closeness (her hair, soft), a clue that matters later.
|
|
187
|
+
2. **Shot type decides what.** Over-the-shoulder always has one (the listener's shoulder); POV has what
|
|
188
|
+
they look past; an establishing shot has a layer of the place. Usually clean: a reaction close-up, an
|
|
189
|
+
insert, the 打脸 proof or reveal, an action impact, a moment of isolation.
|
|
190
|
+
3. **Shot size decides how much.** A wide can take a large shape on one edge; a medium one edge; a close
|
|
191
|
+
a soft sliver, never near the eyes or mouth; an extreme close-up almost never.
|
|
192
|
+
|
|
193
|
+
Take it from the scene: it must already be there and on the camera's side of the action. Keep it off
|
|
194
|
+
the face, the mouth, the key prop and the action. Prefer simple still shapes (edges, frames, shoulders)
|
|
195
|
+
over foreground faces and hands, which can read as an extra person. Do not repeat one object across
|
|
196
|
+
cuts unless it is a story motif. At `high`, keep the same reasons and simply use them more.
|
|
171
197
|
|
|
172
198
|
Directing feel (not gated): reverse angles for dialogue (asker's close-up, answerer's close-up);
|
|
173
199
|
the first cut of an episode moves; a key action gets its own 2 s insert; a reaction shot after a
|