@sokeai/cli 1.0.41 → 1.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -24
- package/package.json +2 -2
- package/scripts/build-binaries.sh +1 -30
- package/scripts/e2e-test.sh +63 -3
- package/scripts/install.js +52 -110
- package/scripts/local-test.js +10 -85
- package/scripts/local-test.sh +52 -7
- package/scripts/push.sh +12 -4
- package/scripts/release.sh +50 -40
- package/scripts/test-auto-detect.js +71 -48
- package/skills/README.md +0 -1
- package/skills/oss-upload/skill.md +50 -0
- package/skills/oss-upload/upload.py +355 -0
- package/skills/soke-assign/README.md +310 -0
- package/skills/soke-assign/SKILL.md +383 -0
- package/skills/soke-course/README.md +168 -92
- package/skills/soke-course/SKILL.md +372 -460
- package/skills/soke-exam/SKILL.md +565 -0
- package/skills/soke-exam/references/exam-get-exam-user.md +212 -0
- package/skills/soke-learning-map/SKILL.md +544 -0
- package/skills/soke-learning-profile/SKILL.md +0 -1
- package/skills/soke-lesson/README.md +53 -0
- package/skills/soke-lesson/SKILL.md +510 -0
- package/skills/soke-material/README.md +49 -0
- package/skills/soke-material/SKILL.md +390 -0
- package/scripts/ci/check-legacy-constants.sh +0 -27
- package/scripts/ci/check-yaml-env-whitelist.sh +0 -33
- package/scripts/mcp-stdout-scan.sh +0 -46
- package/scripts/regress-auth.sh +0 -56
- package/scripts/regress-baseline.md +0 -84
- package/scripts/test-local-reconcile.js +0 -55
- package/skills/soke-business-training-report/SKILL.md +0 -58
- package/skills/soke-course/SUMMARY.md +0 -236
- package/skills/soke-course/templates/batch-create-from-excel.md +0 -75
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soke-lesson
|
|
3
|
+
summary: 授客课件管理(创建课件、查询课件),支持视频/音频/文档等多种类型
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
description: "授客课件管理:课件生命周期管理,包括基于素材创建课件、查询课件列表和详情、管理课件排序。支持视频、音频、文档等多种课件类型。当用户需要添加课件、管理课件、查询课件信息时使用。"
|
|
6
|
+
metadata:
|
|
7
|
+
requires:
|
|
8
|
+
bins: ["soke-cli"]
|
|
9
|
+
cliHelp: "soke-cli course --help"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# 课件管理 (lesson)
|
|
13
|
+
|
|
14
|
+
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../soke-shared/SKILL.md`](../soke-shared/SKILL.md),其中包含认证、配置、权限处理**
|
|
15
|
+
|
|
16
|
+
## ⚠️ 使用前提
|
|
17
|
+
|
|
18
|
+
本 skill 基于 **soke-cli** 命令行工具,使用前必须完成以下步骤:
|
|
19
|
+
|
|
20
|
+
1. **安装 soke-cli**:确保已安装 `@sokeai/cli` NPM 包或 soke-cli 二进制文件
|
|
21
|
+
2. **用户登录授权**:运行 `soke-cli auth login` 完成 OAuth 设备码授权流程,获取用户访问令牌
|
|
22
|
+
|
|
23
|
+
**快速开始**:
|
|
24
|
+
```bash
|
|
25
|
+
|
|
26
|
+
# 1. 用户登录授权(必须)
|
|
27
|
+
soke-cli auth login
|
|
28
|
+
|
|
29
|
+
# 2. 验证登录状态
|
|
30
|
+
soke-cli config show
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
未完成登录授权将无法调用任何课件管理相关的 API。详细的认证配置说明请参考 [soke-shared/SKILL.md](../soke-shared/SKILL.md)。
|
|
34
|
+
|
|
35
|
+
## 核心概念
|
|
36
|
+
|
|
37
|
+
- **Lesson(课件)**: 课程下的学习单元,包含视频、音频、文档等类型的学习内容
|
|
38
|
+
- **Material(素材)**: 课件关联的素材文件,必须先上传到素材库才能创建课件
|
|
39
|
+
- **Course(课程)**: 课件所属的课程,通过 `course_id` 关联
|
|
40
|
+
- **Sort Order(排序)**: 课件在课程中的显示顺序,按创建时间自动排序
|
|
41
|
+
|
|
42
|
+
## 课件类型
|
|
43
|
+
|
|
44
|
+
| 类型 | 说明 | 对应素材类型 |
|
|
45
|
+
|------|------|-------------|
|
|
46
|
+
| video | 视频课件 | video |
|
|
47
|
+
| audio | 音频课件 | audio |
|
|
48
|
+
| document | 文档课件 | document |
|
|
49
|
+
|
|
50
|
+
## 课件创建流程
|
|
51
|
+
|
|
52
|
+
完整的课件创建流程:
|
|
53
|
+
|
|
54
|
+
1. **上传素材** - 使用 `file +upload` 上传文件到素材库,获取 `media_id`
|
|
55
|
+
2. **创建课件** - 使用 `course +lesson-create` 基于素材创建课件
|
|
56
|
+
3. **发布课程** - 课件添加完成后,使用 `course +publish` 发布课程
|
|
57
|
+
|
|
58
|
+
## 可用命令
|
|
59
|
+
|
|
60
|
+
### 课件创建
|
|
61
|
+
|
|
62
|
+
#### `course +lesson-create` - 创建课件
|
|
63
|
+
|
|
64
|
+
基于素材库文件创建课件并关联到课程。
|
|
65
|
+
|
|
66
|
+
**参数:**
|
|
67
|
+
- `--course-id` (必填): 课程 UUID
|
|
68
|
+
- `--title` (必填): 课件标题
|
|
69
|
+
- `--media-id` (必填): 素材库文件 UUID(通过 `file +upload` 获取)
|
|
70
|
+
- `--type` (必填): 课件类型 (video/audio/document)
|
|
71
|
+
- `--length` (必填): 媒体时长(秒,文档类型可填 0)
|
|
72
|
+
- `--object` (必填): OSS 对象路径
|
|
73
|
+
- `--filename` (必填): 文件名
|
|
74
|
+
- `--ext` (必填): 文件扩展名
|
|
75
|
+
- `--filesize` (必填): 文件大小(字节)
|
|
76
|
+
- `--storage` (可选): 存储类型,默认 "aliyun"
|
|
77
|
+
- `--description` (可选): 课件描述
|
|
78
|
+
|
|
79
|
+
**示例:**
|
|
80
|
+
```bash
|
|
81
|
+
# 创建视频课件
|
|
82
|
+
soke-cli course +lesson-create \
|
|
83
|
+
--course-id "COURSE-UUID" \
|
|
84
|
+
--title "第一课:入门介绍" \
|
|
85
|
+
--media-id "MATERIAL-UUID" \
|
|
86
|
+
--type "video" \
|
|
87
|
+
--length 600 \
|
|
88
|
+
--object "ding123/course/video/lesson1.mp4" \
|
|
89
|
+
--filename "lesson1.mp4" \
|
|
90
|
+
--ext "mp4" \
|
|
91
|
+
--filesize 10485760
|
|
92
|
+
|
|
93
|
+
# 创建音频课件
|
|
94
|
+
soke-cli course +lesson-create \
|
|
95
|
+
--course-id "COURSE-UUID" \
|
|
96
|
+
--title "第二课:音频讲解" \
|
|
97
|
+
--media-id "MATERIAL-UUID" \
|
|
98
|
+
--type "audio" \
|
|
99
|
+
--length 236 \
|
|
100
|
+
--object "ding123/course/audio/lesson2.mp3" \
|
|
101
|
+
--filename "lesson2.mp3" \
|
|
102
|
+
--ext "mp3" \
|
|
103
|
+
--filesize 9453464
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**返回:**
|
|
107
|
+
- 课件 UUID
|
|
108
|
+
- 课件标题
|
|
109
|
+
- 课件类型
|
|
110
|
+
- 关联的素材信息
|
|
111
|
+
|
|
112
|
+
### 课件查询
|
|
113
|
+
|
|
114
|
+
#### `course +lesson-list` - 列出课程的课件列表
|
|
115
|
+
|
|
116
|
+
查询指定课程下的所有课件。
|
|
117
|
+
|
|
118
|
+
**参数:**
|
|
119
|
+
- `--course-id` (必填): 课程 UUID
|
|
120
|
+
|
|
121
|
+
**示例:**
|
|
122
|
+
```bash
|
|
123
|
+
soke-cli course +lesson-list --course-id "COURSE-UUID"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**返回:**
|
|
127
|
+
- 课件列表(包含 UUID、标题、类型、时长、排序等信息)
|
|
128
|
+
|
|
129
|
+
#### `course +lesson-get` - 获取课件详情
|
|
130
|
+
|
|
131
|
+
获取单个课件的详细信息。
|
|
132
|
+
|
|
133
|
+
**参数:**
|
|
134
|
+
- `--lesson-id` (必填): 课件 UUID
|
|
135
|
+
|
|
136
|
+
**示例:**
|
|
137
|
+
```bash
|
|
138
|
+
soke-cli course +lesson-get --lesson-id "LESSON-UUID"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**返回:**
|
|
142
|
+
- 课件详细信息(包含素材信息、转换状态等)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## 使用场景
|
|
146
|
+
|
|
147
|
+
### 场景1:为课程添加单个课件
|
|
148
|
+
|
|
149
|
+
**步骤说明**:
|
|
150
|
+
1. 上传素材到素材库
|
|
151
|
+
2. 从上传响应中提取完整文件信息
|
|
152
|
+
3. 使用提取的信息创建课件
|
|
153
|
+
|
|
154
|
+
**步骤1:上传素材**
|
|
155
|
+
```
|
|
156
|
+
soke-cli file +upload --file ./lesson1.mp4 --format json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**响应示例**:
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"success": true,
|
|
163
|
+
"data": {
|
|
164
|
+
"uuid": "media-123456",
|
|
165
|
+
"filename": "lesson1.mp4",
|
|
166
|
+
"filesize": 10485760,
|
|
167
|
+
"object": "uploads/2024/01/abc123.mp4",
|
|
168
|
+
"ext": "mp4",
|
|
169
|
+
"type": "video"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**提取字段**:
|
|
175
|
+
- `data.uuid` → `media_id`
|
|
176
|
+
- `data.filename` → `filename`
|
|
177
|
+
- `data.filesize` → `filesize`
|
|
178
|
+
- `data.object` → `object`
|
|
179
|
+
- `data.ext` → `ext`
|
|
180
|
+
- `data.type` → `type`
|
|
181
|
+
|
|
182
|
+
**步骤2:创建课件**(使用步骤1提取的信息)
|
|
183
|
+
```
|
|
184
|
+
soke-cli course +lesson-create \
|
|
185
|
+
--course-id "{course_id}" \
|
|
186
|
+
--title "第一课" \
|
|
187
|
+
--media-id "media-123456" \
|
|
188
|
+
--type "video" \
|
|
189
|
+
--length 600 \
|
|
190
|
+
--object "uploads/2024/01/abc123.mp4" \
|
|
191
|
+
--filename "lesson1.mp4" \
|
|
192
|
+
--ext "mp4" \
|
|
193
|
+
--filesize 10485760
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 场景2:批量添加课件
|
|
197
|
+
|
|
198
|
+
**流程说明**:
|
|
199
|
+
1. 对每个文件重复"上传素材 → 创建课件"流程
|
|
200
|
+
2. 保持 `course_id` 不变
|
|
201
|
+
3. 每个课件使用不同的 `title`
|
|
202
|
+
|
|
203
|
+
**命令序列**:
|
|
204
|
+
```
|
|
205
|
+
# 对每个文件重复以下步骤:
|
|
206
|
+
|
|
207
|
+
# 文件1:
|
|
208
|
+
# 1. 上传素材
|
|
209
|
+
soke-cli file +upload --file "lesson1.mp4" --format json
|
|
210
|
+
# 提取: media_id, filename, filesize, object, ext, type
|
|
211
|
+
|
|
212
|
+
# 2. 创建课件
|
|
213
|
+
soke-cli course +lesson-create \
|
|
214
|
+
--course-id "{course_id}" \
|
|
215
|
+
--title "第1课" \
|
|
216
|
+
--media-id "{media_id}" \
|
|
217
|
+
--type "{type}" \
|
|
218
|
+
--length 600 \
|
|
219
|
+
--object "{object}" \
|
|
220
|
+
--filename "{filename}" \
|
|
221
|
+
--ext "{ext}" \
|
|
222
|
+
--filesize {filesize}
|
|
223
|
+
|
|
224
|
+
# 文件2:
|
|
225
|
+
# 1. 上传素材
|
|
226
|
+
soke-cli file +upload --file "lesson2.mp4" --format json
|
|
227
|
+
# 提取: media_id, filename, filesize, object, ext, type
|
|
228
|
+
|
|
229
|
+
# 2. 创建课件
|
|
230
|
+
soke-cli course +lesson-create \
|
|
231
|
+
--course-id "{course_id}" \
|
|
232
|
+
--title "第2课" \
|
|
233
|
+
--media-id "{media_id}" \
|
|
234
|
+
--type "{type}" \
|
|
235
|
+
--length 600 \
|
|
236
|
+
--object "{object}" \
|
|
237
|
+
--filename "{filename}" \
|
|
238
|
+
--ext "{ext}" \
|
|
239
|
+
--filesize {filesize}
|
|
240
|
+
|
|
241
|
+
# ... 重复上述步骤
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 场景3:管理课件
|
|
245
|
+
|
|
246
|
+
**查询课程的所有课件**:
|
|
247
|
+
```
|
|
248
|
+
soke-cli course +lesson-list --course-id "{course_id}" --format json
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**响应示例**:
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"success": true,
|
|
255
|
+
"data": {
|
|
256
|
+
"list": [
|
|
257
|
+
{
|
|
258
|
+
"uuid": "lesson-123",
|
|
259
|
+
"title": "第一课",
|
|
260
|
+
"type": "video",
|
|
261
|
+
"length": 600,
|
|
262
|
+
"sort_order": 1
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**获取课件详情**:
|
|
270
|
+
```
|
|
271
|
+
soke-cli course +lesson-get --lesson-id "{lesson_id}" --format json
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**响应示例**:
|
|
275
|
+
```json
|
|
276
|
+
{
|
|
277
|
+
"success": true,
|
|
278
|
+
"data": {
|
|
279
|
+
"uuid": "lesson-123",
|
|
280
|
+
"title": "第一课",
|
|
281
|
+
"type": "video",
|
|
282
|
+
"length": 600,
|
|
283
|
+
"media_id": "media-456",
|
|
284
|
+
"filename": "lesson1.mp4",
|
|
285
|
+
"filesize": 10485760,
|
|
286
|
+
"object": "uploads/2024/01/abc123.mp4"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## API 接口映射
|
|
292
|
+
|
|
293
|
+
| CLI 命令 | API 路径 | HTTP 方法 | 说明 |
|
|
294
|
+
|----------|----------|-----------|------|
|
|
295
|
+
| `course +lesson-create` | `/skills/course/lesson/create` | POST | 创建课件 |
|
|
296
|
+
| `course +lesson-list` | `/skills/course/lesson/list` | GET | 列出课件列表 |
|
|
297
|
+
| `course +lesson-get` | `/skills/course/lesson/{id}` | GET | 获取课件详情 |
|
|
298
|
+
| `course +lesson-update` | `/skills/course/lesson/{id}` | PUT | 更新课件信息 |
|
|
299
|
+
## 课件与素材的关系
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
素材库 (Material)
|
|
303
|
+
↓ (通过 media_id 关联)
|
|
304
|
+
课件 (Lesson)
|
|
305
|
+
↓ (通过 course_id 关联)
|
|
306
|
+
课程 (Course)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**重要说明:**
|
|
310
|
+
1. 课件必须关联素材库中的文件(通过 `media_id`)
|
|
311
|
+
2. 一个素材可以被多个课件使用
|
|
312
|
+
4. 删除素材会影响关联的课件
|
|
313
|
+
|
|
314
|
+
## 课件参数说明
|
|
315
|
+
|
|
316
|
+
### 必填参数详解
|
|
317
|
+
|
|
318
|
+
| 参数 | 说明 | 如何获取 |
|
|
319
|
+
|------|------|----------|
|
|
320
|
+
| course_id | 课程UUID | 通过 `course +create` 创建课程时返回 |
|
|
321
|
+
| media_id | 素材UUID | 通过 `file +upload` 上传素材时返回 |
|
|
322
|
+
| title | 课件标题 | 用户自定义 |
|
|
323
|
+
| type | 课件类型 | 根据素材类型设置 (video/audio/document) |
|
|
324
|
+
| length | 媒体时长 | 视频/音频的实际时长(秒),文档填 0 |
|
|
325
|
+
| object | OSS路径 | 从素材信息中获取 |
|
|
326
|
+
| filename | 文件名 | 从素材信息中获取 |
|
|
327
|
+
| ext | 文件扩展名 | 从素材信息中获取 |
|
|
328
|
+
| filesize | 文件大小 | 从素材信息中获取(字节) |
|
|
329
|
+
|
|
330
|
+
### 从素材信息获取参数
|
|
331
|
+
|
|
332
|
+
**推荐方式**:直接从 `file +upload` 响应中提取所有参数
|
|
333
|
+
|
|
334
|
+
**上传素材命令**:
|
|
335
|
+
```
|
|
336
|
+
soke-cli file +upload --file "lesson.mp4" --format json
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**响应包含所有必需字段**:
|
|
340
|
+
```json
|
|
341
|
+
{
|
|
342
|
+
"success": true,
|
|
343
|
+
"data": {
|
|
344
|
+
"uuid": "media-123456",
|
|
345
|
+
"filename": "lesson.mp4",
|
|
346
|
+
"filesize": 10485760,
|
|
347
|
+
"object": "uploads/2024/01/abc123.mp4",
|
|
348
|
+
"ext": "mp4",
|
|
349
|
+
"type": "video",
|
|
350
|
+
"length": 600
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**字段映射**:
|
|
356
|
+
|
|
357
|
+
| 课件参数 | 来源字段 | 说明 |
|
|
358
|
+
|---------|---------|------|
|
|
359
|
+
| media-id | data.uuid | 素材 UUID |
|
|
360
|
+
| type | data.type | 文件类型(video/audio/document) |
|
|
361
|
+
| length | data.length 或默认值 | 媒体时长(秒) |
|
|
362
|
+
| object | data.object | OSS 对象路径 |
|
|
363
|
+
| filename | data.filename | 文件名 |
|
|
364
|
+
| ext | data.ext | 文件扩展名 |
|
|
365
|
+
| filesize | data.filesize | 文件大小(字节) |
|
|
366
|
+
|
|
367
|
+
**时长设置**:
|
|
368
|
+
- 如果响应中有 `length` 字段,直接使用
|
|
369
|
+
- 如果没有,根据类型设置默认值:
|
|
370
|
+
- video → 600秒
|
|
371
|
+
- audio → 300秒
|
|
372
|
+
- document → 0秒
|
|
373
|
+
|
|
374
|
+
**不推荐的方式**:
|
|
375
|
+
- ❌ 手动填写 `--object` 路径
|
|
376
|
+
- ❌ 本地计算 `--filesize`
|
|
377
|
+
- ❌ 额外调用 `file +get-info` 查询素材信息
|
|
378
|
+
|
|
379
|
+
## 最佳实践
|
|
380
|
+
|
|
381
|
+
### 1. 素材上传与信息提取
|
|
382
|
+
|
|
383
|
+
**关键原则**:素材上传响应包含创建课件所需的所有信息,直接提取使用。
|
|
384
|
+
|
|
385
|
+
**正确流程**:
|
|
386
|
+
1. 调用 `file +upload` 上传文件
|
|
387
|
+
2. 从响应的 `data` 字段提取所有必需信息
|
|
388
|
+
3. 使用提取的信息调用 `course +lesson-create`
|
|
389
|
+
|
|
390
|
+
**错误做法**:
|
|
391
|
+
- ❌ 手动构造 OSS 路径
|
|
392
|
+
- ❌ 猜测文件大小或扩展名
|
|
393
|
+
- ❌ 上传后再查询素材详情
|
|
394
|
+
|
|
395
|
+
### 2. 课件类型匹配
|
|
396
|
+
|
|
397
|
+
课件类型必须与素材类型一致:
|
|
398
|
+
|
|
399
|
+
| 素材类型 | 课件类型 | 说明 |
|
|
400
|
+
|---------|---------|------|
|
|
401
|
+
| video | video | 视频课件 |
|
|
402
|
+
| audio | audio | 音频课件 |
|
|
403
|
+
| document | document | 文档课件 |
|
|
404
|
+
|
|
405
|
+
**建议**:直接使用素材上传响应中的 `type` 字段
|
|
406
|
+
|
|
407
|
+
### 3. 时长设置规则
|
|
408
|
+
|
|
409
|
+
| 课件类型 | 时长要求 | 默认值 |
|
|
410
|
+
|---------|---------|--------|
|
|
411
|
+
| video | 必填,单位秒 | 600秒(10分钟) |
|
|
412
|
+
| audio | 必填,单位秒 | 300秒(5分钟) |
|
|
413
|
+
| document | 填 0 | 0秒 |
|
|
414
|
+
|
|
415
|
+
### 4. 批量创建建议
|
|
416
|
+
|
|
417
|
+
**批量创建课件**:
|
|
418
|
+
- 对每个文件重复"上传 → 创建"流程
|
|
419
|
+
- 保持 `course_id` 不变
|
|
420
|
+
- 使用不同的 `title` 区分课件
|
|
421
|
+
- 可以并行上传素材以提高效率
|
|
422
|
+
|
|
423
|
+
**命名建议**:
|
|
424
|
+
- 使用序号:第1课、第2课、第3课
|
|
425
|
+
- 使用主题:入门介绍、基础语法、高级特性
|
|
426
|
+
- 使用文件名:从文件名中提取标题
|
|
427
|
+
|
|
428
|
+
### 5. 错误处理
|
|
429
|
+
|
|
430
|
+
**检查点**:
|
|
431
|
+
- 素材上传成功(`success: true`)
|
|
432
|
+
- 提取的 `media_id` 不为空
|
|
433
|
+
- 课件创建成功(`success: true`)
|
|
434
|
+
- 课件类型与素材类型匹配
|
|
435
|
+
|
|
436
|
+
**常见错误**:
|
|
437
|
+
- `course_id` 无效 → 确认课程已创建
|
|
438
|
+
- `media_id` 无效 → 确认素材上传成功
|
|
439
|
+
- 类型不匹配 → 检查 `type` 参数
|
|
440
|
+
- 参数缺失 → 检查所有必填参数
|
|
441
|
+
|
|
442
|
+
### 6. 数据流转
|
|
443
|
+
|
|
444
|
+
**完整的数据流转链路**:
|
|
445
|
+
|
|
446
|
+
```
|
|
447
|
+
1. 上传素材
|
|
448
|
+
输入: 文件路径
|
|
449
|
+
输出: media_id, filename, filesize, object, ext, type, length
|
|
450
|
+
|
|
451
|
+
2. 创建课件
|
|
452
|
+
输入: course_id + 步骤1的所有输出 + title
|
|
453
|
+
输出: lesson_id
|
|
454
|
+
|
|
455
|
+
3. 查询验证
|
|
456
|
+
输入: lesson_id 或 course_id
|
|
457
|
+
输出: 课件详情或课件列表
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### 7. 跨平台兼容性
|
|
461
|
+
|
|
462
|
+
**文件路径**:
|
|
463
|
+
- 支持相对路径和绝对路径
|
|
464
|
+
- Windows 支持 `/` 和 `\` 两种分隔符
|
|
465
|
+
- 建议使用 `/` 保持跨平台兼容
|
|
466
|
+
|
|
467
|
+
**JSON 解析**:
|
|
468
|
+
- 使用 `--format json` 获取 JSON 输出
|
|
469
|
+
- 使用各平台的 JSON 解析工具:
|
|
470
|
+
- 命令行: `jq`
|
|
471
|
+
- PowerShell: `ConvertFrom-Json`
|
|
472
|
+
- Python: `json.loads()`
|
|
473
|
+
- Node.js: `JSON.parse()`
|
|
474
|
+
|
|
475
|
+
**命令执行**:
|
|
476
|
+
- 所有命令在 Windows、macOS、Linux 上通用
|
|
477
|
+
- 只需根据平台选择合适的 JSON 解析方法
|
|
478
|
+
|
|
479
|
+
## 注意事项
|
|
480
|
+
|
|
481
|
+
1. **素材必须先上传**: 创建课件前必须先上传素材到素材库
|
|
482
|
+
2. **类型匹配**: 课件类型必须与素材类型匹配
|
|
483
|
+
3. **时长设置**: 视频和音频必须设置正确的时长,文档类型填 0
|
|
484
|
+
4. **排序规则**: 课件按创建时间自动排序,也可以手动调整 `sort_order`
|
|
485
|
+
6. **发布要求**: 课程至少需要一个课件才能发布
|
|
486
|
+
|
|
487
|
+
## 权限要求
|
|
488
|
+
|
|
489
|
+
- **写操作 (创建)): `course:courseware:write`
|
|
490
|
+
- **读操作** (查询): `course:courseware:readonly`
|
|
491
|
+
|
|
492
|
+
## 错误处理
|
|
493
|
+
|
|
494
|
+
常见错误及解决方案:
|
|
495
|
+
|
|
496
|
+
| 错误码 | 错误信息 | 解决方案 |
|
|
497
|
+
|--------|----------|----------|
|
|
498
|
+
| 1001 | 参数错误 | 检查必填参数是否完整 |
|
|
499
|
+
| 2001 | 课程不存在 | 确认 course_id 正确 |
|
|
500
|
+
| 2002 | 素材不存在 | 确认 media_id 正确,素材已上传 |
|
|
501
|
+
| 2003 | 课件类型不匹配 | 确保课件类型与素材类型一致 |
|
|
502
|
+
| 3001 | 课件不存在 | 确认 lesson_id 正确 |
|
|
503
|
+
| 3002 | 课件数量超限 | 课程课件数量达到上限 |
|
|
504
|
+
|
|
505
|
+
## 相关文档
|
|
506
|
+
|
|
507
|
+
- [课程管理 Skill](../soke-course/SKILL.md) - 课程创建和发布
|
|
508
|
+
- [素材库管理 Skill](../soke-material/SKILL.md) - 素材上传和管理
|
|
509
|
+
- [共享配置 Skill](../soke-shared/SKILL.md) - 认证和配置管理
|
|
510
|
+
- [API 接口文档](../../docs/API_PROXY_INTERFACES.md) - 完整的 API 接口说明
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 授客素材库管理 Skill
|
|
2
|
+
|
|
3
|
+
素材库文件管理,包括文件上传到OSS、创建素材记录、查询素材列表和详情、管理素材分类。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
### 上传文件到素材库
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 自动检测类型和时长
|
|
11
|
+
soke-cli file +upload --file ./video.mp4
|
|
12
|
+
|
|
13
|
+
# 指定类型和时长
|
|
14
|
+
soke-cli file +upload --file ./audio.mp3 --type audio --length 236
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 查询素材
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 列出所有素材
|
|
21
|
+
soke-cli file +list-files
|
|
22
|
+
|
|
23
|
+
# 列出视频素材
|
|
24
|
+
soke-cli file +list-files --type video
|
|
25
|
+
|
|
26
|
+
# 获取素材详情
|
|
27
|
+
soke-cli file +get-info --file-id "FILE-UUID"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 主要功能
|
|
31
|
+
|
|
32
|
+
- ✅ 文件上传到 OSS(自动获取签名)
|
|
33
|
+
- ✅ 创建素材库记录
|
|
34
|
+
- ✅ 查询素材列表(支持类型和分类筛选)
|
|
35
|
+
- ✅ 获取素材详情
|
|
36
|
+
- ✅ 管理素材分类
|
|
37
|
+
- ✅ 自动检测文件类型
|
|
38
|
+
- ✅ 自动设置默认时长
|
|
39
|
+
|
|
40
|
+
## 支持的文件类型
|
|
41
|
+
|
|
42
|
+
- **视频**: mp4, avi, mov, wmv, flv, mkv, webm 等
|
|
43
|
+
- **音频**: mp3, wav, flac, aac, ogg, wma, m4a 等
|
|
44
|
+
- **图片**: jpg, jpeg, png, gif, bmp, svg, webp 等
|
|
45
|
+
- **文档**: pdf, ppt, pptx, doc, docx, xls, xlsx 等
|
|
46
|
+
|
|
47
|
+
## 详细文档
|
|
48
|
+
|
|
49
|
+
查看 [SKILL.md](./SKILL.md) 获取完整的使用说明和 API 文档。
|