aivee 0.1.0-alpha.0 → 0.1.0-dev.7025438

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 (73) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +118 -118
  3. package/docs/architecture.md +401 -401
  4. package/docs/aspect-ratio-presets.md +72 -72
  5. package/docs/releasing.md +19 -19
  6. package/docs/usage.md +1193 -1193
  7. package/package.json +52 -52
  8. package/requirements-otio.txt +1 -1
  9. package/src/capabilities.mjs +307 -307
  10. package/src/cli.mjs +646 -646
  11. package/src/doctor.mjs +133 -133
  12. package/src/edits/analysis-to-edl.mjs +43 -43
  13. package/src/edits/detect-silence.mjs +51 -51
  14. package/src/edits/find-mistake-candidates.mjs +42 -42
  15. package/src/edits/plan-shot-placements.mjs +105 -105
  16. package/src/edits/plan-silence-cuts.mjs +49 -49
  17. package/src/edits/retime-transcript.mjs +105 -105
  18. package/src/files.mjs +80 -80
  19. package/src/index.mjs +44 -44
  20. package/src/interchange/otio.mjs +204 -204
  21. package/src/interchange/otio_bridge.py +521 -521
  22. package/src/media/analysis-provider.mjs +75 -75
  23. package/src/media/compatibility.mjs +45 -45
  24. package/src/media/ffmpeg-capabilities.mjs +129 -129
  25. package/src/media/frame-rate.mjs +58 -58
  26. package/src/media/frame-time.mjs +22 -22
  27. package/src/media/preview-assets.mjs +350 -350
  28. package/src/media/probe.mjs +149 -149
  29. package/src/media/render-cuts.mjs +90 -90
  30. package/src/media/scene-detection.mjs +107 -107
  31. package/src/media/scene-review.mjs +205 -205
  32. package/src/project/assets.mjs +1194 -1194
  33. package/src/project/create.mjs +100 -100
  34. package/src/project/presets.mjs +44 -44
  35. package/src/render/checkpoints.mjs +192 -192
  36. package/src/render/formats.mjs +163 -163
  37. package/src/render/hyperframes.mjs +590 -590
  38. package/src/render/process.mjs +111 -111
  39. package/src/render/progress.mjs +46 -46
  40. package/src/render/timeline-control.mjs +53 -53
  41. package/src/timeline/assemble.mjs +119 -119
  42. package/src/timeline/audio-effects.mjs +75 -75
  43. package/src/timeline/audio-mastering.mjs +236 -236
  44. package/src/timeline/audio-mix.mjs +105 -105
  45. package/src/timeline/audio-track-effects.mjs +139 -139
  46. package/src/timeline/audio-volume.mjs +63 -63
  47. package/src/timeline/background.mjs +8 -8
  48. package/src/timeline/blend-mode.mjs +34 -34
  49. package/src/timeline/caption-layouts.mjs +61 -61
  50. package/src/timeline/captions.mjs +80 -80
  51. package/src/timeline/edit.mjs +965 -965
  52. package/src/timeline/fingerprint.mjs +6 -6
  53. package/src/timeline/from-edl.mjs +31 -31
  54. package/src/timeline/history-store.mjs +281 -281
  55. package/src/timeline/history.mjs +69 -69
  56. package/src/timeline/inspect.mjs +117 -117
  57. package/src/timeline/keyframes.mjs +158 -158
  58. package/src/timeline/layers.mjs +18 -18
  59. package/src/timeline/mask.mjs +53 -53
  60. package/src/timeline/project.mjs +52 -52
  61. package/src/timeline/render.mjs +759 -759
  62. package/src/timeline/sidechain-render.mjs +209 -209
  63. package/src/timeline/source-fit.mjs +15 -15
  64. package/src/timeline/speech-bubble.mjs +26 -26
  65. package/src/timeline/speed-ramp.mjs +188 -188
  66. package/src/timeline/track-state.mjs +22 -22
  67. package/src/timeline/transition.mjs +34 -34
  68. package/src/timeline/validate.mjs +322 -322
  69. package/src/transcript/corrections.mjs +21 -21
  70. package/src/transcript/normalize.mjs +17 -17
  71. package/src/transcript/provider.mjs +42 -42
  72. package/src/transcript/subtitles.mjs +57 -57
  73. package/src/transcript/validate.mjs +39 -39
