@meframe/adapter-medeo 0.0.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 ADDED
@@ -0,0 +1,30 @@
1
+ ## @meframe/adapter-medeo
2
+
3
+ Convert Medeo `VideoDraft` (JSON) into `@meframe/core` `CompositionModelData`.
4
+
5
+ ### Install
6
+
7
+ ```bash
8
+ pnpm add @meframe/adapter-medeo
9
+ ```
10
+
11
+ ### Usage
12
+
13
+ ```ts
14
+ import { parseVideoDraft, resolveResources, toCompositionModel } from '@meframe/adapter-medeo';
15
+
16
+ const draft = parseVideoDraft(draftJson);
17
+
18
+ // Optional: resolve assets (e.g. map storage_key -> public URL)
19
+ const assets = await resolveResources(draft, {
20
+ getPublicUrl: (storageKey) => `https://cdn.example.com/${storageKey}`,
21
+ });
22
+
23
+ const model = toCompositionModel(draft, { assets });
24
+ ```
25
+
26
+ ### API
27
+
28
+ - `parseVideoDraft(raw)`
29
+ - `resolveResources(draft, { getPublicUrl, fetchAsset? })`
30
+ - `toCompositionModel(draft, options)`
@@ -0,0 +1,6 @@
1
+ export type { AspectRatio, GetPublicUrl, VideoDraft, Asset, AssetFetcher, BgmClip, CaptionClip, ClipList, MainClip, SpeechClip, MedeoTimeline, ToCompositionModelOptions, } from './types.js';
2
+ export { toCompositionModel } from './to-composition-model.js';
3
+ export { resolveResources } from './resolve-resources.js';
4
+ export type { VideoDraftRaw } from './parse-video-draft.js';
5
+ export { parseVideoDraft } from './parse-video-draft.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACL,YAAY,EACZ,OAAO,EACP,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,EACb,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { toCompositionModel } from './to-composition-model.js';
2
+ export { resolveResources } from './resolve-resources.js';
3
+ export { parseVideoDraft } from './parse-video-draft.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type { VideoDraft } from './types.js';
2
+ export interface VideoDraftRaw {
3
+ id: string;
4
+ timeline?: {
5
+ duration_ms?: number;
6
+ unit_time_ms?: number;
7
+ };
8
+ video_creation_settings?: {
9
+ aspect_ratio?: string;
10
+ };
11
+ main_track?: {
12
+ items?: Array<{
13
+ abs_time_position?: number;
14
+ part_id?: string;
15
+ }>;
16
+ };
17
+ below_main_tracks?: Array<{
18
+ parts_kind?: string;
19
+ is_hidden?: boolean;
20
+ items?: Array<{
21
+ abs_time_position?: number;
22
+ part_id?: string;
23
+ }>;
24
+ }>;
25
+ above_main_tracks?: Array<{
26
+ parts_kind?: string;
27
+ is_hidden?: boolean;
28
+ items?: Array<{
29
+ abs_time_position?: number;
30
+ part_id?: string;
31
+ }>;
32
+ }>;
33
+ part_library?: Record<string, {
34
+ video_clip?: {
35
+ id?: string;
36
+ duration_ms?: number;
37
+ play_in?: number;
38
+ origin_media_id?: string;
39
+ volume?: number;
40
+ };
41
+ bgm?: {
42
+ id?: string;
43
+ duration_ms?: number;
44
+ origin_media_id?: string;
45
+ audio_storage_key?: string;
46
+ volume?: number;
47
+ };
48
+ speech?: {
49
+ id?: string;
50
+ duration_ms?: number;
51
+ origin_speech_id?: string;
52
+ audio_storage_key?: string;
53
+ volume?: number;
54
+ };
55
+ caption?: {
56
+ id?: string;
57
+ duration_ms?: number;
58
+ text?: string;
59
+ start_ms?: number;
60
+ speech_part_id?: string;
61
+ };
62
+ }>;
63
+ }
64
+ export declare function parseVideoDraft(raw: VideoDraftRaw): VideoDraft;
65
+ //# sourceMappingURL=parse-video-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-video-draft.d.ts","sourceRoot":"","sources":["../src/parse-video-draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8C,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,uBAAuB,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEpD,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACjF,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjE,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjE,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,MAAM,CACnB,MAAM,EACN;QACE,UAAU,CAAC,EAAE;YACX,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,GAAG,CAAC,EAAE;YACJ,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,eAAe,CAAC,EAAE,MAAM,CAAC;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CACF,CAAC;CACH;AAaD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAuH9D"}
@@ -0,0 +1,103 @@
1
+ function toList(items) {
2
+ return { toArray: () => items };
3
+ }
4
+ function mustGet(value, field) {
5
+ if (value === null || value === undefined) {
6
+ throw new Error(`Missing field: ${field}`);
7
+ }
8
+ return value;
9
+ }
10
+ export function parseVideoDraft(raw) {
11
+ const partLibrary = raw.part_library ?? {};
12
+ const timeline = {
13
+ durationMs: () => Number(raw.timeline?.duration_ms ?? 0),
14
+ unitTimeMs: () => Number(raw.timeline?.unit_time_ms ?? 33.333),
15
+ };
16
+ const mainItems = raw.main_track?.items ?? [];
17
+ const mainClips = mainItems.map((it) => {
18
+ const partId = mustGet(it.part_id, 'main_track.items[].part_id');
19
+ const libEntry = mustGet(partLibrary[partId], `part_library.${partId}`);
20
+ const clip = mustGet(libEntry.video_clip, `part_library.${partId}.video_clip`);
21
+ return {
22
+ id: () => mustGet(clip.id, `part_library.${partId}.video_clip.id`),
23
+ absTimePositionMs: () => Number(mustGet(it.abs_time_position, 'main_track.items[].abs_time_position')),
24
+ durationMs: () => Number(mustGet(clip.duration_ms, `part_library.${partId}.video_clip.duration_ms`)),
25
+ playInMs: () => Number(clip.play_in ?? 0),
26
+ originMediaId: () => String(clip.origin_media_id ?? ''),
27
+ volumeDb: () => Number(clip.volume ?? 0),
28
+ };
29
+ });
30
+ const collectTrackItems = (tracks) => {
31
+ if (!Array.isArray(tracks))
32
+ return [];
33
+ const items = [];
34
+ for (const t of tracks) {
35
+ const kind = t?.parts_kind;
36
+ const its = t?.items;
37
+ if (!Array.isArray(its) || !kind)
38
+ continue;
39
+ for (const it of its) {
40
+ items.push({
41
+ parts_kind: kind,
42
+ abs_time_position: it?.abs_time_position,
43
+ part_id: it?.part_id,
44
+ });
45
+ }
46
+ }
47
+ return items;
48
+ };
49
+ const speechItems = collectTrackItems(raw.below_main_tracks).filter((it) => it.parts_kind === 'speech');
50
+ const speechClips = speechItems.map((it) => {
51
+ const partId = mustGet(it.part_id, 'below_main_tracks(speech).items[].part_id');
52
+ const libEntry = mustGet(partLibrary[partId], `part_library.${partId}`);
53
+ const speech = mustGet(libEntry.speech, `part_library.${partId}.speech`);
54
+ return {
55
+ id: () => mustGet(speech.id, `part_library.${partId}.speech.id`),
56
+ originSpeechId: () => String(speech.origin_speech_id ?? ''),
57
+ absTimePositionMs: () => Number(mustGet(it.abs_time_position, 'below_main_tracks(speech).items[].abs_time_position')),
58
+ durationMs: () => Number(mustGet(speech.duration_ms, `part_library.${partId}.speech.duration_ms`)),
59
+ volumeDb: () => Number(speech.volume ?? 0),
60
+ audioStorageKey: () => String(speech.audio_storage_key ?? ''),
61
+ };
62
+ });
63
+ const bgmItems = collectTrackItems(raw.below_main_tracks).filter((it) => it.parts_kind === 'bgm');
64
+ const bgmClips = bgmItems.map((it) => {
65
+ const partId = mustGet(it.part_id, 'below_main_tracks(bgm).items[].part_id');
66
+ const libEntry = mustGet(partLibrary[partId], `part_library.${partId}`);
67
+ const bgm = mustGet(libEntry.bgm, `part_library.${partId}.bgm`);
68
+ return {
69
+ id: () => mustGet(bgm.id, `part_library.${partId}.bgm.id`),
70
+ originMediaId: () => String(bgm.origin_media_id ?? ''),
71
+ durationMs: () => Number(mustGet(bgm.duration_ms, `part_library.${partId}.bgm.duration_ms`)),
72
+ volumeDb: () => Number(bgm.volume ?? 0),
73
+ audioStorageKey: () => String(bgm.audio_storage_key ?? ''),
74
+ // absTimePositionMs is not part of MedeoBgmClip interface; loop logic uses only durationMs.
75
+ };
76
+ });
77
+ const captionTrack = Array.isArray(raw.above_main_tracks)
78
+ ? raw.above_main_tracks.find((t) => t?.parts_kind === 'caption')
79
+ : undefined;
80
+ const captionIsHidden = captionTrack?.is_hidden === true || !captionTrack;
81
+ const captionItems = Array.isArray(captionTrack?.items) ? captionTrack.items : [];
82
+ const captionClips = captionItems.map((it) => {
83
+ const partId = mustGet(it.part_id, 'above_main_tracks(caption).items[].part_id');
84
+ const libEntry = mustGet(partLibrary[partId], `part_library.${partId}`);
85
+ const caption = mustGet(libEntry.caption, `part_library.${partId}.caption`);
86
+ return {
87
+ id: () => mustGet(caption.id, `part_library.${partId}.caption.id`),
88
+ absTimePositionMs: () => Number(mustGet(it.abs_time_position, 'above_main_tracks(caption).items[].abs_time_position')),
89
+ durationMs: () => Number(mustGet(caption.duration_ms, `part_library.${partId}.caption.duration_ms`)),
90
+ text: () => String(caption.text ?? ''),
91
+ };
92
+ });
93
+ return {
94
+ id: () => String(raw.id),
95
+ timeline,
96
+ videoCreationSettings: () => ({ aspect_ratio: raw.video_creation_settings?.aspect_ratio }),
97
+ mainTrack: { clips: toList(mainClips) },
98
+ speechTrack: { clips: toList(speechClips) },
99
+ bgmTrack: { clips: toList(bgmClips) },
100
+ captionTrack: { isHidden: () => captionIsHidden, clips: toList(captionClips) },
101
+ };
102
+ }
103
+ //# sourceMappingURL=parse-video-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-video-draft.js","sourceRoot":"","sources":["../src/parse-video-draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Resource } from '@meframe/core';
2
+ import type { GetPublicUrl, AssetFetcher, VideoDraft } from './types.js';
3
+ import type { VideoDraftRaw } from './parse-video-draft.js';
4
+ export interface ResolveResourcesOptions {
5
+ fetcher: AssetFetcher;
6
+ getPublicUrl?: GetPublicUrl;
7
+ abortSignal?: AbortSignal;
8
+ includeSpeech?: boolean;
9
+ includeBgm?: boolean;
10
+ includeMainTrack?: boolean;
11
+ }
12
+ export declare function getResources(draft: VideoDraft, options: ResolveResourcesOptions): Promise<{
13
+ resources: Record<string, Resource>;
14
+ hasAudioByResourceId: Record<string, boolean>;
15
+ }>;
16
+ export declare function resolveResources(draft: VideoDraftRaw, options: ResolveResourcesOptions): Promise<{
17
+ resources: Record<string, Resource>;
18
+ hasAudioByResourceId: Record<string, boolean>;
19
+ }>;
20
+ //# sourceMappingURL=resolve-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-resources.d.ts","sourceRoot":"","sources":["../src/resolve-resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAY5D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAuEjG;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAEjG"}
@@ -0,0 +1,79 @@
1
+ import { parseVideoDraft } from './parse-video-draft.js';
2
+ function normalizeResourceType(type) {
3
+ const t = String(type ?? '').toLowerCase();
4
+ if (t === 'video' || t.startsWith('video_'))
5
+ return 'video';
6
+ if (t === 'audio' || t.startsWith('audio_'))
7
+ return 'audio';
8
+ if (t === 'image' || t.startsWith('image_'))
9
+ return 'image';
10
+ if (t === 'font' || t.startsWith('font_'))
11
+ return 'font';
12
+ return 'video';
13
+ }
14
+ export async function getResources(draft, options) {
15
+ const { fetcher, getPublicUrl, abortSignal, includeSpeech = true, includeBgm = true, includeMainTrack = true, } = options;
16
+ const resources = {};
17
+ const hasAudioByResourceId = {};
18
+ if (includeSpeech) {
19
+ const speechClips = draft.speechTrack.clips.toArray();
20
+ if (speechClips.length > 0 && !getPublicUrl) {
21
+ throw new Error('getPublicUrl is required when resolving speech resources');
22
+ }
23
+ for (const speech of speechClips) {
24
+ const id = speech.originSpeechId();
25
+ if (!id || resources[id])
26
+ continue;
27
+ resources[id] = {
28
+ id,
29
+ type: 'audio',
30
+ uri: getPublicUrl(speech.audioStorageKey(), { raw: true }),
31
+ };
32
+ }
33
+ }
34
+ const mediaIds = new Set();
35
+ if (includeMainTrack) {
36
+ for (const clip of draft.mainTrack.clips.toArray()) {
37
+ const id = clip.originMediaId();
38
+ if (id)
39
+ mediaIds.add(id);
40
+ }
41
+ }
42
+ if (includeBgm) {
43
+ const bgmClips = draft.bgmTrack.clips.toArray();
44
+ if (bgmClips.length > 0 && !getPublicUrl) {
45
+ throw new Error('getPublicUrl is required when resolving bgm resources');
46
+ }
47
+ for (const clip of bgmClips) {
48
+ const bgmId = clip.originMediaId();
49
+ if (bgmId && !resources[bgmId]) {
50
+ resources[bgmId] = {
51
+ id: bgmId,
52
+ type: 'audio',
53
+ uri: getPublicUrl(clip.audioStorageKey(), { raw: true }),
54
+ };
55
+ }
56
+ }
57
+ }
58
+ await Promise.all(Array.from(mediaIds).map(async (mediaId) => {
59
+ if (resources[mediaId])
60
+ return;
61
+ const asset = await fetcher.fetchAssetById(mediaId, abortSignal);
62
+ if (!asset)
63
+ return;
64
+ const uri = getPublicUrl ? getPublicUrl(asset.storageKey, { raw: true }) : asset.storageKey;
65
+ resources[asset.id] = {
66
+ id: asset.id,
67
+ type: normalizeResourceType(asset.type),
68
+ uri,
69
+ };
70
+ if (normalizeResourceType(asset.type) === 'video') {
71
+ hasAudioByResourceId[asset.id] = asset.extraProps?.video?.hasAudio === true;
72
+ }
73
+ }));
74
+ return { resources, hasAudioByResourceId };
75
+ }
76
+ export async function resolveResources(draft, options) {
77
+ return await getResources(parseVideoDraft(draft), options);
78
+ }
79
+ //# sourceMappingURL=resolve-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-resources.js","sourceRoot":"","sources":["../src/resolve-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CompositionModelData } from '@meframe/core';
2
+ import type { VideoDraft, ToCompositionModelOptions } from './types.js';
3
+ import type { VideoDraftRaw } from './parse-video-draft.js';
4
+ export declare function toCompositionModelData(draft: VideoDraft, options: ToCompositionModelOptions): CompositionModelData;
5
+ export declare function toCompositionModel(draftJson: VideoDraftRaw, options: ToCompositionModelOptions): CompositionModelData;
6
+ //# sourceMappingURL=to-composition-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-composition-model.d.ts","sourceRoot":"","sources":["../src/to-composition-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAS,MAAM,eAAe,CAAC;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAiH5D,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,yBAAyB,GACjC,oBAAoB,CAsItB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,yBAAyB,GACjC,oBAAoB,CAEtB"}
@@ -0,0 +1,206 @@
1
+ import { parseVideoDraft } from './parse-video-draft.js';
2
+ const DEFAULT_MAIN_TRACK_ID = 'main';
3
+ const DEFAULT_BACKGROUND_COLOR = '#000000';
4
+ const DEFAULT_RENDER_SIZE_MAP = {
5
+ preview: {
6
+ '9:16': { width: 1080, height: 1920 },
7
+ '16:9': { width: 1920, height: 1080 },
8
+ },
9
+ export: {
10
+ '9:16': { width: 1080, height: 1920 },
11
+ '16:9': { width: 1920, height: 1080 },
12
+ },
13
+ };
14
+ const solidColorCache = new Map();
15
+ function solidColorSvgDataUri(options) {
16
+ const cacheKey = `${options.color}:${options.width}x${options.height}`;
17
+ const cached = solidColorCache.get(cacheKey);
18
+ if (cached)
19
+ return cached;
20
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${options.width}" height="${options.height}"><rect width="100%" height="100%" fill="${options.color}"/></svg>`;
21
+ const uri = `data:image/svg+xml,${encodeURIComponent(svg)}`;
22
+ solidColorCache.set(cacheKey, uri);
23
+ return uri;
24
+ }
25
+ function convertVolume(db) {
26
+ if (db <= -60)
27
+ return { muted: true, volume: 0 };
28
+ return { muted: false, volume: Math.pow(10, db / 20) };
29
+ }
30
+ function roundToNearest(value, candidates) {
31
+ let best = candidates[0];
32
+ let bestDiff = Math.abs(value - best);
33
+ for (let i = 1; i < candidates.length; i++) {
34
+ const c = candidates[i];
35
+ const diff = Math.abs(value - c);
36
+ if (diff < bestDiff) {
37
+ best = c;
38
+ bestDiff = diff;
39
+ }
40
+ }
41
+ return best;
42
+ }
43
+ function fillEmptyClip(data, clip) {
44
+ const width = data.renderConfig.width;
45
+ const height = data.renderConfig.height;
46
+ const color = data.renderConfig.backgroundColor ?? DEFAULT_BACKGROUND_COLOR;
47
+ clip.resourceId = `SOLID-COLOR-${color}-${width}x${height}`;
48
+ if (!data.resources[clip.resourceId]) {
49
+ data.resources[clip.resourceId] = {
50
+ id: clip.resourceId,
51
+ type: 'image',
52
+ uri: solidColorSvgDataUri({ color, width, height }),
53
+ };
54
+ }
55
+ }
56
+ function paddingEnd(data, track, id) {
57
+ const durationUs = data.durationUs;
58
+ const last = track.clips[track.clips.length - 1];
59
+ const lastEndUs = last ? last.startUs + last.durationUs : 0;
60
+ if (lastEndUs < durationUs) {
61
+ const clip = {
62
+ id,
63
+ trackKind: 'video',
64
+ resourceId: '',
65
+ startUs: lastEndUs,
66
+ durationUs: durationUs - lastEndUs,
67
+ };
68
+ fillEmptyClip(data, clip);
69
+ track.clips.push(clip);
70
+ }
71
+ }
72
+ function buildBgmTrack(draft) {
73
+ const bgmTrack = { id: 'bgm', kind: 'audio', clips: [] };
74
+ let startTimeMs = 0;
75
+ const timelineDurationMs = draft.timeline.durationMs();
76
+ const bgmClips = draft.bgmTrack.clips.toArray().filter((c) => c.durationMs() > 0);
77
+ if (bgmClips.length > 0) {
78
+ while (startTimeMs < timelineDurationMs) {
79
+ for (let i = 0; i < bgmClips.length && startTimeMs < timelineDurationMs; i++) {
80
+ const bgmClip = bgmClips[i];
81
+ const restDurationMs = timelineDurationMs - startTimeMs;
82
+ const clipDurationMs = Math.min(bgmClip.durationMs(), restDurationMs);
83
+ bgmTrack.clips.push({
84
+ id: `${bgmClip.id()}-loop-${startTimeMs}`,
85
+ trackKind: 'audio',
86
+ resourceId: bgmClip.originMediaId(),
87
+ startUs: startTimeMs * 1000,
88
+ durationUs: clipDurationMs * 1000,
89
+ trimStartUs: 0,
90
+ audioConfig: convertVolume(bgmClip.volumeDb()),
91
+ });
92
+ startTimeMs += clipDurationMs;
93
+ }
94
+ }
95
+ }
96
+ return bgmTrack;
97
+ }
98
+ export function toCompositionModelData(draft, options) {
99
+ const { scene, backgroundColor = DEFAULT_BACKGROUND_COLOR, renderSizeMap = DEFAULT_RENDER_SIZE_MAP, mainTrackId = DEFAULT_MAIN_TRACK_ID, fpsHint, includeSpeechTrack = true, includeBgmTrack = true, includeCaptionTrack = true, resources, hasAudioByResourceId, allowMissingResources = false, } = options;
100
+ const aspectRatio = draft.videoCreationSettings()?.aspect_ratio ?? '9:16';
101
+ const size = renderSizeMap[scene][aspectRatio] ??
102
+ renderSizeMap[scene]['9:16'] ?? { width: 1080, height: 1920 };
103
+ const fps = fpsHint ??
104
+ roundToNearest(1000 / draft.timeline.unitTimeMs(), [24, 25, 30, 60]);
105
+ const durationUs = draft.timeline.durationMs() * 1000;
106
+ const data = {
107
+ version: '1.0',
108
+ fps,
109
+ durationUs,
110
+ mainTrackId,
111
+ tracks: [],
112
+ resources: { ...resources },
113
+ renderConfig: {
114
+ width: size.width,
115
+ height: size.height,
116
+ backgroundColor,
117
+ },
118
+ ext: { id: draft.id() },
119
+ };
120
+ const mainTrack = {
121
+ id: mainTrackId,
122
+ kind: 'video',
123
+ clips: draft.mainTrack.clips.toArray().map((video) => {
124
+ const resourceId = video.originMediaId();
125
+ if (resourceId && !data.resources[resourceId] && !allowMissingResources) {
126
+ throw new Error(`Missing resource for main video clip: resourceId=${resourceId}`);
127
+ }
128
+ const clip = {
129
+ id: video.id(),
130
+ trackKind: 'video',
131
+ resourceId,
132
+ startUs: video.absTimePositionMs() * 1000,
133
+ durationUs: video.durationMs() * 1000,
134
+ trimStartUs: video.playInMs() * 1000,
135
+ audioConfig: resourceId && hasAudioByResourceId?.[resourceId]
136
+ ? convertVolume(video.volumeDb())
137
+ : { muted: true, volume: 0 },
138
+ attachments: [],
139
+ };
140
+ if (!resourceId) {
141
+ fillEmptyClip(data, clip);
142
+ }
143
+ return clip;
144
+ }),
145
+ };
146
+ data.tracks.push(mainTrack);
147
+ if (includeSpeechTrack) {
148
+ const speechTrack = {
149
+ id: 'speech',
150
+ kind: 'audio',
151
+ clips: draft.speechTrack.clips.toArray().map((clip) => {
152
+ const resourceId = clip.originSpeechId();
153
+ if (resourceId && !data.resources[resourceId] && !allowMissingResources) {
154
+ throw new Error(`Missing resource for speech clip: resourceId=${resourceId}`);
155
+ }
156
+ return {
157
+ id: clip.id(),
158
+ trackKind: 'audio',
159
+ resourceId,
160
+ startUs: clip.absTimePositionMs() * 1000,
161
+ durationUs: clip.durationMs() * 1000,
162
+ audioConfig: convertVolume(clip.volumeDb()),
163
+ };
164
+ }),
165
+ };
166
+ data.tracks.push(speechTrack);
167
+ }
168
+ if (includeCaptionTrack && !draft.captionTrack.isHidden()) {
169
+ const captionTrack = {
170
+ id: 'caption',
171
+ kind: 'caption',
172
+ clips: draft.captionTrack.clips.toArray().map((caption) => ({
173
+ id: caption.id(),
174
+ trackKind: 'caption',
175
+ text: caption.text(),
176
+ startUs: caption.absTimePositionMs() * 1000,
177
+ durationUs: caption.durationMs() * 1000,
178
+ metadata: { purpose: 'caption' },
179
+ })),
180
+ };
181
+ data.tracks.push(captionTrack);
182
+ }
183
+ if (includeBgmTrack) {
184
+ data.tracks.push(buildBgmTrack(draft));
185
+ }
186
+ if (!allowMissingResources) {
187
+ for (const t of data.tracks) {
188
+ if (t.kind !== 'audio')
189
+ continue;
190
+ for (const c of t.clips) {
191
+ if (!('resourceId' in c))
192
+ continue;
193
+ const rid = c.resourceId;
194
+ if (rid && !data.resources[rid]) {
195
+ throw new Error(`Missing resource for audio clip: resourceId=${rid}`);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ paddingEnd(data, mainTrack, 'main-track-padding-end');
201
+ return data;
202
+ }
203
+ export function toCompositionModel(draftJson, options) {
204
+ return toCompositionModelData(parseVideoDraft(draftJson), options);
205
+ }
206
+ //# sourceMappingURL=to-composition-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-composition-model.js","sourceRoot":"","sources":["../src/to-composition-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import type { Resource } from '@meframe/core';
2
+ export type AspectRatio = `${number}:${number}` | string;
3
+ export interface MedeoTimeline {
4
+ durationMs(): number;
5
+ unitTimeMs(): number;
6
+ }
7
+ export interface ClipList<T> {
8
+ toArray(): T[];
9
+ }
10
+ export interface MainClip {
11
+ id(): string;
12
+ absTimePositionMs(): number;
13
+ durationMs(): number;
14
+ playInMs(): number;
15
+ originMediaId(): string;
16
+ volumeDb(): number;
17
+ }
18
+ export interface SpeechClip {
19
+ id(): string;
20
+ originSpeechId(): string;
21
+ absTimePositionMs(): number;
22
+ durationMs(): number;
23
+ volumeDb(): number;
24
+ audioStorageKey(): string;
25
+ }
26
+ export interface BgmClip {
27
+ id(): string;
28
+ originMediaId(): string;
29
+ durationMs(): number;
30
+ volumeDb(): number;
31
+ audioStorageKey(): string;
32
+ }
33
+ export interface CaptionClip {
34
+ id(): string;
35
+ absTimePositionMs(): number;
36
+ durationMs(): number;
37
+ text(): string;
38
+ }
39
+ export interface VideoDraft {
40
+ id(): string;
41
+ timeline: MedeoTimeline;
42
+ videoCreationSettings(): {
43
+ aspect_ratio?: AspectRatio;
44
+ } | null;
45
+ mainTrack: {
46
+ clips: ClipList<MainClip>;
47
+ };
48
+ speechTrack: {
49
+ clips: ClipList<SpeechClip>;
50
+ };
51
+ bgmTrack: {
52
+ clips: ClipList<BgmClip>;
53
+ };
54
+ captionTrack: {
55
+ isHidden(): boolean;
56
+ clips: ClipList<CaptionClip>;
57
+ };
58
+ }
59
+ export interface ToCompositionModelOptions {
60
+ scene: 'preview' | 'export';
61
+ backgroundColor?: string;
62
+ renderSizeMap?: Record<'preview' | 'export', Record<string, {
63
+ width: number;
64
+ height: number;
65
+ }>>;
66
+ mainTrackId?: string;
67
+ fpsHint?: 24 | 25 | 30 | 60;
68
+ /**
69
+ * Whether to include speech audio track (default true).
70
+ * Useful for server-side demos when speech assets are unavailable.
71
+ */
72
+ includeSpeechTrack?: boolean;
73
+ /**
74
+ * Whether to include bgm audio track (default true).
75
+ * Useful for server-side demos when bgm assets are unavailable.
76
+ */
77
+ includeBgmTrack?: boolean;
78
+ /**
79
+ * Whether to include caption track (default true).
80
+ */
81
+ includeCaptionTrack?: boolean;
82
+ /**
83
+ * Pre-resolved resources used by the resulting CompositionModelData.
84
+ *
85
+ * The adapter does not perform any I/O. Callers should provide final, fetchable URLs.
86
+ */
87
+ resources: Record<string, Resource>;
88
+ /**
89
+ * Whether a video resource has audio, used to set per-clip audioConfig for main track video clips.
90
+ * If missing, video clips default to muted.
91
+ */
92
+ hasAudioByResourceId?: Record<string, boolean>;
93
+ /**
94
+ * By default, the adapter fails fast when a referenced resource is missing.
95
+ */
96
+ allowMissingResources?: boolean;
97
+ }
98
+ export interface Asset {
99
+ id: string;
100
+ /**
101
+ * Medeo asset type. Medeo API may return values like "video_mp4".
102
+ * The adapter will normalize this to @meframe/core Resource['type'] when building resources.
103
+ */
104
+ type: string;
105
+ storageKey: string;
106
+ extraProps?: {
107
+ video?: {
108
+ hasAudio?: boolean;
109
+ };
110
+ };
111
+ }
112
+ export interface AssetFetcher {
113
+ fetchAssetById(id: string, signal?: AbortSignal): Promise<Asset | null>;
114
+ }
115
+ export type GetPublicUrl = (path?: string, options?: {
116
+ raw?: boolean;
117
+ }) => string;
118
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,UAAU,IAAI,MAAM,CAAC;IACrB,UAAU,IAAI,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,IAAI,MAAM,CAAC;IACb,iBAAiB,IAAI,MAAM,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,IAAI,MAAM,CAAC;IACnB,aAAa,IAAI,MAAM,CAAC;IACxB,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,IAAI,MAAM,CAAC;IACb,cAAc,IAAI,MAAM,CAAC;IACzB,iBAAiB,IAAI,MAAM,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,IAAI,MAAM,CAAC;IACnB,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,IAAI,MAAM,CAAC;IACb,aAAa,IAAI,MAAM,CAAC;IACxB,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,IAAI,MAAM,CAAC;IACnB,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,IAAI,MAAM,CAAC;IACb,iBAAiB,IAAI,MAAM,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;IACrB,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,IAAI,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IAExB,qBAAqB,IAAI;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC;IAE/D,SAAS,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;IACzC,WAAW,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IACvC,YAAY,EAAE;QACZ,QAAQ,IAAI,OAAO,CAAC;QACpB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAChG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/C;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,MAAM,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@meframe/adapter-medeo",
3
+ "version": "0.0.1",
4
+ "description": "Adapter: convert Medeo VideoDraft to @meframe/core CompositionModelData",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "dependencies": {
20
+ "@meframe/core": "^0.2.4"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.11.24",
24
+ "typescript": "^5.3.3",
25
+ "vitest": "^3.2.4"
26
+ },
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org/"
33
+ },
34
+ "scripts": {
35
+ "build": "pnpm clean && tsc",
36
+ "type-check": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "clean": "rm -rf dist"
40
+ }
41
+ }