@facelessad/cli 2.1.0 → 2.1.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 +1 -1
- package/SKILL.md +9 -7
- package/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ Three ways to get the file:
|
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
facelessad download 103 --out ad.mp4 # saves into the CURRENT directory
|
|
44
|
-
facelessad status 103 --json | jq -r .url # the raw link, valid ~
|
|
44
|
+
facelessad status 103 --json | jq -r .url # the raw link, valid ~24 hours
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
The third is the browser: every video made through the CLI also appears in My
|
package/SKILL.md
CHANGED
|
@@ -14,10 +14,11 @@ facelessad login # API key from https://facelessad.com/develop
|
|
|
14
14
|
facelessad balance # proves the key works
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
**The API needs a paid plan
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
**The API needs a paid plan or an active trial.** The $15 trial (300
|
|
18
|
+
credits, 7 days) opens API keys, the CLI and MCP for its duration. If a
|
|
19
|
+
command answers `api_access_required`, the subscription has ended or the
|
|
20
|
+
trial has expired or run out of credits — a billing state, not a broken
|
|
21
|
+
key, so say so rather than retrying.
|
|
21
22
|
|
|
22
23
|
In CI, skip `login` and set `FACELESSAD_API_KEY`; the environment variable
|
|
23
24
|
wins over the saved key.
|
|
@@ -162,8 +163,8 @@ no voice, no script, no music and no SFX.
|
|
|
162
163
|
|
|
163
164
|
`--voiceover-text "<script>"` (or `--voiceover-file <path>`) makes the
|
|
164
165
|
narration **word-for-word** — the AI script writer is skipped and not
|
|
165
|
-
charged. The word limit follows the duration: 15 s fits ~
|
|
166
|
-
50 s ~
|
|
166
|
+
charged. The word limit follows the duration: 15 s fits ~45 words, 30 s ~80,
|
|
167
|
+
50 s ~130. Over the limit is a clear error, never a silent trim, so count
|
|
167
168
|
before sending. Not on music-video (its script is sung) or video-banner.
|
|
168
169
|
|
|
169
170
|
`--visual-direction` steers the storyboard and `--hook-text` the first frame.
|
|
@@ -291,9 +292,10 @@ names the offending field and usually the valid values.
|
|
|
291
292
|
|
|
292
293
|
**Access and capacity**
|
|
293
294
|
|
|
294
|
-
- `api_access_required` — no active paid plan.
|
|
295
|
+
- `api_access_required` — no active paid plan or live trial. An active $15 trial opens the API for its 7 days.
|
|
295
296
|
- `insufficient_credits` — the body carries the estimate and the balance; nothing was spent.
|
|
296
297
|
- `too_many_active` — the plan's queue is full (Starter 10, Growth 25, Scale 50; app and API share it). Wait for a build to finish, then retry.
|
|
298
|
+
- `test_quota_exceeded` — 100 test runs per day per account (`"test": true` only). Real runs are unaffected; the quota resets at 00:00 UTC and the body carries `retryAfter`.
|
|
297
299
|
- `rate_limited` — over 300 POSTs this hour (`estimate` has its own 600). `retryAfter` gives the seconds until the counter resets on the hour.
|
|
298
300
|
- `unauthorized` — the key is unknown or revoked.
|
|
299
301
|
|
package/index.js
CHANGED
|
@@ -861,7 +861,7 @@ Create flags:
|
|
|
861
861
|
--video-mode continuous|cuts (animated-ad and music-video only)
|
|
862
862
|
--voiceover-text "<script>" (your own narration, spoken word-for-word —
|
|
863
863
|
the AI script writer is skipped and not charged. Word limit follows
|
|
864
|
-
duration: 15s fits
|
|
864
|
+
duration: 15s fits 45 words, 30s fits 80, 50s fits 130. Over the limit
|
|
865
865
|
is an error, never a silent trim. Not on music-video or video-banner.)
|
|
866
866
|
--voiceover-file <path> (same, read from a local text file)
|
|
867
867
|
--visual-direction "<...>" (how the video should LOOK and what happens
|
|
@@ -950,7 +950,7 @@ function statusLine(d) {
|
|
|
950
950
|
let s = 'Video ' + d.id + ': ' + bold(d.status);
|
|
951
951
|
if (d.phase && !done) s += ' ' + dim('(' + d.phase + ')');
|
|
952
952
|
if (d.url) s += '\n' + dim('Download: ') + 'facelessad download ' + d.id + ' --out ad.mp4'
|
|
953
|
-
+ '\n' + dim('(the direct link is in --json output; it expires in ~
|
|
953
|
+
+ '\n' + dim('(the direct link is in --json output; it expires in ~24 h)');
|
|
954
954
|
if (d.error) s += '\n' + d.error;
|
|
955
955
|
return s;
|
|
956
956
|
}
|