@mengine/medeo-client 1.2.0 → 1.2.1-alpha.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.
|
@@ -87,7 +87,8 @@ function jsonTransform() {
|
|
|
87
87
|
const trackItem = schema.LoroMap({
|
|
88
88
|
part_id: schema.String(),
|
|
89
89
|
time_position: schema.String().transform(jsonTransform()),
|
|
90
|
-
fallback_abs_ms: schema.Number({ required: false })
|
|
90
|
+
fallback_abs_ms: schema.Number({ required: false }),
|
|
91
|
+
duration_override_ms: schema.Number({ required: false })
|
|
91
92
|
});
|
|
92
93
|
const track = schema.LoroMap({
|
|
93
94
|
id: schema.String(),
|
|
@@ -773,7 +774,8 @@ const trackItemTimePositionSchema = z.discriminatedUnion("mode", [
|
|
|
773
774
|
const trackItemSchema = z.object({
|
|
774
775
|
part_id: z.string(),
|
|
775
776
|
time_position: trackItemTimePositionSchema,
|
|
776
|
-
fallback_abs_ms: finiteNumber.optional()
|
|
777
|
+
fallback_abs_ms: finiteNumber.optional(),
|
|
778
|
+
duration_override_ms: z.number().finite().positive().optional()
|
|
777
779
|
}).passthrough();
|
|
778
780
|
const trackSchema = z.object({
|
|
779
781
|
id: z.string().optional(),
|
|
@@ -1326,7 +1328,7 @@ function fromVideoDocument(document) {
|
|
|
1326
1328
|
above_main_tracks: aboveTracks.map((t) => draftTrack(t, view.absByPartId)),
|
|
1327
1329
|
below_main_tracks: belowTracks.map((t) => draftTrack(t, view.absByPartId)),
|
|
1328
1330
|
part_aggregations: view.aggregations,
|
|
1329
|
-
part_library: toReadViewPartLibrary(view.partLibrary, view.durationMs, view.derivedFillerPartIds),
|
|
1331
|
+
part_library: toReadViewPartLibrary(view.partLibrary, view.durationMs, view.derivedFillerPartIds, captionDurationOverrides(document)),
|
|
1330
1332
|
version: document.meta.version
|
|
1331
1333
|
};
|
|
1332
1334
|
}
|
|
@@ -1347,7 +1349,7 @@ function fromVideoDocument(document) {
|
|
|
1347
1349
|
* and they are not part of the document (see `fromVideoDocument`). An empty clip a
|
|
1348
1350
|
* writer placed deliberately is NOT in that set and is projected normally.
|
|
1349
1351
|
*/
|
|
1350
|
-
function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
|
|
1352
|
+
function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds, captionDurationByPartId) {
|
|
1351
1353
|
const out = {};
|
|
1352
1354
|
for (const [partId, part] of Object.entries(partLibrary)) {
|
|
1353
1355
|
if (derivedFillerPartIds.has(partId)) continue;
|
|
@@ -1367,7 +1369,7 @@ function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
|
|
|
1367
1369
|
const caption = clone(part.caption);
|
|
1368
1370
|
out[partId] = { caption: {
|
|
1369
1371
|
...caption,
|
|
1370
|
-
duration_ms: caption.initial_duration_ms
|
|
1372
|
+
duration_ms: captionDurationByPartId.get(partId) ?? caption.initial_duration_ms
|
|
1371
1373
|
} };
|
|
1372
1374
|
} else if (part.bgm != null) out[partId] = { bgm: {
|
|
1373
1375
|
...clone(part.bgm),
|
|
@@ -1376,6 +1378,14 @@ function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
|
|
|
1376
1378
|
}
|
|
1377
1379
|
return out;
|
|
1378
1380
|
}
|
|
1381
|
+
function captionDurationOverrides(document) {
|
|
1382
|
+
const result = /* @__PURE__ */ new Map();
|
|
1383
|
+
for (const track of document.tracks ?? []) {
|
|
1384
|
+
if (track.parts_kind !== "caption") continue;
|
|
1385
|
+
for (const item of track.items ?? []) if (item.duration_override_ms != null) result.set(item.part_id, item.duration_override_ms);
|
|
1386
|
+
}
|
|
1387
|
+
return result;
|
|
1388
|
+
}
|
|
1379
1389
|
/** Deep-clone a part payload, dropping the derived read-view `duration_ms`. */
|
|
1380
1390
|
function omitDurationMs(part) {
|
|
1381
1391
|
const { duration_ms: _drop, ...rest } = clone(part);
|
|
@@ -1538,6 +1548,7 @@ function rowToTrack(row) {
|
|
|
1538
1548
|
time_position: item.time_position
|
|
1539
1549
|
};
|
|
1540
1550
|
if (item.fallback_abs_ms != null) result.fallback_abs_ms = item.fallback_abs_ms;
|
|
1551
|
+
if (item.duration_override_ms != null) result.duration_override_ms = item.duration_override_ms;
|
|
1541
1552
|
return result;
|
|
1542
1553
|
})
|
|
1543
1554
|
};
|
|
@@ -1646,7 +1657,8 @@ function toTrackRow(track) {
|
|
|
1646
1657
|
items: (track.items ?? []).map((item) => ({
|
|
1647
1658
|
part_id: item.part_id,
|
|
1648
1659
|
time_position: item.time_position,
|
|
1649
|
-
fallback_abs_ms: item.fallback_abs_ms
|
|
1660
|
+
fallback_abs_ms: item.fallback_abs_ms,
|
|
1661
|
+
duration_override_ms: item.duration_override_ms
|
|
1650
1662
|
}))
|
|
1651
1663
|
};
|
|
1652
1664
|
}
|
|
@@ -545,6 +545,8 @@ interface TrackItem {
|
|
|
545
545
|
part_id: string;
|
|
546
546
|
time_position: TrackItemTimePosition;
|
|
547
547
|
fallback_abs_ms?: number | undefined;
|
|
548
|
+
/** Presentation window for this placement; currently used by caption resize. */
|
|
549
|
+
duration_override_ms?: number | undefined;
|
|
548
550
|
}
|
|
549
551
|
interface Track {
|
|
550
552
|
id: string | undefined;
|
|
@@ -1320,6 +1322,14 @@ declare const replaceVideoClipSequenceInputSchema: z.ZodObject<{
|
|
|
1320
1322
|
}, z.core.$strip>;
|
|
1321
1323
|
type ReplaceVideoClipSequenceInput = z.infer<typeof replaceVideoClipSequenceInputSchema>;
|
|
1322
1324
|
//#endregion
|
|
1325
|
+
//#region src/editor/schemas/resize-caption.d.ts
|
|
1326
|
+
/** Resize one caption placement without changing its cue/source duration. */
|
|
1327
|
+
declare const resizeCaptionInputSchema: z.ZodObject<{
|
|
1328
|
+
caption_id: z.ZodString;
|
|
1329
|
+
duration_ms: z.ZodNumber;
|
|
1330
|
+
}, z.core.$strip>;
|
|
1331
|
+
type ResizeCaptionInput = z.infer<typeof resizeCaptionInputSchema>;
|
|
1332
|
+
//#endregion
|
|
1323
1333
|
//#region src/editor/schemas/set-bgm.d.ts
|
|
1324
1334
|
/**
|
|
1325
1335
|
* Set the document BGM. The media's stable result (storage key) arrives
|
|
@@ -1538,7 +1548,7 @@ type SpeechAsset = z.infer<typeof speechAssetSchema>;
|
|
|
1538
1548
|
type CaptionAsset = z.infer<typeof captionAssetSchema>;
|
|
1539
1549
|
type SpeechAssets = z.infer<typeof speechAssetsSchema>;
|
|
1540
1550
|
declare namespace index_d_exports {
|
|
1541
|
-
export { AddSpeechesInput, AddVideoClipsInput, AdjustBgmVolumeInput, AdjustSpeechVolumeInput, AdjustVideoClipDurationInput, AdjustVideoClipVolumeInput, AnchoredDeletePolicy, AnchoredReplacePolicy, CaptionAsset, ChangeSpeechScriptInput, ChangeSpeechVoiceInput, DeleteBgmInput, DeleteSpeechesInput, DeleteVideoClipsInput, MoveAnchor, MoveSpeechesInput, MoveVideoClipsByAnchorInput, MoveVideoClipsInput, MovedClipAnchoredPolicy, ReplaceVideoClipContentInput, ReplaceVideoClipSequenceInput, SetBgmInput, SetCaptionStyleInput, SetCaptionVisibilityInput, SetVideoClipSpeedShiftInput, SpeechAsset, SpeechAssets, addSpeechesInputSchema, addVideoClipsInputSchema, adjustBgmVolumeInputSchema, adjustSpeechVolumeInputSchema, adjustVideoClipDurationInputSchema, adjustVideoClipVolumeInputSchema, anchoredDeletePolicySchema, anchoredReplacePolicySchema, changeSpeechScriptInputSchema, changeSpeechVoiceInputSchema, clipIdSchema, clipIdsSchema, deleteBgmInputSchema, deleteSpeechesInputSchema, deleteVideoClipsInputSchema, mediaIdSchema, moveAnchorSchema, moveSpeechesInputSchema, moveVideoClipsByAnchorInputSchema, moveVideoClipsInputSchema, movedClipAnchoredPolicySchema, positiveMsSchema, replaceVideoClipContentInputSchema, replaceVideoClipSequenceInputSchema, setBgmInputSchema, setCaptionStyleInputSchema, setCaptionVisibilityInputSchema, setVideoClipSpeedShiftInputSchema, speechAssetsSchema, speechIdSchema, speechIdsSchema, speedShiftSchema, timelineMsSchema, voiceSchema, volumeSchema };
|
|
1551
|
+
export { AddSpeechesInput, AddVideoClipsInput, AdjustBgmVolumeInput, AdjustSpeechVolumeInput, AdjustVideoClipDurationInput, AdjustVideoClipVolumeInput, AnchoredDeletePolicy, AnchoredReplacePolicy, CaptionAsset, ChangeSpeechScriptInput, ChangeSpeechVoiceInput, DeleteBgmInput, DeleteSpeechesInput, DeleteVideoClipsInput, MoveAnchor, MoveSpeechesInput, MoveVideoClipsByAnchorInput, MoveVideoClipsInput, MovedClipAnchoredPolicy, ReplaceVideoClipContentInput, ReplaceVideoClipSequenceInput, ResizeCaptionInput, SetBgmInput, SetCaptionStyleInput, SetCaptionVisibilityInput, SetVideoClipSpeedShiftInput, SpeechAsset, SpeechAssets, addSpeechesInputSchema, addVideoClipsInputSchema, adjustBgmVolumeInputSchema, adjustSpeechVolumeInputSchema, adjustVideoClipDurationInputSchema, adjustVideoClipVolumeInputSchema, anchoredDeletePolicySchema, anchoredReplacePolicySchema, changeSpeechScriptInputSchema, changeSpeechVoiceInputSchema, clipIdSchema, clipIdsSchema, deleteBgmInputSchema, deleteSpeechesInputSchema, deleteVideoClipsInputSchema, mediaIdSchema, moveAnchorSchema, moveSpeechesInputSchema, moveVideoClipsByAnchorInputSchema, moveVideoClipsInputSchema, movedClipAnchoredPolicySchema, positiveMsSchema, replaceVideoClipContentInputSchema, replaceVideoClipSequenceInputSchema, resizeCaptionInputSchema, setBgmInputSchema, setCaptionStyleInputSchema, setCaptionVisibilityInputSchema, setVideoClipSpeedShiftInputSchema, speechAssetsSchema, speechIdSchema, speechIdsSchema, speedShiftSchema, timelineMsSchema, voiceSchema, volumeSchema };
|
|
1542
1552
|
}
|
|
1543
1553
|
//#endregion
|
|
1544
1554
|
//#region src/editor/schema-validator.d.ts
|
|
@@ -1590,6 +1600,7 @@ declare class SchemaValidator {
|
|
|
1590
1600
|
validateSetBgm(input: SetBgmInput, _doc: SnapshotReadable): void;
|
|
1591
1601
|
validateDeleteBgm(input: DeleteBgmInput, _doc: SnapshotReadable): void;
|
|
1592
1602
|
validateSetCaptionVisibility(input: SetCaptionVisibilityInput, _doc: SnapshotReadable): void;
|
|
1603
|
+
validateResizeCaption(input: ResizeCaptionInput, doc: SnapshotReadable): void;
|
|
1593
1604
|
validateSetCaptionStyle(input: SetCaptionStyleInput, _doc: SnapshotReadable): void;
|
|
1594
1605
|
private parse;
|
|
1595
1606
|
private mainTrackIds;
|
|
@@ -1638,7 +1649,7 @@ declare class SchemaValidator {
|
|
|
1638
1649
|
* side-effect payload contract in
|
|
1639
1650
|
* `docs/projects/medeo-integration/results/phase-4-side-effect-payload-contract.md`.
|
|
1640
1651
|
*/
|
|
1641
|
-
type ImplementedSemanticOpKind = 'MoveVideoClips' | 'MoveVideoClipsByAnchor' | 'DeleteVideoClips' | 'AddVideoClips' | 'AdjustVideoClipVolume' | 'SetVideoClipSpeedShift' | 'ReplaceVideoClipContent' | 'ReplaceVideoClipSequence' | 'AdjustVideoClipDuration' | 'AddSpeeches' | 'DeleteSpeeches' | 'MoveSpeeches' | 'ChangeSpeechScript' | 'ChangeSpeechVoice' | 'AdjustSpeechVolume' | 'SetCaptionVisibility' | 'SetCaptionStyle' | 'SetBgm' | 'DeleteBgm' | 'AdjustBgmVolume';
|
|
1652
|
+
type ImplementedSemanticOpKind = 'MoveVideoClips' | 'MoveVideoClipsByAnchor' | 'DeleteVideoClips' | 'AddVideoClips' | 'AdjustVideoClipVolume' | 'SetVideoClipSpeedShift' | 'ReplaceVideoClipContent' | 'ReplaceVideoClipSequence' | 'AdjustVideoClipDuration' | 'AddSpeeches' | 'DeleteSpeeches' | 'MoveSpeeches' | 'ChangeSpeechScript' | 'ChangeSpeechVoice' | 'AdjustSpeechVolume' | 'ResizeCaption' | 'SetCaptionVisibility' | 'SetCaptionStyle' | 'SetBgm' | 'DeleteBgm' | 'AdjustBgmVolume';
|
|
1642
1653
|
/**
|
|
1643
1654
|
* Operations on the roadmap but NOT yet implemented by `SemanticEditor`. Empty:
|
|
1644
1655
|
* Phase 4 covers every op with a real entry point. Kept as a named type so the
|
|
@@ -1700,7 +1711,7 @@ interface CommitOptions {
|
|
|
1700
1711
|
/** Author of this op; omitted for writes with no acting user (bootstrap, repair). */
|
|
1701
1712
|
actor?: OpActor;
|
|
1702
1713
|
}
|
|
1703
|
-
type SemanticOpInput = MoveVideoClipsInput | MoveVideoClipsByAnchorInput | DeleteVideoClipsInput | AddVideoClipsInput | AdjustVideoClipVolumeInput | AdjustSpeechVolumeInput | AdjustBgmVolumeInput | SetVideoClipSpeedShiftInput | ReplaceVideoClipContentInput | ReplaceVideoClipSequenceInput | AdjustVideoClipDurationInput | AddSpeechesInput | DeleteSpeechesInput | MoveSpeechesInput | SetCaptionVisibilityInput | SetCaptionStyleInput | SetBgmInput | DeleteBgmInput;
|
|
1714
|
+
type SemanticOpInput = MoveVideoClipsInput | MoveVideoClipsByAnchorInput | DeleteVideoClipsInput | AddVideoClipsInput | AdjustVideoClipVolumeInput | AdjustSpeechVolumeInput | AdjustBgmVolumeInput | SetVideoClipSpeedShiftInput | ReplaceVideoClipContentInput | ReplaceVideoClipSequenceInput | AdjustVideoClipDurationInput | AddSpeechesInput | DeleteSpeechesInput | MoveSpeechesInput | ResizeCaptionInput | SetCaptionVisibilityInput | SetCaptionStyleInput | SetBgmInput | DeleteBgmInput;
|
|
1704
1715
|
type SemanticOpName = ImplementedSemanticOpKind;
|
|
1705
1716
|
/** Audit metadata committed alongside an op's writes. */
|
|
1706
1717
|
interface TransactAudit {
|
|
@@ -1846,6 +1857,8 @@ declare class SemanticEditor {
|
|
|
1846
1857
|
deleteBgm(input: DeleteBgmInput, options?: CommitOptions): Promise<void>;
|
|
1847
1858
|
/** Toggle caption visibility (caption track `is_hidden`). */
|
|
1848
1859
|
setCaptionVisibility(input: SetCaptionVisibilityInput, options?: CommitOptions): Promise<void>;
|
|
1860
|
+
/** Resize the caption placement window; cue/source duration stays immutable. */
|
|
1861
|
+
resizeCaption(input: ResizeCaptionInput, options?: CommitOptions): Promise<void>;
|
|
1849
1862
|
/**
|
|
1850
1863
|
* Set the document-wide caption style. GLOBAL (no `caption_id`): the patch is
|
|
1851
1864
|
* merged onto EVERY caption part's `style`, mirroring the FE, which applies a
|
|
@@ -2030,6 +2043,7 @@ declare const videoDocumentSchema: z.ZodObject<{
|
|
|
2030
2043
|
offsetMs: z.ZodNumber;
|
|
2031
2044
|
}, z.core.$loose>], "mode">;
|
|
2032
2045
|
fallback_abs_ms: z.ZodOptional<z.ZodNumber>;
|
|
2046
|
+
duration_override_ms: z.ZodOptional<z.ZodNumber>;
|
|
2033
2047
|
}, z.core.$loose>>>;
|
|
2034
2048
|
}, z.core.$loose>>>;
|
|
2035
2049
|
part_library: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as VideoDocumentSchemaVersion, A as assertValidVideoDocument, B as BgmPart, C as index_d_exports, D as VideoDocumentMirrorSchema, E as VideoDocumentDraft, F as SpeechHostMap, G as SpeechPart, H as DEFAULT_UNIT_TIME_MS, I as buildSpeechHostMap, J as TrackItem, K as Timeline, L as derivePositionFromAbs, M as InitialDocumentFacts, N as buildInitialVideoDocument, O as videoDocumentMirrorSchema, P as DerivedItemPosition, Q as VideoDocument, R as fromVideoDocument, S as ValidationError, T as TrackItemDraft, U as PartKind, V as CaptionPart, W as PartUnion, X as VIDEO_DOCUMENT_SCHEMA_VERSION, Y as TrackItemTimePosition, Z as VideoClipPart, _ as PlannedSemanticOpKind, a as MirrorVideoDocumentOptions, at as CaptionPart$1, b as SchemaValidator, c as CommitOptions, ct as SpeedShift, d as SemanticEditor, dt as TrackItem$1, et as VideoDocumentValidationIssue, f as SemanticOpInput, g as ImplementedSemanticOpKind, h as IMPLEMENTED_SEMANTIC_OP_KINDS, i as MirrorVideoDocumentAdapter, it as Attachment, j as validateVideoDocument, k as VideoDocumentValidationError, l as OpActor, lt as Timeline$1, m as TransactAudit, n as videoDocumentSchema, nt as VideoDraft, o as createMirrorVideoDocument, ot as CaptionStyle, p as SemanticOpName, q as Track, r as readVideoDocumentFromDraft, rt as VideoDraftPartUnion, s as createMirrorVideoDocumentAdapter, st as PartAggregation, t as partUnionSchema, tt as VideoDocumentValidationIssueCode, u as SemanticDocumentAdapter, ut as Track$1, v as SemanticOpKind, w as TrackDraft, x as SnapshotReadable, y as isImplementedSemanticOpKind, z as toVideoDocument } from "./index-
|
|
1
|
+
import { $ as VideoDocumentSchemaVersion, A as assertValidVideoDocument, B as BgmPart, C as index_d_exports, D as VideoDocumentMirrorSchema, E as VideoDocumentDraft, F as SpeechHostMap, G as SpeechPart, H as DEFAULT_UNIT_TIME_MS, I as buildSpeechHostMap, J as TrackItem, K as Timeline, L as derivePositionFromAbs, M as InitialDocumentFacts, N as buildInitialVideoDocument, O as videoDocumentMirrorSchema, P as DerivedItemPosition, Q as VideoDocument, R as fromVideoDocument, S as ValidationError, T as TrackItemDraft, U as PartKind, V as CaptionPart, W as PartUnion, X as VIDEO_DOCUMENT_SCHEMA_VERSION, Y as TrackItemTimePosition, Z as VideoClipPart, _ as PlannedSemanticOpKind, a as MirrorVideoDocumentOptions, at as CaptionPart$1, b as SchemaValidator, c as CommitOptions, ct as SpeedShift, d as SemanticEditor, dt as TrackItem$1, et as VideoDocumentValidationIssue, f as SemanticOpInput, g as ImplementedSemanticOpKind, h as IMPLEMENTED_SEMANTIC_OP_KINDS, i as MirrorVideoDocumentAdapter, it as Attachment, j as validateVideoDocument, k as VideoDocumentValidationError, l as OpActor, lt as Timeline$1, m as TransactAudit, n as videoDocumentSchema, nt as VideoDraft, o as createMirrorVideoDocument, ot as CaptionStyle, p as SemanticOpName, q as Track, r as readVideoDocumentFromDraft, rt as VideoDraftPartUnion, s as createMirrorVideoDocumentAdapter, st as PartAggregation, t as partUnionSchema, tt as VideoDocumentValidationIssueCode, u as SemanticDocumentAdapter, ut as Track$1, v as SemanticOpKind, w as TrackDraft, x as SnapshotReadable, y as isImplementedSemanticOpKind, z as toVideoDocument } from "./index-CZlTzzrm.js";
|
|
2
2
|
import { PeerID } from "loro-crdt";
|
|
3
3
|
import { DocState } from "@mengine/sync";
|
|
4
4
|
import { BaseDocStorage, Connection, DocDiff, DocPushReceipt, DocSnapshotRecord, DocStorage, DocStorageOptions, DocUpdate, DocUpdateRecord } from "@mengine/storage";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-D7D4PA-g.js";
|
|
2
|
-
import { A as partDurationMs, C as reassignSpeechesToVideoClipsByTime, D as syncAggregatedClipsTimePosition, E as resolveSpeechOverlapByShiftingVideos, F as partUnionToDraft, I as recordEntries, L as videoDocumentMirrorSchema, M as DEFAULT_UNIT_TIME_MS, N as VIDEO_DOCUMENT_SCHEMA_VERSION, O as TIMELINE_SKELETON_DURATION_MS, P as effectiveVideoClipDurationMs, R as base64ToBytes, S as fillMainTrackTimeGaps, T as resolveAllSpeechOverlaps, _ as findLaneTrack, a as buildInitialVideoDocument, b as cascadeAfterVideoClipChanges, c as fromVideoDocument, d as assertValidVideoDocument, f as validateVideoDocument, g as ensureLaneTrack, h as LANE_KINDS_IN_STACK_ORDER, i as readVideoDocumentFromDraft, j as safeDurationMs, k as isEmptyVideoClip, l as toVideoDocument, m as videoDocumentSchema, n as createMirrorVideoDocument, o as buildSpeechHostMap, p as partUnionSchema, r as createMirrorVideoDocumentAdapter, s as derivePositionFromAbs, t as MirrorVideoDocumentAdapter, u as VideoDocumentValidationError, v as laneTrackId, w as recalculateTimelineDuration, x as arrangeMainTrackSeamlessly, y as solveVideoDocument, z as bytesToBase64 } from "./document-
|
|
2
|
+
import { A as partDurationMs, C as reassignSpeechesToVideoClipsByTime, D as syncAggregatedClipsTimePosition, E as resolveSpeechOverlapByShiftingVideos, F as partUnionToDraft, I as recordEntries, L as videoDocumentMirrorSchema, M as DEFAULT_UNIT_TIME_MS, N as VIDEO_DOCUMENT_SCHEMA_VERSION, O as TIMELINE_SKELETON_DURATION_MS, P as effectiveVideoClipDurationMs, R as base64ToBytes, S as fillMainTrackTimeGaps, T as resolveAllSpeechOverlaps, _ as findLaneTrack, a as buildInitialVideoDocument, b as cascadeAfterVideoClipChanges, c as fromVideoDocument, d as assertValidVideoDocument, f as validateVideoDocument, g as ensureLaneTrack, h as LANE_KINDS_IN_STACK_ORDER, i as readVideoDocumentFromDraft, j as safeDurationMs, k as isEmptyVideoClip, l as toVideoDocument, m as videoDocumentSchema, n as createMirrorVideoDocument, o as buildSpeechHostMap, p as partUnionSchema, r as createMirrorVideoDocumentAdapter, s as derivePositionFromAbs, t as MirrorVideoDocumentAdapter, u as VideoDocumentValidationError, v as laneTrackId, w as recalculateTimelineDuration, x as arrangeMainTrackSeamlessly, y as solveVideoDocument, z as bytesToBase64 } from "./document-Dcu87api.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { LoroDoc, VersionVector } from "loro-crdt";
|
|
5
5
|
import { ClientServerSynchronizer, DocManager } from "@mengine/sync";
|
|
@@ -670,6 +670,13 @@ const replaceVideoClipSequenceInputSchema = z.object({
|
|
|
670
670
|
}
|
|
671
671
|
});
|
|
672
672
|
//#endregion
|
|
673
|
+
//#region src/editor/schemas/resize-caption.ts
|
|
674
|
+
/** Resize one caption placement without changing its cue/source duration. */
|
|
675
|
+
const resizeCaptionInputSchema = z.object({
|
|
676
|
+
caption_id: z.string().min(1),
|
|
677
|
+
duration_ms: z.number().finite().positive()
|
|
678
|
+
});
|
|
679
|
+
//#endregion
|
|
673
680
|
//#region src/editor/schemas/set-bgm.ts
|
|
674
681
|
/**
|
|
675
682
|
* Set the document BGM. The media's stable result (storage key) arrives
|
|
@@ -765,6 +772,7 @@ var schemas_exports = /* @__PURE__ */ __exportAll({
|
|
|
765
772
|
positiveMsSchema: () => positiveMsSchema,
|
|
766
773
|
replaceVideoClipContentInputSchema: () => replaceVideoClipContentInputSchema,
|
|
767
774
|
replaceVideoClipSequenceInputSchema: () => replaceVideoClipSequenceInputSchema,
|
|
775
|
+
resizeCaptionInputSchema: () => resizeCaptionInputSchema,
|
|
768
776
|
setBgmInputSchema: () => setBgmInputSchema,
|
|
769
777
|
setCaptionStyleInputSchema: () => setCaptionStyleInputSchema,
|
|
770
778
|
setCaptionVisibilityInputSchema: () => setCaptionVisibilityInputSchema,
|
|
@@ -1015,6 +1023,18 @@ var SchemaValidator = class {
|
|
|
1015
1023
|
validateSetCaptionVisibility(input, _doc) {
|
|
1016
1024
|
this.parse(setCaptionVisibilityInputSchema, input, "set_caption_visibility_invalid_input");
|
|
1017
1025
|
}
|
|
1026
|
+
validateResizeCaption(input, doc) {
|
|
1027
|
+
const parsed = this.parse(resizeCaptionInputSchema, input, "resize_caption_invalid_input");
|
|
1028
|
+
const snapshot = doc.snapshot();
|
|
1029
|
+
this.assertPartKind(snapshot, parsed.caption_id, "caption", "resize_caption");
|
|
1030
|
+
if (snapshot.tracks?.find((track) => track.parts_kind === "caption")?.items?.find((row) => row.part_id === parsed.caption_id) == null) throw new ValidationError("resize_caption_placement_not_found", `caption_id "${parsed.caption_id}" is not placed on the caption track`, { caption_id: parsed.caption_id });
|
|
1031
|
+
const cueDuration = snapshot.part_library?.[parsed.caption_id]?.caption?.initial_duration_ms ?? 0;
|
|
1032
|
+
if (parsed.duration_ms < cueDuration) throw new ValidationError("resize_caption_below_cue", `duration_ms ${parsed.duration_ms} is shorter than cue duration ${cueDuration}`, {
|
|
1033
|
+
caption_id: parsed.caption_id,
|
|
1034
|
+
duration_ms: parsed.duration_ms,
|
|
1035
|
+
cue_duration_ms: cueDuration
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1018
1038
|
validateSetCaptionStyle(input, _doc) {
|
|
1019
1039
|
this.parse(setCaptionStyleInputSchema, input, "set_caption_style_invalid_input");
|
|
1020
1040
|
}
|
|
@@ -1220,7 +1240,8 @@ var SemanticEditor = class {
|
|
|
1220
1240
|
track.items.splice(at, 0, {
|
|
1221
1241
|
part_id: partId,
|
|
1222
1242
|
time_position: { mode: "sequential" },
|
|
1223
|
-
fallback_abs_ms: void 0
|
|
1243
|
+
fallback_abs_ms: void 0,
|
|
1244
|
+
duration_override_ms: void 0
|
|
1224
1245
|
});
|
|
1225
1246
|
at += 1;
|
|
1226
1247
|
}
|
|
@@ -1267,7 +1288,8 @@ var SemanticEditor = class {
|
|
|
1267
1288
|
newItems.push({
|
|
1268
1289
|
part_id: partId,
|
|
1269
1290
|
time_position: { mode: "sequential" },
|
|
1270
|
-
fallback_abs_ms: void 0
|
|
1291
|
+
fallback_abs_ms: void 0,
|
|
1292
|
+
duration_override_ms: void 0
|
|
1271
1293
|
});
|
|
1272
1294
|
newClipIds.push(partId);
|
|
1273
1295
|
}
|
|
@@ -1480,7 +1502,8 @@ var SemanticEditor = class {
|
|
|
1480
1502
|
mode: "absolute",
|
|
1481
1503
|
offsetMs: 0
|
|
1482
1504
|
},
|
|
1483
|
-
fallback_abs_ms: void 0
|
|
1505
|
+
fallback_abs_ms: void 0,
|
|
1506
|
+
duration_override_ms: void 0
|
|
1484
1507
|
}];
|
|
1485
1508
|
}, audit("SetBgm", input, options));
|
|
1486
1509
|
}
|
|
@@ -1503,6 +1526,15 @@ var SemanticEditor = class {
|
|
|
1503
1526
|
track.is_hidden = input.is_hidden;
|
|
1504
1527
|
}, audit("SetCaptionVisibility", input, options));
|
|
1505
1528
|
}
|
|
1529
|
+
/** Resize the caption placement window; cue/source duration stays immutable. */
|
|
1530
|
+
async resizeCaption(input, options) {
|
|
1531
|
+
this.validator.validateResizeCaption(input, this.doc);
|
|
1532
|
+
this.doc.transact((draft) => {
|
|
1533
|
+
const item = findLaneTrack(draft, "caption")?.items?.find((row) => row.part_id === input.caption_id);
|
|
1534
|
+
if (item == null) return;
|
|
1535
|
+
item.duration_override_ms = input.duration_ms;
|
|
1536
|
+
}, audit("ResizeCaption", input, options));
|
|
1537
|
+
}
|
|
1506
1538
|
/**
|
|
1507
1539
|
* Set the document-wide caption style. GLOBAL (no `caption_id`): the patch is
|
|
1508
1540
|
* merged onto EVERY caption part's `style`, mirroring the FE, which applies a
|
|
@@ -1749,7 +1781,8 @@ function placeRelative(items, partId, anchorPartId, offsetMs, fallbackAbsMs) {
|
|
|
1749
1781
|
items.push({
|
|
1750
1782
|
part_id: partId,
|
|
1751
1783
|
time_position: timePosition,
|
|
1752
|
-
fallback_abs_ms: fallbackAbsMs
|
|
1784
|
+
fallback_abs_ms: fallbackAbsMs,
|
|
1785
|
+
duration_override_ms: void 0
|
|
1753
1786
|
});
|
|
1754
1787
|
}
|
|
1755
1788
|
/**
|
|
@@ -1893,6 +1926,7 @@ const IMPLEMENTED_SEMANTIC_OP_KINDS = [
|
|
|
1893
1926
|
"ChangeSpeechScript",
|
|
1894
1927
|
"ChangeSpeechVoice",
|
|
1895
1928
|
"AdjustSpeechVolume",
|
|
1929
|
+
"ResizeCaption",
|
|
1896
1930
|
"SetCaptionVisibility",
|
|
1897
1931
|
"SetCaptionStyle",
|
|
1898
1932
|
"SetBgm",
|
package/dist/testing.d.ts
CHANGED
package/dist/testing.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { N as VIDEO_DOCUMENT_SCHEMA_VERSION, R as base64ToBytes, r as createMirrorVideoDocumentAdapter, z as bytesToBase64 } from "./document-
|
|
1
|
+
import { N as VIDEO_DOCUMENT_SCHEMA_VERSION, R as base64ToBytes, r as createMirrorVideoDocumentAdapter, z as bytesToBase64 } from "./document-Dcu87api.js";
|
|
2
2
|
import { t as classifyUpdate } from "./loro-relay-doc-ssdYpuef.js";
|
|
3
3
|
import { LoroDoc, VersionVector, encodeFrontiers } from "loro-crdt";
|
|
4
4
|
//#region src/testing/in-memory-mengine-server.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mengine/medeo-client",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1-alpha.1",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"loro-mirror": "^2.2.0",
|
|
27
27
|
"zod": "^4.4.3",
|
|
28
|
-
"@mengine/
|
|
29
|
-
"@mengine/
|
|
30
|
-
"@mengine/utils": "1.2.
|
|
28
|
+
"@mengine/storage": "1.2.1-alpha.1",
|
|
29
|
+
"@mengine/sync": "1.2.1-alpha.1",
|
|
30
|
+
"@mengine/utils": "1.2.1-alpha.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^25.9.1",
|