clipugc 0.2.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.
Files changed (77) hide show
  1. package/README.md +249 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +31 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/account.d.ts +12 -0
  6. package/dist/commands/account.js +48 -0
  7. package/dist/commands/account.js.map +1 -0
  8. package/dist/commands/auth.d.ts +14 -0
  9. package/dist/commands/auth.js +152 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/characters.d.ts +3 -0
  12. package/dist/commands/characters.js +261 -0
  13. package/dist/commands/characters.js.map +1 -0
  14. package/dist/commands/config.d.ts +5 -0
  15. package/dist/commands/config.js +69 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/credits.d.ts +2 -0
  18. package/dist/commands/credits.js +117 -0
  19. package/dist/commands/credits.js.map +1 -0
  20. package/dist/commands/hooks.d.ts +2 -0
  21. package/dist/commands/hooks.js +32 -0
  22. package/dist/commands/hooks.js.map +1 -0
  23. package/dist/commands/images.d.ts +3 -0
  24. package/dist/commands/images.js +257 -0
  25. package/dist/commands/images.js.map +1 -0
  26. package/dist/commands/videos.d.ts +2 -0
  27. package/dist/commands/videos.js +272 -0
  28. package/dist/commands/videos.js.map +1 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +24 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/services/api.d.ts +40 -0
  33. package/dist/services/api.js +139 -0
  34. package/dist/services/api.js.map +1 -0
  35. package/dist/services/characters.service.d.ts +135 -0
  36. package/dist/services/characters.service.js +276 -0
  37. package/dist/services/characters.service.js.map +1 -0
  38. package/dist/services/hooks.service.d.ts +9 -0
  39. package/dist/services/hooks.service.js +23 -0
  40. package/dist/services/hooks.service.js.map +1 -0
  41. package/dist/services/images.service.d.ts +95 -0
  42. package/dist/services/images.service.js +191 -0
  43. package/dist/services/images.service.js.map +1 -0
  44. package/dist/services/upload.service.d.ts +46 -0
  45. package/dist/services/upload.service.js +134 -0
  46. package/dist/services/upload.service.js.map +1 -0
  47. package/dist/services/user.service.d.ts +80 -0
  48. package/dist/services/user.service.js +35 -0
  49. package/dist/services/user.service.js.map +1 -0
  50. package/dist/services/videos.service.d.ts +100 -0
  51. package/dist/services/videos.service.js +187 -0
  52. package/dist/services/videos.service.js.map +1 -0
  53. package/dist/types/index.d.ts +47 -0
  54. package/dist/types/index.js +18 -0
  55. package/dist/types/index.js.map +1 -0
  56. package/dist/utils/config.d.ts +18 -0
  57. package/dist/utils/config.js +65 -0
  58. package/dist/utils/config.js.map +1 -0
  59. package/dist/utils/errors.d.ts +52 -0
  60. package/dist/utils/errors.js +74 -0
  61. package/dist/utils/errors.js.map +1 -0
  62. package/dist/utils/logger.d.ts +11 -0
  63. package/dist/utils/logger.js +28 -0
  64. package/dist/utils/logger.js.map +1 -0
  65. package/dist/utils/output.d.ts +16 -0
  66. package/dist/utils/output.js +53 -0
  67. package/dist/utils/output.js.map +1 -0
  68. package/dist/utils/poll.d.ts +37 -0
  69. package/dist/utils/poll.js +94 -0
  70. package/dist/utils/poll.js.map +1 -0
  71. package/dist/utils/prompt.d.ts +4 -0
  72. package/dist/utils/prompt.js +55 -0
  73. package/dist/utils/prompt.js.map +1 -0
  74. package/dist/version.d.ts +1 -0
  75. package/dist/version.js +12 -0
  76. package/dist/version.js.map +1 -0
  77. package/package.json +49 -0
