@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.
- package/README.md +58 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/ffmpeg-helpers.d.ts +77 -0
- package/dist/nodes/ffmpeg-helpers.d.ts.map +1 -0
- package/dist/nodes/ffmpeg-helpers.js +220 -0
- package/dist/nodes/ffmpeg-helpers.js.map +1 -0
- package/dist/nodes/lib-video-download.d.ts +29 -0
- package/dist/nodes/lib-video-download.d.ts.map +1 -0
- package/dist/nodes/lib-video-download.js +353 -0
- package/dist/nodes/lib-video-download.js.map +1 -0
- package/dist/nodes/model3d/analysis.d.ts +16 -0
- package/dist/nodes/model3d/analysis.d.ts.map +1 -0
- package/dist/nodes/model3d/analysis.js +38 -0
- package/dist/nodes/model3d/analysis.js.map +1 -0
- package/dist/nodes/model3d/base.d.ts +28 -0
- package/dist/nodes/model3d/base.d.ts.map +1 -0
- package/dist/nodes/model3d/base.js +20 -0
- package/dist/nodes/model3d/base.js.map +1 -0
- package/dist/nodes/model3d/boolean-ops.d.ts +2 -0
- package/dist/nodes/model3d/boolean-ops.d.ts.map +1 -0
- package/dist/nodes/model3d/boolean-ops.js +172 -0
- package/dist/nodes/model3d/boolean-ops.js.map +1 -0
- package/dist/nodes/model3d/cleanup.d.ts +56 -0
- package/dist/nodes/model3d/cleanup.d.ts.map +1 -0
- package/dist/nodes/model3d/cleanup.js +144 -0
- package/dist/nodes/model3d/cleanup.js.map +1 -0
- package/dist/nodes/model3d/convert.d.ts +27 -0
- package/dist/nodes/model3d/convert.d.ts.map +1 -0
- package/dist/nodes/model3d/convert.js +66 -0
- package/dist/nodes/model3d/convert.js.map +1 -0
- package/dist/nodes/model3d/defaults.d.ts +34 -0
- package/dist/nodes/model3d/defaults.d.ts.map +1 -0
- package/dist/nodes/model3d/defaults.js +28 -0
- package/dist/nodes/model3d/defaults.js.map +1 -0
- package/dist/nodes/model3d/document-ops.d.ts +4 -0
- package/dist/nodes/model3d/document-ops.d.ts.map +1 -0
- package/dist/nodes/model3d/document-ops.js +40 -0
- package/dist/nodes/model3d/document-ops.js.map +1 -0
- package/dist/nodes/model3d/generation.d.ts +56 -0
- package/dist/nodes/model3d/generation.d.ts.map +1 -0
- package/dist/nodes/model3d/generation.js +203 -0
- package/dist/nodes/model3d/generation.js.map +1 -0
- package/dist/nodes/model3d/glb.d.ts +29 -0
- package/dist/nodes/model3d/glb.d.ts.map +1 -0
- package/dist/nodes/model3d/glb.js +255 -0
- package/dist/nodes/model3d/glb.js.map +1 -0
- package/dist/nodes/model3d/index.d.ts +22 -0
- package/dist/nodes/model3d/index.d.ts.map +1 -0
- package/dist/nodes/model3d/index.js +41 -0
- package/dist/nodes/model3d/index.js.map +1 -0
- package/dist/nodes/model3d/io.d.ts +81 -0
- package/dist/nodes/model3d/io.d.ts.map +1 -0
- package/dist/nodes/model3d/io.js +162 -0
- package/dist/nodes/model3d/io.js.map +1 -0
- package/dist/nodes/model3d/mesh-ops.d.ts +40 -0
- package/dist/nodes/model3d/mesh-ops.d.ts.map +1 -0
- package/dist/nodes/model3d/mesh-ops.js +775 -0
- package/dist/nodes/model3d/mesh-ops.js.map +1 -0
- package/dist/nodes/model3d/nodes.d.ts +2 -0
- package/dist/nodes/model3d/nodes.d.ts.map +1 -0
- package/dist/nodes/model3d/nodes.js +2 -0
- package/dist/nodes/model3d/nodes.js.map +1 -0
- package/dist/nodes/model3d/ops.d.ts +44 -0
- package/dist/nodes/model3d/ops.d.ts.map +1 -0
- package/dist/nodes/model3d/ops.js +142 -0
- package/dist/nodes/model3d/ops.js.map +1 -0
- package/dist/nodes/model3d/render.d.ts +51 -0
- package/dist/nodes/model3d/render.d.ts.map +1 -0
- package/dist/nodes/model3d/render.js +124 -0
- package/dist/nodes/model3d/render.js.map +1 -0
- package/dist/nodes/model3d/render3d-core.d.ts +177 -0
- package/dist/nodes/model3d/render3d-core.d.ts.map +1 -0
- package/dist/nodes/model3d/render3d-core.js +366 -0
- package/dist/nodes/model3d/render3d-core.js.map +1 -0
- package/dist/nodes/model3d/render3d-headless.d.ts +75 -0
- package/dist/nodes/model3d/render3d-headless.d.ts.map +1 -0
- package/dist/nodes/model3d/render3d-headless.js +190 -0
- package/dist/nodes/model3d/render3d-headless.js.map +1 -0
- package/dist/nodes/model3d/render3d-page.d.ts +16 -0
- package/dist/nodes/model3d/render3d-page.d.ts.map +1 -0
- package/dist/nodes/model3d/render3d-page.js +51 -0
- package/dist/nodes/model3d/render3d-page.js.map +1 -0
- package/dist/nodes/model3d/transforms.d.ts +56 -0
- package/dist/nodes/model3d/transforms.d.ts.map +1 -0
- package/dist/nodes/model3d/transforms.js +148 -0
- package/dist/nodes/model3d/transforms.js.map +1 -0
- package/dist/nodes/model3d/types.d.ts +82 -0
- package/dist/nodes/model3d/types.d.ts.map +1 -0
- package/dist/nodes/model3d/types.js +2 -0
- package/dist/nodes/model3d/types.js.map +1 -0
- package/dist/nodes/model3d/utils.d.ts +46 -0
- package/dist/nodes/model3d/utils.d.ts.map +1 -0
- package/dist/nodes/model3d/utils.js +190 -0
- package/dist/nodes/model3d/utils.js.map +1 -0
- package/dist/nodes/model3d.d.ts +2 -0
- package/dist/nodes/model3d.d.ts.map +1 -0
- package/dist/nodes/model3d.js +2 -0
- package/dist/nodes/model3d.js.map +1 -0
- package/dist/nodes/placeholder-values.d.ts +10 -0
- package/dist/nodes/placeholder-values.d.ts.map +1 -0
- package/dist/nodes/placeholder-values.js +19 -0
- package/dist/nodes/placeholder-values.js.map +1 -0
- package/dist/nodes/script.d.ts +161 -0
- package/dist/nodes/script.d.ts.map +1 -0
- package/dist/nodes/script.js +673 -0
- package/dist/nodes/script.js.map +1 -0
- package/dist/nodes/storyboard.d.ts +269 -0
- package/dist/nodes/storyboard.d.ts.map +1 -0
- package/dist/nodes/storyboard.js +1017 -0
- package/dist/nodes/storyboard.js.map +1 -0
- package/dist/nodes/timeline/assetFiles.d.ts +19 -0
- package/dist/nodes/timeline/assetFiles.d.ts.map +1 -0
- package/dist/nodes/timeline/assetFiles.js +52 -0
- package/dist/nodes/timeline/assetFiles.js.map +1 -0
- package/dist/nodes/timeline/compositeRender.d.ts +60 -0
- package/dist/nodes/timeline/compositeRender.d.ts.map +1 -0
- package/dist/nodes/timeline/compositeRender.js +508 -0
- package/dist/nodes/timeline/compositeRender.js.map +1 -0
- package/dist/nodes/timeline/contactSheet.d.ts +43 -0
- package/dist/nodes/timeline/contactSheet.d.ts.map +1 -0
- package/dist/nodes/timeline/contactSheet.js +78 -0
- package/dist/nodes/timeline/contactSheet.js.map +1 -0
- package/dist/nodes/timeline/outputFormats.d.ts +69 -0
- package/dist/nodes/timeline/outputFormats.d.ts.map +1 -0
- package/dist/nodes/timeline/outputFormats.js +173 -0
- package/dist/nodes/timeline/outputFormats.js.map +1 -0
- package/dist/nodes/timeline/pngSequence.d.ts +44 -0
- package/dist/nodes/timeline/pngSequence.d.ts.map +1 -0
- package/dist/nodes/timeline/pngSequence.js +172 -0
- package/dist/nodes/timeline/pngSequence.js.map +1 -0
- package/dist/nodes/timeline/rasterizers.d.ts +47 -0
- package/dist/nodes/timeline/rasterizers.d.ts.map +1 -0
- package/dist/nodes/timeline/rasterizers.js +103 -0
- package/dist/nodes/timeline/rasterizers.js.map +1 -0
- package/dist/nodes/timeline/rawFrames.d.ts +149 -0
- package/dist/nodes/timeline/rawFrames.d.ts.map +1 -0
- package/dist/nodes/timeline/rawFrames.js +598 -0
- package/dist/nodes/timeline/rawFrames.js.map +1 -0
- package/dist/nodes/timeline.d.ts +206 -0
- package/dist/nodes/timeline.d.ts.map +1 -0
- package/dist/nodes/timeline.js +1395 -0
- package/dist/nodes/timeline.js.map +1 -0
- package/dist/nodes/video.d.ts +705 -0
- package/dist/nodes/video.d.ts.map +1 -0
- package/dist/nodes/video.js +2672 -0
- package/dist/nodes/video.js.map +1 -0
- package/dist/render3d-page.js +4118 -0
- package/package.json +95 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { promises as fs } from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { isString } from "@nodetool-ai/node-sdk";
|
|
13
|
+
async function runCommand(cmd, args, timeoutMs) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const child = spawn(cmd, args, { stdio: "pipe" });
|
|
16
|
+
let stdout = "";
|
|
17
|
+
let stderr = "";
|
|
18
|
+
let timedOut = false;
|
|
19
|
+
let killTimer;
|
|
20
|
+
const timer = setTimeout(() => {
|
|
21
|
+
timedOut = true;
|
|
22
|
+
child.kill("SIGTERM");
|
|
23
|
+
// Escalate if the process ignores SIGTERM.
|
|
24
|
+
killTimer = setTimeout(() => child.kill("SIGKILL"), 5000);
|
|
25
|
+
}, timeoutMs);
|
|
26
|
+
child.stdout.on("data", (d) => {
|
|
27
|
+
stdout += String(d);
|
|
28
|
+
});
|
|
29
|
+
child.stderr.on("data", (d) => {
|
|
30
|
+
stderr += String(d);
|
|
31
|
+
});
|
|
32
|
+
child.on("error", (err) => {
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
clearTimeout(killTimer);
|
|
35
|
+
reject(err);
|
|
36
|
+
});
|
|
37
|
+
child.on("close", (code) => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
clearTimeout(killTimer);
|
|
40
|
+
if (timedOut) {
|
|
41
|
+
resolve({
|
|
42
|
+
stdout,
|
|
43
|
+
stderr: `${stderr}\nProcess timed out`,
|
|
44
|
+
exitCode: 124
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
resolve({ stdout, stderr, exitCode: code ?? 0 });
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Trust model: the URL is user-supplied and yt-dlp runs on the user's own
|
|
53
|
+
// machine (this is a local desktop tool). We only require a well-formed
|
|
54
|
+
// http(s) URL — there is deliberately no internal-network/SSRF blocking, since
|
|
55
|
+
// the user is free to point this at any host they can already reach.
|
|
56
|
+
function isValidUrl(url) {
|
|
57
|
+
try {
|
|
58
|
+
const parsed = new URL(url);
|
|
59
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const DEFAULT_SUB_LANGS = "en,en-US,en-GB";
|
|
66
|
+
function emptyVideoRef() {
|
|
67
|
+
return { type: "video", uri: "", asset_id: null, data: null, metadata: null };
|
|
68
|
+
}
|
|
69
|
+
function emptyAudioRef() {
|
|
70
|
+
return { type: "audio", uri: "", asset_id: null, data: null, metadata: null };
|
|
71
|
+
}
|
|
72
|
+
function emptyImageRef() {
|
|
73
|
+
return { type: "image", uri: "", asset_id: null, data: null, metadata: null };
|
|
74
|
+
}
|
|
75
|
+
function safeMetadata(info) {
|
|
76
|
+
const keys = [
|
|
77
|
+
"id",
|
|
78
|
+
"title",
|
|
79
|
+
"description",
|
|
80
|
+
"uploader",
|
|
81
|
+
"upload_date",
|
|
82
|
+
"duration",
|
|
83
|
+
"view_count",
|
|
84
|
+
"like_count",
|
|
85
|
+
"channel",
|
|
86
|
+
"channel_id",
|
|
87
|
+
"webpage_url",
|
|
88
|
+
"ext",
|
|
89
|
+
"width",
|
|
90
|
+
"height",
|
|
91
|
+
"fps",
|
|
92
|
+
"filesize",
|
|
93
|
+
"tags",
|
|
94
|
+
"categories"
|
|
95
|
+
];
|
|
96
|
+
const out = {};
|
|
97
|
+
for (const key of keys) {
|
|
98
|
+
if (key in info)
|
|
99
|
+
out[key] = info[key];
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
function base64Ref(bytes, kind) {
|
|
104
|
+
return {
|
|
105
|
+
type: kind,
|
|
106
|
+
data: bytes.toString("base64")
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async function findFileByExt(dir, exts, preferredId = "") {
|
|
110
|
+
const names = await fs.readdir(dir);
|
|
111
|
+
const extSet = new Set(exts.map((e) => e.toLowerCase()));
|
|
112
|
+
if (preferredId) {
|
|
113
|
+
const exact = names.find((name) => {
|
|
114
|
+
const ext = path.extname(name).slice(1).toLowerCase();
|
|
115
|
+
const stem = path.basename(name, path.extname(name));
|
|
116
|
+
return stem === preferredId && extSet.has(ext);
|
|
117
|
+
});
|
|
118
|
+
if (exact)
|
|
119
|
+
return path.join(dir, exact);
|
|
120
|
+
}
|
|
121
|
+
const any = names.find((name) => extSet.has(path.extname(name).slice(1).toLowerCase()));
|
|
122
|
+
return any ? path.join(dir, any) : null;
|
|
123
|
+
}
|
|
124
|
+
export class YtDlpDownloadLibNode extends BaseNode {
|
|
125
|
+
static nodeType = "lib.video.download.YtDlpDownload";
|
|
126
|
+
static title = "YouTube Downloader";
|
|
127
|
+
static description = "Download media from URLs using yt-dlp.\n download, video, audio, youtube, media, yt-dlp, metadata, subtitles\n\n Use cases:\n - Download videos from YouTube and other platforms\n - Extract audio from video URLs\n - Retrieve video/audio metadata without downloading\n - Download subtitles and thumbnails";
|
|
128
|
+
static metadataOutputTypes = {
|
|
129
|
+
video: "video",
|
|
130
|
+
audio: "audio",
|
|
131
|
+
metadata: "dict",
|
|
132
|
+
subtitles: "str",
|
|
133
|
+
thumbnail: "image"
|
|
134
|
+
};
|
|
135
|
+
static inlineFields = ["url"];
|
|
136
|
+
static inputFields = ["url"];
|
|
137
|
+
static requiredRuntimes = ["yt-dlp"];
|
|
138
|
+
async process() {
|
|
139
|
+
const url = String(this.url ?? "").trim();
|
|
140
|
+
if (!url) {
|
|
141
|
+
throw new Error("URL cannot be empty");
|
|
142
|
+
}
|
|
143
|
+
if (!isValidUrl(url)) {
|
|
144
|
+
throw new Error(`Invalid URL format: ${url}`);
|
|
145
|
+
}
|
|
146
|
+
const mode = String(this.mode ?? "video").toLowerCase();
|
|
147
|
+
const timeoutMs = Math.max(1000, Number(this.timeout ?? 600) * 1000);
|
|
148
|
+
const formatSelector = String(this.format_selector ?? "best");
|
|
149
|
+
const container = String(this.container ?? "auto");
|
|
150
|
+
const subtitles = Boolean(this.subtitles ?? false);
|
|
151
|
+
const subLangs = String(this.sub_langs ?? "").trim() || DEFAULT_SUB_LANGS;
|
|
152
|
+
const thumbnail = Boolean(this.thumbnail ?? false);
|
|
153
|
+
const overwrite = Boolean(this.overwrite ?? false);
|
|
154
|
+
const rateLimitKbps = Number(this.rate_limit_kbps ?? 0);
|
|
155
|
+
// One deadline for the whole node run: the metadata probe and the
|
|
156
|
+
// download share the budget instead of each getting the full timeout.
|
|
157
|
+
const deadline = Date.now() + timeoutMs;
|
|
158
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "ytdlp-"));
|
|
159
|
+
try {
|
|
160
|
+
const metadataArgs = [
|
|
161
|
+
"--no-playlist",
|
|
162
|
+
"--no-warnings",
|
|
163
|
+
"--no-color",
|
|
164
|
+
"--print-json",
|
|
165
|
+
"--skip-download",
|
|
166
|
+
url
|
|
167
|
+
];
|
|
168
|
+
const metadataRes = await runCommand("yt-dlp", metadataArgs, timeoutMs);
|
|
169
|
+
if (metadataRes.exitCode !== 0) {
|
|
170
|
+
throw new Error(`yt-dlp metadata failed: ${metadataRes.stderr || metadataRes.stdout}`);
|
|
171
|
+
}
|
|
172
|
+
const lines = metadataRes.stdout
|
|
173
|
+
.split(/\r?\n/)
|
|
174
|
+
.map((line) => line.trim())
|
|
175
|
+
.filter(Boolean);
|
|
176
|
+
let jsonLine = "";
|
|
177
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
178
|
+
if (lines[i].startsWith("{")) {
|
|
179
|
+
jsonLine = lines[i];
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// yt-dlp exited 0 but produced no JSON info line — abnormal output.
|
|
184
|
+
// Downstream download-file naming relies on parsedInfo.id, so a silent
|
|
185
|
+
// {} would break it; fail loudly instead.
|
|
186
|
+
if (!jsonLine) {
|
|
187
|
+
throw new Error("yt-dlp metadata output was malformed: no JSON info line found in stdout");
|
|
188
|
+
}
|
|
189
|
+
let parsedInfo;
|
|
190
|
+
try {
|
|
191
|
+
parsedInfo = JSON.parse(jsonLine);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw new Error(`yt-dlp metadata output was malformed: could not parse JSON info line (${error instanceof Error ? error.message : String(error)})`);
|
|
195
|
+
}
|
|
196
|
+
const output = {
|
|
197
|
+
video: emptyVideoRef(),
|
|
198
|
+
audio: emptyAudioRef(),
|
|
199
|
+
metadata: safeMetadata(parsedInfo),
|
|
200
|
+
subtitles: "",
|
|
201
|
+
thumbnail: emptyImageRef()
|
|
202
|
+
};
|
|
203
|
+
if (mode !== "metadata") {
|
|
204
|
+
const dlArgs = [
|
|
205
|
+
"--no-playlist",
|
|
206
|
+
"--no-warnings",
|
|
207
|
+
"--no-color",
|
|
208
|
+
"--restrict-filenames",
|
|
209
|
+
"-o",
|
|
210
|
+
path.join(tempDir, "%(id)s.%(ext)s")
|
|
211
|
+
];
|
|
212
|
+
if (!overwrite)
|
|
213
|
+
dlArgs.push("--no-overwrites");
|
|
214
|
+
if (rateLimitKbps > 0)
|
|
215
|
+
dlArgs.push("--limit-rate", `${Math.trunc(rateLimitKbps)}K`);
|
|
216
|
+
if (subtitles)
|
|
217
|
+
dlArgs.push("--write-subs", "--write-auto-subs", "--sub-langs", subLangs, "--sub-format", "srt/vtt/ass/best");
|
|
218
|
+
if (thumbnail)
|
|
219
|
+
dlArgs.push("--write-thumbnail");
|
|
220
|
+
if (mode === "audio") {
|
|
221
|
+
dlArgs.push("-f", "bestaudio/best", "-x", "--audio-format", "mp3");
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
dlArgs.push("-f", formatSelector === "best"
|
|
225
|
+
? "bestvideo+bestaudio/best"
|
|
226
|
+
: formatSelector);
|
|
227
|
+
if (container !== "auto")
|
|
228
|
+
dlArgs.push("--merge-output-format", container);
|
|
229
|
+
}
|
|
230
|
+
dlArgs.push(url);
|
|
231
|
+
const remainingMs = deadline - Date.now();
|
|
232
|
+
if (remainingMs <= 0) {
|
|
233
|
+
throw new Error(`yt-dlp timed out after ${Math.round(timeoutMs / 1000)}s before the download started`);
|
|
234
|
+
}
|
|
235
|
+
const dlRes = await runCommand("yt-dlp", dlArgs, remainingMs);
|
|
236
|
+
if (dlRes.exitCode !== 0) {
|
|
237
|
+
throw new Error(`yt-dlp download failed: ${dlRes.stderr || dlRes.stdout}`);
|
|
238
|
+
}
|
|
239
|
+
const mediaId = isString(parsedInfo.id) ? parsedInfo.id : "";
|
|
240
|
+
if (mode === "audio") {
|
|
241
|
+
const audioFile = await findFileByExt(tempDir, ["mp3", "m4a", "opus", "ogg", "wav", "webm"], mediaId);
|
|
242
|
+
if (audioFile)
|
|
243
|
+
output.audio = base64Ref(await fs.readFile(audioFile), "audio");
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const videoFile = await findFileByExt(tempDir, ["mp4", "webm", "mkv", "avi", "mov", "flv"], mediaId);
|
|
247
|
+
if (videoFile)
|
|
248
|
+
output.video = base64Ref(await fs.readFile(videoFile), "video");
|
|
249
|
+
}
|
|
250
|
+
if (subtitles) {
|
|
251
|
+
const subFile = await findFileByExt(tempDir, ["srt", "vtt", "ass", "ssa"], mediaId);
|
|
252
|
+
if (subFile)
|
|
253
|
+
output.subtitles = await fs.readFile(subFile, "utf8");
|
|
254
|
+
}
|
|
255
|
+
if (thumbnail) {
|
|
256
|
+
const thumbFile = await findFileByExt(tempDir, ["jpg", "jpeg", "png", "webp"], mediaId);
|
|
257
|
+
if (thumbFile)
|
|
258
|
+
output.thumbnail = base64Ref(await fs.readFile(thumbFile), "image");
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return output;
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
__decorate([
|
|
269
|
+
prop({
|
|
270
|
+
type: "str",
|
|
271
|
+
default: "",
|
|
272
|
+
title: "Url",
|
|
273
|
+
description: "URL of the media to download"
|
|
274
|
+
})
|
|
275
|
+
], YtDlpDownloadLibNode.prototype, "url", void 0);
|
|
276
|
+
__decorate([
|
|
277
|
+
prop({
|
|
278
|
+
type: "enum",
|
|
279
|
+
default: "video",
|
|
280
|
+
title: "Mode",
|
|
281
|
+
description: "Download mode: video, audio, or metadata only",
|
|
282
|
+
values: ["video", "audio", "metadata"]
|
|
283
|
+
})
|
|
284
|
+
], YtDlpDownloadLibNode.prototype, "mode", void 0);
|
|
285
|
+
__decorate([
|
|
286
|
+
prop({
|
|
287
|
+
type: "str",
|
|
288
|
+
default: "best",
|
|
289
|
+
title: "Format Selector",
|
|
290
|
+
description: "yt-dlp format selector (e.g., 'best', 'bestvideo+bestaudio')"
|
|
291
|
+
})
|
|
292
|
+
], YtDlpDownloadLibNode.prototype, "format_selector", void 0);
|
|
293
|
+
__decorate([
|
|
294
|
+
prop({
|
|
295
|
+
type: "str",
|
|
296
|
+
default: "auto",
|
|
297
|
+
title: "Container",
|
|
298
|
+
description: "Output container format (e.g., 'mp4', 'webm', 'auto')"
|
|
299
|
+
})
|
|
300
|
+
], YtDlpDownloadLibNode.prototype, "container", void 0);
|
|
301
|
+
__decorate([
|
|
302
|
+
prop({
|
|
303
|
+
type: "bool",
|
|
304
|
+
default: false,
|
|
305
|
+
title: "Subtitles",
|
|
306
|
+
description: "Download subtitles if available"
|
|
307
|
+
})
|
|
308
|
+
], YtDlpDownloadLibNode.prototype, "subtitles", void 0);
|
|
309
|
+
__decorate([
|
|
310
|
+
prop({
|
|
311
|
+
type: "str",
|
|
312
|
+
default: DEFAULT_SUB_LANGS,
|
|
313
|
+
title: "Subtitle Languages",
|
|
314
|
+
description: "Comma-separated subtitle language codes in yt-dlp syntax (e.g., 'en,en-US,en-GB', 'de.*', 'all'). Only used when Subtitles is enabled."
|
|
315
|
+
})
|
|
316
|
+
], YtDlpDownloadLibNode.prototype, "sub_langs", void 0);
|
|
317
|
+
__decorate([
|
|
318
|
+
prop({
|
|
319
|
+
type: "bool",
|
|
320
|
+
default: false,
|
|
321
|
+
title: "Thumbnail",
|
|
322
|
+
description: "Download thumbnail if available"
|
|
323
|
+
})
|
|
324
|
+
], YtDlpDownloadLibNode.prototype, "thumbnail", void 0);
|
|
325
|
+
__decorate([
|
|
326
|
+
prop({
|
|
327
|
+
type: "bool",
|
|
328
|
+
default: false,
|
|
329
|
+
title: "Overwrite",
|
|
330
|
+
description: "Overwrite existing files"
|
|
331
|
+
})
|
|
332
|
+
], YtDlpDownloadLibNode.prototype, "overwrite", void 0);
|
|
333
|
+
__decorate([
|
|
334
|
+
prop({
|
|
335
|
+
type: "int",
|
|
336
|
+
default: 0,
|
|
337
|
+
title: "Rate Limit Kbps",
|
|
338
|
+
description: "Rate limit in KB/s (0 = unlimited)",
|
|
339
|
+
min: 0
|
|
340
|
+
})
|
|
341
|
+
], YtDlpDownloadLibNode.prototype, "rate_limit_kbps", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
prop({
|
|
344
|
+
type: "int",
|
|
345
|
+
default: 600,
|
|
346
|
+
title: "Timeout",
|
|
347
|
+
description: "Timeout in seconds",
|
|
348
|
+
min: 1,
|
|
349
|
+
max: 3600
|
|
350
|
+
})
|
|
351
|
+
], YtDlpDownloadLibNode.prototype, "timeout", void 0);
|
|
352
|
+
export const LIB_YTDLP_NODES = [YtDlpDownloadLibNode];
|
|
353
|
+
//# sourceMappingURL=lib-video-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib-video-download.js","sourceRoot":"","sources":["../../src/nodes/lib-video-download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import type { ProcessingContext } from "@nodetool-ai/runtime";
|
|
3
|
+
import type { Model3DRefLike } from "./types.js";
|
|
4
|
+
export declare class GetModel3DMetadataNode extends BaseNode {
|
|
5
|
+
static readonly nodeType = "nodetool.model3d.GetModel3DMetadata";
|
|
6
|
+
static readonly title = "Get Model 3D Metadata";
|
|
7
|
+
static readonly description = "Get metadata about a 3D model.\n 3d, mesh, model, metadata, info, properties\n\n Use cases:\n - Get vertex and face counts for processing decisions\n - Analyze model properties\n - Gather information for model cataloging";
|
|
8
|
+
static readonly metadataOutputTypes: {
|
|
9
|
+
output: string;
|
|
10
|
+
};
|
|
11
|
+
static readonly inlineFields: never[];
|
|
12
|
+
static readonly inputFields: string[];
|
|
13
|
+
model: Model3DRefLike;
|
|
14
|
+
process(context?: ProcessingContext): Promise<Record<string, unknown>>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,qBAAa,sBAAuB,SAAQ,QAAQ;IAClD,MAAM,CAAC,QAAQ,CAAC,QAAQ,yCAAyC;IACjE,MAAM,CAAC,QAAQ,CAAC,KAAK,2BAA2B;IAChD,MAAM,CAAC,QAAQ,CAAC,WAAW,iPACqN;IAEhP,MAAM,CAAC,QAAQ,CAAC,mBAAmB;QACjC,MAAM;MACN;IACF,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAM;IAClC,MAAM,CAAC,QAAQ,CAAC,WAAW,WAAa;IAQhC,KAAK,EAAE,cAAc,CAAC;IAExB,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQ3E;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { DEFAULT_MODEL_3D } from "./defaults.js";
|
|
9
|
+
import { analyzeGlbMetadata, fallbackMetadata, parseGlb } from "./glb.js";
|
|
10
|
+
import { modelFormat, modelRefToBytes } from "./utils.js";
|
|
11
|
+
export class GetModel3DMetadataNode extends BaseNode {
|
|
12
|
+
static nodeType = "nodetool.model3d.GetModel3DMetadata";
|
|
13
|
+
static title = "Get Model 3D Metadata";
|
|
14
|
+
static description = "Get metadata about a 3D model.\n 3d, mesh, model, metadata, info, properties\n\n Use cases:\n - Get vertex and face counts for processing decisions\n - Analyze model properties\n - Gather information for model cataloging";
|
|
15
|
+
// Returns { output: <metadata dict> } — use output: "dict" to match the actual return shape.
|
|
16
|
+
static metadataOutputTypes = {
|
|
17
|
+
output: "dict"
|
|
18
|
+
};
|
|
19
|
+
static inlineFields = [];
|
|
20
|
+
static inputFields = ["model"];
|
|
21
|
+
async process(context) {
|
|
22
|
+
const model = this.model;
|
|
23
|
+
const bytes = await modelRefToBytes(model, context);
|
|
24
|
+
const metadata = modelFormat(model) === "glb" && parseGlb(bytes)
|
|
25
|
+
? analyzeGlbMetadata(model, bytes)
|
|
26
|
+
: fallbackMetadata(model, bytes);
|
|
27
|
+
return { output: metadata };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
__decorate([
|
|
31
|
+
prop({
|
|
32
|
+
type: "model_3d",
|
|
33
|
+
default: DEFAULT_MODEL_3D,
|
|
34
|
+
title: "Model",
|
|
35
|
+
description: "The 3D model to analyze"
|
|
36
|
+
})
|
|
37
|
+
], GetModel3DMetadataNode.prototype, "model", void 0);
|
|
38
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../src/nodes/model3d/analysis.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,OAAO,sBAAuB,SAAQ,QAAQ;IAClD,MAAM,CAAU,QAAQ,GAAG,qCAAqC,CAAC;IACjE,MAAM,CAAU,KAAK,GAAG,uBAAuB,CAAC;IAChD,MAAM,CAAU,WAAW,GACzB,6OAA6O,CAAC;IAChP,6FAA6F;IAC7F,MAAM,CAAU,mBAAmB,GAAG;QACpC,MAAM,EAAE,MAAM;KACf,CAAC;IACF,MAAM,CAAU,YAAY,GAAG,EAAE,CAAC;IAClC,MAAM,CAAU,WAAW,GAAG,CAAC,OAAO,CAAC,CAAC;IAUxC,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GACZ,WAAW,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;YAC7C,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;YAClC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF;AAXS;IANP,IAAI,CAAC;QACJ,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,yBAAyB;KACvC,CAAC;qDAC4B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import type { ProcessingContext } from "@nodetool-ai/runtime";
|
|
3
|
+
import type { Model3DRefLike } from "./types.js";
|
|
4
|
+
/** Output handles GlbTransformNode.process() emits. */
|
|
5
|
+
type GlbTransformNodeOutputs = {
|
|
6
|
+
output: {
|
|
7
|
+
type: string;
|
|
8
|
+
asset_id: null;
|
|
9
|
+
metadata: null;
|
|
10
|
+
data: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare abstract class GlbTransformNode extends BaseNode {
|
|
14
|
+
model: Model3DRefLike;
|
|
15
|
+
protected getModel(): Model3DRefLike;
|
|
16
|
+
protected abstract transform(bytes: Uint8Array): Uint8Array | null | Promise<Uint8Array | null>;
|
|
17
|
+
process(context?: ProcessingContext): Promise<GlbTransformNodeOutputs>;
|
|
18
|
+
}
|
|
19
|
+
export declare const glbOutput: (bytes: Uint8Array, uri?: string) => {
|
|
20
|
+
output: {
|
|
21
|
+
type: string;
|
|
22
|
+
asset_id: null;
|
|
23
|
+
metadata: null;
|
|
24
|
+
data: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,uDAAuD;AACvD,KAAK,uBAAuB,GAAG;IAC7B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE,CAAC;AAEF,8BAAsB,gBAAiB,SAAQ,QAAQ;IAC7C,KAAK,EAAE,cAAc,CAAC;IAE9B,SAAS,CAAC,QAAQ,IAAI,cAAc,CAEnC;IAED,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,KAAK,EAAE,UAAU,GAChB,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAE5C,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAM3E;CACF;AAED,eAAO,MAAM,SAAS,UAAW,UAAU;IACzC,MAAM;;;;;;CACN,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import { modelRef, modelRefToBytes } from "./utils.js";
|
|
3
|
+
import { isObjectLike } from "@nodetool-ai/node-sdk";
|
|
4
|
+
export class GlbTransformNode extends BaseNode {
|
|
5
|
+
getModel() {
|
|
6
|
+
return isObjectLike(this.model) ? this.model : {};
|
|
7
|
+
}
|
|
8
|
+
async process(context) {
|
|
9
|
+
const model = this.getModel();
|
|
10
|
+
const bytes = await modelRefToBytes(model, context);
|
|
11
|
+
const out = await this.transform(bytes);
|
|
12
|
+
if (!out)
|
|
13
|
+
return { output: modelRef(bytes, { uri: model.uri ?? "", format: model.format ?? "glb" }) };
|
|
14
|
+
return { output: modelRef(out, { uri: model.uri ?? "", format: "glb" }) };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export const glbOutput = (bytes, uri = "") => ({
|
|
18
|
+
output: modelRef(bytes, { uri, format: "glb" })
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/nodes/model3d/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD,MAAM,OAAgB,gBAAiB,SAAQ,QAAQ;IAG3C,QAAQ;QAChB,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IAMD,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;QACtG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;CAChD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-ops.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/boolean-ops.ts"],"names":[],"mappings":"AA4LA,wBAAsB,UAAU,CAC9B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC,CAsBrB"}
|