@byteplus/amk-editor 0.0.0-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.
Files changed (88) hide show
  1. package/LICENSE +11 -0
  2. package/README.md +217 -0
  3. package/dist/amk-editor.d.ts +411 -0
  4. package/dist/amk-modal.d.ts +16 -0
  5. package/dist/api/client.d.ts +63 -0
  6. package/dist/api/preset-library.d.ts +18 -0
  7. package/dist/api/project.d.ts +47 -0
  8. package/dist/asr-progress-modal-view.d.ts +9 -0
  9. package/dist/asr-progress-modal.d.ts +11 -0
  10. package/dist/asr-provider.d.ts +17 -0
  11. package/dist/asr-text-layout.d.ts +4 -0
  12. package/dist/assets/asr-subtitle-dark.svg +3 -0
  13. package/dist/assets/asr-subtitle.svg +3 -0
  14. package/dist/assets/export-empty-dark.svg +66 -0
  15. package/dist/assets/export-empty-ellipse749.svg +3 -0
  16. package/dist/assets/export-empty-ellipse750.svg +3 -0
  17. package/dist/assets/export-empty-ellipse751.svg +3 -0
  18. package/dist/assets/export-empty-ellipse753.svg +3 -0
  19. package/dist/assets/export-empty-img2.svg +10 -0
  20. package/dist/assets/export-empty-img3.svg +10 -0
  21. package/dist/assets/export-empty-subtract.svg +14 -0
  22. package/dist/assets/export-modal-ai.png +0 -0
  23. package/dist/assets/export-modal-close.png +0 -0
  24. package/dist/assets/export-modal-info.png +0 -0
  25. package/dist/assets/export-modal-question.png +0 -0
  26. package/dist/assets/export-modal-select.png +0 -0
  27. package/dist/assets/export-task-error.svg +5 -0
  28. package/dist/assets/export-task-loading.svg +6 -0
  29. package/dist/assets/header-back.png +0 -0
  30. package/dist/assets/header-close.png +0 -0
  31. package/dist/assets/header-close.svg +5 -0
  32. package/dist/assets/header-edit.png +0 -0
  33. package/dist/assets/header-export-download.svg +5 -0
  34. package/dist/assets/header-export-history.svg +5 -0
  35. package/dist/assets/header-export.png +0 -0
  36. package/dist/assets/import-local.svg +3 -0
  37. package/dist/assets/import-menu-chevron-down.svg +3 -0
  38. package/dist/assets/import-menu-local.svg +3 -0
  39. package/dist/assets/import-menu-system-arrow.svg +3 -0
  40. package/dist/assets/import-menu-system-cloud.svg +3 -0
  41. package/dist/assets/import-menu-url.svg +3 -0
  42. package/dist/assets/import-url.svg +10 -0
  43. package/dist/assets/project-loading.svg +6 -0
  44. package/dist/byteplus-export-source-adapter.d.ts +9 -0
  45. package/dist/config-validation.d.ts +3 -0
  46. package/dist/confirm-modal-view.d.ts +16 -0
  47. package/dist/confirm-modal.d.ts +14 -0
  48. package/dist/distribution.d.ts +16 -0
  49. package/dist/export-modal-view.d.ts +13 -0
  50. package/dist/export-modal.d.ts +63 -0
  51. package/dist/export-project-adapter.d.ts +14 -0
  52. package/dist/export-task-polling.d.ts +15 -0
  53. package/dist/header.d.ts +57 -0
  54. package/dist/i18n/index.d.ts +17 -0
  55. package/dist/i18n/keys.d.ts +107 -0
  56. package/dist/i18n/locales/en-US.d.ts +2 -0
  57. package/dist/i18n/locales/zh-CN.d.ts +2 -0
  58. package/dist/import-actions-dropdown-view.d.ts +15 -0
  59. package/dist/import-actions.d.ts +29 -0
  60. package/dist/index.d.ts +9 -0
  61. package/dist/index.js +2907 -0
  62. package/dist/legacy-export-adapter.d.ts +7 -0
  63. package/dist/local-upload-modal-view.d.ts +13 -0
  64. package/dist/local-upload-modal.d.ts +13 -0
  65. package/dist/material-source.d.ts +5 -0
  66. package/dist/modal-page-overscroll.d.ts +4 -0
  67. package/dist/project-bootstrap.d.ts +11 -0
  68. package/dist/public-types.d.ts +147 -0
  69. package/dist/react-mount.d.ts +10 -0
  70. package/dist/refresh-play-info.d.ts +34 -0
  71. package/dist/remote-edit-param-schema.d.ts +29 -0
  72. package/dist/runtime/veveditor.d.ts +6 -0
  73. package/dist/task-polling.d.ts +9 -0
  74. package/dist/task-query-status.d.ts +10 -0
  75. package/dist/toast.d.ts +36 -0
  76. package/dist/tos-upload.d.ts +74 -0
  77. package/dist/types.d.ts +344 -0
  78. package/dist/upload-queue.d.ts +6 -0
  79. package/dist/url-upload-modal-view.d.ts +13 -0
  80. package/dist/url-upload-modal.d.ts +12 -0
  81. package/dist/utils/material-extract.d.ts +62 -0
  82. package/dist/utils/signed-media-url-expiration.d.ts +2 -0
  83. package/dist/veveditor.css +1 -0
  84. package/dist/vod-openapi.d.ts +17 -0
  85. package/dist/vod-upload.d.ts +65 -0
  86. package/dist/xg-player-style-isolation.d.ts +6 -0
  87. package/package.json +43 -0
  88. package/third_party_notice.txt +1207 -0
