@nodetool-ai/video-nodes 0.8.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 (152) hide show
  1. package/README.md +58 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +11 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/nodes/ffmpeg-helpers.d.ts +77 -0
  8. package/dist/nodes/ffmpeg-helpers.d.ts.map +1 -0
  9. package/dist/nodes/ffmpeg-helpers.js +220 -0
  10. package/dist/nodes/ffmpeg-helpers.js.map +1 -0
  11. package/dist/nodes/lib-video-download.d.ts +29 -0
  12. package/dist/nodes/lib-video-download.d.ts.map +1 -0
  13. package/dist/nodes/lib-video-download.js +353 -0
  14. package/dist/nodes/lib-video-download.js.map +1 -0
  15. package/dist/nodes/model3d/analysis.d.ts +16 -0
  16. package/dist/nodes/model3d/analysis.d.ts.map +1 -0
  17. package/dist/nodes/model3d/analysis.js +38 -0
  18. package/dist/nodes/model3d/analysis.js.map +1 -0
  19. package/dist/nodes/model3d/base.d.ts +28 -0
  20. package/dist/nodes/model3d/base.d.ts.map +1 -0
  21. package/dist/nodes/model3d/base.js +20 -0
  22. package/dist/nodes/model3d/base.js.map +1 -0
  23. package/dist/nodes/model3d/boolean-ops.d.ts +2 -0
  24. package/dist/nodes/model3d/boolean-ops.d.ts.map +1 -0
  25. package/dist/nodes/model3d/boolean-ops.js +172 -0
  26. package/dist/nodes/model3d/boolean-ops.js.map +1 -0
  27. package/dist/nodes/model3d/cleanup.d.ts +56 -0
  28. package/dist/nodes/model3d/cleanup.d.ts.map +1 -0
  29. package/dist/nodes/model3d/cleanup.js +144 -0
  30. package/dist/nodes/model3d/cleanup.js.map +1 -0
  31. package/dist/nodes/model3d/convert.d.ts +27 -0
  32. package/dist/nodes/model3d/convert.d.ts.map +1 -0
  33. package/dist/nodes/model3d/convert.js +66 -0
  34. package/dist/nodes/model3d/convert.js.map +1 -0
  35. package/dist/nodes/model3d/defaults.d.ts +34 -0
  36. package/dist/nodes/model3d/defaults.d.ts.map +1 -0
  37. package/dist/nodes/model3d/defaults.js +28 -0
  38. package/dist/nodes/model3d/defaults.js.map +1 -0
  39. package/dist/nodes/model3d/document-ops.d.ts +4 -0
  40. package/dist/nodes/model3d/document-ops.d.ts.map +1 -0
  41. package/dist/nodes/model3d/document-ops.js +40 -0
  42. package/dist/nodes/model3d/document-ops.js.map +1 -0
  43. package/dist/nodes/model3d/generation.d.ts +56 -0
  44. package/dist/nodes/model3d/generation.d.ts.map +1 -0
  45. package/dist/nodes/model3d/generation.js +203 -0
  46. package/dist/nodes/model3d/generation.js.map +1 -0
  47. package/dist/nodes/model3d/glb.d.ts +29 -0
  48. package/dist/nodes/model3d/glb.d.ts.map +1 -0
  49. package/dist/nodes/model3d/glb.js +255 -0
  50. package/dist/nodes/model3d/glb.js.map +1 -0
  51. package/dist/nodes/model3d/index.d.ts +22 -0
  52. package/dist/nodes/model3d/index.d.ts.map +1 -0
  53. package/dist/nodes/model3d/index.js +41 -0
  54. package/dist/nodes/model3d/index.js.map +1 -0
  55. package/dist/nodes/model3d/io.d.ts +81 -0
  56. package/dist/nodes/model3d/io.d.ts.map +1 -0
  57. package/dist/nodes/model3d/io.js +162 -0
  58. package/dist/nodes/model3d/io.js.map +1 -0
  59. package/dist/nodes/model3d/mesh-ops.d.ts +40 -0
  60. package/dist/nodes/model3d/mesh-ops.d.ts.map +1 -0
  61. package/dist/nodes/model3d/mesh-ops.js +775 -0
  62. package/dist/nodes/model3d/mesh-ops.js.map +1 -0
  63. package/dist/nodes/model3d/nodes.d.ts +2 -0
  64. package/dist/nodes/model3d/nodes.d.ts.map +1 -0
  65. package/dist/nodes/model3d/nodes.js +2 -0
  66. package/dist/nodes/model3d/nodes.js.map +1 -0
  67. package/dist/nodes/model3d/ops.d.ts +44 -0
  68. package/dist/nodes/model3d/ops.d.ts.map +1 -0
  69. package/dist/nodes/model3d/ops.js +142 -0
  70. package/dist/nodes/model3d/ops.js.map +1 -0
  71. package/dist/nodes/model3d/render.d.ts +51 -0
  72. package/dist/nodes/model3d/render.d.ts.map +1 -0
  73. package/dist/nodes/model3d/render.js +124 -0
  74. package/dist/nodes/model3d/render.js.map +1 -0
  75. package/dist/nodes/model3d/render3d-core.d.ts +177 -0
  76. package/dist/nodes/model3d/render3d-core.d.ts.map +1 -0
  77. package/dist/nodes/model3d/render3d-core.js +366 -0
  78. package/dist/nodes/model3d/render3d-core.js.map +1 -0
  79. package/dist/nodes/model3d/render3d-headless.d.ts +75 -0
  80. package/dist/nodes/model3d/render3d-headless.d.ts.map +1 -0
  81. package/dist/nodes/model3d/render3d-headless.js +190 -0
  82. package/dist/nodes/model3d/render3d-headless.js.map +1 -0
  83. package/dist/nodes/model3d/render3d-page.d.ts +16 -0
  84. package/dist/nodes/model3d/render3d-page.d.ts.map +1 -0
  85. package/dist/nodes/model3d/render3d-page.js +51 -0
  86. package/dist/nodes/model3d/render3d-page.js.map +1 -0
  87. package/dist/nodes/model3d/transforms.d.ts +56 -0
  88. package/dist/nodes/model3d/transforms.d.ts.map +1 -0
  89. package/dist/nodes/model3d/transforms.js +148 -0
  90. package/dist/nodes/model3d/transforms.js.map +1 -0
  91. package/dist/nodes/model3d/types.d.ts +82 -0
  92. package/dist/nodes/model3d/types.d.ts.map +1 -0
  93. package/dist/nodes/model3d/types.js +2 -0
  94. package/dist/nodes/model3d/types.js.map +1 -0
  95. package/dist/nodes/model3d/utils.d.ts +46 -0
  96. package/dist/nodes/model3d/utils.d.ts.map +1 -0
  97. package/dist/nodes/model3d/utils.js +190 -0
  98. package/dist/nodes/model3d/utils.js.map +1 -0
  99. package/dist/nodes/model3d.d.ts +2 -0
  100. package/dist/nodes/model3d.d.ts.map +1 -0
  101. package/dist/nodes/model3d.js +2 -0
  102. package/dist/nodes/model3d.js.map +1 -0
  103. package/dist/nodes/placeholder-values.d.ts +10 -0
  104. package/dist/nodes/placeholder-values.d.ts.map +1 -0
  105. package/dist/nodes/placeholder-values.js +19 -0
  106. package/dist/nodes/placeholder-values.js.map +1 -0
  107. package/dist/nodes/script.d.ts +161 -0
  108. package/dist/nodes/script.d.ts.map +1 -0
  109. package/dist/nodes/script.js +673 -0
  110. package/dist/nodes/script.js.map +1 -0
  111. package/dist/nodes/storyboard.d.ts +269 -0
  112. package/dist/nodes/storyboard.d.ts.map +1 -0
  113. package/dist/nodes/storyboard.js +1017 -0
  114. package/dist/nodes/storyboard.js.map +1 -0
  115. package/dist/nodes/timeline/assetFiles.d.ts +19 -0
  116. package/dist/nodes/timeline/assetFiles.d.ts.map +1 -0
  117. package/dist/nodes/timeline/assetFiles.js +52 -0
  118. package/dist/nodes/timeline/assetFiles.js.map +1 -0
  119. package/dist/nodes/timeline/compositeRender.d.ts +60 -0
  120. package/dist/nodes/timeline/compositeRender.d.ts.map +1 -0
  121. package/dist/nodes/timeline/compositeRender.js +508 -0
  122. package/dist/nodes/timeline/compositeRender.js.map +1 -0
  123. package/dist/nodes/timeline/contactSheet.d.ts +43 -0
  124. package/dist/nodes/timeline/contactSheet.d.ts.map +1 -0
  125. package/dist/nodes/timeline/contactSheet.js +78 -0
  126. package/dist/nodes/timeline/contactSheet.js.map +1 -0
  127. package/dist/nodes/timeline/outputFormats.d.ts +69 -0
  128. package/dist/nodes/timeline/outputFormats.d.ts.map +1 -0
  129. package/dist/nodes/timeline/outputFormats.js +173 -0
  130. package/dist/nodes/timeline/outputFormats.js.map +1 -0
  131. package/dist/nodes/timeline/pngSequence.d.ts +44 -0
  132. package/dist/nodes/timeline/pngSequence.d.ts.map +1 -0
  133. package/dist/nodes/timeline/pngSequence.js +172 -0
  134. package/dist/nodes/timeline/pngSequence.js.map +1 -0
  135. package/dist/nodes/timeline/rasterizers.d.ts +47 -0
  136. package/dist/nodes/timeline/rasterizers.d.ts.map +1 -0
  137. package/dist/nodes/timeline/rasterizers.js +103 -0
  138. package/dist/nodes/timeline/rasterizers.js.map +1 -0
  139. package/dist/nodes/timeline/rawFrames.d.ts +149 -0
  140. package/dist/nodes/timeline/rawFrames.d.ts.map +1 -0
  141. package/dist/nodes/timeline/rawFrames.js +598 -0
  142. package/dist/nodes/timeline/rawFrames.js.map +1 -0
  143. package/dist/nodes/timeline.d.ts +206 -0
  144. package/dist/nodes/timeline.d.ts.map +1 -0
  145. package/dist/nodes/timeline.js +1395 -0
  146. package/dist/nodes/timeline.js.map +1 -0
  147. package/dist/nodes/video.d.ts +705 -0
  148. package/dist/nodes/video.d.ts.map +1 -0
  149. package/dist/nodes/video.js +2672 -0
  150. package/dist/nodes/video.js.map +1 -0
  151. package/dist/render3d-page.js +4118 -0
  152. package/package.json +95 -0
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Timeline nodes — operate on persisted timeline sequences (the video
3
+ * editor's documents) referenced by the `timeline` type.
4
+ *
5
+ * RenderTimeline composites the sequence frame by frame through the same GPU
6
+ * compositor and scene model the editor's preview and its in-browser export
7
+ * use (`@nodetool-ai/timeline/render`), so a workflow render is the picture
8
+ * the user previewed: clip placement, transforms, opacity, blend modes,
9
+ * transitions, animations, effects, captions, text and shapes, across every
10
+ * visual track. ffmpeg decodes clip media into RGBA and encodes the result.
11
+ *
12
+ * Compositing needs a WebGPU device, which means the optional `webgpu` (Dawn)
13
+ * package and a working driver. Both profiles ship Dawn (D9,
14
+ * docs/plans/motion-graphics.md), and the Docker image installs lavapipe as its
15
+ * Vulkan driver, so a server render is composited too. A host that still has no
16
+ * adapter falls back to the older ffmpeg rough cut — video/image clips
17
+ * normalized and concatenated in start order — which ignores everything above.
18
+ * The fallback is a `warning` on the job and `metadata.render_mode` on the
19
+ * output says which path ran: "composited" or "rough_cut".
20
+ *
21
+ * `format` picks the container and `alpha` decides whether the frames keep a
22
+ * transparency channel: `webm` (VP9, `yuva420p`), `mov` (ProRes 4444,
23
+ * `yuva444p10le`) and `png_sequence` (a zip of PNGs plus a `manifest.json`)
24
+ * carry it, `mp4` does not and refuses the pair. The table is
25
+ * `timeline/outputFormats.ts`.
26
+ */
27
+ import { BaseNode } from "@nodetool-ai/node-sdk";
28
+ import type { DocumentRef, TimelineRef, VideoRef } from "@nodetool-ai/protocol";
29
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
30
+ import { type TimelineSequence } from "@nodetool-ai/timeline";
31
+ import { type ResolvedTimelineOutput } from "./timeline/outputFormats.js";
32
+ /**
33
+ * linkIds of audio-track clips that are the detached audio representation of a
34
+ * video clip. The mere presence of such a clip means the linked video's own
35
+ * muxed audio must be suppressed (the editor mutes the video element; audio
36
+ * comes only from audio-track clips). This is intentionally NOT gated on
37
+ * mute/hidden — those govern whether the audio clip is mixed in, not whether
38
+ * the video's embedded audio resurfaces. If the user deletes the audio clip,
39
+ * the store auto-unlinks the lone survivor, clearing the video's linkId, so the
40
+ * video's audio returns on its own.
41
+ */
42
+ export declare function extractedAudioLinkIds(seq: TimelineSequence): Set<string>;
43
+ /** Add the sequence's audible tracks and embedded video audio to a composited video. */
44
+ export declare function mixCompositedTimelineAudio(opts: {
45
+ sequence: TimelineSequence;
46
+ basePath: string;
47
+ workDir: string;
48
+ output: ResolvedTimelineOutput;
49
+ resolveAssetPath: (assetId: string) => Promise<string | null>;
50
+ }): Promise<string>;
51
+ /**
52
+ * The PNG-sequence archive on the `frames` handle. `DocumentRef` in the
53
+ * protocol declares only `uri` and `asset_id`; the document nodes' own refs
54
+ * carry `data` and `metadata` as well, and that is how a node hands fresh bytes
55
+ * to the next node.
56
+ */
57
+ type TimelineFramesRef = DocumentRef & {
58
+ data?: string | null;
59
+ metadata?: Record<string, unknown> | null;
60
+ };
61
+ /** Output handles RenderTimelineNode.process() emits. */
62
+ type RenderTimelineNodeOutputs = {
63
+ output: VideoRef;
64
+ frames: TimelineFramesRef;
65
+ };
66
+ export declare class RenderTimelineNode extends BaseNode {
67
+ static readonly nodeType = "nodetool.timeline.RenderTimeline";
68
+ static readonly title = "Render Timeline";
69
+ static readonly description = "Render a timeline sequence to a video, composited exactly as the timeline editor previews it (tracks, transforms, transitions, effects, captions and text), with audio mixed in at each clip's offset. Writes MP4, WebM, MOV or a zipped PNG sequence, with an optional transparent background.\n timeline, render, video, export, cut, alpha\n\n Use cases:\n - Turn an edit assembled in the timeline editor into a shareable video\n - Export a title or lower third over transparency to composite elsewhere\n - Feed a rough cut into captioning, review, or upload nodes\n - Automate exports of timelines built by other workflow nodes";
70
+ static readonly requiredRuntimes: string[];
71
+ static readonly metadataOutputTypes: {
72
+ output: string;
73
+ frames: string;
74
+ };
75
+ static readonly inlineFields: string[];
76
+ static readonly inputFields: string[];
77
+ timeline: TimelineRef;
78
+ include_audio: boolean;
79
+ format: string;
80
+ alpha: boolean;
81
+ video_codec: string;
82
+ motion_blur_samples: number;
83
+ shutter_angle: number;
84
+ bitrate: number;
85
+ preview_scale: number;
86
+ process(context?: ProcessingContext): Promise<RenderTimelineNodeOutputs>;
87
+ /**
88
+ * Refuse a format this ffmpeg cannot encode, by name.
89
+ *
90
+ * ProRes and VP9 are both optional at ffmpeg build time. Without this the
91
+ * render composites every frame first and then dies on ffmpeg's own
92
+ * "Unknown encoder" line, which says nothing about what to pick instead.
93
+ */
94
+ private assertEncoderAvailable;
95
+ /** Post on the node's log channel, where the run has one. */
96
+ private log;
97
+ /**
98
+ * A `node_progress` reporter for the frame loop, rate-limited to four posts a
99
+ * second. A minute of 1080p is thousands of frames and every post crosses the
100
+ * websocket; the final frame always posts, so the bar reaches its end.
101
+ */
102
+ private progressReporter;
103
+ }
104
+ /** Output handles TimelineTranscriptNode.process() emits. */
105
+ type TimelineTranscriptNodeOutputs = {
106
+ text: string;
107
+ lines: string[];
108
+ };
109
+ export declare class TimelineTranscriptNode extends BaseNode {
110
+ static readonly nodeType = "nodetool.timeline.Transcript";
111
+ static readonly title = "Timeline Transcript";
112
+ static readonly description = "Extract the transcript of a timeline sequence as text.\n timeline, transcript, text, script, voiceover\n\n Use cases:\n - Summarize or rewrite an edit's narration with an LLM\n - Generate titles, descriptions, or chapters from the spoken script\n - Translate a voiceover script before re-recording with TTS";
113
+ static readonly metadataOutputTypes: {
114
+ text: string;
115
+ lines: string;
116
+ };
117
+ static readonly inlineFields: string[];
118
+ static readonly inputFields: string[];
119
+ timeline: TimelineRef;
120
+ process(context?: ProcessingContext): Promise<TimelineTranscriptNodeOutputs>;
121
+ }
122
+ /**
123
+ * The content type to store a clip's bytes under.
124
+ *
125
+ * The stored asset's file extension and the `Content-Type` the browser is
126
+ * served both come from this, so guessing by media kind alone mislabels
127
+ * anything that is not the kind's default container: a WAV voiceover saved as
128
+ * `audio/mpeg` reaches the player as a `.mp3` it cannot decode. Read the bytes
129
+ * first, then the source URI's extension, and only then fall back to the kind.
130
+ */
131
+ export declare function clipContentType(mediaType: string, bytes: Uint8Array, uri: string | undefined): string;
132
+ /** Output handles AddClipsToTimelineNode.process() emits. */
133
+ type AddClipsToTimelineNodeOutputs = {
134
+ output: {
135
+ type: string;
136
+ id: string;
137
+ };
138
+ };
139
+ export declare class AddClipsToTimelineNode extends BaseNode {
140
+ static readonly nodeType = "nodetool.timeline.AddClips";
141
+ static readonly title = "Add Clips To Timeline";
142
+ static readonly description = "Append media to a timeline sequence as clips (videos and images on the video track, audio on the audio track). Creates a new timeline when none is given.\n timeline, clips, append, assemble, storyboard\n\n Use cases:\n - Assemble generated shots into an editable rough cut\n - Turn a storyboard's images into an animatic\n - Add a generated voiceover or soundtrack under an edit";
143
+ static readonly requiredRuntimes: string[];
144
+ static readonly metadataOutputTypes: {
145
+ output: string;
146
+ };
147
+ static readonly inlineFields: string[];
148
+ static readonly inputFields: string[];
149
+ timeline: TimelineRef;
150
+ clips: unknown[];
151
+ name: string;
152
+ image_duration_ms: number;
153
+ process(context?: ProcessingContext): Promise<AddClipsToTimelineNodeOutputs>;
154
+ }
155
+ /** Output handles FillTimelineTextNode.process() emits. */
156
+ type FillTimelineTextNodeOutputs = {
157
+ timeline: {
158
+ type: string;
159
+ id: string;
160
+ };
161
+ filled: string[];
162
+ unresolved: string[];
163
+ };
164
+ export declare class FillTimelineTextNode extends BaseNode {
165
+ static readonly nodeType = "nodetool.timeline.FillTimelineText";
166
+ static readonly title = "Fill Timeline Text";
167
+ static readonly description = "Fill a template cut's {{key}} placeholders \u2014 in text clips and in captions \u2014 from a value bag, and save the result as a new timeline. The template is never written. A key with no value stays in the frame and is reported.\n timeline, template, text, fill, batch\n\n Use cases:\n - Stamp a per-SKU name and price onto an approved cut\n - Localize an overlay without re-editing the timeline\n - Produce one variant per row of a feed";
168
+ static readonly metadataOutputTypes: {
169
+ timeline: string;
170
+ filled: string;
171
+ unresolved: string;
172
+ };
173
+ static readonly inlineFields: string[];
174
+ static readonly inputFields: string[];
175
+ timeline: TimelineRef;
176
+ values: Record<string, unknown>;
177
+ name: string;
178
+ process(context?: ProcessingContext): Promise<FillTimelineTextNodeOutputs>;
179
+ }
180
+ /** Output handles RetargetTimelineNode.process() emits. */
181
+ type RetargetTimelineNodeOutputs = {
182
+ timeline: {
183
+ type: string;
184
+ id: string;
185
+ };
186
+ cropped: string[];
187
+ };
188
+ export declare class RetargetTimelineNode extends BaseNode {
189
+ static readonly nodeType = "nodetool.timeline.RetargetTimeline";
190
+ static readonly title = "Retarget Timeline";
191
+ static readonly description = "Derive a new timeline from an approved cut on another aspect ratio, keeping every trim, placement and edit. Cover scales each shot to fill the new frame and reports the clips it crops; contain letterboxes instead. Text sizes follow the short edge. The source cut is never written.\n timeline, aspect ratio, resize, reframe, variant\n\n Use cases:\n - Turn a 16:9 film into 9:16 and 1:1 cuts\n - Produce every placement's ratio from one approved edit\n - See which shots lose their sides before rendering";
192
+ static readonly metadataOutputTypes: {
193
+ timeline: string;
194
+ cropped: string;
195
+ };
196
+ static readonly inlineFields: string[];
197
+ static readonly inputFields: string[];
198
+ timeline: TimelineRef;
199
+ aspect_ratio: string;
200
+ fit: "cover" | "contain";
201
+ name: string;
202
+ process(context?: ProcessingContext): Promise<RetargetTimelineNodeOutputs>;
203
+ }
204
+ export declare const TIMELINE_NODES: (typeof RenderTimelineNode | typeof TimelineTranscriptNode | typeof AddClipsToTimelineNode | typeof FillTimelineTextNode | typeof RetargetTimelineNode)[];
205
+ export {};
206
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/nodes/timeline.ts"],"names":[],"mappings":"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"}