@volcengine/amk-editor 0.0.2-beta.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -17
- package/dist/amk-editor.d.ts +49 -5
- package/dist/api/client.d.ts +26 -7
- package/dist/api/preset-library.d.ts +2 -0
- package/dist/api/project.d.ts +1 -0
- package/dist/export-modal.d.ts +2 -2
- package/dist/export-task-polling.d.ts +12 -0
- package/dist/header.d.ts +21 -0
- package/dist/i18n/keys.d.ts +15 -0
- package/dist/import-actions.d.ts +12 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +16580 -2819
- package/dist/local-upload-modal.d.ts +1 -1
- package/dist/tos-upload.d.ts +11 -0
- package/dist/types.d.ts +40 -14
- package/dist/veveditor.css +530 -4
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -13,17 +13,11 @@ const editor = new AmkEditor({
|
|
|
13
13
|
container,
|
|
14
14
|
projectId: 'your-project-id',
|
|
15
15
|
endpoint: 'https://your-backend.example.com',
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
Authorization: `Bearer ${token}`,
|
|
23
|
-
'X-Customer-Id': 'your-customer-id',
|
|
24
|
-
};
|
|
25
|
-
},
|
|
26
|
-
},
|
|
16
|
+
// 可选:每次请求前动态获取,SDK 不解析或改写返回的 Header。
|
|
17
|
+
getHeaders: async () => ({
|
|
18
|
+
Authorization: `Bearer ${await getLatestToken()}`,
|
|
19
|
+
'X-Customer-Id': 'your-customer-id',
|
|
20
|
+
}),
|
|
27
21
|
material: {
|
|
28
22
|
onUploadMaterial: async files => {
|
|
29
23
|
// 上传到业务存储后返回素材列表,每项必须带 source_material_id
|
|
@@ -42,12 +36,24 @@ const editor = new AmkEditor({
|
|
|
42
36
|
},
|
|
43
37
|
});
|
|
44
38
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
|
|
40
|
+
// 外部工具栏可复用素材面板的同一套导入弹窗与入库链路。
|
|
41
|
+
editor.requestMaterialImport('local'); // 本地文件选择 + 本地上传确认弹窗
|
|
42
|
+
editor.requestMaterialImport('url'); // URL 上传弹窗
|
|
43
|
+
editor.requestMaterialImport('system'); // 业务资产库回调
|
|
44
|
+
|
|
45
|
+
// 只有这个外部调用触发的导入成功后才回调;编辑器自身的导入按钮不会触发它。
|
|
46
|
+
editor.requestMaterialImport('local', {
|
|
47
|
+
onMaterialsImported: materials => {
|
|
48
|
+
console.log('本次已入库素材', materials);
|
|
49
|
+
},
|
|
48
50
|
});
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
|
|
52
|
+
// 从服务端重新拉取当前工程,并热更新素材与 Track(不写入撤销历史)。
|
|
53
|
+
await editor.refreshProject();
|
|
54
|
+
|
|
55
|
+
// 查询由编辑器操作创建的异步任务;复用相同的 endpoint 和 getHeaders。
|
|
56
|
+
const exportTask = await editor.getTask('your-task-id');
|
|
51
57
|
```
|
|
52
58
|
页面卸载时销毁:
|
|
53
59
|
```ts
|
|
@@ -55,8 +61,27 @@ editor.destroy();
|
|
|
55
61
|
```
|
|
56
62
|
## 接入说明
|
|
57
63
|
- `projectId`、`endpoint` 必填。`endpoint` 指向你的业务代理。
|
|
58
|
-
- `
|
|
64
|
+
- `theme` 默认 `light`。未传或传入其他值时按浅色渲染;只有显式 `theme: 'dark'` 才走暗色。
|
|
65
|
+
- 产物是单文件 ESM。依赖里的 AMD `define(["./core"])` 已在构建时剔除,避免 Next.js / webpack 误解析不存在的 `dist/core.js`。
|
|
66
|
+
- `getHeaders` 可选,每次请求前都会重新调用;SDK 不解析、不缓存、不改写返回值,仅将其合并到发往 `endpoint` 的工程、素材、tools、tasks、导出等请求中。闭包内 Token 更新会自动用于下一次请求。
|
|
59
67
|
- 本地上传、URL 导入由业务回调完成。返回的素材必须带业务主键 `source_material_id`,不必填写 `material_id`。
|
|
60
68
|
- 播放地址、封面、雪碧图可能有时效。通过 `onRefreshPlayInfo` 返回新的访问地址。
|
|
69
|
+
- 可选实现 `onMaterialsImported`:素材成功入库后回调已合并 `material_id` 的列表;可用于把新素材挂到对话草稿。失败或取消不会触发。
|
|
61
70
|
- 可选实现 `onPersistExtractUrls`:把抽帧得到的临时地址转存为业务长期地址,并随 `materialPatch` 写回自定义存储字段。
|
|
62
71
|
- 可选配置 `export.qualityEnhancement: true` 以在导出弹窗展示「视频画质增强」;默认不展示。
|
|
72
|
+
- 可选配置 `header.mount` 为外部 DOM 节点,将顶栏渲染到该节点(而不是编辑器内部),便于宿主做全宽顶栏;`header.show: false` 仍可完全隐藏顶栏。
|
|
73
|
+
- 可选配置 `header.onTitleUpdateSuccess`:工程名 PATCH 成功后回调 `{ projectId, title }`。保存成功前编辑器继续展示旧名称;保存失败不会修改编辑器标题,也不会触发回调。
|
|
74
|
+
- 可选配置 `header.exportTaskList: false` 隐藏导出任务列表入口;默认开启。关闭后不会展示任务列表按钮,也不会启动导出任务列表查询与轮询。
|
|
75
|
+
- `requestMaterialImport(type, options?)` 返回是否成功触发已配置入口;`local`、`url`、`system` 分别要求存在本地上传能力、`onUploadUrlMaterial`、`onUploadFromSystem`。外部入口不会复制上传逻辑,仍走素材面板相同的回调、TOS 签名、素材入库与元信息处理。可选的 `options.onMaterialsImported` 只对这一次外部触发有效,编辑器自身的导入按钮不会调用它。
|
|
76
|
+
- `toolbar.customItems` 的只读态不会自动置灰。需要禁用时在该项 `disabled({ readonly })` 里自行返回 true(例如 `disabled: ({ readonly }) => readonly`)。录音中仍会全局锁定自定义项。内置 ASR 按钮在只读时仍会禁用。
|
|
77
|
+
- `refreshProject()` 会等待当前保存队列结束,再重新拉取工程、刷新临时播放地址并热更新素材与 Track;远端 Track 不会写入本地撤销历史,也不会被自动保存回服务端。
|
|
78
|
+
- `getTask(taskId, options?)` 查询 `GET /api/v1/tasks/{task_id}`,复用编辑器初始化时的 `endpoint` 与 `getHeaders`;`options.signal` 可在宿主任务卡卸载时取消轮询请求。
|
|
79
|
+
- 配置 `projectId` 后,API Client 会把 `invokeTool`、`invokeSyncTool` 的成功响应以及 `getTask` 的轮询结果,以 schema v2 best-effort 上报到 `POST /api/v1/editing/projects/{project_id}/tasks`。记录包含 `task_id`、`tool_name`、同步/异步模式、状态、原始请求和响应;台账写入失败只输出 warning,不会让已经成功的 AMK 调用失败。轮询上报会省略 `request.input`,避免覆盖首次提交保存的请求参数。
|
|
80
|
+
- mediakit-studio `dev` 当前只提供上述任务台账写接口,尚无任务列表/详情 GET 接口。因此编辑器顶栏的导出记录仍只保留当前页面会话;如需刷新后读取历史导出列表,需要服务端补充按工程查询任务的接口。
|
|
81
|
+
## 样式隔离
|
|
82
|
+
SDK 会随 `import '@volcengine/amk-editor'` 自动注入样式,导航栏、左侧分类、素材网格的布局由 SDK 自己负责。**接入方不必再写补丁 CSS 才能让界面正常显示。**
|
|
83
|
+
编辑器挂在普通 DOM(`#track-video-editor`)里,不是 Shadow DOM。宿主页面里针对 `section` / `nav` / `aside` 的全局布局重置会穿透进来,把顶栏或左侧分类挤扁。
|
|
84
|
+
请避免:
|
|
85
|
+
- 对 `section`、`nav`、`aside` 写全局 `display` / `flex` / `height` / `margin` 规则。
|
|
86
|
+
- 用 `#track-video-editor nav { ... }` 这类按标签名锁定内部节点。同名标签在编辑器里用途不同,一条规则会同时打到顶栏和分类栏。
|
|
87
|
+
如需约束编辑器尺寸,只设置挂载容器或 `#track-video-editor` 本身的 `width` / `height` / `min-height`。
|
package/dist/amk-editor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './veveditor.css';
|
|
2
|
-
import type {
|
|
2
|
+
import type { AmkMaterialImportType, AmkMaterialImportRequestOptions, AmkEditorOptions, AmkExportRequestResult, AmkProjectSnapshot, MaterialItem, VeVeditorInstance } from './types';
|
|
3
3
|
import { type AmkI18nInstance } from './i18n';
|
|
4
4
|
import { type AmkInvokeToolParams } from './api/client';
|
|
5
5
|
export declare class AmkEditor {
|
|
@@ -10,6 +10,11 @@ export declare class AmkEditor {
|
|
|
10
10
|
private layout?;
|
|
11
11
|
private exportModal?;
|
|
12
12
|
private exportRequestInFlight?;
|
|
13
|
+
private readonly exportTaskPollingControllers;
|
|
14
|
+
private readonly exportTaskPollingTokens;
|
|
15
|
+
private exportTasks;
|
|
16
|
+
private exportTaskListRequest?;
|
|
17
|
+
private importActions?;
|
|
13
18
|
private asrProgressModal?;
|
|
14
19
|
private confirmModal?;
|
|
15
20
|
private emptyTrackConfirmInFlight?;
|
|
@@ -24,6 +29,7 @@ export declare class AmkEditor {
|
|
|
24
29
|
private emptyTrackSaveBlocked;
|
|
25
30
|
private savedMaterials;
|
|
26
31
|
private saveQueue;
|
|
32
|
+
private projectRefreshInFlight?;
|
|
27
33
|
private pendingSaveCount;
|
|
28
34
|
private readonly asrPollingControllers;
|
|
29
35
|
/** 当前前台 ASR 会话;取消、关闭或销毁后直接丢弃,不写入工程 JSON。 */
|
|
@@ -48,6 +54,8 @@ export declare class AmkEditor {
|
|
|
48
54
|
private readonly thumbnailErrorInFlight;
|
|
49
55
|
/** 前端抽帧封面缓存(不落盘):key = materialKey,value = dataURL */
|
|
50
56
|
private readonly posterCache;
|
|
57
|
+
/** 本次会话签名 URL 对应的原始 TOS 身份,供产物落盘时保留重签依据。 */
|
|
58
|
+
private readonly tosIdentityBySignedUrl;
|
|
51
59
|
/** 同一 URL 的封面抽帧只执行一次,避免初始化与上传回调重复请求。 */
|
|
52
60
|
private readonly posterCaptureInFlight;
|
|
53
61
|
/** 销毁编辑器时中断尚未完成的前端抽帧或 AMK 首帧轮询。 */
|
|
@@ -65,21 +73,46 @@ export declare class AmkEditor {
|
|
|
65
73
|
whenReady(): Promise<this>;
|
|
66
74
|
getEditor(): VeVeditorInstance | undefined;
|
|
67
75
|
getI18n(): AmkI18nInstance;
|
|
68
|
-
/** 替换后续 AMK 请求使用的鉴权 Header 提供器;传入 null/undefined 可清除。 */
|
|
69
|
-
setAuth(auth?: AmkEditorAuthConfig | null): void;
|
|
70
76
|
/** 通用工具调用:POST /api/v1/tools/{toolName} */
|
|
71
77
|
invokeTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
78
|
+
/**
|
|
79
|
+
* Queries an asynchronous AMK task through the editor's configured endpoint
|
|
80
|
+
* and headers. Intended for host UI cards that track tasks created by editor
|
|
81
|
+
* operations such as {@link requestExport}.
|
|
82
|
+
*/
|
|
83
|
+
getTask<T = unknown>(taskId: string, options?: {
|
|
84
|
+
headers?: Record<string, string>;
|
|
85
|
+
signal?: AbortSignal;
|
|
86
|
+
}): Promise<T>;
|
|
72
87
|
/**
|
|
73
88
|
* Opens the existing export modal and resolves after the user confirms or cancels.
|
|
74
89
|
* Intended for Agent frontend tools (`request_export_task`). Header export still
|
|
75
90
|
* uses `open()` + direct submit and is unchanged.
|
|
76
91
|
*/
|
|
77
92
|
requestExport(): Promise<AmkExportRequestResult>;
|
|
93
|
+
/**
|
|
94
|
+
* 从外部工具栏打开 AMK Editor 已配置的素材导入入口。
|
|
95
|
+
* 本地、URL、资产库均复用素材面板中的同一套弹窗、回调和入库链路。
|
|
96
|
+
* @returns 当前入口存在且已触发时返回 true;未配置或尚未挂载时返回 false。
|
|
97
|
+
*/
|
|
98
|
+
requestMaterialImport(type: AmkMaterialImportType, options?: AmkMaterialImportRequestOptions): boolean;
|
|
78
99
|
/**
|
|
79
100
|
* 获取工程全量参数(materials + editParam + projectName)。
|
|
80
101
|
* 从 VeVeditor 当前素材/草稿快照读取;未挂载时回落内置拉取到的快照。
|
|
81
102
|
*/
|
|
82
103
|
getProject(): AmkProjectSnapshot;
|
|
104
|
+
/**
|
|
105
|
+
* 从 Editing 工程接口重新拉取完整素材列表。
|
|
106
|
+
* 与 `getProject()` 的当前编辑器快照不同,该方法每次都会请求服务端,
|
|
107
|
+
* 适合素材引用面板等必须包含最新导出产物的场景。
|
|
108
|
+
*/
|
|
109
|
+
fetchProjectMaterials(): Promise<MaterialItem[]>;
|
|
110
|
+
/**
|
|
111
|
+
* 重新拉取服务端工程,并把最新素材与 Track 热更新到当前编辑器。
|
|
112
|
+
* 用于 Agent 完成远端编辑后刷新右侧预览;不会产生撤销记录,也不会把回灌事件再次保存到服务端。
|
|
113
|
+
*/
|
|
114
|
+
refreshProject(): Promise<AmkProjectSnapshot>;
|
|
115
|
+
private refreshProjectFromServer;
|
|
83
116
|
/**
|
|
84
117
|
* 刷新素材播放信息(按需触发,如播放前 / 初始化)。
|
|
85
118
|
* - TOS 直传素材会先使用临时 STS 重签私有对象 URL
|
|
@@ -104,6 +137,7 @@ export declare class AmkEditor {
|
|
|
104
137
|
* URL 是运行时数据:保存工程,但不产生撤销步骤。
|
|
105
138
|
*/
|
|
106
139
|
private applyTrackMaterialUrls;
|
|
140
|
+
private resolveTosSignedResourceUrls;
|
|
107
141
|
private getExpiringTosMaterialIds;
|
|
108
142
|
private scheduleTosSignedUrlRefresh;
|
|
109
143
|
private refreshExpiringTosUrls;
|
|
@@ -131,6 +165,10 @@ export declare class AmkEditor {
|
|
|
131
165
|
* 适配只作用于即将提交给导出接口的 editParam 副本,不写回工程或当前预览。
|
|
132
166
|
*/
|
|
133
167
|
private submitExport;
|
|
168
|
+
private startExportTaskStatusPolling;
|
|
169
|
+
private refreshLatestExportTasks;
|
|
170
|
+
private loadLatestExportTasks;
|
|
171
|
+
private clearExportTaskPolling;
|
|
134
172
|
private attach;
|
|
135
173
|
private detach;
|
|
136
174
|
private clearAsrPollingTimers;
|
|
@@ -181,10 +219,14 @@ export declare class AmkEditor {
|
|
|
181
219
|
* POST 远端素材库 → 按 sprite/poster 判断发起抽帧并 PUT 更新。
|
|
182
220
|
*/
|
|
183
221
|
private ingestImportedMaterials;
|
|
222
|
+
/**
|
|
223
|
+
* 通知宿主素材已入库。抽帧仍在后台进行,不阻塞对话引用。
|
|
224
|
+
*/
|
|
225
|
+
private notifyMaterialsImported;
|
|
184
226
|
/**
|
|
185
227
|
* 本地上传 / URL 上传完成后,将新素材 POST 到 Editing API。
|
|
186
|
-
*
|
|
187
|
-
*
|
|
228
|
+
* 先确保远端持久化并合并 Editing API 返回的 material_id;成功后调用方
|
|
229
|
+
* 才写入素材面板(业务不用传 material_id;不覆盖本地 source / kid / 预览字段)。
|
|
188
230
|
*/
|
|
189
231
|
private persistUploadedMaterials;
|
|
190
232
|
private isHttpUrl;
|
|
@@ -230,6 +272,8 @@ export declare class AmkEditor {
|
|
|
230
272
|
*/
|
|
231
273
|
private ensureMaterialExtractTasks;
|
|
232
274
|
private createExtractFramesTask;
|
|
275
|
+
/** AMK 转存到私有 TOS 后,任务产物需先重签才能用于浏览器预览。 */
|
|
276
|
+
private signTaskOutputUrls;
|
|
233
277
|
private startSpritePolling;
|
|
234
278
|
private startPosterPolling;
|
|
235
279
|
private buildSpriteFromExtractResult;
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AmkEditorGetHeaders } from '../types';
|
|
2
2
|
export type AmkApiClientOptions = {
|
|
3
3
|
endpoint: string;
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/** 当前工程 ID,用于统一注入 tools 请求的 callback_args。 */
|
|
5
|
+
projectId?: string;
|
|
6
|
+
/** 每次请求前动态获取并原样透传给客户业务代理的请求头。 */
|
|
7
|
+
getHeaders?: AmkEditorGetHeaders;
|
|
6
8
|
/** 调用 tools 接口时写入请求体的产物存储目标,例如 `tos://bucket`。 */
|
|
7
9
|
mediaOutputDestination?: string;
|
|
8
10
|
};
|
|
@@ -16,15 +18,25 @@ export type AmkInvokeToolParams = {
|
|
|
16
18
|
};
|
|
17
19
|
export declare class AmkApiClient {
|
|
18
20
|
private readonly baseUrl;
|
|
19
|
-
private
|
|
21
|
+
private readonly projectId?;
|
|
22
|
+
private readonly getHeaders?;
|
|
20
23
|
private readonly mediaOutputDestination?;
|
|
24
|
+
private readonly taskToolNames;
|
|
25
|
+
private readonly terminalTaskReports;
|
|
26
|
+
private syncTaskSequence;
|
|
21
27
|
constructor(options: AmkApiClientOptions);
|
|
22
28
|
getBaseUrl(): string;
|
|
23
|
-
/** 替换后续请求使用的鉴权 Header 提供器;传入 null/undefined 可清除。 */
|
|
24
|
-
setAuth(auth?: AmkEditorAuthConfig | null): void;
|
|
25
29
|
invokeTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
26
30
|
invokeSyncTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
31
|
+
private createSyncTaskId;
|
|
32
|
+
private rememberTaskTool;
|
|
33
|
+
private reportTaskObservation;
|
|
27
34
|
private mergeToolParams;
|
|
35
|
+
/**
|
|
36
|
+
* callback_args 约定以 JSON 字符串传输。保留调用方已有字段,并统一补充
|
|
37
|
+
* project_id,避免各个工具调用点重复组装且漏传。
|
|
38
|
+
*/
|
|
39
|
+
private mergeCallbackArgs;
|
|
28
40
|
/**
|
|
29
41
|
* 查询异步任务:GET /api/v1/tasks/{task_id}
|
|
30
42
|
* @see https://docs.volcengine.com/docs/6448/2278532
|
|
@@ -33,12 +45,19 @@ export declare class AmkApiClient {
|
|
|
33
45
|
headers?: Record<string, string>;
|
|
34
46
|
signal?: AbortSignal;
|
|
35
47
|
}): Promise<T>;
|
|
48
|
+
/** 查询当前工程任务台账;服务端按 submitted_at 倒序返回。 */
|
|
49
|
+
listProjectTasks<T = unknown>(options?: {
|
|
50
|
+
toolNames?: string[];
|
|
51
|
+
page?: number;
|
|
52
|
+
pageSize?: number;
|
|
53
|
+
includeTotal?: boolean;
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
}): Promise<T>;
|
|
36
56
|
requestJson<T = unknown>(path: string, options?: {
|
|
37
57
|
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
38
58
|
headers?: Record<string, string>;
|
|
39
59
|
body?: unknown;
|
|
40
60
|
signal?: AbortSignal;
|
|
41
61
|
}): Promise<T>;
|
|
42
|
-
private resolveAuthHeaders;
|
|
43
62
|
}
|
|
44
63
|
export declare function createAmkApiClient(options: AmkApiClientOptions): AmkApiClient;
|
|
@@ -5,6 +5,8 @@ export type PresetLibraryItem = {
|
|
|
5
5
|
name: string;
|
|
6
6
|
icon_url: string;
|
|
7
7
|
package_url: string;
|
|
8
|
+
/** 滤镜分类;无显式 categories 时 SDK 按 tag 聚合侧栏(值即分类名)。 */
|
|
9
|
+
tag?: string;
|
|
8
10
|
default?: boolean;
|
|
9
11
|
};
|
|
10
12
|
export type PresetLibrary = Partial<Record<PresetLibraryResourceKey, PresetLibraryItem[]>>;
|
package/dist/api/project.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export type SavedAmkEditor = {
|
|
|
8
8
|
revision: number;
|
|
9
9
|
editParam: Record<string, unknown>;
|
|
10
10
|
};
|
|
11
|
+
export declare function fetchAmkProjectMaterials(client: EditingApiClient, projectId: string): Promise<MaterialItem[]>;
|
|
11
12
|
export declare function fetchAmkProject(client: EditingApiClient, projectId: string): Promise<LoadedAmkProject>;
|
|
12
13
|
export declare function updateAmkProjectName(client: EditingApiClient, projectId: string, projectName: string): Promise<void>;
|
|
13
14
|
/**
|
package/dist/export-modal.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ type SelectOption<T extends string> = {
|
|
|
34
34
|
export declare const QUALITY_TOOLTIP = "AI MediaKit \u753B\u8D28\u589E\u5F3A\u96C6\u6210\u667A\u80FD\u8D85\u5206\u3001\u63D2\u5E27\u3001\u753B\u9762\u589E\u5F3A\u3001\u81EA\u9002\u5E94\u9510\u5316\u3001\u8272\u5F69\u589E\u5F3A\u7B49 30+ \u9AD8\u8D28\u91CF\u7B97\u6CD5\uFF0C\u7ED3\u5408\u81EA\u7814\u89C6\u9891\u5185\u5BB9\u7406\u89E3\u4E0E\u667A\u80FD\u8C03\u5EA6\uFF0C\u6309\u573A\u666F\u81EA\u52A8\u62E9\u4F18\u8C03\u7528\uFF0C\u5168\u9762\u63D0\u5347\u89C6\u9891\u753B\u8D28\u3002";
|
|
35
35
|
export declare function getBaseResolutions(t: AmkI18nInstance['t']): SelectOption<ExportVideoParams['resolution']>[];
|
|
36
36
|
/** 画质增强开启后的分辨率:不含原画;大模型版不含 4K */
|
|
37
|
-
export declare function getEnhancedResolutions(
|
|
37
|
+
export declare function getEnhancedResolutions(_t: AmkI18nInstance['t'], enhancementVersion?: ExportVideoParams['enhancementVersion']): SelectOption<ExportVideoParams['resolution']>[];
|
|
38
38
|
/** 当前模式下合法分辨率;非法时回落到默认项 */
|
|
39
39
|
export declare function normalizeExportResolution(params: Pick<ExportVideoParams, 'qualityEnhancement' | 'enhancementVersion' | 'resolution'>, t?: AmkI18nInstance['t']): ExportVideoParams['resolution'];
|
|
40
40
|
export declare function getEnhancementVersions(t: AmkI18nInstance['t']): SelectOption<ExportVideoParams['enhancementVersion']>[];
|
|
@@ -54,7 +54,7 @@ export declare function createDefaultExportVideoParams(videoName: string): Expor
|
|
|
54
54
|
/** 导出帧率合法区间(含端点) */
|
|
55
55
|
export declare const EXPORT_FRAME_RATE_MIN = 15;
|
|
56
56
|
export declare const EXPORT_FRAME_RATE_MAX = 120;
|
|
57
|
-
/** 将导出帧率钳制到 15~120;非法输入回落
|
|
57
|
+
/** 将导出帧率钳制到 15~120;非法输入回落 24 */
|
|
58
58
|
export declare function normalizeExportFrameRate(frameRate: unknown): number;
|
|
59
59
|
export declare function toggleQualityEnhancement(params: ExportVideoParams, enabled: boolean): ExportVideoParams;
|
|
60
60
|
export declare function createExportModal(options: CreateExportModalOptions): ExportModalController;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type TaskPollingController } from './task-polling';
|
|
2
|
+
export declare const EXPORT_TASK_POLL_INTERVAL_MS = 5000;
|
|
3
|
+
export type ExportTaskPollingStatus = 'polling' | 'success' | 'failed';
|
|
4
|
+
export declare function resolveExportTaskPollingStatus(payload: unknown): ExportTaskPollingStatus;
|
|
5
|
+
export declare function resolveExportTaskProgress(payload: unknown): number | undefined;
|
|
6
|
+
export declare function resolveExportTaskOutputUrl(payload: unknown): string | undefined;
|
|
7
|
+
export declare function startExportTaskPolling(options: {
|
|
8
|
+
taskId: string;
|
|
9
|
+
getTask: (taskId: string) => Promise<unknown>;
|
|
10
|
+
onStatusChange: (status: ExportTaskPollingStatus, payload?: unknown) => void | Promise<void>;
|
|
11
|
+
onError?: (error: unknown) => void;
|
|
12
|
+
}): TaskPollingController;
|
package/dist/header.d.ts
CHANGED
|
@@ -9,7 +9,13 @@ export interface CreateAmkEditorLayoutOptions {
|
|
|
9
9
|
title: string;
|
|
10
10
|
theme?: 'light' | 'dark';
|
|
11
11
|
showHeader: boolean;
|
|
12
|
+
/** 是否展示导出任务列表入口,默认开启。 */
|
|
13
|
+
showExportTaskList?: boolean;
|
|
14
|
+
/** When set, append the header here instead of inside the editor root. */
|
|
15
|
+
headerMount?: HTMLElement;
|
|
12
16
|
onExport: () => void;
|
|
17
|
+
/** 导出任务列表每次从关闭变为展开时触发。 */
|
|
18
|
+
onExportTasksOpen?: () => void | Promise<void>;
|
|
13
19
|
/** 传入则展示返回按钮 */
|
|
14
20
|
onBack?: () => void;
|
|
15
21
|
/** 传入则展示关闭按钮 */
|
|
@@ -18,10 +24,25 @@ export interface CreateAmkEditorLayoutOptions {
|
|
|
18
24
|
t?: AmkI18nInstance['t'];
|
|
19
25
|
}
|
|
20
26
|
export type AmkSaveStatus = 'saving' | 'saved';
|
|
27
|
+
export type AmkExportTaskStatus = 'idle' | 'polling' | 'success' | 'failed';
|
|
28
|
+
export type AmkExportTaskListItem = {
|
|
29
|
+
taskId: string;
|
|
30
|
+
name: string;
|
|
31
|
+
format: 'mp4' | 'mp3';
|
|
32
|
+
status: Exclude<AmkExportTaskStatus, 'idle'>;
|
|
33
|
+
/** 服务端返回的任务进度(0-100);没有进度时使用不定长动画。 */
|
|
34
|
+
progress?: number;
|
|
35
|
+
/** 是否已在当前页面触发过浏览器下载。 */
|
|
36
|
+
downloaded?: boolean;
|
|
37
|
+
outputUrl?: string;
|
|
38
|
+
};
|
|
21
39
|
export interface AmkEditorLayout {
|
|
22
40
|
root: HTMLDivElement;
|
|
23
41
|
workspace: HTMLDivElement;
|
|
42
|
+
setTitle: (title: string) => void;
|
|
24
43
|
setSaveStatus: (status: AmkSaveStatus) => void;
|
|
44
|
+
setExportTasks: (tasks: AmkExportTaskListItem[]) => void;
|
|
45
|
+
openExportTasks: () => void;
|
|
25
46
|
destroy: () => void;
|
|
26
47
|
}
|
|
27
48
|
export declare function resolveHeaderTitle(options: ResolveHeaderTitleOptions): string;
|
package/dist/i18n/keys.d.ts
CHANGED
|
@@ -16,6 +16,21 @@ export declare const AMK_I18N_KEYS: {
|
|
|
16
16
|
readonly saving: "amk.header.saving";
|
|
17
17
|
readonly saved: "amk.header.saved";
|
|
18
18
|
readonly exportVideo: "amk.header.exportVideo";
|
|
19
|
+
readonly exportTasks: "amk.header.exportTasks";
|
|
20
|
+
readonly exportTaskTooltip: "amk.header.exportTaskTooltip";
|
|
21
|
+
readonly exportTaskPolling: "amk.header.exportTaskPolling";
|
|
22
|
+
readonly exportTaskSuccess: "amk.header.exportTaskSuccess";
|
|
23
|
+
readonly exportTaskFailed: "amk.header.exportTaskFailed";
|
|
24
|
+
readonly exportTaskEmpty: "amk.header.exportTaskEmpty";
|
|
25
|
+
readonly exportTaskDownloadReady: "amk.header.exportTaskDownloadReady";
|
|
26
|
+
readonly exportTaskDownload: "amk.header.exportTaskDownload";
|
|
27
|
+
readonly exportTaskDownloadAgain: "amk.header.exportTaskDownloadAgain";
|
|
28
|
+
readonly exportTaskDownloading: "amk.header.exportTaskDownloading";
|
|
29
|
+
readonly exportTaskDownloadFailed: "amk.header.exportTaskDownloadFailed";
|
|
30
|
+
readonly exportTaskDownloadCorsHint: "amk.header.exportTaskDownloadCorsHint";
|
|
31
|
+
readonly exportTaskView: "amk.header.exportTaskView";
|
|
32
|
+
readonly exportTaskVideo: "amk.header.exportTaskVideo";
|
|
33
|
+
readonly exportTaskAudio: "amk.header.exportTaskAudio";
|
|
19
34
|
readonly titleRuleEmpty: "amk.header.titleRuleEmpty";
|
|
20
35
|
readonly titleRuleMaxLength: "amk.header.titleRuleMaxLength";
|
|
21
36
|
readonly titleRuleCharset: "amk.header.titleRuleCharset";
|
package/dist/import-actions.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MaterialItem, SystemMaterialItem } from './types';
|
|
1
|
+
import type { AmkMaterialImportType, AmkMaterialImportRequestOptions, MaterialItem, SystemMaterialItem } from './types';
|
|
2
2
|
import type { AmkI18nInstance } from './i18n';
|
|
3
3
|
interface MountImportActionsOptions {
|
|
4
4
|
/** AMKEditor 自己的浮层容器;按钮仍挂在 VeVeditor 提供的工具栏插槽中。 */
|
|
@@ -7,9 +7,18 @@ interface MountImportActionsOptions {
|
|
|
7
7
|
onUploadMaterial?: (files: File[]) => Promise<MaterialItem[]> | MaterialItem[];
|
|
8
8
|
onUploadUrlMaterial?: (urls: string[]) => Promise<MaterialItem[]> | MaterialItem[];
|
|
9
9
|
onUploadFromSystem?: () => Promise<SystemMaterialItem[] | undefined | null> | SystemMaterialItem[] | undefined | null;
|
|
10
|
-
onMaterialsImported: (materials: SystemMaterialItem[]) =>
|
|
10
|
+
onMaterialsImported: (materials: SystemMaterialItem[]) => MaterialItem[] | Promise<MaterialItem[]>;
|
|
11
11
|
t?: AmkI18nInstance['t'];
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* 素材面板按钮与外部入口共用的控制器。保留可调用的 cleanup 形态,兼容已有
|
|
15
|
+
* `renderImportActions` 挂载协议;外部入口通过 trigger 复用完全相同的导入链路。
|
|
16
|
+
*/
|
|
17
|
+
export type ImportActionsController = (() => void) & {
|
|
18
|
+
hasAction: (type: AmkMaterialImportType) => boolean;
|
|
19
|
+
trigger: (type: AmkMaterialImportType, options?: AmkMaterialImportRequestOptions) => boolean;
|
|
20
|
+
destroy: () => void;
|
|
21
|
+
};
|
|
13
22
|
/** AMK 独立拥有素材导入 UI 与业务回调,VeVeditor 仅提供挂载容器和标准数据写入 API。 */
|
|
14
|
-
export declare function mountImportActions(container: HTMLElement, options: MountImportActionsOptions):
|
|
23
|
+
export declare function mountImportActions(container: HTMLElement, options: MountImportActionsOptions): ImportActionsController;
|
|
15
24
|
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ export type { AmkApiClientOptions, AmkInvokeToolParams } from './api/client';
|
|
|
4
4
|
export type { PresetLibrary, PresetLibraryItem, PresetLibraryResourceKey, } from './api/preset-library';
|
|
5
5
|
export { AMK_I18N_KEYS, createAmkI18n, tAmk, getGlobalAmkI18n, setGlobalAmkI18n, } from './i18n';
|
|
6
6
|
export type { AmkI18nInstance, AmkI18nOptions, Locale, LocaleMessages, Messages, } from './i18n';
|
|
7
|
-
export type { AmkEditorOptions,
|
|
7
|
+
export type { AmkEditorOptions, AmkEditorStorageConfig, AmkEditorUploadSTSCredentials, AmkEditorConfig, AmkEditorDecodeOptions, AmkEditorExportConfig, AmkEditorGetHeaders, AmkEditorHeaderConfig, AmkEditorHeaderTitleUpdateSuccess, AmkEditorInternalConfig, AmkMaterialImportType, AmkMaterialImportRequestOptions, AmkExportRequestResult, AmkProjectSnapshot, ExportVideoParams, MaterialConfig, MaterialItem, PersistExtractUrlsResult, RecommendedExtractStorageFields, SystemMaterialItem, Theme, VeVeditorInstance, } from './types';
|