@@ -0,0 +1,7 @@
1
+ import type { ExportVideoParams } from './types';
2
+ type RecordValue = Record<string, any>;
3
+ export declare function buildExportSubmission(editParam: RecordValue, params: Pick<ExportVideoParams, 'resolution' | 'format' | 'frameRate' | 'codec'>, legacy?: boolean): {
4
+ toolName: string;
5
+ params: Record<string, unknown>;
6
+ };
7
+ export {};
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import type { AmkI18nInstance } from './i18n';
3
+ export interface LocalUploadModalViewProps {
4
+ visible: boolean;
5
+ popupContainer: HTMLElement;
6
+ initialFiles: File[];
7
+ accept?: string;
8
+ t: AmkI18nInstance['t'];
9
+ /** 确认后弹窗立即关闭;上传过程由外部 Message 提示 */
10
+ onConfirm: (files: File[]) => void;
11
+ onClose: () => void;
12
+ }
13
+ export declare function LocalUploadModalView({ visible, popupContainer, initialFiles, accept, t, onConfirm, onClose, }: LocalUploadModalViewProps): React.ReactElement;
@@ -0,0 +1,13 @@
1
+ import type { AmkI18nInstance } from './i18n';
2
+ export interface CreateLocalUploadModalOptions {
3
+ container: HTMLElement;
4
+ accept?: string;
5
+ t: AmkI18nInstance['t'];
6
+ onConfirm: (files: File[]) => void;
7
+ }
8
+ export interface LocalUploadModalController {
9
+ open: (files?: File[]) => void;
10
+ close: () => void;
11
+ destroy: () => void;
12
+ }
13
+ export declare function createLocalUploadModal(options: CreateLocalUploadModalOptions): LocalUploadModalController;
@@ -0,0 +1,5 @@
1
+ /** 媒体资源身份在入库时确定;url 独立保存 HTTP(S) 播放地址。 */
2
+ export declare function resolveMaterialSource(material: {
3
+ source?: unknown;
4
+ source_material_id?: unknown;
5
+ }): string;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Modal 进入 top layer 后锁住宿主页面,同时保留 Modal 内部可滚动区域的正常滚动。
3
+ */
4
+ export declare function lockModalPageOverscroll(): () => void;
@@ -0,0 +1,11 @@
1
+ import type { AmkProjectSnapshot, MaterialItem } from './types';
2
+ /** 预览与导出统一使用 NativeRender 的多语言断行规则。 */
3
+ export declare function addForceMultilingualLineBreak(editParam: Record<string, unknown>): Record<string, unknown>;
4
+ export declare function normalizeLoadedProject(input: AmkProjectSnapshot | undefined): Required<Pick<AmkProjectSnapshot, 'materials' | 'editParam'>> & {
5
+ projectName?: string;
6
+ };
7
+ export declare function toEditorInitialData(params: {
8
+ projectName?: string;
9
+ materials: MaterialItem[];
10
+ editParam: Record<string, unknown>;
11
+ }): AmkProjectSnapshot;
@@ -0,0 +1,147 @@
1
+ /**
2
+ * 公网包的自包含类型契约。
3
+ *
4
+ * 这些类型与底层编辑器的公开 Options 保持结构兼容,但不引用底层内部包,
5
+ * 避免公网用户安装 amk-editor 时还需要访问内网依赖。
6
+ */
7
+ export type VeVeditorTheme = 'light' | 'dark';
8
+ export type VeVeditorMediaErrorCategory = 'aborted' | 'network' | 'network_or_cors' | 'decode' | 'unsupported' | 'cors' | 'render' | 'initialization' | 'unknown';
9
+ export interface VeVeditorMediaError {
10
+ name: 'VideoEditorMediaError';
11
+ type: 'video' | 'audio' | 'image' | string;
12
+ phase: 'init' | 'load' | 'decode' | 'render';
13
+ code: string;
14
+ category: VeVeditorMediaErrorCategory;
15
+ message: string;
16
+ url?: string;
17
+ nativeCode?: number;
18
+ possibleCauses: string[];
19
+ cause?: {
20
+ name?: string;
21
+ message: string;
22
+ };
23
+ originalEvent?: Event;
24
+ }
25
+ export interface VeVeditorMaterialItem {
26
+ id?: string;
27
+ type?: 'video' | 'audio' | 'image' | string;
28
+ source: string;
29
+ material_id?: string;
30
+ source_material_id?: string;
31
+ url?: string;
32
+ poster?: string;
33
+ sprite?: string | Record<string, unknown>;
34
+ waveform?: string | Record<string, unknown>;
35
+ duration?: number;
36
+ width?: number;
37
+ height?: number;
38
+ kid?: string;
39
+ bizMeta?: Record<string, unknown>;
40
+ [key: string]: unknown;
41
+ }
42
+ export interface VeVeditorI18nOptions {
43
+ locale?: string;
44
+ messages?: Record<string, Record<string, string>>;
45
+ messageOverrides?: Record<string, string>;
46
+ }
47
+ export interface VeVeditorDecodeOptions {
48
+ enableAudioFrontendDecode?: boolean;
49
+ /** @default true */
50
+ enableVideoFrontendDecode?: boolean;
51
+ decodeConcurrency?: number;
52
+ decodeTopK?: number;
53
+ enableThumbnailDecode?: boolean;
54
+ }
55
+ export type VeVeditorResourceOptionTypes = {
56
+ font: unknown;
57
+ wordArt: unknown;
58
+ textAnimation: unknown;
59
+ transition: unknown;
60
+ filter: unknown;
61
+ effect: unknown;
62
+ };
63
+ export type VeVeditorResourceSource<T = unknown> = T[] | {
64
+ resources: T[];
65
+ categories?: Array<Record<string, unknown>>;
66
+ } | (() => Promise<T[] | {
67
+ resources: T[];
68
+ categories?: Array<Record<string, unknown>>;
69
+ }>) | false;
70
+ export interface VeVeditorMaterialOptions<TMaterialItem = VeVeditorMaterialItem> {
71
+ show?: boolean;
72
+ emptyIcon?: string;
73
+ showClassification?: boolean;
74
+ defaultClassificationId?: string | null;
75
+ showExportVideoClassification?: boolean;
76
+ sketchItems?: TMaterialItem[];
77
+ sketchShowAdd?: boolean;
78
+ sketchShowDelete?: boolean;
79
+ showProductCategory?: boolean;
80
+ renderChannels?: () => unknown;
81
+ renderImportActions?: (container: HTMLElement) => void | (() => void);
82
+ onDeleteMaterial?: (material: TMaterialItem) => boolean | void | Promise<boolean | void>;
83
+ }
84
+ export interface VeVeditorOptions<TMaterialOptions = VeVeditorMaterialOptions, TI18nOptions = VeVeditorI18nOptions, TResourceOptions extends VeVeditorResourceOptionTypes = VeVeditorResourceOptionTypes> {
85
+ container: HTMLElement;
86
+ /** 埋点来源标识,用于区分业务接入方。 */
87
+ source?: string;
88
+ /** 埋点账号 ID;上报时写入事件 params.AccountID(对齐 master)。 */
89
+ accountId?: string;
90
+ theme?: VeVeditorTheme;
91
+ /** 项目加载页配置;默认展示 SDK 内置 loading,设为 false 后由宿主自行渲染。 */
92
+ loading?: {
93
+ show?: boolean;
94
+ };
95
+ material?: TMaterialOptions;
96
+ i18n?: TI18nOptions;
97
+ decode?: VeVeditorDecodeOptions;
98
+ track?: Record<string, unknown>;
99
+ toolbar?: Record<string, unknown>;
100
+ navigationBar?: Record<string, unknown>;
101
+ videoOperationBar?: Record<string, unknown>;
102
+ layout?: Record<string, unknown>;
103
+ ui?: Record<string, unknown>;
104
+ shortcut?: Record<string, boolean | undefined>;
105
+ interaction?: {
106
+ readonly?: boolean;
107
+ };
108
+ frameRate?: {
109
+ type?: 'source' | 'target';
110
+ frameRate?: number;
111
+ };
112
+ timeDisplayFormat?: 'hms' | 'msms' | 'msf';
113
+ crashedFallback?: string;
114
+ debug?: boolean;
115
+ renderMode?: 'webgl' | 'native';
116
+ initialData?: Record<string, unknown>;
117
+ font?: TResourceOptions['font'];
118
+ wordArt?: TResourceOptions['wordArt'];
119
+ textAnimation?: TResourceOptions['textAnimation'];
120
+ transition?: TResourceOptions['transition'];
121
+ filter?: TResourceOptions['filter'];
122
+ effect?: TResourceOptions['effect'];
123
+ recording?: Record<string, unknown>;
124
+ onSketchItemsChange?: (params: {
125
+ sketchItems?: VeVeditorMaterialItem[];
126
+ action?: 'delete' | 'add';
127
+ item?: unknown;
128
+ }) => void;
129
+ onNodePreviewError?: (type: 'video' | 'audio' | 'image', node: unknown, error?: VeVeditorMediaError) => void;
130
+ onPreviewNodeRefresh?: (type: 'video' | 'audio' | 'image', node: unknown) => void | Promise<void>;
131
+ onBeforeUndo?: (payload: unknown) => boolean | void;
132
+ onBeforeRedo?: (payload: unknown) => boolean | void;
133
+ onBeforeTimestampMount?: (params: Record<string, unknown>) => boolean | Promise<boolean>;
134
+ onBeforeKeyframeMount?: (params: Record<string, unknown>) => boolean | Promise<boolean>;
135
+ onTrackChanged?: (payload: unknown) => unknown;
136
+ onRecordingUpload?: (params: Record<string, unknown>) => Promise<boolean | {
137
+ success: boolean;
138
+ url?: string;
139
+ name?: string;
140
+ userDataPatch?: Record<string, unknown>;
141
+ }> | boolean | {
142
+ success: boolean;
143
+ url?: string;
144
+ name?: string;
145
+ userDataPatch?: Record<string, unknown>;
146
+ };
147
+ }
@@ -0,0 +1,10 @@
1
+ import type { ReactElement } from 'react';
2
+ /**
3
+ * React 18/19 挂载封装:createRoot + render / unmount。
4
+ * 避免 ReactDOM.render / unmountComponentAtNode(React 18 弃用,19 已移除)。
5
+ * 命令式 modal 宿主需要同步刷 DOM,故 render 包一层 flushSync。
6
+ */
7
+ export declare function createReactMount(container: HTMLElement): {
8
+ render: (element: ReactElement) => void;
9
+ unmount: () => void;
10
+ };
@@ -0,0 +1,34 @@
1
+ import type { MaterialItem } from './types';
2
+ /**
3
+ * 业务方回写的播放信息补丁;未返回的字段保持原样。
4
+ * 优先按 SDK 内部 material_id 匹配,随后按业务 source_material_id 兜底;
5
+ * 两个标识都没有的补丁才按数组下标兜底。
6
+ * 可更新 url / poster / sprite / source_material_id 等。
7
+ * material_id 为 SDK 内部字段,补丁中的同名字段会被忽略。
8
+ */
9
+ export type MaterialPlayInfoPatch = Partial<MaterialItem> & {
10
+ material_id?: string;
11
+ source_material_id?: string;
12
+ };
13
+ /** SDK 内部素材关联键:material_id(不暴露给业务改写) */
14
+ export declare function resolveMaterialId(material: Pick<MaterialItem, 'material_id'> | MaterialPlayInfoPatch): string;
15
+ /** 业务侧 / Editing API 主键:source_material_id */
16
+ export declare function resolveSourceMaterialId(material: MaterialItem | MaterialPlayInfoPatch | Record<string, unknown>): string;
17
+ export declare function mergePlayInfoOverrides(materials: MaterialItem[], overrides: MaterialPlayInfoPatch | MaterialPlayInfoPatch[]): MaterialItem[];
18
+ /**
19
+ * 将异步播放信息刷新结果变基到最新素材列表。
20
+ * 刷新期间新写入的 sprite/poster 等字段会被保留;只有相对刷新前快照
21
+ * 确实发生变化的字段才会覆盖最新值,保证后完成的刷新不会回滚并发更新。
22
+ */
23
+ export declare function mergeRefreshedPlayInfoIntoLatest(latestMaterials: MaterialItem[], baseMaterials: MaterialItem[], refreshedTargets: MaterialPlayInfoPatch | MaterialPlayInfoPatch[]): MaterialItem[];
24
+ /** 从当前素材库按 material_id 选出待刷新列表;未传则全量有 material_id 的素材。 */
25
+ export declare function pickMaterialsForRefresh(materials: MaterialItem[], materialIdOrIds?: string | string[]): MaterialItem[];
26
+ /**
27
+ * 初始化刷新分组:轨道实际引用的素材进入首屏关键路径,其余素材留到
28
+ * 编辑器挂载后刷新。两个分组都保持素材库原有顺序,且忽略无 material_id
29
+ * 的条目(它们本身无法参与播放信息刷新)。
30
+ */
31
+ export declare function partitionMaterialsByTrack(materials: MaterialItem[], track: unknown): {
32
+ trackMaterials: MaterialItem[];
33
+ remainingMaterials: MaterialItem[];
34
+ };
@@ -0,0 +1,29 @@
1
+ export declare const REMOTE_MEDIA_SPEED_MIN = 0.1;
2
+ export declare const REMOTE_MEDIA_SPEED_MAX = 4;
3
+ export declare const REMOTE_MEDIA_SPEED_DEFAULT = 1;
4
+ export declare const REMOTE_MEDIA_VOLUME_MIN = 0;
5
+ export declare const REMOTE_MEDIA_VOLUME_MAX = 4;
6
+ export declare const REMOTE_TRANSFORM_ALPHA_MIN = 0;
7
+ export declare const REMOTE_TRANSFORM_ALPHA_MAX = 1;
8
+ export declare const REMOTE_COLOR_ADJUSTMENT_MIN = 0;
9
+ export declare const REMOTE_COLOR_ADJUSTMENT_MAX = 1;
10
+ export declare const REMOTE_MEDIA_FADE_MIN_MS = 0;
11
+ export declare const REMOTE_MEDIA_FADE_MAX_MS = 2000;
12
+ export type RemoteEditParamSchemaIssue = {
13
+ path: string;
14
+ rule: 'media_speed' | 'media_volume' | 'transform_alpha' | 'color_adjustment' | 'media_fade';
15
+ reason: 'invalid_number' | 'coerced_number' | 'below_minimum' | 'above_maximum';
16
+ received: unknown;
17
+ normalized: number;
18
+ };
19
+ export type RemoteEditParamSchemaResult = {
20
+ value: Record<string, unknown>;
21
+ issues: RemoteEditParamSchemaIssue[];
22
+ };
23
+ /**
24
+ * 远端 editor document 进入 SDK 前的统一 schema 边界。
25
+ *
26
+ * 规则采用兼容式清洗:保留未知字段,只修正已声明且会影响 SDK 稳定性的字段。
27
+ * 新规则应加入 REMOTE_EDIT_PARAM_SCHEMA_RULES,禁止散落到本地编辑/保存链路。
28
+ */
29
+ export declare function parseRemoteEditParam(input: unknown): RemoteEditParamSchemaResult;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 构建占位模块:发布构建由 build.mjs 替换为内联的 VeVeditor UMD。
3
+ * 测试环境通过 Vitest mock 此模块注入编辑器实例。
4
+ */
5
+ declare const VeVeditor: any;
6
+ export default VeVeditor;
@@ -0,0 +1,9 @@
1
+ export declare function getTaskPollDelayMs(attempt: number): number;
2
+ export type TaskPollingController = {
3
+ cancel: () => void;
4
+ };
5
+ export declare function startTaskPolling(options: {
6
+ poll: () => Promise<boolean>;
7
+ onError?: (error: unknown) => void | Promise<void>;
8
+ getDelayMs?: (attempt: number) => number;
9
+ }): TaskPollingController;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 查询任务信息 API 的官方响应状态。
3
+ * @see https://docs.volcengine.com/docs/6448/2278532?lang=zh
4
+ */
5
+ export type AmkTaskQueryStatus = 'running' | 'completed' | 'failed';
6
+ /**
7
+ * `success` 表示查询请求本身是否成功;查询成功后才读取任务 `status`。
8
+ * 非官方响应同样按失败收口,避免未知响应被无限轮询。
9
+ */
10
+ export declare function resolveAmkTaskQueryStatus(payload: unknown): AmkTaskQueryStatus;
@@ -0,0 +1,36 @@
1
+ export type AmkMessageType = 'info' | 'warning' | 'error' | 'success' | 'loading';
2
+ export interface AmkMessageAction {
3
+ label: string;
4
+ onClick: () => void;
5
+ }
6
+ export interface ShowAmkMessageOptions {
7
+ action?: AmkMessageAction;
8
+ durationMs?: number;
9
+ type?: AmkMessageType;
10
+ }
11
+ type MessageCloser = () => void;
12
+ export type AmkMessageScope = {
13
+ loading: (content: string) => MessageCloser;
14
+ success: (content: string, options?: Pick<ShowAmkMessageOptions, 'action'>) => MessageCloser;
15
+ error: (content: string) => MessageCloser;
16
+ warning: (content: string) => MessageCloser;
17
+ info: (content: string) => MessageCloser;
18
+ clear: () => void;
19
+ };
20
+ /** 为单个编辑器/控制器创建消息作用域,销毁时只清理自己的全局 Message。 */
21
+ export declare function createAmkMessageScope(): AmkMessageScope;
22
+ /** VeDesign 全局 Message;保留 AMK 原有命令式调用方式。 */
23
+ export declare const Message: {
24
+ loading(content: string): MessageCloser;
25
+ success(content: string, options?: Pick<ShowAmkMessageOptions, "action">): MessageCloser;
26
+ error(content: string): MessageCloser;
27
+ warning(content: string): MessageCloser;
28
+ info(content: string): MessageCloser;
29
+ clear(): void;
30
+ };
31
+ /** @deprecated 使用 Message.* */
32
+ export declare function showAmkToast(message: string, options?: {
33
+ type?: Exclude<AmkMessageType, 'loading'>;
34
+ durationMs?: number;
35
+ }): void;
36
+ export {};
@@ -0,0 +1,74 @@
1
+ import type { AmkEditorStorageConfig, AmkEditorUploadSTSCredentials, MaterialItem } from './types';
2
+ export declare const DEFAULT_TOS_REGION = "cn-beijing";
3
+ export declare const DEFAULT_SIGNED_URL_EXPIRES_SECONDS: number;
4
+ export declare const TOS_SIGNED_URL_REFRESH_AHEAD_MS: number;
5
+ /** 签名最长 24 小时,但不能超过本次 STS 凭证的剩余有效期。 */
6
+ export declare function resolveSignedUrlExpiresSeconds(credentials: AmkEditorUploadSTSCredentials, now?: number): number;
7
+ /** 解析 TOS V4 签名 URL 的绝对过期时间;非 TOS 签名链返回 null。 */
8
+ export declare function resolveTosSignedUrlExpiresAt(urlValue: unknown): number | null;
9
+ interface TosClientLike {
10
+ putObject(input: {
11
+ bucket: string;
12
+ key: string;
13
+ body: File;
14
+ contentType?: string;
15
+ }): Promise<unknown>;
16
+ getPreSignedUrl(input: {
17
+ bucket: string;
18
+ key: string;
19
+ method?: 'GET' | 'PUT';
20
+ expires?: number;
21
+ }): string;
22
+ }
23
+ interface UploadFilesToTosOptions {
24
+ files: File[];
25
+ projectId: string;
26
+ storage: AmkEditorStorageConfig;
27
+ createClient?: (credentials: AmkEditorUploadSTSCredentials, region: string) => TosClientLike;
28
+ /** 单个文件完成 TOS 上传后回调;批量 Promise 会等待该文件的回调完成。 */
29
+ onFileUploaded?: (material: MaterialItem, index: number) => void | Promise<void>;
30
+ }
31
+ type UploadFileToTosOptions = Omit<UploadFilesToTosOptions, 'files' | 'onFileUploaded'> & {
32
+ file: File;
33
+ };
34
+ interface RefreshTosMaterialUrlsOptions {
35
+ materials: MaterialItem[];
36
+ storage: AmkEditorStorageConfig;
37
+ createClient?: UploadFilesToTosOptions['createClient'];
38
+ }
39
+ /** TOS 素材的稳定标识已包含 bucket 与 object key,无需额外持久化内部字段。 */
40
+ export declare function parseTosResourceUrl(value: unknown): {
41
+ bucket: string;
42
+ key: string;
43
+ } | null;
44
+ /** 业务 ID 可独立于存储地址,优先有效 source_material_id,否则使用 source。 */
45
+ export declare function resolveTosMaterialSource(material: {
46
+ source_material_id?: unknown;
47
+ source?: unknown;
48
+ }): string | undefined;
49
+ /** 与素材 TOS 上传保持一致,保留配置的产物存储目录。 */
50
+ export declare function resolveTosOutputDestination(destination: string | undefined): string | undefined;
51
+ /** 使用宿主下发的临时 STS 将本地文件直传客户 TOS,并转换为编辑器素材。 */
52
+ export declare function uploadFilesToTos(options: UploadFilesToTosOptions): Promise<MaterialItem[]>;
53
+ /**
54
+ * 内置 TOS 的单文件上传实现。本地多选时仍由上层 SDK 调度,
55
+ * 使 TOS 和业务自定义 onUploadFile 共用同一条逐项回写链路。
56
+ */
57
+ export declare function uploadFileToTos(options: UploadFileToTosOptions): Promise<MaterialItem>;
58
+ /** 为已持久化的私有 TOS 素材重新生成播放签名,供初始化和按需刷新使用。 */
59
+ export declare function refreshTosMaterialUrls(options: RefreshTosMaterialUrlsOptions): Promise<Array<Partial<MaterialItem> & {
60
+ material_id: string;
61
+ }>>;
62
+ /** 将任意任务产物中的 tos:// 地址批量签成浏览器可访问的 HTTP URL。 */
63
+ export declare function signTosResourceUrls(options: {
64
+ urls: unknown[];
65
+ storage: AmkEditorStorageConfig;
66
+ createClient?: UploadFilesToTosOptions['createClient'];
67
+ }): Promise<unknown[]>;
68
+ /** 为资产库导入的 TOS 素材签发播放 URL;稳定身份仍保留在 source_material_id。 */
69
+ export declare function signTosImportedMaterialUrls(options: {
70
+ materials: MaterialItem[];
71
+ storage: AmkEditorStorageConfig;
72
+ createClient?: UploadFilesToTosOptions['createClient'];
73
+ }): Promise<MaterialItem[]>;
74
+ export {};