package/src/files.mjs CHANGED
@@ -1,80 +1,80 @@
1
- import { closeSync, createReadStream, linkSync, openSync, readSync, rmSync, statSync, writeSync } from 'node:fs';
2
- import { link, open, rm } from 'node:fs/promises';
3
- import { Transform } from 'node:stream';
4
- import { pipeline } from 'node:stream/promises';
5
-
6
- /** Publish a staged file without overwriting an existing destination. */
7
- export function linkOrCopySync(source, destination) {
8
- try {
9
- linkSync(source, destination);
10
- } catch (error) {
11
- if (!isUnsupportedHardLinkError(error)) throw error;
12
- copyFileExclusiveSync(source, destination);
13
- }
14
- }
15
-
16
- /** Publish a staged file asynchronously and report bytes only when copied. */
17
- export async function linkOrCopyAsync(source, destination, { signal, onCopyProgress } = {}) {
18
- try {
19
- await link(source, destination);
20
- } catch (error) {
21
- if (!isUnsupportedHardLinkError(error)) throw error;
22
- const destinationHandle = await open(destination, 'wx');
23
- try {
24
- const progress = onCopyProgress ? createCopyProgress(source, onCopyProgress) : undefined;
25
- const streams = [createReadStream(source, { signal }), ...(progress ? [progress] : []), destinationHandle.createWriteStream()];
26
- await pipeline(...streams, { signal });
27
- } catch (copyError) {
28
- await destinationHandle.close().catch(() => {});
29
- await rm(destination, { force: true }).catch(() => {});
30
- throw copyError;
31
- }
32
- }
33
- }
34
-
35
- function isUnsupportedHardLinkError(error) {
36
- return ['EPERM', 'EXDEV', 'ENOSYS', 'ENOTSUP', 'EOPNOTSUPP'].includes(error?.code);
37
- }
38
-
39
- function copyFileExclusiveSync(source, destination) {
40
- let sourceDescriptor;
41
- let destinationDescriptor;
42
- try {
43
- sourceDescriptor = openSync(source, 'r');
44
- destinationDescriptor = openSync(destination, 'wx');
45
- const buffer = Buffer.allocUnsafe(1024 * 1024);
46
- let bytesRead;
47
- while ((bytesRead = readSync(sourceDescriptor, buffer, 0, buffer.length, null)) > 0) {
48
- let offset = 0;
49
- while (offset < bytesRead) offset += writeSync(destinationDescriptor, buffer, offset, bytesRead - offset);
50
- }
51
- closeSync(destinationDescriptor);
52
- destinationDescriptor = undefined;
53
- } catch (error) {
54
- if (destinationDescriptor !== undefined) {
55
- try { closeSync(destinationDescriptor); } catch { /* Preserve the original copy error. */ }
56
- destinationDescriptor = undefined;
57
- try { rmSync(destination, { force: true }); } catch { /* Preserve the original copy error. */ }
58
- }
59
- throw error;
60
- } finally {
61
- if (sourceDescriptor !== undefined) closeSync(sourceDescriptor);
62
- }
63
- }
64
-
65
- function createCopyProgress(source, onCopyProgress) {
66
- const totalBytes = statSync(source).size;
67
- let completedBytes = 0;
68
- let lastPercent = -1;
69
- return new Transform({
70
- transform(chunk, encoding, callback) {
71
- completedBytes += chunk.length;
72
- const percent = totalBytes > 0 ? Math.floor(completedBytes / totalBytes * 100) : 100;
73
- if (percent > lastPercent || completedBytes >= totalBytes) {
74
- lastPercent = percent;
75
- onCopyProgress(completedBytes, totalBytes);
76
- }
77
- callback(null, chunk);
78
- },
79
- });
80
- }
1
+ import { closeSync, createReadStream, linkSync, openSync, readSync, rmSync, statSync, writeSync } from 'node:fs';
2
+ import { link, open, rm } from 'node:fs/promises';
3
+ import { Transform } from 'node:stream';
4
+ import { pipeline } from 'node:stream/promises';
5
+
6
+ /** Publish a staged file without overwriting an existing destination. */
7
+ export function linkOrCopySync(source, destination) {
8
+ try {
9
+ linkSync(source, destination);
10
+ } catch (error) {
11
+ if (!isUnsupportedHardLinkError(error)) throw error;
12
+ copyFileExclusiveSync(source, destination);
13
+ }
14
+ }
15
+
16
+ /** Publish a staged file asynchronously and report bytes only when copied. */
17
+ export async function linkOrCopyAsync(source, destination, { signal, onCopyProgress } = {}) {
18
+ try {
19
+ await link(source, destination);
20
+ } catch (error) {
21
+ if (!isUnsupportedHardLinkError(error)) throw error;
22
+ const destinationHandle = await open(destination, 'wx');
23
+ try {
24
+ const progress = onCopyProgress ? createCopyProgress(source, onCopyProgress) : undefined;
25
+ const streams = [createReadStream(source, { signal }), ...(progress ? [progress] : []), destinationHandle.createWriteStream()];
26
+ await pipeline(...streams, { signal });
27
+ } catch (copyError) {
28
+ await destinationHandle.close().catch(() => {});
29
+ await rm(destination, { force: true }).catch(() => {});
30
+ throw copyError;
31
+ }
32
+ }
33
+ }
34
+
35
+ function isUnsupportedHardLinkError(error) {
36
+ return ['EPERM', 'EXDEV', 'ENOSYS', 'ENOTSUP', 'EOPNOTSUPP'].includes(error?.code);
37
+ }
38
+
39
+ function copyFileExclusiveSync(source, destination) {
40
+ let sourceDescriptor;
41
+ let destinationDescriptor;
42
+ try {
43
+ sourceDescriptor = openSync(source, 'r');
44
+ destinationDescriptor = openSync(destination, 'wx');
45
+ const buffer = Buffer.allocUnsafe(1024 * 1024);
46
+ let bytesRead;
47
+ while ((bytesRead = readSync(sourceDescriptor, buffer, 0, buffer.length, null)) > 0) {
48
+ let offset = 0;
49
+ while (offset < bytesRead) offset += writeSync(destinationDescriptor, buffer, offset, bytesRead - offset);
50
+ }
51
+ closeSync(destinationDescriptor);
52
+ destinationDescriptor = undefined;
53
+ } catch (error) {
54
+ if (destinationDescriptor !== undefined) {
55
+ try { closeSync(destinationDescriptor); } catch { /* Preserve the original copy error. */ }
56
+ destinationDescriptor = undefined;
57
+ try { rmSync(destination, { force: true }); } catch { /* Preserve the original copy error. */ }
58
+ }
59
+ throw error;
60
+ } finally {
61
+ if (sourceDescriptor !== undefined) closeSync(sourceDescriptor);
62
+ }
63
+ }
64
+
65
+ function createCopyProgress(source, onCopyProgress) {
66
+ const totalBytes = statSync(source).size;
67
+ let completedBytes = 0;
68
+ let lastPercent = -1;
69
+ return new Transform({
70
+ transform(chunk, encoding, callback) {
71
+ completedBytes += chunk.length;
72
+ const percent = totalBytes > 0 ? Math.floor(completedBytes / totalBytes * 100) : 100;
73
+ if (percent > lastPercent || completedBytes >= totalBytes) {
74
+ lastPercent = percent;
75
+ onCopyProgress(completedBytes, totalBytes);
76
+ }
77
+ callback(null, chunk);
78
+ },
79
+ });
80
+ }
package/src/index.mjs CHANGED
@@ -1,44 +1,44 @@
1
- export { validateTranscript } from './transcript/validate.mjs';
2
- export { getEngineCapabilities } from './capabilities.mjs';
3
- export { validateTimeline } from './timeline/validate.mjs';
4
- export { inspectTimeline } from './timeline/inspect.mjs';
5
- export { blendModeStyle, validateBlendMode } from './timeline/blend-mode.mjs';
6
- export { timelineForRender } from './timeline/track-state.mjs';
7
- export { SPEED_RAMP_EASES, speedRampDuration } from './timeline/speed-ramp.mjs';
8
- export { timelineFromEdl } from './timeline/from-edl.mjs';
9
- export { renderTimeline, renderTimelineAsync, renderTimelineRange, renderTimelineRangeAsync } from './timeline/render.mjs';
10
- export { DEFAULT_SOURCE_FIT, SOURCE_FIT_MODES, resolveSourceFit, validateSourceFit } from './timeline/source-fit.mjs';
11
- export { addTimelineClip, addTimelineTrack, crossfadeTimelineClips, detachAudioFromTimelineClip, duplicateTimelineClip, editTimeline, editTimelineBatch, extractTimelineRange, insertTimelineGap, moveTimelineClip, moveTimelineClipToTrack, previewTimelineEdit, removeTimelineClip, removeTimelineMarker, removeTimelineTrack, reorderTimelineTrack, replaceTimelineClipAsset, rippleDeleteTimelineClip, rippleDeleteTimelineRange, setTimelineAudioMastering, setTimelineAudioMix, setTimelineClipAudioEffects, setTimelineClipAudioState, setTimelineClipState, setTimelineClipVideoState, setTimelineClipFraming, setTimelineClipKeyframes, setTimelineClipReverse, setTimelineClipSpeed, setTimelineClipVolumeKeyframes, setTimelineMarker, setTimelineOverlay, setTimelineProjectState, setTimelineTrackAudioEffects, setTimelineTrackState, setTimelineTransition, slipTimelineClip, splitTimelineClip, trimTimelineClip } from './timeline/edit.mjs';
12
- export { createTimelineHistory } from './timeline/history.mjs';
13
- export { applyTimelineReviewPlan, editTimelineFile, undoTimelineFile, redoTimelineFile, getTimelineFileHistory, resetTimelineFileHistory } from './timeline/history-store.mjs';
14
- export { timelineFingerprint } from './timeline/fingerprint.mjs';
15
- export { createProjectTimeline } from './timeline/project.mjs';
16
- export { createCaptionTrack } from './timeline/captions.mjs';
17
- export { CAPTION_LAYOUT_PRESETS, listCaptionLayoutPresets, resolveCaptionLayoutPreset } from './timeline/caption-layouts.mjs';
18
- export { assembleEditedTimeline, renderEditedProject, renderEditedProjectAsync } from './timeline/assemble.mjs';
19
- export { normalizeTranscript } from './transcript/normalize.mjs';
20
- export { formatSubtitleText, parseSubtitleText } from './transcript/subtitles.mjs';
21
- export { transcribeWithProvider } from './transcript/provider.mjs';
22
- export { approveEdl, assertEdlApproved, retimeTranscript, validateEdl } from './edits/retime-transcript.mjs';
23
- export { mediaAnalysisToEdl } from './edits/analysis-to-edl.mjs';
24
- export { planSilenceCuts } from './edits/plan-silence-cuts.mjs';
25
- export { detectAcousticSilence, parseSilenceIntervals } from './edits/detect-silence.mjs';
26
- export { findMistakeCandidates } from './edits/find-mistake-candidates.mjs';
27
- export { planSceneReviewPlacements } from './edits/plan-shot-placements.mjs';
28
- export { applyTranscriptCorrections } from './transcript/corrections.mjs';
29
- export { parseProbeOutput, probeMedia, probeMediaAsync } from './media/probe.mjs';
30
- export { inspectMediaCompatibility } from './media/compatibility.mjs';
31
- export { analyzeMediaWithProvider, normalizeMediaFindings } from './media/analysis-provider.mjs';
32
- export { detectSceneChangesAsync, parseSceneDetectionOutput } from './media/scene-detection.mjs';
33
- export { buildShotRanges, createSceneReviewPackAsync } from './media/scene-review.mjs';
34
- export { generateAssetPreview } from './media/preview-assets.mjs';
35
- export { normalizeFrameRate, frameRateNumber } from './media/frame-rate.mjs';
36
- export { assertFfmpegDecoder, assertFfmpegDemuxer, assertFfmpegEncoder, hasFfmpegDecoder, hasFfmpegDemuxer, hasFfmpegEncoder, hasFfmpegFilter, listFfmpegDecoders, listFfmpegDemuxers, listFfmpegEncoders, listFfmpegFilters, parseFfmpegDecoders, parseFfmpegDemuxers, parseFfmpegEncoders, parseFfmpegFilters } from './media/ffmpeg-capabilities.mjs';
37
- export { secondsToFrame, frameToSeconds, snapTimeToFrame } from './media/frame-time.mjs';
38
- export { createFilterGraph, getKeepRanges, renderCuts } from './media/render-cuts.mjs';
39
- export { createVideoProject } from './project/create.mjs';
40
- export { createAssetProxy, createAssetProxyAsync, listProjectAssets, registerMediaAsset, registerMediaAssetAsync, registerMediaAssetsAsync, relinkProjectAsset, relinkProjectAssetAsync, resolveAssetProxies, resolveAssetProxiesAsync, unregisterProjectAsset, verifyProjectAssets, verifyProjectAssetsAsync } from './project/assets.mjs';
41
- export { CANVAS_PRESETS, listCanvasPresets, resolveCanvasPreset } from './project/presets.mjs';
42
- export { doctorHyperframes, importProjectTranscript, lintProject, previewProject, renderProject, renderProjectAsync, transcribeProject } from './render/hyperframes.mjs';
43
- export { resolveColorProfile, resolveEncoderArgs, resolveProfileEncoder, resolveRenderControlArgs, resolveRenderFormat, resolveVideoEncoder } from './render/formats.mjs';
44
- export { exportTimelineToOtio, importTimelineFromOtio, isOtioPath } from './interchange/otio.mjs';
1
+ export { validateTranscript } from './transcript/validate.mjs';
2
+ export { getEngineCapabilities } from './capabilities.mjs';
3
+ export { validateTimeline } from './timeline/validate.mjs';
4
+ export { inspectTimeline } from './timeline/inspect.mjs';
5
+ export { blendModeStyle, validateBlendMode } from './timeline/blend-mode.mjs';
6
+ export { timelineForRender } from './timeline/track-state.mjs';
7
+ export { SPEED_RAMP_EASES, speedRampDuration } from './timeline/speed-ramp.mjs';
8
+ export { timelineFromEdl } from './timeline/from-edl.mjs';
9
+ export { renderTimeline, renderTimelineAsync, renderTimelineRange, renderTimelineRangeAsync } from './timeline/render.mjs';
10
+ export { DEFAULT_SOURCE_FIT, SOURCE_FIT_MODES, resolveSourceFit, validateSourceFit } from './timeline/source-fit.mjs';
11
+ export { addTimelineClip, addTimelineTrack, crossfadeTimelineClips, detachAudioFromTimelineClip, duplicateTimelineClip, editTimeline, editTimelineBatch, extractTimelineRange, insertTimelineGap, moveTimelineClip, moveTimelineClipToTrack, previewTimelineEdit, removeTimelineClip, removeTimelineMarker, removeTimelineTrack, reorderTimelineTrack, replaceTimelineClipAsset, rippleDeleteTimelineClip, rippleDeleteTimelineRange, setTimelineAudioMastering, setTimelineAudioMix, setTimelineClipAudioEffects, setTimelineClipAudioState, setTimelineClipState, setTimelineClipVideoState, setTimelineClipFraming, setTimelineClipKeyframes, setTimelineClipReverse, setTimelineClipSpeed, setTimelineClipVolumeKeyframes, setTimelineMarker, setTimelineOverlay, setTimelineProjectState, setTimelineTrackAudioEffects, setTimelineTrackState, setTimelineTransition, slipTimelineClip, splitTimelineClip, trimTimelineClip } from './timeline/edit.mjs';
12
+ export { createTimelineHistory } from './timeline/history.mjs';
13
+ export { applyTimelineReviewPlan, editTimelineFile, undoTimelineFile, redoTimelineFile, getTimelineFileHistory, resetTimelineFileHistory } from './timeline/history-store.mjs';
14
+ export { timelineFingerprint } from './timeline/fingerprint.mjs';
15
+ export { createProjectTimeline } from './timeline/project.mjs';
16
+ export { createCaptionTrack } from './timeline/captions.mjs';
17
+ export { CAPTION_LAYOUT_PRESETS, listCaptionLayoutPresets, resolveCaptionLayoutPreset } from './timeline/caption-layouts.mjs';
18
+ export { assembleEditedTimeline, renderEditedProject, renderEditedProjectAsync } from './timeline/assemble.mjs';
19
+ export { normalizeTranscript } from './transcript/normalize.mjs';
20
+ export { formatSubtitleText, parseSubtitleText } from './transcript/subtitles.mjs';
21
+ export { transcribeWithProvider } from './transcript/provider.mjs';
22
+ export { approveEdl, assertEdlApproved, retimeTranscript, validateEdl } from './edits/retime-transcript.mjs';
23
+ export { mediaAnalysisToEdl } from './edits/analysis-to-edl.mjs';
24
+ export { planSilenceCuts } from './edits/plan-silence-cuts.mjs';
25
+ export { detectAcousticSilence, parseSilenceIntervals } from './edits/detect-silence.mjs';
26
+ export { findMistakeCandidates } from './edits/find-mistake-candidates.mjs';
27
+ export { planSceneReviewPlacements } from './edits/plan-shot-placements.mjs';
28
+ export { applyTranscriptCorrections } from './transcript/corrections.mjs';
29
+ export { parseProbeOutput, probeMedia, probeMediaAsync } from './media/probe.mjs';
30
+ export { inspectMediaCompatibility } from './media/compatibility.mjs';
31
+ export { analyzeMediaWithProvider, normalizeMediaFindings } from './media/analysis-provider.mjs';
32
+ export { detectSceneChangesAsync, parseSceneDetectionOutput } from './media/scene-detection.mjs';
33
+ export { buildShotRanges, createSceneReviewPackAsync } from './media/scene-review.mjs';
34
+ export { generateAssetPreview } from './media/preview-assets.mjs';
35
+ export { normalizeFrameRate, frameRateNumber } from './media/frame-rate.mjs';
36
+ export { assertFfmpegDecoder, assertFfmpegDemuxer, assertFfmpegEncoder, hasFfmpegDecoder, hasFfmpegDemuxer, hasFfmpegEncoder, hasFfmpegFilter, listFfmpegDecoders, listFfmpegDemuxers, listFfmpegEncoders, listFfmpegFilters, parseFfmpegDecoders, parseFfmpegDemuxers, parseFfmpegEncoders, parseFfmpegFilters } from './media/ffmpeg-capabilities.mjs';
37
+ export { secondsToFrame, frameToSeconds, snapTimeToFrame } from './media/frame-time.mjs';
38
+ export { createFilterGraph, getKeepRanges, renderCuts } from './media/render-cuts.mjs';
39
+ export { createVideoProject } from './project/create.mjs';
40
+ export { createAssetProxy, createAssetProxyAsync, listProjectAssets, registerMediaAsset, registerMediaAssetAsync, registerMediaAssetsAsync, relinkProjectAsset, relinkProjectAssetAsync, resolveAssetProxies, resolveAssetProxiesAsync, unregisterProjectAsset, verifyProjectAssets, verifyProjectAssetsAsync } from './project/assets.mjs';
41
+ export { CANVAS_PRESETS, listCanvasPresets, resolveCanvasPreset } from './project/presets.mjs';
42
+ export { doctorHyperframes, importProjectTranscript, lintProject, previewProject, renderProject, renderProjectAsync, transcribeProject } from './render/hyperframes.mjs';
43
+ export { resolveColorProfile, resolveEncoderArgs, resolveProfileEncoder, resolveRenderControlArgs, resolveRenderFormat, resolveVideoEncoder } from './render/formats.mjs';
44
+ export { exportTimelineToOtio, importTimelineFromOtio, isOtioPath } from './interchange/otio.mjs';