@@ -0,0 +1,257 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { isJsonMode, printJson, printTable, formatStatus } from '../utils/output.js';
3
+ import { confirm } from '../utils/prompt.js';
4
+ import { AbortedError, ValidationError } from '../utils/errors.js';
5
+ import { waitForCompletion } from '../utils/poll.js';
6
+ import { DEFAULT_RESOLUTION, RESOLUTIONS, SHOT_TYPES, TEMPLATES, checkImageStatus, createVariation, deleteImage, downloadImage, findImageUrl, generateImages, getImage, listImages, retryImage, } from '../services/images.service.js';
7
+ function parseIntStrict(value, label) {
8
+ const n = Number(value);
9
+ if (!Number.isInteger(n)) {
10
+ throw new ValidationError(`${label} must be an integer (got "${value}").`);
11
+ }
12
+ return n;
13
+ }
14
+ /** Poll a set of image ids until each completes; returns the final payloads. */
15
+ async function waitForImages(images, quiet) {
16
+ const finals = [];
17
+ for (const image of images) {
18
+ const final = await waitForCompletion(() => checkImageStatus(String(image.id)), {
19
+ label: `Generating look ${image.id}`,
20
+ quiet,
21
+ });
22
+ finals.push(final);
23
+ }
24
+ return finals;
25
+ }
26
+ function printFinalStatuses(images, finals) {
27
+ finals.forEach((final, i) => {
28
+ const id = images[i]?.id;
29
+ const url = findImageUrl(final);
30
+ logger.kv(`Look ${id}`, formatStatus(String(final.status)) + (url ? ` ${url}` : ''));
31
+ });
32
+ }
33
+ /** Register the `clipugc images` command group (character looks). */
34
+ export function registerImagesCommands(program) {
35
+ const images = program
36
+ .command('images')
37
+ .description('Manage character looks (reference images)');
38
+ images
39
+ .command('generate')
40
+ .description('Generate look(s) for a character')
41
+ .requiredOption('--character <id>', 'Character id')
42
+ .option('--shots <list>', `Comma-separated shot types: ${SHOT_TYPES.join(', ')}`, 'frontal')
43
+ .option('--template <template>', `Template: ${TEMPLATES.join(', ')}`)
44
+ .option('--scene <prompt>', 'Scene prompt (max 600 characters)')
45
+ .option('--resolution <res>', `Resolution: ${RESOLUTIONS.join(', ')}`, DEFAULT_RESOLUTION)
46
+ .option('--wait', 'Poll until generation completes')
47
+ .action(async (options, cmd) => {
48
+ const json = isJsonMode(cmd);
49
+ const { raw, images: created } = await generateImages(options.character, {
50
+ shots: options.shots,
51
+ template: options.template,
52
+ scene: options.scene,
53
+ resolution: options.resolution,
54
+ });
55
+ if (!options.wait) {
56
+ if (json) {
57
+ printJson(raw);
58
+ return;
59
+ }
60
+ if (created.length === 0) {
61
+ logger.success('Look generation started.');
62
+ return;
63
+ }
64
+ logger.success(`Look generation started (id${created.length > 1 ? 's' : ''}: ${created.map((i) => i.id).join(', ')})`);
65
+ logger.hint(`Check progress with: clipugc images status ${created[0].id}`);
66
+ return;
67
+ }
68
+ if (created.length === 0) {
69
+ if (json) {
70
+ printJson(raw);
71
+ }
72
+ else {
73
+ logger.warn('Generation started but no image ids were returned — cannot wait. Check `clipugc images list`.');
74
+ }
75
+ return;
76
+ }
77
+ const finals = await waitForImages(created, json);
78
+ if (json) {
79
+ printJson(finals);
80
+ return;
81
+ }
82
+ printFinalStatuses(created, finals);
83
+ });
84
+ images
85
+ .command('list')
86
+ .description('List looks for a character')
87
+ .requiredOption('--character <id>', 'Character id')
88
+ .action(async (options, cmd) => {
89
+ const json = isJsonMode(cmd);
90
+ const { items, raw } = await listImages(options.character);
91
+ if (json) {
92
+ printJson(raw);
93
+ return;
94
+ }
95
+ const columns = [
96
+ { header: 'ID', value: (i) => i.id },
97
+ {
98
+ header: 'Scene',
99
+ value: (i) => {
100
+ const scene = typeof i.scene_prompt === 'string' ? i.scene_prompt : '';
101
+ if (scene === '')
102
+ return 'base look';
103
+ return scene.length > 42 ? `${scene.slice(0, 39)}…` : scene;
104
+ },
105
+ },
106
+ { header: 'Status', value: (i) => (i.status ? formatStatus(String(i.status)) : undefined) },
107
+ { header: 'Created', value: (i) => i.created_at },
108
+ ];
109
+ printTable(items, columns);
110
+ logger.hint('Reference a look by its ID, e.g. clipugc videos create --image <ID>');
111
+ });
112
+ images
113
+ .command('show <id>')
114
+ .description('Show a look in detail')
115
+ .action(async (id, _options, cmd) => {
116
+ const json = isJsonMode(cmd);
117
+ const image = await getImage(id);
118
+ if (json) {
119
+ printJson(image);
120
+ return;
121
+ }
122
+ for (const [key, value] of Object.entries(image)) {
123
+ if (value === null || value === undefined || value === '')
124
+ continue;
125
+ if (typeof value === 'object') {
126
+ logger.kv(key, JSON.stringify(value));
127
+ }
128
+ else if (key === 'status') {
129
+ logger.kv(key, formatStatus(String(value)));
130
+ }
131
+ else {
132
+ logger.kv(key, String(value));
133
+ }
134
+ }
135
+ });
136
+ images
137
+ .command('status <id>')
138
+ .description('Check generation status of a look')
139
+ .action(async (id, _options, cmd) => {
140
+ const json = isJsonMode(cmd);
141
+ const check = await checkImageStatus(id);
142
+ if (json) {
143
+ printJson(check);
144
+ return;
145
+ }
146
+ logger.kv('Status', formatStatus(String(check.status)));
147
+ const url = findImageUrl(check);
148
+ if (check.status === 'completed' && url)
149
+ logger.kv('URL', url);
150
+ const reason = check.failure_reason || check.error_message;
151
+ if (check.status === 'failed' && reason)
152
+ logger.kv('Reason', reason);
153
+ });
154
+ images
155
+ .command('download <id>')
156
+ .description('Download a look image to disk')
157
+ .option('-o, --output <file>', 'Output file (default: clipugc-look-<id>.<ext>)')
158
+ .action(async (id, options, cmd) => {
159
+ const json = isJsonMode(cmd);
160
+ const dest = await downloadImage(id, { output: options.output, quiet: json });
161
+ if (json) {
162
+ printJson({ saved: dest });
163
+ return;
164
+ }
165
+ logger.success(`Saved ${dest}`);
166
+ });
167
+ images
168
+ .command('variation <id>')
169
+ .description('Generate variation(s) of a look with a new scene')
170
+ .requiredOption('--scene <prompt>', 'Scene prompt (3-600 characters)')
171
+ .option('--count <n>', 'Number of variations (1-4)')
172
+ .option('--before-after', 'Generate a before/after style variation')
173
+ .option('--wait', 'Poll until the variation completes')
174
+ .action(async (id, options, cmd) => {
175
+ const json = isJsonMode(cmd);
176
+ const count = options.count !== undefined ? parseIntStrict(options.count, '--count') : undefined;
177
+ const { raw, images: created } = await createVariation(id, {
178
+ scene: options.scene,
179
+ count,
180
+ beforeAfter: options.beforeAfter ? true : undefined,
181
+ });
182
+ if (!options.wait) {
183
+ if (json) {
184
+ printJson(raw);
185
+ return;
186
+ }
187
+ if (created.length === 0) {
188
+ logger.success('Variation started.');
189
+ return;
190
+ }
191
+ logger.success(`Variation started (id${created.length > 1 ? 's' : ''}: ${created.map((i) => i.id).join(', ')})`);
192
+ logger.hint(`Check progress with: clipugc images status ${created[0].id}`);
193
+ return;
194
+ }
195
+ if (created.length === 0) {
196
+ if (json) {
197
+ printJson(raw);
198
+ }
199
+ else {
200
+ logger.warn('Variation started but no image ids were returned — cannot wait. Check `clipugc images list`.');
201
+ }
202
+ return;
203
+ }
204
+ const finals = await waitForImages(created, json);
205
+ if (json) {
206
+ printJson(finals);
207
+ return;
208
+ }
209
+ printFinalStatuses(created, finals);
210
+ });
211
+ images
212
+ .command('retry <id>')
213
+ .description('Retry a failed look generation')
214
+ .option('--wait', 'Poll until the retry completes')
215
+ .action(async (id, options, cmd) => {
216
+ const json = isJsonMode(cmd);
217
+ const result = await retryImage(id);
218
+ if (!options.wait) {
219
+ if (json) {
220
+ printJson(result ?? { retried: true, id });
221
+ return;
222
+ }
223
+ logger.success(`Retry started for look ${id}.`);
224
+ logger.hint(`Check progress with: clipugc images status ${id}`);
225
+ return;
226
+ }
227
+ const final = await waitForCompletion(() => checkImageStatus(id), {
228
+ label: `Regenerating look ${id}`,
229
+ quiet: json,
230
+ });
231
+ if (json) {
232
+ printJson(final);
233
+ return;
234
+ }
235
+ const url = findImageUrl(final);
236
+ logger.kv(`Look ${id}`, formatStatus(String(final.status)) + (url ? ` ${url}` : ''));
237
+ });
238
+ images
239
+ .command('delete <id>')
240
+ .description('Delete a look')
241
+ .option('--yes', 'Skip the confirmation prompt')
242
+ .action(async (id, options, cmd) => {
243
+ const json = isJsonMode(cmd);
244
+ if (!options.yes) {
245
+ const ok = await confirm(`Delete look ${id}? This cannot be undone.`);
246
+ if (!ok)
247
+ throw new AbortedError('Delete cancelled.');
248
+ }
249
+ const result = await deleteImage(id);
250
+ if (json) {
251
+ printJson(result ?? { deleted: true, id });
252
+ return;
253
+ }
254
+ logger.success(`Look ${id} deleted.`);
255
+ });
256
+ }
257
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/commands/images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerVideosCommands(program: Command): void;
@@ -0,0 +1,272 @@
1
+ import { createApiClient } from '../services/api.js';
2
+ import { checkVideoStatus, createImageToVideo, createMotionControl, deleteVideo, downloadVideo, getVideo, listVideos, mergeVideo, retryVideo, } from '../services/videos.service.js';
3
+ import { uploadFile } from '../services/upload.service.js';
4
+ import { formatStatus, isJsonMode, printJson, printPagination, printTable } from '../utils/output.js';
5
+ import { waitForCompletion, waitForMerge } from '../utils/poll.js';
6
+ import { confirm } from '../utils/prompt.js';
7
+ import { AbortedError, ValidationError } from '../utils/errors.js';
8
+ import { logger } from '../utils/logger.js';
9
+ function parsePositiveInt(flag) {
10
+ return (value) => {
11
+ const n = Number.parseInt(value, 10);
12
+ if (!Number.isInteger(n) || String(n) !== value.trim() || n < 1) {
13
+ throw new ValidationError(`${flag} must be a positive integer (got "${value}").`);
14
+ }
15
+ return n;
16
+ };
17
+ }
18
+ /**
19
+ * Resolve the --image/--photo pair into the API image source.
20
+ * Exactly one must be given; --photo is uploaded first (purpose: photo).
21
+ */
22
+ async function resolveImageSource(api, opts, quiet) {
23
+ const hasImage = Boolean(opts.image);
24
+ const hasPhoto = Boolean(opts.photo);
25
+ if (hasImage === hasPhoto) {
26
+ throw new ValidationError('Provide exactly one image source: --image <lookId> (a generated character look) or --photo <file> (your own photo).');
27
+ }
28
+ if (hasImage) {
29
+ return { characterReferenceImageId: opts.image };
30
+ }
31
+ const sourceImageKey = await uploadFile(api, 'photo', opts.photo, { quiet });
32
+ return { sourceImageKey };
33
+ }
34
+ /** Human label for a video's merge state. */
35
+ function mergedLabel(v) {
36
+ const ms = typeof v.merge_status === 'string' ? v.merge_status : undefined;
37
+ if (ms)
38
+ return ms; // processing | completed | failed
39
+ const media = v.media;
40
+ if (v.is_merged === true || media?.has_merged === true)
41
+ return 'completed';
42
+ return '—';
43
+ }
44
+ /** Shared post-create flow: --wait polling or a status hint. */
45
+ async function finishCreate(api, video, opts, json, label) {
46
+ const id = String(video.id);
47
+ if (opts.wait) {
48
+ const finalStatus = await waitForCompletion(() => checkVideoStatus(api, id), { label, quiet: json });
49
+ if (json) {
50
+ printJson(finalStatus);
51
+ return;
52
+ }
53
+ logger.hint(`Download it with \`clipugc videos download ${id}\``);
54
+ return;
55
+ }
56
+ if (json) {
57
+ printJson(video);
58
+ return;
59
+ }
60
+ logger.success(`Video queued (id: ${id}, status: ${formatStatus(video.status ?? 'pending')}).`);
61
+ logger.hint(`Check progress with \`clipugc videos status ${id}\` (or re-run with --wait).`);
62
+ }
63
+ export function registerVideosCommands(program) {
64
+ const videos = program
65
+ .command('videos')
66
+ .description('Create, manage, and download UGC character videos');
67
+ videos
68
+ .command('list')
69
+ .description('List your character videos')
70
+ .option('--character <id>', 'Only videos of this AI character')
71
+ .option('--mergeable', 'Only completed, unmerged clips (ready for `videos merge`)')
72
+ .option('--finals', 'Only merged final UGC videos')
73
+ .option('--page <n>', 'Page number', parsePositiveInt('--page'))
74
+ .option('--per-page <n>', 'Results per page (max 50)', parsePositiveInt('--per-page'))
75
+ .action(async (opts, cmd) => {
76
+ const json = isJsonMode(cmd);
77
+ const api = await createApiClient();
78
+ const { items, pagination, raw } = await listVideos(api, {
79
+ page: opts.page,
80
+ perPage: opts.perPage,
81
+ aiCharacterId: opts.character,
82
+ mergeable: opts.mergeable,
83
+ finals: opts.finals,
84
+ });
85
+ if (json) {
86
+ printJson(raw);
87
+ return;
88
+ }
89
+ printTable(items, [
90
+ { header: 'ID', value: (v) => v.id },
91
+ { header: 'Status', value: (v) => formatStatus(v.status ?? '') },
92
+ { header: 'Merged', value: (v) => mergedLabel(v) },
93
+ { header: 'Type', value: (v) => v.kind ?? v.type },
94
+ { header: 'Created', value: (v) => v.created_at },
95
+ ]);
96
+ printPagination(pagination);
97
+ });
98
+ videos
99
+ .command('create')
100
+ .description('Generate a character video from an image (image-to-video). Costs 7 credits (5s) or 13 (10s); a --scene staged clip adds the image cost (9 at 5s, 15 at 10s)')
101
+ .option('--image <lookId>', 'ID of a generated character look/reference image')
102
+ .option('--photo <file>', 'Path to your own photo (png/jpg/jpeg/webp) — uploaded first')
103
+ .option('--prompt <text>', 'What the character should say/do (max 1500 chars)')
104
+ .option('--scene <text>', 'Extra scene description, max 600 chars (scene-staged clip: 9 credits at 5s, 15 at 10s)')
105
+ .option('--duration <seconds>', 'Video duration: 5 or 10 (default 5). 5s = 7 credits, 10s = 13', parsePositiveInt('--duration'))
106
+ .option('--keep-sound', 'Keep the original sound')
107
+ .option('--wait', 'Wait until generation completes')
108
+ .action(async (opts, cmd) => {
109
+ const json = isJsonMode(cmd);
110
+ const api = await createApiClient();
111
+ const source = await resolveImageSource(api, opts, json);
112
+ const video = await createImageToVideo(api, {
113
+ ...source,
114
+ prompt: opts.prompt,
115
+ scenePrompt: opts.scene,
116
+ duration: opts.duration,
117
+ keepOriginalSound: opts.keepSound,
118
+ });
119
+ await finishCreate(api, video, opts, json, 'Generating video');
120
+ });
121
+ videos
122
+ .command('motion')
123
+ .description('Generate a character video driven by a reference video (motion control). Costs 3 credits per second of driver video (rounded up, capped at 30s)')
124
+ .option('--image <lookId>', 'ID of a generated character look/reference image')
125
+ .option('--photo <file>', 'Path to your own photo (png/jpg/jpeg/webp) — uploaded first')
126
+ .requiredOption('--driver <videoFile>', 'Driver video (mp4/mov, max 50 MB and 30s) whose motion is applied')
127
+ .option('--prompt <text>', 'What the character should say/do (max 1500 chars)')
128
+ .option('--keep-sound', "Keep the driver video's original sound")
129
+ .option('--wait', 'Wait until generation completes')
130
+ .action(async (opts, cmd) => {
131
+ const json = isJsonMode(cmd);
132
+ const api = await createApiClient();
133
+ const source = await resolveImageSource(api, opts, json);
134
+ const referenceVideoKey = await uploadFile(api, 'driver_video', opts.driver, { quiet: json });
135
+ const video = await createMotionControl(api, {
136
+ ...source,
137
+ referenceVideoKey,
138
+ prompt: opts.prompt,
139
+ keepOriginalSound: opts.keepSound,
140
+ });
141
+ await finishCreate(api, video, opts, json, 'Generating video');
142
+ });
143
+ videos
144
+ .command('merge <videoId>')
145
+ .description('Merge your app screen recording with the character clip into a final UGC video, with a hook text overlay (and optional background music)')
146
+ .requiredOption('--app-video <file>', 'App screen recording (mp4/mov) — uploaded first')
147
+ .requiredOption('--hook <text>', 'Hook text overlay (max 150 chars)')
148
+ .option('--music <file>', 'Background music (mp3/wav/m4a) — uploaded first')
149
+ .option('--wait', 'Wait until the merge completes')
150
+ .action(async (videoId, opts, cmd) => {
151
+ const json = isJsonMode(cmd);
152
+ const api = await createApiClient();
153
+ const appVideoKey = await uploadFile(api, 'app_video', opts.appVideo, { quiet: json });
154
+ const musicKey = opts.music ? await uploadFile(api, 'music', opts.music, { quiet: json }) : undefined;
155
+ const video = await mergeVideo(api, videoId, { appVideoKey, hookText: opts.hook, musicKey });
156
+ const id = String(video.id ?? videoId);
157
+ if (opts.wait) {
158
+ // A clip's own status stays "completed" during a merge, so wait on the
159
+ // video resource's merge_status (processing → completed | failed).
160
+ const final = await waitForMerge(() => getVideo(api, id), { label: 'Merging video', quiet: json });
161
+ if (json) {
162
+ printJson(final);
163
+ }
164
+ else {
165
+ logger.hint(`Download the finished ad with \`clipugc videos download ${id}\``);
166
+ }
167
+ return;
168
+ }
169
+ if (json) {
170
+ printJson(video);
171
+ return;
172
+ }
173
+ logger.success(`Merge queued (video ${id}). It renders in the background.`);
174
+ logger.hint(`Wait for it with \`clipugc videos status ${id}\` — or re-run with --wait.`);
175
+ });
176
+ videos
177
+ .command('show <id>')
178
+ .description('Show details of a character video')
179
+ .action(async (id, cmd) => {
180
+ const json = isJsonMode(cmd);
181
+ const api = await createApiClient();
182
+ const video = await getVideo(api, id);
183
+ if (json) {
184
+ printJson(video);
185
+ return;
186
+ }
187
+ logger.plain(`Video ${video.id}`);
188
+ logger.kv('status', formatStatus(video.status ?? ''));
189
+ for (const [key, value] of Object.entries(video)) {
190
+ if (key === 'id' || key === 'status')
191
+ continue;
192
+ if (value === null || ['string', 'number', 'boolean'].includes(typeof value)) {
193
+ logger.kv(key, value);
194
+ }
195
+ }
196
+ if (video.status === 'completed') {
197
+ logger.hint(`Download it with \`clipugc videos download ${video.id}\``);
198
+ }
199
+ });
200
+ videos
201
+ .command('status <id>')
202
+ .description('Check the processing status of a character video')
203
+ .action(async (id, cmd) => {
204
+ const json = isJsonMode(cmd);
205
+ const api = await createApiClient();
206
+ const check = await checkVideoStatus(api, id);
207
+ if (json) {
208
+ printJson(check);
209
+ return;
210
+ }
211
+ logger.plain(`Status: ${formatStatus(check.status ?? 'unknown')}`);
212
+ const mergeStatus = typeof check.merge_status === 'string' ? check.merge_status : undefined;
213
+ const media = check.media;
214
+ if (mergeStatus || media?.has_merged) {
215
+ logger.kv('Merge', mergeStatus ?? (media?.has_merged ? 'completed' : '—'));
216
+ }
217
+ if (check.status === 'failed') {
218
+ const reason = check.failure_reason || check.error_message;
219
+ if (reason)
220
+ logger.warn(String(reason));
221
+ logger.hint(`Retry with \`clipugc videos retry ${id}\``);
222
+ }
223
+ if (mergeStatus === 'failed') {
224
+ logger.warn('The merge failed and its credit was refunded. Re-run `clipugc videos merge`.');
225
+ }
226
+ if (check.status === 'completed') {
227
+ logger.hint(`Download it with \`clipugc videos download ${id}\``);
228
+ }
229
+ });
230
+ videos
231
+ .command('download <id>')
232
+ .description('Download a completed character video to disk')
233
+ .option('-o, --output <file>', 'Destination file (default: clipugc-video-<id>.mp4)')
234
+ .action(async (id, opts, cmd) => {
235
+ const json = isJsonMode(cmd);
236
+ const api = await createApiClient();
237
+ const dest = await downloadVideo(api, id, { output: opts.output, quiet: json });
238
+ if (json) {
239
+ printJson({ id, output: dest });
240
+ }
241
+ });
242
+ videos
243
+ .command('retry <id>')
244
+ .description('Retry a failed character video')
245
+ .option('--wait', 'Wait until generation completes')
246
+ .action(async (id, opts, cmd) => {
247
+ const json = isJsonMode(cmd);
248
+ const api = await createApiClient();
249
+ const video = await retryVideo(api, id);
250
+ await finishCreate(api, { ...video, id: video.id ?? id }, opts, json, 'Generating video');
251
+ });
252
+ videos
253
+ .command('delete <id>')
254
+ .description('Delete a character video')
255
+ .option('-y, --yes', 'Skip the confirmation prompt')
256
+ .action(async (id, opts, cmd) => {
257
+ const json = isJsonMode(cmd);
258
+ if (!opts.yes) {
259
+ const ok = await confirm(`Delete video ${id}? This cannot be undone.`);
260
+ if (!ok)
261
+ throw new AbortedError();
262
+ }
263
+ const api = await createApiClient();
264
+ const { data, message } = await deleteVideo(api, id);
265
+ if (json) {
266
+ printJson(data);
267
+ return;
268
+ }
269
+ logger.success(message ?? `Video ${id} deleted.`);
270
+ });
271
+ }
272
+ //# sourceMappingURL=videos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videos.js","sourceRoot":"","sources":["../../src/commands/videos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { createCli } from './cli.js';
3
+ import { CliError, EXIT_CODES } from './utils/errors.js';
4
+ import { logger } from './utils/logger.js';
5
+ process.on('SIGINT', () => {
6
+ console.log('\n');
7
+ process.exit(130);
8
+ });
9
+ const program = createCli();
10
+ program.parseAsync(process.argv).catch((error) => {
11
+ if (error instanceof CliError) {
12
+ if (error.exitCode === EXIT_CODES.OK) {
13
+ // e.g. user aborted a confirmation — informational, not a failure
14
+ logger.info(error.message);
15
+ process.exit(0);
16
+ }
17
+ logger.error(error.message);
18
+ process.exit(error.exitCode);
19
+ }
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ logger.error(message);
22
+ process.exit(EXIT_CODES.GENERIC);
23
+ });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;AAE5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE,EAAE,CAAC;YACrC,kEAAkE;YAClE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface RequestOptions {
2
+ /** JSON body (POST/PATCH). */
3
+ body?: unknown;
4
+ /** Multipart body (file uploads). Mutually exclusive with body. */
5
+ form?: FormData;
6
+ /** Query string params; undefined/null values are dropped. */
7
+ query?: Record<string, string | number | boolean | undefined | null>;
8
+ }
9
+ export interface ApiResult<T> {
10
+ data: T;
11
+ message: string | null;
12
+ }
13
+ /**
14
+ * Thin fetch client for the ClipUGC REST API.
15
+ * Unwraps the {statusCode, errorMessage, data, message} envelope and throws
16
+ * typed errors — it never exits the process.
17
+ */
18
+ export declare class ApiClient {
19
+ readonly baseUrl: string;
20
+ private readonly apiKey;
21
+ constructor(baseUrl: string, apiKey: string);
22
+ get<T>(path: string, options?: RequestOptions): Promise<T>;
23
+ post<T>(path: string, options?: RequestOptions): Promise<T>;
24
+ /** POST multipart/form-data (file uploads). fetch sets the boundary header itself. */
25
+ postForm<T>(path: string, form: FormData): Promise<T>;
26
+ patch<T>(path: string, options?: RequestOptions): Promise<T>;
27
+ delete<T>(path: string, options?: RequestOptions): Promise<T>;
28
+ /** Full request returning both data and the envelope message. */
29
+ request<T>(method: string, path: string, options?: RequestOptions): Promise<ApiResult<T>>;
30
+ private unwrap;
31
+ private buildUrl;
32
+ }
33
+ /**
34
+ * Build a client from persisted config/env. Throws AuthError when no API key
35
+ * is available (unless allowAnonymous — used by `auth login` itself).
36
+ */
37
+ export declare function createApiClient(opts?: {
38
+ allowAnonymous?: boolean;
39
+ apiKey?: string;
40
+ }): Promise<ApiClient>;