@optima-chat/commerce-cli 1.6.0 → 1.7.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/.claude/skills/commerce-product/SKILL.md +47 -17
- package/.claude/skills/commerce-storefront/SKILL.md +9 -4
- package/dist/api/rest/commerce.d.ts +69 -1
- package/dist/api/rest/commerce.d.ts.map +1 -1
- package/dist/api/rest/commerce.js +81 -2
- package/dist/api/rest/commerce.js.map +1 -1
- package/dist/commands/product/add-videos.d.ts +3 -0
- package/dist/commands/product/add-videos.d.ts.map +1 -0
- package/dist/commands/product/add-videos.js +141 -0
- package/dist/commands/product/add-videos.js.map +1 -0
- package/dist/commands/product/index.d.ts.map +1 -1
- package/dist/commands/product/index.js +8 -0
- package/dist/commands/product/index.js.map +1 -1
- package/dist/commands/product/remove-videos.d.ts +3 -0
- package/dist/commands/product/remove-videos.d.ts.map +1 -0
- package/dist/commands/product/remove-videos.js +108 -0
- package/dist/commands/product/remove-videos.js.map +1 -0
- package/dist/commands/product/reorder-videos.d.ts +3 -0
- package/dist/commands/product/reorder-videos.d.ts.map +1 -0
- package/dist/commands/product/reorder-videos.js +111 -0
- package/dist/commands/product/reorder-videos.js.map +1 -0
- package/dist/commands/product/video-status.d.ts +3 -0
- package/dist/commands/product/video-status.d.ts.map +1 -0
- package/dist/commands/product/video-status.js +186 -0
- package/dist/commands/product/video-status.js.map +1 -0
- package/dist/commands/variant/add-images.d.ts.map +1 -1
- package/dist/commands/variant/add-images.js +47 -8
- package/dist/commands/variant/add-images.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { commerceApi } from '../../api/rest/commerce.js';
|
|
4
|
+
import { handleError, createApiError, ValidationError } from '../../utils/error.js';
|
|
5
|
+
import { output } from '../../utils/output.js';
|
|
6
|
+
import { addEnhancedHelp } from '../../utils/helpText.js';
|
|
7
|
+
const cmd = new Command('add-videos')
|
|
8
|
+
.description('Add videos to product (URLs or media IDs)')
|
|
9
|
+
.option('--id <uuid>', 'Product ID (required)')
|
|
10
|
+
.option('--url <urls...>', 'Video URLs (multiple allowed)')
|
|
11
|
+
.option('--media-id <ids...>', 'Media IDs from upload command (multiple allowed)')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
try {
|
|
14
|
+
await addVideos(options);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
handleError(error);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
addEnhancedHelp(cmd, {
|
|
21
|
+
examples: [
|
|
22
|
+
'# Method 1: Use video URLs (RECOMMENDED)',
|
|
23
|
+
'$ commerce product add-videos \\',
|
|
24
|
+
' --id prod-123 \\',
|
|
25
|
+
' --url "https://example.com/demo.mp4"',
|
|
26
|
+
'',
|
|
27
|
+
'# Method 2: Use media IDs',
|
|
28
|
+
'$ commerce upload video --path ./demo.mp4',
|
|
29
|
+
'# Copy media_id from response',
|
|
30
|
+
'$ commerce product add-videos \\',
|
|
31
|
+
' --id prod-123 \\',
|
|
32
|
+
' --media-id media_456 media_789',
|
|
33
|
+
],
|
|
34
|
+
output: {
|
|
35
|
+
example: JSON.stringify({
|
|
36
|
+
success: true,
|
|
37
|
+
data: {
|
|
38
|
+
product_id: 'uuid',
|
|
39
|
+
videos: [
|
|
40
|
+
{ media_id: 'xxx', position: 1, variants: { '720p': { url: '...' } } }
|
|
41
|
+
],
|
|
42
|
+
count: 1
|
|
43
|
+
}
|
|
44
|
+
}, null, 2)
|
|
45
|
+
},
|
|
46
|
+
relatedCommands: [
|
|
47
|
+
{ command: 'upload video', description: 'Upload video first to get media ID' },
|
|
48
|
+
{ command: 'product video-status', description: 'Check video processing status' },
|
|
49
|
+
{ command: 'product reorder-videos', description: 'Reorder product videos' },
|
|
50
|
+
{ command: 'product remove-videos', description: 'Remove videos from product' },
|
|
51
|
+
],
|
|
52
|
+
notes: [
|
|
53
|
+
'Product ID is required',
|
|
54
|
+
'Provide either --url or --media-id',
|
|
55
|
+
'Videos are processed asynchronously (transcoding to 480p/720p/1080p)',
|
|
56
|
+
'Supported formats: MP4, WebM, MOV',
|
|
57
|
+
'Maximum file size: 500MB per video',
|
|
58
|
+
]
|
|
59
|
+
});
|
|
60
|
+
export const addVideosCommand = cmd;
|
|
61
|
+
async function addVideos(options) {
|
|
62
|
+
if (!options.id || options.id.trim().length === 0) {
|
|
63
|
+
throw new ValidationError('商品 ID 不能为空', 'id');
|
|
64
|
+
}
|
|
65
|
+
const productId = options.id;
|
|
66
|
+
const { url: videoUrls = [], mediaId: mediaIds = [] } = options;
|
|
67
|
+
if (videoUrls.length === 0 && mediaIds.length === 0) {
|
|
68
|
+
throw new ValidationError('请至少提供一个视频(--url 或 --media-id)', 'videos');
|
|
69
|
+
}
|
|
70
|
+
console.log(chalk.cyan('\n🎬 添加商品视频...\n'));
|
|
71
|
+
// 1. 如果有 Media IDs,直接关联
|
|
72
|
+
if (mediaIds.length > 0) {
|
|
73
|
+
console.log(chalk.green(`✓ Media IDs: ${mediaIds.length} 个`));
|
|
74
|
+
console.log();
|
|
75
|
+
const spinner = output.spinner(`正在关联 ${mediaIds.length} 个视频...`);
|
|
76
|
+
try {
|
|
77
|
+
const result = await commerceApi.products.addVideosByMediaIds(productId, mediaIds);
|
|
78
|
+
spinner.succeed(`视频关联成功!(${mediaIds.length} 个)`);
|
|
79
|
+
if (output.isJson()) {
|
|
80
|
+
output.success({
|
|
81
|
+
product_id: productId,
|
|
82
|
+
videos: result.videos || [],
|
|
83
|
+
count: (result.videos || []).length
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log();
|
|
88
|
+
if (result.videos && result.videos.length > 0) {
|
|
89
|
+
console.log(chalk.gray('已关联的视频:'));
|
|
90
|
+
result.videos.forEach((video, index) => {
|
|
91
|
+
console.log(chalk.gray(` ${index + 1}. `) + chalk.cyan(video.media_id || video));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
console.log();
|
|
95
|
+
console.log(chalk.yellow('⚠️ 视频转码处理中,使用 commerce product video-status 查看状态'));
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
spinner.fail('视频关联失败');
|
|
102
|
+
throw createApiError(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 2. 如果有 URL,使用 video_urls API
|
|
106
|
+
if (videoUrls.length > 0) {
|
|
107
|
+
for (const url of videoUrls) {
|
|
108
|
+
console.log(chalk.green(`✓ URL: ${url}`));
|
|
109
|
+
}
|
|
110
|
+
console.log();
|
|
111
|
+
const spinner = output.spinner(`正在添加 ${videoUrls.length} 个视频...`);
|
|
112
|
+
try {
|
|
113
|
+
const result = await commerceApi.products.addVideoUrls(productId, videoUrls);
|
|
114
|
+
spinner.succeed(`视频添加成功!(${videoUrls.length} 个)`);
|
|
115
|
+
if (output.isJson()) {
|
|
116
|
+
output.success({
|
|
117
|
+
product_id: productId,
|
|
118
|
+
videos: result.videos || [],
|
|
119
|
+
count: (result.videos || []).length
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log();
|
|
124
|
+
if (result.videos && result.videos.length > 0) {
|
|
125
|
+
console.log(chalk.gray('已添加的视频:'));
|
|
126
|
+
result.videos.forEach((video, index) => {
|
|
127
|
+
console.log(chalk.gray(` ${index + 1}. `) + chalk.cyan(video.media_id || video));
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
console.log();
|
|
131
|
+
console.log(chalk.yellow('⚠️ 视频转码处理中,使用 commerce product video-status 查看状态'));
|
|
132
|
+
console.log();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
spinner.fail('视频添加失败');
|
|
137
|
+
throw createApiError(error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=add-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-videos.js","sourceRoot":"","sources":["../../../src/commands/product/add-videos.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAYF,CAAC"}
|
|
@@ -5,6 +5,10 @@ import { getProductCommand } from './get.js';
|
|
|
5
5
|
import { updateProductCommand } from './update.js';
|
|
6
6
|
import { deleteProductCommand } from './delete.js';
|
|
7
7
|
import { addImagesCommand } from './add-images.js';
|
|
8
|
+
import { addVideosCommand } from './add-videos.js';
|
|
9
|
+
import { removeVideosCommand } from './remove-videos.js';
|
|
10
|
+
import { reorderVideosCommand } from './reorder-videos.js';
|
|
11
|
+
import { videoStatusCommand } from './video-status.js';
|
|
8
12
|
import { urlCommand } from './url.js';
|
|
9
13
|
export const productCommand = new Command('product')
|
|
10
14
|
.description('商品管理')
|
|
@@ -14,5 +18,9 @@ export const productCommand = new Command('product')
|
|
|
14
18
|
.addCommand(updateProductCommand)
|
|
15
19
|
.addCommand(deleteProductCommand)
|
|
16
20
|
.addCommand(addImagesCommand)
|
|
21
|
+
.addCommand(addVideosCommand)
|
|
22
|
+
.addCommand(removeVideosCommand)
|
|
23
|
+
.addCommand(reorderVideosCommand)
|
|
24
|
+
.addCommand(videoStatusCommand)
|
|
17
25
|
.addCommand(urlCommand);
|
|
18
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,UAAU,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/product/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,iBAAiB,CAAC;KAC7B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,gBAAgB,CAAC;KAC5B,UAAU,CAAC,mBAAmB,CAAC;KAC/B,UAAU,CAAC,oBAAoB,CAAC;KAChC,UAAU,CAAC,kBAAkB,CAAC;KAC9B,UAAU,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-videos.d.ts","sourceRoot":"","sources":["../../../src/commands/product/remove-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,mBAAmB,SAAM,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { commerceApi } from '../../api/rest/commerce.js';
|
|
5
|
+
import { handleError, createApiError, ValidationError } from '../../utils/error.js';
|
|
6
|
+
import { output } from '../../utils/output.js';
|
|
7
|
+
import { addEnhancedHelp } from '../../utils/helpText.js';
|
|
8
|
+
import { isInteractiveEnvironment } from '../../utils/interactive.js';
|
|
9
|
+
const cmd = new Command('remove-videos')
|
|
10
|
+
.description('Remove videos from product')
|
|
11
|
+
.option('--id <uuid>', 'Product ID (required)')
|
|
12
|
+
.option('--media-id <ids...>', 'Media IDs to remove (multiple allowed)')
|
|
13
|
+
.option('--yes', 'Skip confirmation prompt')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
await removeVideos(options);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
handleError(error);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
addEnhancedHelp(cmd, {
|
|
23
|
+
examples: [
|
|
24
|
+
'# Remove specific videos',
|
|
25
|
+
'$ commerce product remove-videos \\',
|
|
26
|
+
' --id prod-123 \\',
|
|
27
|
+
' --media-id media_456 media_789',
|
|
28
|
+
'',
|
|
29
|
+
'# Skip confirmation',
|
|
30
|
+
'$ commerce product remove-videos \\',
|
|
31
|
+
' --id prod-123 \\',
|
|
32
|
+
' --media-id media_456 --yes',
|
|
33
|
+
],
|
|
34
|
+
output: {
|
|
35
|
+
example: JSON.stringify({
|
|
36
|
+
success: true,
|
|
37
|
+
data: {
|
|
38
|
+
product_id: 'uuid',
|
|
39
|
+
removed_count: 2,
|
|
40
|
+
remaining_videos: []
|
|
41
|
+
}
|
|
42
|
+
}, null, 2)
|
|
43
|
+
},
|
|
44
|
+
relatedCommands: [
|
|
45
|
+
{ command: 'product get', description: 'View product videos and media IDs' },
|
|
46
|
+
{ command: 'product add-videos', description: 'Add videos to product' },
|
|
47
|
+
],
|
|
48
|
+
notes: [
|
|
49
|
+
'Product ID and media IDs are required',
|
|
50
|
+
'Use product get to find video media IDs',
|
|
51
|
+
'This only removes the association, not the media file',
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
export const removeVideosCommand = cmd;
|
|
55
|
+
async function removeVideos(options) {
|
|
56
|
+
if (!options.id || options.id.trim().length === 0) {
|
|
57
|
+
throw new ValidationError('商品 ID 不能为空', 'id');
|
|
58
|
+
}
|
|
59
|
+
const { mediaId: mediaIds = [] } = options;
|
|
60
|
+
if (mediaIds.length === 0) {
|
|
61
|
+
throw new ValidationError('请提供要移除的视频 Media ID(--media-id)', 'media_id');
|
|
62
|
+
}
|
|
63
|
+
const productId = options.id;
|
|
64
|
+
console.log(chalk.cyan('\n🎬 移除商品视频\n'));
|
|
65
|
+
console.log(chalk.gray('商品 ID: ') + chalk.white(productId));
|
|
66
|
+
console.log(chalk.gray('要移除的视频: ') + chalk.white(mediaIds.join(', ')));
|
|
67
|
+
console.log();
|
|
68
|
+
// 确认
|
|
69
|
+
if (!options.yes && isInteractiveEnvironment()) {
|
|
70
|
+
const { confirm } = await inquirer.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: 'confirm',
|
|
73
|
+
name: 'confirm',
|
|
74
|
+
message: `确定要移除 ${mediaIds.length} 个视频吗?`,
|
|
75
|
+
default: false,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
if (!confirm) {
|
|
79
|
+
console.log(chalk.yellow('已取消操作'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const spinner = output.spinner(`正在移除 ${mediaIds.length} 个视频...`);
|
|
84
|
+
try {
|
|
85
|
+
const result = await commerceApi.products.removeVideos(productId, mediaIds);
|
|
86
|
+
spinner.succeed(`视频移除成功!`);
|
|
87
|
+
if (output.isJson()) {
|
|
88
|
+
output.success({
|
|
89
|
+
product_id: productId,
|
|
90
|
+
removed_count: mediaIds.length,
|
|
91
|
+
remaining_videos: result.videos || []
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log();
|
|
96
|
+
console.log(chalk.green(`✓ 已移除 ${mediaIds.length} 个视频`));
|
|
97
|
+
if (result.videos && result.videos.length > 0) {
|
|
98
|
+
console.log(chalk.gray(`剩余视频: ${result.videos.length} 个`));
|
|
99
|
+
}
|
|
100
|
+
console.log();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
spinner.fail('视频移除失败');
|
|
105
|
+
throw createApiError(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=remove-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-videos.js","sourceRoot":"","sources":["../../../src/commands/product/remove-videos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-videos.d.ts","sourceRoot":"","sources":["../../../src/commands/product/reorder-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,oBAAoB,SAAM,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { commerceApi } from '../../api/rest/commerce.js';
|
|
4
|
+
import { handleError, createApiError, ValidationError } from '../../utils/error.js';
|
|
5
|
+
import { output } from '../../utils/output.js';
|
|
6
|
+
import { addEnhancedHelp } from '../../utils/helpText.js';
|
|
7
|
+
const cmd = new Command('reorder-videos')
|
|
8
|
+
.description('Reorder product videos')
|
|
9
|
+
.option('--id <uuid>', 'Product ID (required)')
|
|
10
|
+
.option('--moves <json>', 'Reorder moves as JSON: [{"media_id":"xxx","new_position":1}]')
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
try {
|
|
13
|
+
await reorderVideos(options);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
handleError(error);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
addEnhancedHelp(cmd, {
|
|
20
|
+
examples: [
|
|
21
|
+
'# Move video to position 1 (first)',
|
|
22
|
+
'$ commerce product reorder-videos \\',
|
|
23
|
+
' --id prod-123 \\',
|
|
24
|
+
' --moves \'[{"media_id":"media_456","new_position":1}]\'',
|
|
25
|
+
'',
|
|
26
|
+
'# Swap multiple videos',
|
|
27
|
+
'$ commerce product reorder-videos \\',
|
|
28
|
+
' --id prod-123 \\',
|
|
29
|
+
' --moves \'[{"media_id":"media_a","new_position":2},{"media_id":"media_b","new_position":1}]\'',
|
|
30
|
+
],
|
|
31
|
+
output: {
|
|
32
|
+
example: JSON.stringify({
|
|
33
|
+
success: true,
|
|
34
|
+
data: {
|
|
35
|
+
updated_count: 2,
|
|
36
|
+
videos: [
|
|
37
|
+
{ media_id: 'media_b', position: 1 },
|
|
38
|
+
{ media_id: 'media_a', position: 2 }
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}, null, 2)
|
|
42
|
+
},
|
|
43
|
+
relatedCommands: [
|
|
44
|
+
{ command: 'product get', description: 'View current video order' },
|
|
45
|
+
{ command: 'product add-videos', description: 'Add videos to product' },
|
|
46
|
+
],
|
|
47
|
+
notes: [
|
|
48
|
+
'Product ID and moves are required',
|
|
49
|
+
'Position uses 1-based indexing (1 = first video)',
|
|
50
|
+
'Other videos automatically shift positions',
|
|
51
|
+
'Use product get to find video media IDs',
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
export const reorderVideosCommand = cmd;
|
|
55
|
+
async function reorderVideos(options) {
|
|
56
|
+
if (!options.id || options.id.trim().length === 0) {
|
|
57
|
+
throw new ValidationError('商品 ID 不能为空', 'id');
|
|
58
|
+
}
|
|
59
|
+
if (!options.moves) {
|
|
60
|
+
throw new ValidationError('请提供重排操作(--moves)', 'moves');
|
|
61
|
+
}
|
|
62
|
+
const productId = options.id;
|
|
63
|
+
// 解析 moves JSON
|
|
64
|
+
let moves;
|
|
65
|
+
try {
|
|
66
|
+
moves = JSON.parse(options.moves);
|
|
67
|
+
if (!Array.isArray(moves)) {
|
|
68
|
+
throw new Error('moves 必须是数组');
|
|
69
|
+
}
|
|
70
|
+
for (const move of moves) {
|
|
71
|
+
if (!move.media_id || typeof move.new_position !== 'number') {
|
|
72
|
+
throw new Error('每个 move 必须包含 media_id 和 new_position');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new ValidationError(`无效的 moves JSON: ${error.message}`, 'moves');
|
|
78
|
+
}
|
|
79
|
+
console.log(chalk.cyan('\n🎬 重排商品视频\n'));
|
|
80
|
+
console.log(chalk.gray('商品 ID: ') + chalk.white(productId));
|
|
81
|
+
console.log(chalk.gray('操作:'));
|
|
82
|
+
for (const move of moves) {
|
|
83
|
+
console.log(chalk.gray(` • `) + chalk.white(`${move.media_id} → 位置 ${move.new_position}`));
|
|
84
|
+
}
|
|
85
|
+
console.log();
|
|
86
|
+
const spinner = output.spinner('正在重排视频...');
|
|
87
|
+
try {
|
|
88
|
+
const result = await commerceApi.products.reorderVideos(productId, moves);
|
|
89
|
+
spinner.succeed('视频重排成功!');
|
|
90
|
+
if (output.isJson()) {
|
|
91
|
+
output.success(result);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log();
|
|
95
|
+
console.log(chalk.green(`✓ 更新了 ${result.updated_count || moves.length} 个视频位置`));
|
|
96
|
+
if (result.videos && result.videos.length > 0) {
|
|
97
|
+
console.log();
|
|
98
|
+
console.log(chalk.gray('当前顺序:'));
|
|
99
|
+
result.videos.forEach((video) => {
|
|
100
|
+
console.log(chalk.gray(` ${video.position}. `) + chalk.cyan(video.media_id));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
spinner.fail('视频重排失败');
|
|
108
|
+
throw createApiError(error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=reorder-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reorder-videos.js","sourceRoot":"","sources":["../../../src/commands/product/reorder-videos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-status.d.ts","sourceRoot":"","sources":["../../../src/commands/product/video-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,eAAO,MAAM,kBAAkB,SAAM,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { commerceApi } from '../../api/rest/commerce.js';
|
|
4
|
+
import { handleError, createApiError, ValidationError } from '../../utils/error.js';
|
|
5
|
+
import { output } from '../../utils/output.js';
|
|
6
|
+
import { addEnhancedHelp } from '../../utils/helpText.js';
|
|
7
|
+
const cmd = new Command('video-status')
|
|
8
|
+
.description('Check video processing status')
|
|
9
|
+
.option('--media-id <id>', 'Media ID of the video (required)')
|
|
10
|
+
.option('--wait', 'Wait for processing to complete (polls every 3 seconds)')
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
try {
|
|
13
|
+
await checkVideoStatus(options);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
handleError(error);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
addEnhancedHelp(cmd, {
|
|
20
|
+
examples: [
|
|
21
|
+
'# Check video status',
|
|
22
|
+
'$ commerce product video-status --media-id media_456',
|
|
23
|
+
'',
|
|
24
|
+
'# Wait for processing to complete',
|
|
25
|
+
'$ commerce product video-status --media-id media_456 --wait',
|
|
26
|
+
],
|
|
27
|
+
output: {
|
|
28
|
+
example: JSON.stringify({
|
|
29
|
+
success: true,
|
|
30
|
+
data: {
|
|
31
|
+
media_id: 'media_456',
|
|
32
|
+
status: 'completed',
|
|
33
|
+
progress: 100,
|
|
34
|
+
variants: {
|
|
35
|
+
'480p': { url: 'https://...', size: 12345 },
|
|
36
|
+
'720p': { url: 'https://...', size: 23456 },
|
|
37
|
+
'1080p': { url: 'https://...', size: 45678 },
|
|
38
|
+
'thumbnail': { url: 'https://...' }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, null, 2)
|
|
42
|
+
},
|
|
43
|
+
relatedCommands: [
|
|
44
|
+
{ command: 'product add-videos', description: 'Add videos to product' },
|
|
45
|
+
{ command: 'upload video', description: 'Upload video to get media ID' },
|
|
46
|
+
],
|
|
47
|
+
notes: [
|
|
48
|
+
'Status values: pending, processing, completed, failed',
|
|
49
|
+
'Videos are transcoded to 480p, 720p, 1080p + thumbnail',
|
|
50
|
+
'Use --wait to automatically poll until complete',
|
|
51
|
+
'Processing usually takes 1-5 minutes depending on file size',
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
export const videoStatusCommand = cmd;
|
|
55
|
+
async function checkVideoStatus(options) {
|
|
56
|
+
if (!options.mediaId || options.mediaId.trim().length === 0) {
|
|
57
|
+
throw new ValidationError('Media ID 不能为空', 'media_id');
|
|
58
|
+
}
|
|
59
|
+
const mediaId = options.mediaId;
|
|
60
|
+
if (options.wait) {
|
|
61
|
+
await waitForVideoProcessing(mediaId);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await getVideoStatus(mediaId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function getVideoStatus(mediaId) {
|
|
68
|
+
const spinner = output.spinner('正在查询视频状态...');
|
|
69
|
+
try {
|
|
70
|
+
const result = await commerceApi.media.getVideoStatus(mediaId);
|
|
71
|
+
spinner.stop();
|
|
72
|
+
if (output.isJson()) {
|
|
73
|
+
output.success(result);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log();
|
|
77
|
+
console.log(chalk.cyan('🎬 视频处理状态'));
|
|
78
|
+
console.log();
|
|
79
|
+
console.log(chalk.gray('Media ID: ') + chalk.white(mediaId));
|
|
80
|
+
console.log(chalk.gray('状态: ') + formatStatus(result.status));
|
|
81
|
+
if (result.progress !== undefined && result.progress !== null) {
|
|
82
|
+
console.log(chalk.gray('进度: ') + chalk.white(`${result.progress}%`));
|
|
83
|
+
}
|
|
84
|
+
if (result.error) {
|
|
85
|
+
console.log(chalk.gray('错误: ') + chalk.red(result.error));
|
|
86
|
+
}
|
|
87
|
+
if (result.variants && Object.keys(result.variants).length > 0) {
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(chalk.gray('转码版本:'));
|
|
90
|
+
for (const [resolution, info] of Object.entries(result.variants)) {
|
|
91
|
+
const variantInfo = info;
|
|
92
|
+
const size = variantInfo.size ? ` (${formatBytes(variantInfo.size)})` : '';
|
|
93
|
+
console.log(chalk.gray(` • ${resolution}:`) + chalk.cyan(` ${variantInfo.url || '处理中...'}${size}`));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
spinner.fail('查询失败');
|
|
101
|
+
throw createApiError(error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function waitForVideoProcessing(mediaId) {
|
|
105
|
+
console.log(chalk.cyan('\n🎬 等待视频处理完成...\n'));
|
|
106
|
+
console.log(chalk.gray('Media ID: ') + chalk.white(mediaId));
|
|
107
|
+
console.log();
|
|
108
|
+
const maxAttempts = 120; // 最多等待 6 分钟(120 * 3秒)
|
|
109
|
+
let attempts = 0;
|
|
110
|
+
while (attempts < maxAttempts) {
|
|
111
|
+
try {
|
|
112
|
+
const result = await commerceApi.media.getVideoStatus(mediaId);
|
|
113
|
+
// 清除上一行并显示当前状态
|
|
114
|
+
process.stdout.write(`\r${chalk.gray('状态:')} ${formatStatus(result.status)}`);
|
|
115
|
+
if (result.progress !== undefined && result.progress !== null) {
|
|
116
|
+
process.stdout.write(chalk.gray(` | 进度: `) + chalk.white(`${result.progress}%`));
|
|
117
|
+
}
|
|
118
|
+
process.stdout.write(' '); // 清除可能的残留字符
|
|
119
|
+
if (result.status === 'completed') {
|
|
120
|
+
console.log('\n');
|
|
121
|
+
console.log(chalk.green('✓ 视频处理完成!'));
|
|
122
|
+
if (result.variants && Object.keys(result.variants).length > 0) {
|
|
123
|
+
console.log();
|
|
124
|
+
console.log(chalk.gray('可用版本:'));
|
|
125
|
+
for (const [resolution, info] of Object.entries(result.variants)) {
|
|
126
|
+
const variantInfo = info;
|
|
127
|
+
const size = variantInfo.size ? ` (${formatBytes(variantInfo.size)})` : '';
|
|
128
|
+
console.log(chalk.gray(` • ${resolution}:`));
|
|
129
|
+
console.log(chalk.cyan(` ${variantInfo.url}${size}`));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
console.log();
|
|
133
|
+
if (output.isJson()) {
|
|
134
|
+
output.success(result);
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (result.status === 'failed') {
|
|
139
|
+
console.log('\n');
|
|
140
|
+
console.log(chalk.red('✗ 视频处理失败'));
|
|
141
|
+
if (result.error) {
|
|
142
|
+
console.log(chalk.gray('错误: ') + chalk.red(result.error));
|
|
143
|
+
}
|
|
144
|
+
console.log();
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
// 等待 3 秒后重试
|
|
148
|
+
await sleep(3000);
|
|
149
|
+
attempts++;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.log('\n');
|
|
153
|
+
throw createApiError(error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
console.log('\n');
|
|
157
|
+
console.log(chalk.yellow('⚠️ 等待超时,视频仍在处理中'));
|
|
158
|
+
console.log(chalk.gray('请稍后使用 commerce product video-status --media-id ' + mediaId + ' 再次查询'));
|
|
159
|
+
console.log();
|
|
160
|
+
}
|
|
161
|
+
function formatStatus(status) {
|
|
162
|
+
switch (status) {
|
|
163
|
+
case 'pending':
|
|
164
|
+
return chalk.yellow('等待处理');
|
|
165
|
+
case 'processing':
|
|
166
|
+
return chalk.blue('处理中');
|
|
167
|
+
case 'completed':
|
|
168
|
+
return chalk.green('已完成');
|
|
169
|
+
case 'failed':
|
|
170
|
+
return chalk.red('失败');
|
|
171
|
+
default:
|
|
172
|
+
return chalk.gray(status);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function formatBytes(bytes) {
|
|
176
|
+
if (bytes === 0)
|
|
177
|
+
return '0 B';
|
|
178
|
+
const k = 1024;
|
|
179
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
180
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
181
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
|
|
182
|
+
}
|
|
183
|
+
function sleep(ms) {
|
|
184
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=video-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-status.js","sourceRoot":"","sources":["../../../src/commands/product/video-status.ts"],"names":[],"mappings":"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"}
|