@cutcli/cutcli 0.0.1 → 1.1.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/README.md +17 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +969 -0
- package/dist/cli.js.map +1 -0
- package/package.json +24 -5
- package/index.js +0 -2
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @cutcli/cutcli
|
|
2
|
+
|
|
3
|
+
AI 友好的 CapCut / 剪映草稿命令行工具。它适合被 Agent 实时调用,用命令创建草稿、添加素材、查询状态并提交云渲染。
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @cutcli/cutcli
|
|
7
|
+
cutcli draft create --width 1080 --height 1920
|
|
8
|
+
cutcli image add <draftId> --src ./素材/bg.png --start 0s --duration 5s --width 1080 --height 1920
|
|
9
|
+
cutcli audio add <draftId> --src ./素材/bgm.mp3 --start 0s --duration 5s
|
|
10
|
+
cutcli cloud render <draftId>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
给某个项目安装 AI 使用说明:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
cutcli agents install
|
|
17
|
+
```
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAC;AA6JrC,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,wBAAgB,aAAa,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAg0B5D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,969 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.createProgram = createProgram;
|
|
41
|
+
const commander_1 = require("commander");
|
|
42
|
+
const fs_1 = __importDefault(require("fs"));
|
|
43
|
+
const os_1 = __importDefault(require("os"));
|
|
44
|
+
const path_1 = __importDefault(require("path"));
|
|
45
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
46
|
+
const defaultSdk = __importStar(require("cutsdk"));
|
|
47
|
+
function parseJsonArg(val) {
|
|
48
|
+
if (val.startsWith('@')) {
|
|
49
|
+
const filePath = val.slice(1);
|
|
50
|
+
return JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
return JSON.parse(val);
|
|
53
|
+
}
|
|
54
|
+
function readJsonFile(filePath) {
|
|
55
|
+
return JSON.parse(fs_1.default.readFileSync(filePath, 'utf-8'));
|
|
56
|
+
}
|
|
57
|
+
function parseTimeArg(val, field) {
|
|
58
|
+
if (val === undefined || val === null || val === '')
|
|
59
|
+
return undefined;
|
|
60
|
+
if (typeof val === 'number')
|
|
61
|
+
return val;
|
|
62
|
+
const raw = String(val).trim();
|
|
63
|
+
let unit = 'us';
|
|
64
|
+
let numeric = raw;
|
|
65
|
+
if (raw.endsWith('ms')) {
|
|
66
|
+
unit = 'ms';
|
|
67
|
+
numeric = raw.slice(0, -2);
|
|
68
|
+
}
|
|
69
|
+
else if (raw.endsWith('us')) {
|
|
70
|
+
unit = 'us';
|
|
71
|
+
numeric = raw.slice(0, -2);
|
|
72
|
+
}
|
|
73
|
+
else if (raw.endsWith('s')) {
|
|
74
|
+
unit = 's';
|
|
75
|
+
numeric = raw.slice(0, -1);
|
|
76
|
+
}
|
|
77
|
+
const match = numeric.match(/^-?\d+(?:\.\d+)?$/);
|
|
78
|
+
if (!match) {
|
|
79
|
+
throw new Error(`${field} must be a number or time string like 1.5s, 300ms, 1500000us`);
|
|
80
|
+
}
|
|
81
|
+
const amount = Number(numeric);
|
|
82
|
+
if (unit === 's')
|
|
83
|
+
return Math.round(amount * 1000000);
|
|
84
|
+
if (unit === 'ms')
|
|
85
|
+
return Math.round(amount * 1000);
|
|
86
|
+
if (unit === 'us')
|
|
87
|
+
return Math.round(amount);
|
|
88
|
+
return Math.round(amount);
|
|
89
|
+
}
|
|
90
|
+
function toNumber(val) {
|
|
91
|
+
if (val === undefined || val === null || val === '')
|
|
92
|
+
return undefined;
|
|
93
|
+
return Number(val);
|
|
94
|
+
}
|
|
95
|
+
function buildShadowInfo(opts) {
|
|
96
|
+
const shadowInfo = {
|
|
97
|
+
shadowColor: opts.shadowColor,
|
|
98
|
+
shadowAlpha: toNumber(opts.shadowAlpha),
|
|
99
|
+
shadowDiffuse: toNumber(opts.shadowDiffuse),
|
|
100
|
+
shadowDistance: toNumber(opts.shadowDistance),
|
|
101
|
+
shadowAngle: toNumber(opts.shadowAngle),
|
|
102
|
+
};
|
|
103
|
+
const hasShadowInfo = Object.values(shadowInfo).some((value) => value !== undefined);
|
|
104
|
+
return hasShadowInfo ? shadowInfo : undefined;
|
|
105
|
+
}
|
|
106
|
+
function hasShadow(opts) {
|
|
107
|
+
return opts.shadow || Boolean(opts.shadowColor || opts.shadowAlpha || opts.shadowDiffuse || opts.shadowDistance || opts.shadowAngle) || undefined;
|
|
108
|
+
}
|
|
109
|
+
function resolveEndTime(opts) {
|
|
110
|
+
const start = parseTimeArg(opts.start, 'start') ?? 0;
|
|
111
|
+
const end = parseTimeArg(opts.end, 'end');
|
|
112
|
+
const duration = parseTimeArg(opts.duration, 'duration');
|
|
113
|
+
if (end === undefined && duration === undefined) {
|
|
114
|
+
throw new Error('Either --end or --duration is required');
|
|
115
|
+
}
|
|
116
|
+
const resolvedEnd = end ?? start + duration;
|
|
117
|
+
const resolvedDuration = duration ?? resolvedEnd - start;
|
|
118
|
+
if (resolvedEnd <= start)
|
|
119
|
+
throw new Error('end must be greater than start');
|
|
120
|
+
return { start, end: resolvedEnd, duration: resolvedDuration };
|
|
121
|
+
}
|
|
122
|
+
function readDraftSpec(filePath) {
|
|
123
|
+
const spec = readJsonFile(filePath);
|
|
124
|
+
if (spec?.draft && spec?.render !== undefined)
|
|
125
|
+
return spec.draft;
|
|
126
|
+
return spec;
|
|
127
|
+
}
|
|
128
|
+
function getDefaultDraftsDir() {
|
|
129
|
+
if (process.env.CUT_DRAFTS_DIR)
|
|
130
|
+
return process.env.CUT_DRAFTS_DIR;
|
|
131
|
+
if (process.platform === 'darwin') {
|
|
132
|
+
return path_1.default.join(process.env.HOME || '', 'Movies', 'JianyingPro Drafts');
|
|
133
|
+
}
|
|
134
|
+
return path_1.default.join(process.env.HOME || '', '.cut', 'drafts');
|
|
135
|
+
}
|
|
136
|
+
function getCutcliConfigPath() {
|
|
137
|
+
if (process.env.CUTCLI_CONFIG_FILE)
|
|
138
|
+
return process.env.CUTCLI_CONFIG_FILE;
|
|
139
|
+
return path_1.default.join(os_1.default.homedir(), '.cutcli', 'config.json');
|
|
140
|
+
}
|
|
141
|
+
function readCutcliConfig() {
|
|
142
|
+
const configPath = getCutcliConfigPath();
|
|
143
|
+
if (!fs_1.default.existsSync(configPath))
|
|
144
|
+
return {};
|
|
145
|
+
return JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
|
|
146
|
+
}
|
|
147
|
+
function writeCutcliConfig(config) {
|
|
148
|
+
const configPath = getCutcliConfigPath();
|
|
149
|
+
fs_1.default.mkdirSync(path_1.default.dirname(configPath), { recursive: true });
|
|
150
|
+
fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
151
|
+
try {
|
|
152
|
+
fs_1.default.chmodSync(configPath, 0o600);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Best effort on platforms that support POSIX file modes.
|
|
156
|
+
}
|
|
157
|
+
return configPath;
|
|
158
|
+
}
|
|
159
|
+
function resolveApiToken(token) {
|
|
160
|
+
return token || process.env.CUT_API_TOKEN || readCutcliConfig().apiToken;
|
|
161
|
+
}
|
|
162
|
+
function output(data, pretty) {
|
|
163
|
+
console.log(pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data));
|
|
164
|
+
}
|
|
165
|
+
function getCliVersion() {
|
|
166
|
+
return require('../package.json').version;
|
|
167
|
+
}
|
|
168
|
+
function copyProjectTemplate(targetDir, force) {
|
|
169
|
+
const sdkPackageJson = require.resolve('cutsdk/package.json');
|
|
170
|
+
const sdkRoot = path_1.default.dirname(sdkPackageJson);
|
|
171
|
+
const sourceDir = path_1.default.join(sdkRoot, 'dist', 'api', 'setup', 'templates', 'project');
|
|
172
|
+
if (!fs_1.default.existsSync(sourceDir)) {
|
|
173
|
+
throw new Error(`cutsdk project template not found: ${sourceDir}`);
|
|
174
|
+
}
|
|
175
|
+
const targets = [
|
|
176
|
+
{ from: path_1.default.join(sourceDir, '.agents'), to: path_1.default.join(targetDir, '.agents') },
|
|
177
|
+
{ from: path_1.default.join(sourceDir, 'cutcli-docs'), to: path_1.default.join(targetDir, 'cutcli-docs') },
|
|
178
|
+
];
|
|
179
|
+
const installed = [];
|
|
180
|
+
const skipped = [];
|
|
181
|
+
for (const item of targets) {
|
|
182
|
+
if (fs_1.default.existsSync(item.to) && !force) {
|
|
183
|
+
skipped.push(item.to);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
fs_1.default.cpSync(item.from, item.to, { recursive: true, force });
|
|
187
|
+
installed.push(item.to);
|
|
188
|
+
}
|
|
189
|
+
return { targetDir, installed, skipped };
|
|
190
|
+
}
|
|
191
|
+
function createProgram(deps = {}) {
|
|
192
|
+
const sdk = { ...defaultSdk, ...deps };
|
|
193
|
+
const { addAudios, addCaptions, addEffects, addImages, addKeyframes, addMasks, addSticker, addTextStyle, addVideos, createAndRenderDraft, createDraft, createDraftFromSpec, easyCreateMaterial, getAudioDuration, getAudios, getCaptions, getCloudRenderStatus, getDraftInfo, getEffects, getImageAnimations, getImages, getKeyframes, getMasks, getStickers, getTextEffect, getTextEffects, getVideos, listDrafts, renderDraft, submitVideoRenderTask, validateDraftSpec, } = sdk;
|
|
194
|
+
const program = new commander_1.Command();
|
|
195
|
+
program
|
|
196
|
+
.name('cutcli')
|
|
197
|
+
.description('AI 友好的 CapCut / 剪映草稿命令行工具')
|
|
198
|
+
.version(getCliVersion())
|
|
199
|
+
.option('--env-file <path>', '指定 .env 文件路径')
|
|
200
|
+
.option('--pretty', '美化 JSON 输出', false)
|
|
201
|
+
.option('--json-errors', '以 JSON 输出错误,便于 AI/脚本解析', false)
|
|
202
|
+
.hook('preAction', (thisCommand) => {
|
|
203
|
+
const opts = thisCommand.opts();
|
|
204
|
+
if (opts.envFile)
|
|
205
|
+
dotenv_1.default.config({ path: opts.envFile });
|
|
206
|
+
});
|
|
207
|
+
const pretty = () => program.opts().pretty;
|
|
208
|
+
program.command('login')
|
|
209
|
+
.description('保存云渲染 API Token 到本机 cutcli 配置')
|
|
210
|
+
.argument('[apiToken]', '云渲染 API Token')
|
|
211
|
+
.option('--api-token <token>', '云渲染 API Token')
|
|
212
|
+
.action(async (_apiToken, opts) => {
|
|
213
|
+
const apiToken = opts.apiToken || _apiToken;
|
|
214
|
+
if (!apiToken)
|
|
215
|
+
throw new Error('apiToken is required. Usage: cutcli login <apiToken>');
|
|
216
|
+
const existing = readCutcliConfig();
|
|
217
|
+
const configPath = writeCutcliConfig({ ...existing, apiToken });
|
|
218
|
+
output({ ok: true, configPath, apiToken: '<set>' }, pretty());
|
|
219
|
+
});
|
|
220
|
+
// ========== draft ==========
|
|
221
|
+
const draft = program.command('draft').description('草稿管理');
|
|
222
|
+
draft.command('create')
|
|
223
|
+
.description('创建新草稿')
|
|
224
|
+
.option('--width <n>', '画布宽度', '1080')
|
|
225
|
+
.option('--height <n>', '画布高度', '1920')
|
|
226
|
+
.option('--user-id <id>', '用户ID')
|
|
227
|
+
.action(async (opts) => {
|
|
228
|
+
const result = await createDraft({ width: +opts.width, height: +opts.height, userId: opts.userId });
|
|
229
|
+
output(result, pretty());
|
|
230
|
+
});
|
|
231
|
+
draft.command('list')
|
|
232
|
+
.description('列出所有草稿')
|
|
233
|
+
.action(async () => {
|
|
234
|
+
const result = await listDrafts();
|
|
235
|
+
output(result, pretty());
|
|
236
|
+
});
|
|
237
|
+
draft.command('info <draftId>')
|
|
238
|
+
.description('查看草稿信息')
|
|
239
|
+
.action(async (draftId) => {
|
|
240
|
+
const result = await getDraftInfo({ draftId });
|
|
241
|
+
output(result, pretty());
|
|
242
|
+
});
|
|
243
|
+
draft.command('easy <draftId>')
|
|
244
|
+
.description('快速添加素材')
|
|
245
|
+
.option('--audio-url <pathOrUrl>', '音频路径或 URL')
|
|
246
|
+
.option('--audio-src <pathOrUrl>', '音频路径或 URL')
|
|
247
|
+
.option('--img-url <pathOrUrl>', '图片路径或 URL')
|
|
248
|
+
.option('--image-src <pathOrUrl>', '图片路径或 URL')
|
|
249
|
+
.option('--video-url <pathOrUrl>', '视频路径或 URL')
|
|
250
|
+
.option('--video-src <pathOrUrl>', '视频路径或 URL')
|
|
251
|
+
.option('--text <text>', '文字内容')
|
|
252
|
+
.option('--text-color <hex>', '文字颜色')
|
|
253
|
+
.option('--font-size <n>', '字号')
|
|
254
|
+
.option('--text-transform-y <n>', '文字 Y 位置')
|
|
255
|
+
.action(async (draftId, opts) => {
|
|
256
|
+
const audioUrl = opts.audioSrc || opts.audioUrl;
|
|
257
|
+
if (!audioUrl)
|
|
258
|
+
throw new Error('Either --audio-src or --audio-url is required');
|
|
259
|
+
const result = await easyCreateMaterial({
|
|
260
|
+
draftId,
|
|
261
|
+
audioUrl,
|
|
262
|
+
imgUrl: opts.imageSrc || opts.imgUrl,
|
|
263
|
+
videoUrl: opts.videoSrc || opts.videoUrl,
|
|
264
|
+
text: opts.text,
|
|
265
|
+
textColor: opts.textColor,
|
|
266
|
+
fontSize: toNumber(opts.fontSize),
|
|
267
|
+
textTransformY: toNumber(opts.textTransformY),
|
|
268
|
+
});
|
|
269
|
+
output(result, pretty());
|
|
270
|
+
});
|
|
271
|
+
// ========== captions ==========
|
|
272
|
+
const captions = program.command('captions').description('字幕管理');
|
|
273
|
+
captions.command('add <draftId>')
|
|
274
|
+
.description('添加字幕')
|
|
275
|
+
.requiredOption('--captions <json>', '字幕数据 (JSON 或 @file.json)')
|
|
276
|
+
.option('--font <name>', '字体名称')
|
|
277
|
+
.option('--alignment <n>', '对齐方式')
|
|
278
|
+
.option('--alpha <n>', '透明度')
|
|
279
|
+
.option('--text-color <hex>', '文字颜色')
|
|
280
|
+
.option('--font-size <n>', '字号')
|
|
281
|
+
.option('--bold', '加粗')
|
|
282
|
+
.option('--italic', '斜体')
|
|
283
|
+
.option('--underline', '下划线')
|
|
284
|
+
.option('--text-effect <name>', '花字/文字特效名称')
|
|
285
|
+
.option('--border-color <hex>', '描边颜色')
|
|
286
|
+
.option('--letter-spacing <n>', '字间距')
|
|
287
|
+
.option('--line-spacing <n>', '行间距')
|
|
288
|
+
.option('--style-text', '使用纯文本样式内容')
|
|
289
|
+
.option('--shadow', '启用阴影')
|
|
290
|
+
.option('--shadow-color <hex>', '阴影颜色')
|
|
291
|
+
.option('--shadow-alpha <n>', '阴影透明度')
|
|
292
|
+
.option('--shadow-diffuse <n>', '阴影模糊')
|
|
293
|
+
.option('--shadow-distance <n>', '阴影距离')
|
|
294
|
+
.option('--shadow-angle <n>', '阴影角度')
|
|
295
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
296
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
297
|
+
.option('--transform-x <n>', 'X轴位置,归一化值 (0=居中, -1=最左, 1=最右)')
|
|
298
|
+
.option('--transform-y <n>', 'Y轴位置,归一化值 (0=居中, 1=最上, -1=最下)')
|
|
299
|
+
.action(async (draftId, opts) => {
|
|
300
|
+
const result = await addCaptions({
|
|
301
|
+
draftId, captions: parseJsonArg(opts.captions), font: opts.font,
|
|
302
|
+
alignment: toNumber(opts.alignment),
|
|
303
|
+
alpha: toNumber(opts.alpha),
|
|
304
|
+
textColor: opts.textColor, fontSize: toNumber(opts.fontSize),
|
|
305
|
+
bold: opts.bold, italic: opts.italic, underline: opts.underline,
|
|
306
|
+
textEffect: opts.textEffect,
|
|
307
|
+
borderColor: opts.borderColor,
|
|
308
|
+
letterSpacing: toNumber(opts.letterSpacing),
|
|
309
|
+
lineSpacing: toNumber(opts.lineSpacing),
|
|
310
|
+
styleText: opts.styleText,
|
|
311
|
+
hasShadow: hasShadow(opts),
|
|
312
|
+
shadowInfo: buildShadowInfo(opts),
|
|
313
|
+
scaleX: toNumber(opts.scaleX),
|
|
314
|
+
scaleY: toNumber(opts.scaleY),
|
|
315
|
+
transformX: toNumber(opts.transformX),
|
|
316
|
+
transformY: toNumber(opts.transformY),
|
|
317
|
+
});
|
|
318
|
+
output(result, pretty());
|
|
319
|
+
});
|
|
320
|
+
captions.command('list <draftId>')
|
|
321
|
+
.description('查看已有字幕')
|
|
322
|
+
.action(async (draftId) => {
|
|
323
|
+
const result = await getCaptions({ draftId });
|
|
324
|
+
output(result, pretty());
|
|
325
|
+
});
|
|
326
|
+
// ========== images ==========
|
|
327
|
+
const images = program.command('images').description('图片管理');
|
|
328
|
+
images.command('add <draftId>')
|
|
329
|
+
.description('添加图片')
|
|
330
|
+
.requiredOption('--image-infos <json>', '图片数据 (JSON 或 @file.json)')
|
|
331
|
+
.option('--alpha <n>', '透明度')
|
|
332
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
333
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
334
|
+
.option('--transform-x <n>', 'X 位置')
|
|
335
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
336
|
+
.action(async (draftId, opts) => {
|
|
337
|
+
const result = await addImages({
|
|
338
|
+
draftId,
|
|
339
|
+
imageInfos: parseJsonArg(opts.imageInfos),
|
|
340
|
+
alpha: toNumber(opts.alpha),
|
|
341
|
+
scaleX: toNumber(opts.scaleX),
|
|
342
|
+
scaleY: toNumber(opts.scaleY),
|
|
343
|
+
transformX: toNumber(opts.transformX),
|
|
344
|
+
transformY: toNumber(opts.transformY),
|
|
345
|
+
});
|
|
346
|
+
output(result, pretty());
|
|
347
|
+
});
|
|
348
|
+
images.command('list <draftId>')
|
|
349
|
+
.description('查看已有图片')
|
|
350
|
+
.action(async (draftId) => {
|
|
351
|
+
const result = await getImages({ draftId });
|
|
352
|
+
output(result, pretty());
|
|
353
|
+
});
|
|
354
|
+
// ========== videos ==========
|
|
355
|
+
const videos = program.command('videos').description('视频管理');
|
|
356
|
+
videos.command('add <draftId>')
|
|
357
|
+
.description('添加视频')
|
|
358
|
+
.requiredOption('--video-infos <json>', '视频数据 (JSON 或 @file.json)')
|
|
359
|
+
.option('--alpha <n>', '透明度')
|
|
360
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
361
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
362
|
+
.option('--transform-x <n>', 'X 位置')
|
|
363
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
364
|
+
.option('--scene-timelines <json>', '变速场景时间线 (JSON 或 @file.json)')
|
|
365
|
+
.action(async (draftId, opts) => {
|
|
366
|
+
const result = await addVideos({
|
|
367
|
+
draftId,
|
|
368
|
+
videoInfos: parseJsonArg(opts.videoInfos),
|
|
369
|
+
alpha: toNumber(opts.alpha),
|
|
370
|
+
scaleX: toNumber(opts.scaleX),
|
|
371
|
+
scaleY: toNumber(opts.scaleY),
|
|
372
|
+
transformX: toNumber(opts.transformX),
|
|
373
|
+
transformY: toNumber(opts.transformY),
|
|
374
|
+
sceneTimelines: opts.sceneTimelines ? parseJsonArg(opts.sceneTimelines) : undefined,
|
|
375
|
+
});
|
|
376
|
+
output(result, pretty());
|
|
377
|
+
});
|
|
378
|
+
videos.command('list <draftId>')
|
|
379
|
+
.description('查看已有视频')
|
|
380
|
+
.action(async (draftId) => {
|
|
381
|
+
const result = await getVideos({ draftId });
|
|
382
|
+
output(result, pretty());
|
|
383
|
+
});
|
|
384
|
+
// ========== audios ==========
|
|
385
|
+
const audios = program.command('audios').description('音频管理');
|
|
386
|
+
audios.command('add <draftId>')
|
|
387
|
+
.description('添加音频')
|
|
388
|
+
.requiredOption('--audio-infos <json>', '音频数据 (JSON 或 @file.json)')
|
|
389
|
+
.action(async (draftId, opts) => {
|
|
390
|
+
const result = await addAudios({ draftId, audioInfos: parseJsonArg(opts.audioInfos) });
|
|
391
|
+
output(result, pretty());
|
|
392
|
+
});
|
|
393
|
+
audios.command('list <draftId>')
|
|
394
|
+
.description('查看已有音频')
|
|
395
|
+
.action(async (draftId) => {
|
|
396
|
+
const result = await getAudios({ draftId });
|
|
397
|
+
output(result, pretty());
|
|
398
|
+
});
|
|
399
|
+
// ========== effects ==========
|
|
400
|
+
const effects = program.command('effects').description('特效管理');
|
|
401
|
+
effects.command('add <draftId>')
|
|
402
|
+
.description('添加特效')
|
|
403
|
+
.requiredOption('--effect-infos <json>', '特效数据 (JSON 或 @file.json)')
|
|
404
|
+
.action(async (draftId, opts) => {
|
|
405
|
+
const result = await addEffects({ draftId, effectInfos: parseJsonArg(opts.effectInfos) });
|
|
406
|
+
output(result, pretty());
|
|
407
|
+
});
|
|
408
|
+
effects.command('list <draftId>')
|
|
409
|
+
.description('查看已有特效')
|
|
410
|
+
.action(async (draftId) => {
|
|
411
|
+
const result = await getEffects({ draftId });
|
|
412
|
+
output(result, pretty());
|
|
413
|
+
});
|
|
414
|
+
// ========== sticker ==========
|
|
415
|
+
const sticker = program.command('sticker').description('贴纸管理');
|
|
416
|
+
sticker.command('add <draftId>')
|
|
417
|
+
.description('添加贴纸')
|
|
418
|
+
.requiredOption('--sticker-id <id>', '贴纸ID')
|
|
419
|
+
.requiredOption('--start <time>', '开始时间,如 0s、500ms、1000000us')
|
|
420
|
+
.option('--end <time>', '结束时间')
|
|
421
|
+
.option('--duration <time>', '持续时间')
|
|
422
|
+
.option('--scale <n>', '缩放')
|
|
423
|
+
.option('--transform-x <n>', 'X 位置')
|
|
424
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
425
|
+
.action(async (draftId, opts) => {
|
|
426
|
+
const time = resolveEndTime(opts);
|
|
427
|
+
const result = await addSticker({
|
|
428
|
+
draftId,
|
|
429
|
+
stickerId: opts.stickerId,
|
|
430
|
+
start: time.start,
|
|
431
|
+
end: time.end,
|
|
432
|
+
scale: toNumber(opts.scale),
|
|
433
|
+
transformX: toNumber(opts.transformX),
|
|
434
|
+
transformY: toNumber(opts.transformY),
|
|
435
|
+
});
|
|
436
|
+
output(result, pretty());
|
|
437
|
+
});
|
|
438
|
+
sticker.command('list <draftId>')
|
|
439
|
+
.description('查看已有贴纸')
|
|
440
|
+
.action(async (draftId) => {
|
|
441
|
+
const result = await getStickers({ draftId });
|
|
442
|
+
output(result, pretty());
|
|
443
|
+
});
|
|
444
|
+
// ========== keyframes ==========
|
|
445
|
+
const kf = program.command('keyframes').description('关键帧管理');
|
|
446
|
+
kf.command('add <draftId>')
|
|
447
|
+
.description('添加关键帧')
|
|
448
|
+
.requiredOption('--keyframes <json>', '关键帧数据 (JSON 或 @file.json)')
|
|
449
|
+
.action(async (draftId, opts) => {
|
|
450
|
+
const result = await addKeyframes({ draftId, keyframes: parseJsonArg(opts.keyframes) });
|
|
451
|
+
output(result, pretty());
|
|
452
|
+
});
|
|
453
|
+
kf.command('list <draftId>')
|
|
454
|
+
.description('查看关键帧')
|
|
455
|
+
.requiredOption('--segment-id <id>', '片段ID')
|
|
456
|
+
.action(async (draftId, opts) => {
|
|
457
|
+
const result = await getKeyframes({ draftId, segmentId: opts.segmentId });
|
|
458
|
+
output(result, pretty());
|
|
459
|
+
});
|
|
460
|
+
// ========== masks ==========
|
|
461
|
+
const masks = program.command('masks').description('遮罩管理');
|
|
462
|
+
masks.command('add <draftId>')
|
|
463
|
+
.description('添加遮罩')
|
|
464
|
+
.requiredOption('--segment-ids <ids>', '片段ID列表 (逗号分隔)')
|
|
465
|
+
.option('--name <name>', '遮罩类型', '线性')
|
|
466
|
+
.option('--width <n>', '宽度')
|
|
467
|
+
.option('--height <n>', '高度')
|
|
468
|
+
.option('--x <n>', '遮罩中心 X 像素')
|
|
469
|
+
.option('--y <n>', '遮罩中心 Y 像素')
|
|
470
|
+
.option('--feather <n>', '羽化')
|
|
471
|
+
.option('--rotation <n>', '旋转')
|
|
472
|
+
.option('--round-corner <n>', '圆角')
|
|
473
|
+
.option('--invert', '反转')
|
|
474
|
+
.action(async (draftId, opts) => {
|
|
475
|
+
const result = await addMasks({
|
|
476
|
+
draftId, segmentIds: opts.segmentIds.split(','), name: opts.name,
|
|
477
|
+
width: toNumber(opts.width), height: toNumber(opts.height),
|
|
478
|
+
X: toNumber(opts.x), Y: toNumber(opts.y),
|
|
479
|
+
feather: toNumber(opts.feather), rotation: toNumber(opts.rotation),
|
|
480
|
+
roundCorner: toNumber(opts.roundCorner),
|
|
481
|
+
invert: opts.invert,
|
|
482
|
+
});
|
|
483
|
+
output(result, pretty());
|
|
484
|
+
});
|
|
485
|
+
masks.command('list <draftId>')
|
|
486
|
+
.description('查看遮罩')
|
|
487
|
+
.option('--segment-id <id>', '片段ID')
|
|
488
|
+
.action(async (draftId, opts) => {
|
|
489
|
+
const result = await getMasks({ draftId, segmentId: opts.segmentId });
|
|
490
|
+
output(result, pretty());
|
|
491
|
+
});
|
|
492
|
+
// ========== text-style ==========
|
|
493
|
+
program.command('text-style')
|
|
494
|
+
.description('生成文字样式')
|
|
495
|
+
.requiredOption('--text <text>', '文字内容')
|
|
496
|
+
.requiredOption('--keyword <keywords>', '关键词 (| 分隔)')
|
|
497
|
+
.option('--keyword-color <hex>', '关键词颜色')
|
|
498
|
+
.option('--font-size <n>', '默认字号')
|
|
499
|
+
.option('--keyword-font-size <n>', '关键词字号')
|
|
500
|
+
.action(async (opts) => {
|
|
501
|
+
const result = await addTextStyle({
|
|
502
|
+
text: opts.text, keyword: opts.keyword,
|
|
503
|
+
keywordColor: opts.keywordColor,
|
|
504
|
+
fontSize: opts.fontSize ? +opts.fontSize : undefined,
|
|
505
|
+
keywordFontSize: opts.keywordFontSize ? +opts.keywordFontSize : undefined,
|
|
506
|
+
});
|
|
507
|
+
output(result, pretty());
|
|
508
|
+
});
|
|
509
|
+
// ========== query ==========
|
|
510
|
+
const query = program.command('query').description('工具查询');
|
|
511
|
+
query.command('audio-duration')
|
|
512
|
+
.description('获取音频时长')
|
|
513
|
+
.requiredOption('--url <url>', '音频URL')
|
|
514
|
+
.action(async (opts) => {
|
|
515
|
+
const result = await getAudioDuration({ url: opts.url });
|
|
516
|
+
output(result, pretty());
|
|
517
|
+
});
|
|
518
|
+
query.command('image-animations')
|
|
519
|
+
.description('查看图片动画列表')
|
|
520
|
+
.option('--mode <n>', '模式', '0')
|
|
521
|
+
.option('--type <type>', '类型: in/out/loop', 'in')
|
|
522
|
+
.action(async (opts) => {
|
|
523
|
+
const result = await getImageAnimations({ mode: +opts.mode, type: opts.type });
|
|
524
|
+
output(result, pretty());
|
|
525
|
+
});
|
|
526
|
+
query.command('text-effects')
|
|
527
|
+
.description('搜索花字/文字特效')
|
|
528
|
+
.option('--keyword <keyword>', '搜索关键词', '')
|
|
529
|
+
.option('--limit <n>', '返回数量', '20')
|
|
530
|
+
.action(async (opts) => {
|
|
531
|
+
const result = await getTextEffects({ keyword: opts.keyword, limit: Number(opts.limit) });
|
|
532
|
+
output(result, pretty());
|
|
533
|
+
});
|
|
534
|
+
query.command('text-effect')
|
|
535
|
+
.description('查询单个花字/文字特效')
|
|
536
|
+
.requiredOption('--name <name>', '花字/文字特效名称')
|
|
537
|
+
.action(async (opts) => {
|
|
538
|
+
const result = await getTextEffect({ name: opts.name });
|
|
539
|
+
output(result, pretty());
|
|
540
|
+
});
|
|
541
|
+
// ========== spec ==========
|
|
542
|
+
const spec = program.command('spec').description('AI Draft Spec 草稿生成');
|
|
543
|
+
spec.command('validate')
|
|
544
|
+
.description('校验 AI Draft Spec JSON 文件')
|
|
545
|
+
.requiredOption('--file <path>', 'Draft Spec JSON 文件')
|
|
546
|
+
.action(async (opts) => {
|
|
547
|
+
const draftSpec = readDraftSpec(opts.file);
|
|
548
|
+
const result = validateDraftSpec(draftSpec);
|
|
549
|
+
output(result, pretty());
|
|
550
|
+
if (!result.valid)
|
|
551
|
+
process.exitCode = 1;
|
|
552
|
+
});
|
|
553
|
+
spec.command('create')
|
|
554
|
+
.description('从 AI Draft Spec JSON 创建草稿')
|
|
555
|
+
.requiredOption('--file <path>', 'Draft Spec JSON 文件')
|
|
556
|
+
.action(async (opts) => {
|
|
557
|
+
const draftSpec = readDraftSpec(opts.file);
|
|
558
|
+
const result = await createDraftFromSpec(draftSpec);
|
|
559
|
+
output(result, pretty());
|
|
560
|
+
});
|
|
561
|
+
spec.command('render')
|
|
562
|
+
.description('从 AI Draft Spec JSON 创建草稿,并可提交云渲染')
|
|
563
|
+
.requiredOption('--file <path>', 'Draft Spec JSON 文件')
|
|
564
|
+
.option('--name <name>', '草稿显示名称')
|
|
565
|
+
.option('--drafts-dir <path>', '草稿输出目录')
|
|
566
|
+
.option('--cloud', '提交云渲染', false)
|
|
567
|
+
.option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
|
|
568
|
+
.option('--wait', '提交后持续轮询,直到渲染完成/失败或超时', false)
|
|
569
|
+
.option('--poll-interval <seconds>', '轮询间隔秒数;默认 15', '15')
|
|
570
|
+
.option('--timeout <seconds>', '最长等待秒数;默认 1800', '1800')
|
|
571
|
+
.option('--keep-zip', '保留临时 zip 文件', false)
|
|
572
|
+
.action(async (opts) => {
|
|
573
|
+
const fileInput = readJsonFile(opts.file);
|
|
574
|
+
const draftSpec = fileInput?.draft ? fileInput.draft : fileInput;
|
|
575
|
+
const fileRender = fileInput?.render && typeof fileInput.render === 'object' ? fileInput.render : undefined;
|
|
576
|
+
const shouldRender = Boolean(opts.cloud || fileRender?.cloud);
|
|
577
|
+
const apiToken = resolveApiToken(opts.apiToken || fileRender?.apiToken);
|
|
578
|
+
const result = await createAndRenderDraft({
|
|
579
|
+
draft: draftSpec,
|
|
580
|
+
output: {
|
|
581
|
+
name: opts.name || fileInput?.output?.name,
|
|
582
|
+
draftsDir: opts.draftsDir || fileInput?.output?.draftsDir,
|
|
583
|
+
},
|
|
584
|
+
render: shouldRender ? {
|
|
585
|
+
cloud: true,
|
|
586
|
+
apiToken,
|
|
587
|
+
keepZip: opts.keepZip || fileRender?.keepZip,
|
|
588
|
+
wait: opts.wait || fileRender?.wait,
|
|
589
|
+
pollIntervalMs: Number(opts.pollInterval) * 1000,
|
|
590
|
+
timeoutMs: Number(opts.timeout) * 1000,
|
|
591
|
+
} : false,
|
|
592
|
+
});
|
|
593
|
+
output(result, pretty());
|
|
594
|
+
});
|
|
595
|
+
// ========== AI-friendly single item commands ==========
|
|
596
|
+
program.command('image')
|
|
597
|
+
.description('便捷添加单个图片素材')
|
|
598
|
+
.command('add <draftId>')
|
|
599
|
+
.description('添加单个图片素材')
|
|
600
|
+
.requiredOption('--src <pathOrUrl>', '图片路径或 URL')
|
|
601
|
+
.option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
|
|
602
|
+
.option('--end <time>', '结束时间')
|
|
603
|
+
.option('--duration <time>', '持续时间')
|
|
604
|
+
.option('--width <n>', '图片宽度', '1080')
|
|
605
|
+
.option('--height <n>', '图片高度', '1920')
|
|
606
|
+
.option('--alpha <n>', '透明度')
|
|
607
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
608
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
609
|
+
.option('--transform-x <n>', 'X 位置')
|
|
610
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
611
|
+
.option('--in-animation <name>', '入场动画')
|
|
612
|
+
.option('--out-animation <name>', '出场动画')
|
|
613
|
+
.option('--loop-animation <name>', '循环动画')
|
|
614
|
+
.option('--in-animation-duration <time>', '入场动画时长')
|
|
615
|
+
.option('--out-animation-duration <time>', '出场动画时长')
|
|
616
|
+
.option('--loop-animation-duration <time>', '循环动画时长')
|
|
617
|
+
.option('--transition <name>', '转场效果')
|
|
618
|
+
.option('--transition-duration <time>', '转场时长')
|
|
619
|
+
.action(async (draftId, opts) => {
|
|
620
|
+
const time = resolveEndTime(opts);
|
|
621
|
+
const result = await addImages({
|
|
622
|
+
draftId,
|
|
623
|
+
imageInfos: [{
|
|
624
|
+
imageUrl: opts.src,
|
|
625
|
+
width: +opts.width,
|
|
626
|
+
height: +opts.height,
|
|
627
|
+
start: time.start,
|
|
628
|
+
end: time.end,
|
|
629
|
+
inAnimation: opts.inAnimation,
|
|
630
|
+
outAnimation: opts.outAnimation,
|
|
631
|
+
loopAnimation: opts.loopAnimation,
|
|
632
|
+
inAnimationDuration: parseTimeArg(opts.inAnimationDuration, 'in-animation-duration'),
|
|
633
|
+
outAnimationDuration: parseTimeArg(opts.outAnimationDuration, 'out-animation-duration'),
|
|
634
|
+
loopAnimationDuration: parseTimeArg(opts.loopAnimationDuration, 'loop-animation-duration'),
|
|
635
|
+
transition: opts.transition,
|
|
636
|
+
transitionDuration: parseTimeArg(opts.transitionDuration, 'transition-duration'),
|
|
637
|
+
}],
|
|
638
|
+
alpha: toNumber(opts.alpha),
|
|
639
|
+
scaleX: toNumber(opts.scaleX),
|
|
640
|
+
scaleY: toNumber(opts.scaleY),
|
|
641
|
+
transformX: toNumber(opts.transformX),
|
|
642
|
+
transformY: toNumber(opts.transformY),
|
|
643
|
+
});
|
|
644
|
+
output(result, pretty());
|
|
645
|
+
});
|
|
646
|
+
program.command('video')
|
|
647
|
+
.description('便捷添加单个视频素材')
|
|
648
|
+
.command('add <draftId>')
|
|
649
|
+
.description('添加单个视频素材')
|
|
650
|
+
.requiredOption('--src <pathOrUrl>', '视频路径或 URL')
|
|
651
|
+
.option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
|
|
652
|
+
.option('--end <time>', '结束时间')
|
|
653
|
+
.option('--duration <time>', '持续时间')
|
|
654
|
+
.option('--source-duration <time>', '源视频时长;默认等于持续时间')
|
|
655
|
+
.option('--width <n>', '视频宽度', '1080')
|
|
656
|
+
.option('--height <n>', '视频高度', '1920')
|
|
657
|
+
.option('--volume <n>', '音量')
|
|
658
|
+
.option('--alpha <n>', '透明度')
|
|
659
|
+
.option('--mask <name>', '遮罩名称')
|
|
660
|
+
.option('--transition <name>', '转场效果')
|
|
661
|
+
.option('--transition-duration <time>', '转场时长')
|
|
662
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
663
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
664
|
+
.option('--transform-x <n>', 'X 位置')
|
|
665
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
666
|
+
.action(async (draftId, opts) => {
|
|
667
|
+
const time = resolveEndTime(opts);
|
|
668
|
+
const sourceDuration = parseTimeArg(opts.sourceDuration, 'source-duration') ?? time.duration;
|
|
669
|
+
const result = await addVideos({
|
|
670
|
+
draftId,
|
|
671
|
+
videoInfos: [{
|
|
672
|
+
videoUrl: opts.src,
|
|
673
|
+
width: +opts.width,
|
|
674
|
+
height: +opts.height,
|
|
675
|
+
duration: sourceDuration,
|
|
676
|
+
start: time.start,
|
|
677
|
+
end: time.end,
|
|
678
|
+
volume: toNumber(opts.volume),
|
|
679
|
+
mask: opts.mask,
|
|
680
|
+
transition: opts.transition,
|
|
681
|
+
transitionDuration: parseTimeArg(opts.transitionDuration, 'transition-duration'),
|
|
682
|
+
}],
|
|
683
|
+
alpha: toNumber(opts.alpha),
|
|
684
|
+
scaleX: toNumber(opts.scaleX),
|
|
685
|
+
scaleY: toNumber(opts.scaleY),
|
|
686
|
+
transformX: toNumber(opts.transformX),
|
|
687
|
+
transformY: toNumber(opts.transformY),
|
|
688
|
+
});
|
|
689
|
+
output(result, pretty());
|
|
690
|
+
});
|
|
691
|
+
program.command('audio')
|
|
692
|
+
.description('便捷添加单个音频素材')
|
|
693
|
+
.command('add <draftId>')
|
|
694
|
+
.description('添加单个音频素材')
|
|
695
|
+
.requiredOption('--src <pathOrUrl>', '音频路径或 URL')
|
|
696
|
+
.option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
|
|
697
|
+
.option('--end <time>', '结束时间')
|
|
698
|
+
.option('--duration <time>', '持续时间')
|
|
699
|
+
.option('--source-duration <time>', '源音频时长;默认等于持续时间')
|
|
700
|
+
.option('--volume <n>', '音量')
|
|
701
|
+
.option('--audio-effect <name>', '音频效果')
|
|
702
|
+
.action(async (draftId, opts) => {
|
|
703
|
+
const time = resolveEndTime(opts);
|
|
704
|
+
const sourceDuration = parseTimeArg(opts.sourceDuration, 'source-duration') ?? time.duration;
|
|
705
|
+
const result = await addAudios({
|
|
706
|
+
draftId,
|
|
707
|
+
audioInfos: [{
|
|
708
|
+
audioUrl: opts.src,
|
|
709
|
+
duration: sourceDuration,
|
|
710
|
+
start: time.start,
|
|
711
|
+
end: time.end,
|
|
712
|
+
volume: opts.volume ? +opts.volume : undefined,
|
|
713
|
+
audioEffect: opts.audioEffect,
|
|
714
|
+
}],
|
|
715
|
+
});
|
|
716
|
+
output(result, pretty());
|
|
717
|
+
});
|
|
718
|
+
program.command('text')
|
|
719
|
+
.description('便捷添加单条字幕')
|
|
720
|
+
.command('add <draftId>')
|
|
721
|
+
.description('添加单条字幕')
|
|
722
|
+
.requiredOption('--text <text>', '字幕文本')
|
|
723
|
+
.option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
|
|
724
|
+
.option('--end <time>', '结束时间')
|
|
725
|
+
.option('--duration <time>', '持续时间')
|
|
726
|
+
.option('--font <name>', '字体名称')
|
|
727
|
+
.option('--font-size <n>', '字号')
|
|
728
|
+
.option('--text-color <hex>', '文字颜色')
|
|
729
|
+
.option('--bold', '加粗')
|
|
730
|
+
.option('--italic', '斜体')
|
|
731
|
+
.option('--underline', '下划线')
|
|
732
|
+
.option('--alignment <n>', '对齐方式')
|
|
733
|
+
.option('--alpha <n>', '透明度')
|
|
734
|
+
.option('--text-effect <name>', '花字/文字特效名称')
|
|
735
|
+
.option('--border-color <hex>', '描边颜色')
|
|
736
|
+
.option('--letter-spacing <n>', '字间距')
|
|
737
|
+
.option('--line-spacing <n>', '行间距')
|
|
738
|
+
.option('--style-text', '使用纯文本样式内容')
|
|
739
|
+
.option('--shadow', '启用阴影')
|
|
740
|
+
.option('--shadow-color <hex>', '阴影颜色')
|
|
741
|
+
.option('--shadow-alpha <n>', '阴影透明度')
|
|
742
|
+
.option('--shadow-diffuse <n>', '阴影模糊')
|
|
743
|
+
.option('--shadow-distance <n>', '阴影距离')
|
|
744
|
+
.option('--shadow-angle <n>', '阴影角度')
|
|
745
|
+
.option('--keyword <text>', '关键词')
|
|
746
|
+
.option('--keyword-color <hex>', '关键词颜色')
|
|
747
|
+
.option('--keyword-font-size <n>', '关键词字号')
|
|
748
|
+
.option('--scale-x <n>', 'X 缩放')
|
|
749
|
+
.option('--scale-y <n>', 'Y 缩放')
|
|
750
|
+
.option('--transform-x <n>', 'X 位置')
|
|
751
|
+
.option('--transform-y <n>', 'Y 位置')
|
|
752
|
+
.option('--in-animation <name>', '入场动画')
|
|
753
|
+
.option('--out-animation <name>', '出场动画')
|
|
754
|
+
.option('--loop-animation <name>', '循环动画')
|
|
755
|
+
.option('--in-animation-duration <time>', '入场动画时长')
|
|
756
|
+
.option('--out-animation-duration <time>', '出场动画时长')
|
|
757
|
+
.option('--loop-animation-duration <time>', '循环动画时长')
|
|
758
|
+
.action(async (draftId, opts) => {
|
|
759
|
+
const time = resolveEndTime(opts);
|
|
760
|
+
const result = await addCaptions({
|
|
761
|
+
draftId,
|
|
762
|
+
captions: [{
|
|
763
|
+
text: opts.text,
|
|
764
|
+
start: time.start,
|
|
765
|
+
end: time.end,
|
|
766
|
+
keyword: opts.keyword,
|
|
767
|
+
keywordColor: opts.keywordColor,
|
|
768
|
+
fontSize: toNumber(opts.fontSize),
|
|
769
|
+
keywordFontSize: opts.keywordFontSize ? +opts.keywordFontSize : undefined,
|
|
770
|
+
inAnimation: opts.inAnimation,
|
|
771
|
+
outAnimation: opts.outAnimation,
|
|
772
|
+
loopAnimation: opts.loopAnimation,
|
|
773
|
+
inAnimationDuration: parseTimeArg(opts.inAnimationDuration, 'in-animation-duration'),
|
|
774
|
+
outAnimationDuration: parseTimeArg(opts.outAnimationDuration, 'out-animation-duration'),
|
|
775
|
+
loopAnimationDuration: parseTimeArg(opts.loopAnimationDuration, 'loop-animation-duration'),
|
|
776
|
+
}],
|
|
777
|
+
font: opts.font,
|
|
778
|
+
alignment: toNumber(opts.alignment),
|
|
779
|
+
alpha: toNumber(opts.alpha),
|
|
780
|
+
fontSize: toNumber(opts.fontSize),
|
|
781
|
+
textColor: opts.textColor,
|
|
782
|
+
bold: opts.bold,
|
|
783
|
+
italic: opts.italic,
|
|
784
|
+
underline: opts.underline,
|
|
785
|
+
textEffect: opts.textEffect,
|
|
786
|
+
borderColor: opts.borderColor,
|
|
787
|
+
letterSpacing: toNumber(opts.letterSpacing),
|
|
788
|
+
lineSpacing: toNumber(opts.lineSpacing),
|
|
789
|
+
styleText: opts.styleText,
|
|
790
|
+
hasShadow: hasShadow(opts),
|
|
791
|
+
shadowInfo: buildShadowInfo(opts),
|
|
792
|
+
scaleX: toNumber(opts.scaleX),
|
|
793
|
+
scaleY: toNumber(opts.scaleY),
|
|
794
|
+
transformX: toNumber(opts.transformX),
|
|
795
|
+
transformY: toNumber(opts.transformY),
|
|
796
|
+
});
|
|
797
|
+
output(result, pretty());
|
|
798
|
+
});
|
|
799
|
+
program.command('effect')
|
|
800
|
+
.description('便捷添加单个特效')
|
|
801
|
+
.command('add <draftId>')
|
|
802
|
+
.description('添加单个特效')
|
|
803
|
+
.requiredOption('--effect-title <name>', '特效名称')
|
|
804
|
+
.option('--start <time>', '开始时间,如 0s、500ms、1000000us', '0s')
|
|
805
|
+
.option('--end <time>', '结束时间')
|
|
806
|
+
.option('--duration <time>', '持续时间')
|
|
807
|
+
.action(async (draftId, opts) => {
|
|
808
|
+
const time = resolveEndTime(opts);
|
|
809
|
+
const result = await addEffects({
|
|
810
|
+
draftId,
|
|
811
|
+
effectInfos: [{ effectTitle: opts.effectTitle, start: time.start, end: time.end }],
|
|
812
|
+
});
|
|
813
|
+
output(result, pretty());
|
|
814
|
+
});
|
|
815
|
+
program.command('keyframe')
|
|
816
|
+
.description('便捷添加单个关键帧')
|
|
817
|
+
.command('add <draftId>')
|
|
818
|
+
.description('添加单个关键帧')
|
|
819
|
+
.requiredOption('--segment-id <id>', '片段ID')
|
|
820
|
+
.requiredOption('--property <name>', '关键帧属性')
|
|
821
|
+
.requiredOption('--offset <time>', '片段内偏移时间,如 500ms')
|
|
822
|
+
.requiredOption('--value <n>', '关键帧值')
|
|
823
|
+
.action(async (draftId, opts) => {
|
|
824
|
+
const result = await addKeyframes({
|
|
825
|
+
draftId,
|
|
826
|
+
keyframes: [{
|
|
827
|
+
segmentId: opts.segmentId,
|
|
828
|
+
property: opts.property,
|
|
829
|
+
offset: parseTimeArg(opts.offset, 'offset') ?? 0,
|
|
830
|
+
value: Number(opts.value),
|
|
831
|
+
}],
|
|
832
|
+
});
|
|
833
|
+
output(result, pretty());
|
|
834
|
+
});
|
|
835
|
+
// ========== config ==========
|
|
836
|
+
const configCmd = program.command('config').description('配置检查');
|
|
837
|
+
configCmd.command('show')
|
|
838
|
+
.description('显示 cutcli 当前读取到的配置')
|
|
839
|
+
.action(async () => {
|
|
840
|
+
const savedConfig = readCutcliConfig();
|
|
841
|
+
const apiToken = resolveApiToken();
|
|
842
|
+
output({
|
|
843
|
+
draftsDir: getDefaultDraftsDir(),
|
|
844
|
+
configPath: getCutcliConfigPath(),
|
|
845
|
+
hasApiToken: Boolean(apiToken),
|
|
846
|
+
apiToken: apiToken ? '<set>' : undefined,
|
|
847
|
+
backendUrl: 'https://cutsdk-api.51sux.com',
|
|
848
|
+
env: {
|
|
849
|
+
CUT_DRAFTS_DIR: process.env.CUT_DRAFTS_DIR,
|
|
850
|
+
CUT_API_TOKEN: process.env.CUT_API_TOKEN ? '<set>' : undefined,
|
|
851
|
+
},
|
|
852
|
+
saved: {
|
|
853
|
+
apiToken: savedConfig.apiToken ? '<set>' : undefined,
|
|
854
|
+
},
|
|
855
|
+
}, pretty());
|
|
856
|
+
});
|
|
857
|
+
configCmd.command('doctor')
|
|
858
|
+
.description('检查 cutcli 常用配置是否可用')
|
|
859
|
+
.action(async () => {
|
|
860
|
+
const draftsDir = getDefaultDraftsDir();
|
|
861
|
+
const savedConfig = readCutcliConfig();
|
|
862
|
+
const apiToken = resolveApiToken();
|
|
863
|
+
const checks = [
|
|
864
|
+
{
|
|
865
|
+
name: 'draftsDir',
|
|
866
|
+
ok: fs_1.default.existsSync(draftsDir),
|
|
867
|
+
value: draftsDir,
|
|
868
|
+
message: fs_1.default.existsSync(draftsDir) ? '草稿目录存在' : '草稿目录不存在;创建草稿时通常会自动创建',
|
|
869
|
+
},
|
|
870
|
+
{
|
|
871
|
+
name: 'apiToken',
|
|
872
|
+
ok: Boolean(apiToken),
|
|
873
|
+
value: apiToken ? '<set>' : undefined,
|
|
874
|
+
message: apiToken
|
|
875
|
+
? `云渲染 token 已设置${savedConfig.apiToken ? '(来自 cutcli login 或环境变量)' : '(来自环境变量)'}`
|
|
876
|
+
: '未设置 API Token;运行 cutcli login --api-token <token> 后可使用云渲染',
|
|
877
|
+
},
|
|
878
|
+
];
|
|
879
|
+
output({ ok: checks.every((check) => check.ok || check.name === 'apiToken'), checks }, pretty());
|
|
880
|
+
});
|
|
881
|
+
// ========== cloud ==========
|
|
882
|
+
const cloud = program.command('cloud').description('云渲染');
|
|
883
|
+
cloud.command('render <draftId>')
|
|
884
|
+
.description('上传草稿并创建云渲染任务')
|
|
885
|
+
.option('--draft-path <path>', '草稿目录路径;默认使用 CUT_DRAFTS_DIR/<draftId>')
|
|
886
|
+
.option('--zip-path <path>', '指定已有 zip 文件路径')
|
|
887
|
+
.option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
|
|
888
|
+
.option('--wait', '提交后持续轮询,直到渲染完成/失败或超时', false)
|
|
889
|
+
.option('--poll-interval <seconds>', '轮询间隔秒数;默认 15', '15')
|
|
890
|
+
.option('--timeout <seconds>', '最长等待秒数;默认 1800', '1800')
|
|
891
|
+
.option('--keep-zip', '保留临时 zip 文件', false)
|
|
892
|
+
.action(async (draftId, opts) => {
|
|
893
|
+
const result = await renderDraft({
|
|
894
|
+
draftId,
|
|
895
|
+
draftPath: opts.draftPath,
|
|
896
|
+
zipPath: opts.zipPath,
|
|
897
|
+
apiToken: resolveApiToken(opts.apiToken),
|
|
898
|
+
keepZip: opts.keepZip,
|
|
899
|
+
wait: opts.wait,
|
|
900
|
+
pollIntervalMs: Number(opts.pollInterval) * 1000,
|
|
901
|
+
timeoutMs: Number(opts.timeout) * 1000,
|
|
902
|
+
onPoll: opts.wait ? (job) => console.error(`[cloud] job ${job.id}: ${job.status}`) : undefined,
|
|
903
|
+
});
|
|
904
|
+
output(result, pretty());
|
|
905
|
+
});
|
|
906
|
+
cloud.command('result <jobId>')
|
|
907
|
+
.description('查看云渲染任务结果')
|
|
908
|
+
.option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
|
|
909
|
+
.action(async (jobId, opts) => {
|
|
910
|
+
const result = await getCloudRenderStatus({
|
|
911
|
+
taskId: jobId,
|
|
912
|
+
apiToken: resolveApiToken(opts.apiToken),
|
|
913
|
+
});
|
|
914
|
+
output(result, pretty());
|
|
915
|
+
});
|
|
916
|
+
cloud.command('render-legacy <draftUrl>')
|
|
917
|
+
.description('使用旧 submit_video_render_task 接口提交云渲染任务')
|
|
918
|
+
.option('--api-token <token>', 'API Token;也可使用 CUT_API_TOKEN 环境变量')
|
|
919
|
+
.action(async (draftUrl, opts) => {
|
|
920
|
+
const result = await submitVideoRenderTask({
|
|
921
|
+
draftUrl,
|
|
922
|
+
apiToken: resolveApiToken(opts.apiToken),
|
|
923
|
+
});
|
|
924
|
+
output(result, pretty());
|
|
925
|
+
});
|
|
926
|
+
const agents = program.command('agents').description('AI Agent 项目辅助');
|
|
927
|
+
agents.command('install')
|
|
928
|
+
.description('把 cutcli/cutsdk 使用说明安装到当前项目的 .agents 和 cutcli-docs 目录')
|
|
929
|
+
.option('--dir <path>', '目标项目目录', process.cwd())
|
|
930
|
+
.option('--force', '覆盖已有 .agents 或 cutcli-docs 目录', false)
|
|
931
|
+
.action(async (opts) => {
|
|
932
|
+
const targetDir = path_1.default.resolve(opts.dir);
|
|
933
|
+
const result = copyProjectTemplate(targetDir, Boolean(opts.force));
|
|
934
|
+
output(result, pretty());
|
|
935
|
+
});
|
|
936
|
+
return program;
|
|
937
|
+
}
|
|
938
|
+
async function run() {
|
|
939
|
+
await createProgram().parseAsync(process.argv);
|
|
940
|
+
}
|
|
941
|
+
function shouldUseJsonErrors(argv = process.argv) {
|
|
942
|
+
return process.env.CUTCLI_JSON_ERRORS === '1' || argv.includes('--json-errors');
|
|
943
|
+
}
|
|
944
|
+
function serializeCliError(err) {
|
|
945
|
+
return {
|
|
946
|
+
ok: false,
|
|
947
|
+
error: {
|
|
948
|
+
name: err?.name || 'Error',
|
|
949
|
+
code: err?.code,
|
|
950
|
+
message: err?.message || String(err),
|
|
951
|
+
operation: err?.operation,
|
|
952
|
+
path: err?.path,
|
|
953
|
+
status: err?.status,
|
|
954
|
+
details: err?.details,
|
|
955
|
+
},
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
if (require.main === module) {
|
|
959
|
+
run().catch((err) => {
|
|
960
|
+
if (shouldUseJsonErrors()) {
|
|
961
|
+
console.error(JSON.stringify(serializeCliError(err)));
|
|
962
|
+
}
|
|
963
|
+
else {
|
|
964
|
+
console.error(err.message || err);
|
|
965
|
+
}
|
|
966
|
+
process.exit(1);
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cutcli/cutcli",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "AI 友好的 CapCut / 剪映草稿命令行工具",
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
|
+
"types": "dist/cli.d.ts",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"author": "m007",
|
|
6
9
|
"bin": {
|
|
7
|
-
"cutcli": "
|
|
10
|
+
"cutcli": "dist/cli.js"
|
|
8
11
|
},
|
|
9
|
-
"
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
17
|
+
"test": "npm run build && node dist/cli.js --help >/dev/null && node dist/cli.js spec --help >/dev/null && node dist/cli.js config --help >/dev/null",
|
|
18
|
+
"start": "node dist/cli.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"commander": "^12.1.0",
|
|
22
|
+
"cutsdk": "1.1.0",
|
|
23
|
+
"dotenv": "^16.4.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^20.0.0",
|
|
27
|
+
"typescript": "^5.4.0"
|
|
28
|
+
}
|
|
10
29
|
}
|
package/index.js
DELETED