@volcengine/amk-editor 0.0.2-beta.0 → 0.0.2-beta.1
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 +35 -17
- package/dist/amk-editor.d.ts +27 -5
- package/dist/api/client.d.ts +4 -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/header.d.ts +3 -0
- package/dist/import-actions.d.ts +12 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2307 -2045
- package/dist/local-upload-modal.d.ts +1 -1
- package/dist/types.d.ts +28 -6
- package/dist/veveditor.css +15 -4
- package/package.json +1 -1
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,21 @@ 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();
|
|
51
54
|
```
|
|
52
55
|
页面卸载时销毁:
|
|
53
56
|
```ts
|
|
@@ -55,8 +58,23 @@ editor.destroy();
|
|
|
55
58
|
```
|
|
56
59
|
## 接入说明
|
|
57
60
|
- `projectId`、`endpoint` 必填。`endpoint` 指向你的业务代理。
|
|
58
|
-
- `
|
|
61
|
+
- `theme` 默认 `light`。未传或传入其他值时按浅色渲染;只有显式 `theme: 'dark'` 才走暗色。
|
|
62
|
+
- 产物是单文件 ESM。依赖里的 AMD `define(["./core"])` 已在构建时剔除,避免 Next.js / webpack 误解析不存在的 `dist/core.js`。
|
|
63
|
+
- `getHeaders` 可选,每次请求前都会重新调用;SDK 不解析、不缓存、不改写返回值,仅将其合并到发往 `endpoint` 的工程、素材、tools、tasks、导出等请求中。闭包内 Token 更新会自动用于下一次请求。
|
|
59
64
|
- 本地上传、URL 导入由业务回调完成。返回的素材必须带业务主键 `source_material_id`,不必填写 `material_id`。
|
|
60
65
|
- 播放地址、封面、雪碧图可能有时效。通过 `onRefreshPlayInfo` 返回新的访问地址。
|
|
66
|
+
- 可选实现 `onMaterialsImported`:素材成功入库后回调已合并 `material_id` 的列表;可用于把新素材挂到对话草稿。失败或取消不会触发。
|
|
61
67
|
- 可选实现 `onPersistExtractUrls`:把抽帧得到的临时地址转存为业务长期地址,并随 `materialPatch` 写回自定义存储字段。
|
|
62
68
|
- 可选配置 `export.qualityEnhancement: true` 以在导出弹窗展示「视频画质增强」;默认不展示。
|
|
69
|
+
- 可选配置 `header.mount` 为外部 DOM 节点,将顶栏渲染到该节点(而不是编辑器内部),便于宿主做全宽顶栏;`header.show: false` 仍可完全隐藏顶栏。
|
|
70
|
+
- 可选配置 `header.onTitleUpdateSuccess`:工程名 PATCH 成功后回调 `{ projectId, title }`。保存成功前编辑器继续展示旧名称;保存失败不会修改编辑器标题,也不会触发回调。
|
|
71
|
+
- `requestMaterialImport(type, options?)` 返回是否成功触发已配置入口;`local`、`url`、`system` 分别要求存在本地上传能力、`onUploadUrlMaterial`、`onUploadFromSystem`。外部入口不会复制上传逻辑,仍走素材面板相同的回调、TOS 签名、素材入库与元信息处理。可选的 `options.onMaterialsImported` 只对这一次外部触发有效,编辑器自身的导入按钮不会调用它。
|
|
72
|
+
- `toolbar.customItems` 的只读态不会自动置灰。需要禁用时在该项 `disabled({ readonly })` 里自行返回 true(例如 `disabled: ({ readonly }) => readonly`)。录音中仍会全局锁定自定义项。内置 ASR 按钮在只读时仍会禁用。
|
|
73
|
+
- `refreshProject()` 会等待当前保存队列结束,再重新拉取工程、刷新临时播放地址并热更新素材与 Track;远端 Track 不会写入本地撤销历史,也不会被自动保存回服务端。
|
|
74
|
+
## 样式隔离
|
|
75
|
+
SDK 会随 `import '@volcengine/amk-editor'` 自动注入样式,导航栏、左侧分类、素材网格的布局由 SDK 自己负责。**接入方不必再写补丁 CSS 才能让界面正常显示。**
|
|
76
|
+
编辑器挂在普通 DOM(`#track-video-editor`)里,不是 Shadow DOM。宿主页面里针对 `section` / `nav` / `aside` 的全局布局重置会穿透进来,把顶栏或左侧分类挤扁。
|
|
77
|
+
请避免:
|
|
78
|
+
- 对 `section`、`nav`、`aside` 写全局 `display` / `flex` / `height` / `margin` 规则。
|
|
79
|
+
- 用 `#track-video-editor nav { ... }` 这类按标签名锁定内部节点。同名标签在编辑器里用途不同,一条规则会同时打到顶栏和分类栏。
|
|
80
|
+
如需约束编辑器尺寸,只设置挂载容器或 `#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,7 @@ export declare class AmkEditor {
|
|
|
10
10
|
private layout?;
|
|
11
11
|
private exportModal?;
|
|
12
12
|
private exportRequestInFlight?;
|
|
13
|
+
private importActions?;
|
|
13
14
|
private asrProgressModal?;
|
|
14
15
|
private confirmModal?;
|
|
15
16
|
private emptyTrackConfirmInFlight?;
|
|
@@ -24,6 +25,7 @@ export declare class AmkEditor {
|
|
|
24
25
|
private emptyTrackSaveBlocked;
|
|
25
26
|
private savedMaterials;
|
|
26
27
|
private saveQueue;
|
|
28
|
+
private projectRefreshInFlight?;
|
|
27
29
|
private pendingSaveCount;
|
|
28
30
|
private readonly asrPollingControllers;
|
|
29
31
|
/** 当前前台 ASR 会话;取消、关闭或销毁后直接丢弃,不写入工程 JSON。 */
|
|
@@ -65,8 +67,6 @@ export declare class AmkEditor {
|
|
|
65
67
|
whenReady(): Promise<this>;
|
|
66
68
|
getEditor(): VeVeditorInstance | undefined;
|
|
67
69
|
getI18n(): AmkI18nInstance;
|
|
68
|
-
/** 替换后续 AMK 请求使用的鉴权 Header 提供器;传入 null/undefined 可清除。 */
|
|
69
|
-
setAuth(auth?: AmkEditorAuthConfig | null): void;
|
|
70
70
|
/** 通用工具调用:POST /api/v1/tools/{toolName} */
|
|
71
71
|
invokeTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
72
72
|
/**
|
|
@@ -75,11 +75,29 @@ export declare class AmkEditor {
|
|
|
75
75
|
* uses `open()` + direct submit and is unchanged.
|
|
76
76
|
*/
|
|
77
77
|
requestExport(): Promise<AmkExportRequestResult>;
|
|
78
|
+
/**
|
|
79
|
+
* 从外部工具栏打开 AMK Editor 已配置的素材导入入口。
|
|
80
|
+
* 本地、URL、资产库均复用素材面板中的同一套弹窗、回调和入库链路。
|
|
81
|
+
* @returns 当前入口存在且已触发时返回 true;未配置或尚未挂载时返回 false。
|
|
82
|
+
*/
|
|
83
|
+
requestMaterialImport(type: AmkMaterialImportType, options?: AmkMaterialImportRequestOptions): boolean;
|
|
78
84
|
/**
|
|
79
85
|
* 获取工程全量参数(materials + editParam + projectName)。
|
|
80
86
|
* 从 VeVeditor 当前素材/草稿快照读取;未挂载时回落内置拉取到的快照。
|
|
81
87
|
*/
|
|
82
88
|
getProject(): AmkProjectSnapshot;
|
|
89
|
+
/**
|
|
90
|
+
* 从 Editing 工程接口重新拉取完整素材列表。
|
|
91
|
+
* 与 `getProject()` 的当前编辑器快照不同,该方法每次都会请求服务端,
|
|
92
|
+
* 适合素材引用面板等必须包含最新导出产物的场景。
|
|
93
|
+
*/
|
|
94
|
+
fetchProjectMaterials(): Promise<MaterialItem[]>;
|
|
95
|
+
/**
|
|
96
|
+
* 重新拉取服务端工程,并把最新素材与 Track 热更新到当前编辑器。
|
|
97
|
+
* 用于 Agent 完成远端编辑后刷新右侧预览;不会产生撤销记录,也不会把回灌事件再次保存到服务端。
|
|
98
|
+
*/
|
|
99
|
+
refreshProject(): Promise<AmkProjectSnapshot>;
|
|
100
|
+
private refreshProjectFromServer;
|
|
83
101
|
/**
|
|
84
102
|
* 刷新素材播放信息(按需触发,如播放前 / 初始化)。
|
|
85
103
|
* - TOS 直传素材会先使用临时 STS 重签私有对象 URL
|
|
@@ -181,10 +199,14 @@ export declare class AmkEditor {
|
|
|
181
199
|
* POST 远端素材库 → 按 sprite/poster 判断发起抽帧并 PUT 更新。
|
|
182
200
|
*/
|
|
183
201
|
private ingestImportedMaterials;
|
|
202
|
+
/**
|
|
203
|
+
* 通知宿主素材已入库。抽帧仍在后台进行,不阻塞对话引用。
|
|
204
|
+
*/
|
|
205
|
+
private notifyMaterialsImported;
|
|
184
206
|
/**
|
|
185
207
|
* 本地上传 / URL 上传完成后,将新素材 POST 到 Editing API。
|
|
186
|
-
*
|
|
187
|
-
*
|
|
208
|
+
* 先确保远端持久化并合并 Editing API 返回的 material_id;成功后调用方
|
|
209
|
+
* 才写入素材面板(业务不用传 material_id;不覆盖本地 source / kid / 预览字段)。
|
|
188
210
|
*/
|
|
189
211
|
private persistUploadedMaterials;
|
|
190
212
|
private isHttpUrl;
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AmkEditorGetHeaders } from '../types';
|
|
2
2
|
export type AmkApiClientOptions = {
|
|
3
3
|
endpoint: string;
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/** 每次请求前动态获取并原样透传给客户业务代理的请求头。 */
|
|
5
|
+
getHeaders?: AmkEditorGetHeaders;
|
|
6
6
|
/** 调用 tools 接口时写入请求体的产物存储目标,例如 `tos://bucket`。 */
|
|
7
7
|
mediaOutputDestination?: string;
|
|
8
8
|
};
|
|
@@ -16,12 +16,10 @@ export type AmkInvokeToolParams = {
|
|
|
16
16
|
};
|
|
17
17
|
export declare class AmkApiClient {
|
|
18
18
|
private readonly baseUrl;
|
|
19
|
-
private
|
|
19
|
+
private readonly getHeaders?;
|
|
20
20
|
private readonly mediaOutputDestination?;
|
|
21
21
|
constructor(options: AmkApiClientOptions);
|
|
22
22
|
getBaseUrl(): string;
|
|
23
|
-
/** 替换后续请求使用的鉴权 Header 提供器;传入 null/undefined 可清除。 */
|
|
24
|
-
setAuth(auth?: AmkEditorAuthConfig | null): void;
|
|
25
23
|
invokeTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
26
24
|
invokeSyncTool<T = unknown>(options: AmkInvokeToolParams): Promise<T>;
|
|
27
25
|
private mergeToolParams;
|
|
@@ -39,6 +37,5 @@ export declare class AmkApiClient {
|
|
|
39
37
|
body?: unknown;
|
|
40
38
|
signal?: AbortSignal;
|
|
41
39
|
}): Promise<T>;
|
|
42
|
-
private resolveAuthHeaders;
|
|
43
40
|
}
|
|
44
41
|
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;
|
package/dist/header.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface CreateAmkEditorLayoutOptions {
|
|
|
9
9
|
title: string;
|
|
10
10
|
theme?: 'light' | 'dark';
|
|
11
11
|
showHeader: boolean;
|
|
12
|
+
/** When set, append the header here instead of inside the editor root. */
|
|
13
|
+
headerMount?: HTMLElement;
|
|
12
14
|
onExport: () => void;
|
|
13
15
|
/** 传入则展示返回按钮 */
|
|
14
16
|
onBack?: () => void;
|
|
@@ -21,6 +23,7 @@ export type AmkSaveStatus = 'saving' | 'saved';
|
|
|
21
23
|
export interface AmkEditorLayout {
|
|
22
24
|
root: HTMLDivElement;
|
|
23
25
|
workspace: HTMLDivElement;
|
|
26
|
+
setTitle: (title: string) => void;
|
|
24
27
|
setSaveStatus: (status: AmkSaveStatus) => void;
|
|
25
28
|
destroy: () => void;
|
|
26
29
|
}
|
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';
|