@jtdigital/renderbox-sdk 0.2.0

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 (79) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +82 -0
  3. package/dist/graph.d.ts +194 -0
  4. package/dist/graph.d.ts.map +1 -0
  5. package/dist/graph.js +62 -0
  6. package/dist/graph.js.map +1 -0
  7. package/dist/index.d.ts +13 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +13 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/input.d.ts +30 -0
  12. package/dist/input.d.ts.map +1 -0
  13. package/dist/input.js +167 -0
  14. package/dist/input.js.map +1 -0
  15. package/dist/job.d.ts +18 -0
  16. package/dist/job.d.ts.map +1 -0
  17. package/dist/job.js +15 -0
  18. package/dist/job.js.map +1 -0
  19. package/dist/ops/ai.d.ts +156 -0
  20. package/dist/ops/ai.d.ts.map +1 -0
  21. package/dist/ops/ai.js +134 -0
  22. package/dist/ops/ai.js.map +1 -0
  23. package/dist/ops/audio.d.ts +359 -0
  24. package/dist/ops/audio.d.ts.map +1 -0
  25. package/dist/ops/audio.js +296 -0
  26. package/dist/ops/audio.js.map +1 -0
  27. package/dist/ops/combine.d.ts +246 -0
  28. package/dist/ops/combine.d.ts.map +1 -0
  29. package/dist/ops/combine.js +230 -0
  30. package/dist/ops/combine.js.map +1 -0
  31. package/dist/ops/source.d.ts +41 -0
  32. package/dist/ops/source.d.ts.map +1 -0
  33. package/dist/ops/source.js +34 -0
  34. package/dist/ops/source.js.map +1 -0
  35. package/dist/ops/video.d.ts +695 -0
  36. package/dist/ops/video.d.ts.map +1 -0
  37. package/dist/ops/video.js +620 -0
  38. package/dist/ops/video.js.map +1 -0
  39. package/dist/output.d.ts +26 -0
  40. package/dist/output.d.ts.map +1 -0
  41. package/dist/output.js +144 -0
  42. package/dist/output.js.map +1 -0
  43. package/dist/protocol.d.ts +96 -0
  44. package/dist/protocol.d.ts.map +1 -0
  45. package/dist/protocol.js +2 -0
  46. package/dist/protocol.js.map +1 -0
  47. package/dist/recipes/depthBlurPipeline.d.ts +11 -0
  48. package/dist/recipes/depthBlurPipeline.d.ts.map +1 -0
  49. package/dist/recipes/depthBlurPipeline.js +17 -0
  50. package/dist/recipes/depthBlurPipeline.js.map +1 -0
  51. package/dist/recipes/faceRedact.d.ts +15 -0
  52. package/dist/recipes/faceRedact.d.ts.map +1 -0
  53. package/dist/recipes/faceRedact.js +25 -0
  54. package/dist/recipes/faceRedact.js.map +1 -0
  55. package/dist/recipes/index.d.ts +6 -0
  56. package/dist/recipes/index.d.ts.map +1 -0
  57. package/dist/recipes/index.js +6 -0
  58. package/dist/recipes/index.js.map +1 -0
  59. package/dist/recipes/letterbox.d.ts +6 -0
  60. package/dist/recipes/letterbox.d.ts.map +1 -0
  61. package/dist/recipes/letterbox.js +7 -0
  62. package/dist/recipes/letterbox.js.map +1 -0
  63. package/dist/recipes/makeSlideshow.d.ts +28 -0
  64. package/dist/recipes/makeSlideshow.d.ts.map +1 -0
  65. package/dist/recipes/makeSlideshow.js +127 -0
  66. package/dist/recipes/makeSlideshow.js.map +1 -0
  67. package/dist/recipes/snip.d.ts +3 -0
  68. package/dist/recipes/snip.d.ts.map +1 -0
  69. package/dist/recipes/snip.js +6 -0
  70. package/dist/recipes/snip.js.map +1 -0
  71. package/dist/recipes/subtitleBurn.d.ts +11 -0
  72. package/dist/recipes/subtitleBurn.d.ts.map +1 -0
  73. package/dist/recipes/subtitleBurn.js +16 -0
  74. package/dist/recipes/subtitleBurn.js.map +1 -0
  75. package/dist/types.d.ts +10 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +39 -0
@@ -0,0 +1,127 @@
1
+ import { GraphBuilder, pipe, _id } from '../graph.js';
2
+ import { fileOn } from '../input.js';
3
+ import { sinkAv } from '../output.js';
4
+ import { scale, pad, format, setpts, trim, zoompan, deflicker, tmix, gblur, setsar, fps, loop as vloop, } from '../ops/video.js';
5
+ import { volume, afade } from '../ops/audio.js';
6
+ import { xfade, concat } from '../ops/combine.js';
7
+ const CENTER_X = 'iw/2-(iw/zoom/2)';
8
+ const CENTER_Y = 'ih/2-(ih/zoom/2)';
9
+ const EDGE_X = 'iw-(iw/zoom)';
10
+ const EDGE_Y = 'ih-(ih/zoom)';
11
+ const DRIFT_X = 'iw/6';
12
+ const DRIFT_Y = 'ih/6';
13
+ function lerp(frames, from, to) {
14
+ return `${from}+(${to}-(${from}))*on/${frames}`;
15
+ }
16
+ function easeInOut(frames, from, to) {
17
+ return `${from}+(${to}-(${from}))*(3*pow(on/${frames},2)-2*pow(on/${frames},3))`;
18
+ }
19
+ function presetExprs(preset, frames) {
20
+ switch (preset) {
21
+ case 'gentleZoomIn': return { z: lerp(frames, '1', '1.15'), x: CENTER_X, y: CENTER_Y };
22
+ case 'gentleZoomOut': return { z: lerp(frames, '1.15', '1'), x: CENTER_X, y: CENTER_Y };
23
+ case 'gentlePan': return { z: '1.05', x: easeInOut(frames, '0', CENTER_X), y: CENTER_Y };
24
+ case 'zoomIn': return { z: easeInOut(frames, '1', '1.5'), x: CENTER_X, y: CENTER_Y };
25
+ case 'zoomOut': return { z: easeInOut(frames, '1.5', '1'), x: CENTER_X, y: CENTER_Y };
26
+ case 'panRight': return { z: '1.1', x: easeInOut(frames, '0', EDGE_X), y: CENTER_Y };
27
+ case 'panLeft': return { z: '1.1', x: easeInOut(frames, EDGE_X, '0'), y: CENTER_Y };
28
+ case 'punchIn': return { z: easeInOut(frames, '1', '2'), x: CENTER_X, y: CENTER_Y };
29
+ case 'pullBack': return { z: easeInOut(frames, '2', '1'), x: CENTER_X, y: CENTER_Y };
30
+ case 'spiral': return {
31
+ z: easeInOut(frames, '1', '1.4'),
32
+ x: `${CENTER_X}+${DRIFT_X}*sin(2*PI*on/${frames})`,
33
+ y: `${CENTER_Y}+${DRIFT_Y}*cos(2*PI*on/${frames})`,
34
+ };
35
+ case 'diagonal': return {
36
+ z: easeInOut(frames, '1', '1.3'),
37
+ x: easeInOut(frames, '0', EDGE_X),
38
+ y: easeInOut(frames, '0', EDGE_Y),
39
+ };
40
+ case 'parallax': return {
41
+ z: '1.2',
42
+ x: easeInOut(frames, DRIFT_X, `${EDGE_X}-${DRIFT_X}`),
43
+ y: CENTER_Y,
44
+ };
45
+ }
46
+ }
47
+ function imageClip(g, path, duration, fpsRate) {
48
+ const [v] = fileOn(g, path);
49
+ return pipe(vloop({ loop: -1, size: 1, start: 0 }), fps({ fps: fpsRate }), trim({ start: 0, end: duration }), setpts({ expr: 'PTS-STARTPTS' }))(v);
50
+ }
51
+ function applyKenBurns(input, preset, duration, w, h, fpsRate) {
52
+ const frames = Math.round(duration * fpsRate);
53
+ const exprs = presetExprs(preset, frames);
54
+ const scaledW = w * 4;
55
+ const scaledH = h * 4;
56
+ return pipe(scale({ w: scaledW, h: scaledH, force_original_aspect_ratio: 'decrease', flags: 'lanczos' }), pad({ w: scaledW, h: scaledH, x: '(ow-iw)/2', y: '(oh-ih)/2', color: 'black' }), setsar({ sar: '1' }), zoompan({ z: exprs.z, x: exprs.x, y: exprs.y, d: frames, fps: fpsRate, s: `${w}x${h}` }), deflicker({ size: 11, mode: 'pm' }), tmix({ frames: 3, weights: '1 2 1' }), gblur({ sigma: 0.5 }), format({ pix_fmts: 'yuv420p' }))(input);
57
+ }
58
+ function applyLetterbox(input, w, h) {
59
+ return pipe(scale({ w, h, force_original_aspect_ratio: 'decrease', flags: 'lanczos' }), pad({ w, h, x: '(ow-iw)/2', y: '(oh-ih)/2', color: 'black' }), setsar({ sar: '1' }), format({ pix_fmts: 'yuv420p' }))(input);
60
+ }
61
+ function buildXfadeChain(clips, durations, transition, transitionDur) {
62
+ let result = clips[0];
63
+ let elapsedContent = durations[0];
64
+ let elapsedTransitions = 0;
65
+ for (let i = 1; i < clips.length; i++) {
66
+ const offset = elapsedContent - elapsedTransitions - transitionDur;
67
+ result = xfade(clips[i], { transition, duration: transitionDur, offset })(result);
68
+ elapsedContent += durations[i];
69
+ elapsedTransitions += transitionDur;
70
+ }
71
+ return result;
72
+ }
73
+ export function makeSlideshow(outputPath, opts) {
74
+ if (opts.slides.length < 2)
75
+ throw new Error('makeSlideshow: requires at least 2 slides');
76
+ const [w, h] = opts.resolution;
77
+ const fpsRate = opts.fps ?? 25;
78
+ const g = new GraphBuilder();
79
+ const clips = opts.slides.map((slide) => {
80
+ const clip = imageClip(g, slide.path, slide.duration, fpsRate);
81
+ if (slide.kenBurns) {
82
+ return applyKenBurns(clip, slide.kenBurns, slide.duration, w, h, fpsRate);
83
+ }
84
+ return applyLetterbox(clip, w, h);
85
+ });
86
+ const durations = opts.slides.map((s) => s.duration);
87
+ const transitionType = opts.transition?.type ?? 'dissolve';
88
+ const transitionDur = opts.transition?.duration ?? 1.0;
89
+ let video;
90
+ if (transitionDur > 0 && clips.length > 1) {
91
+ video = buildXfadeChain(clips, durations, transitionType, transitionDur);
92
+ }
93
+ else {
94
+ video = concat(clips);
95
+ }
96
+ let audio;
97
+ if (opts.music) {
98
+ const [, musicAudio] = fileOn(g, opts.music.path);
99
+ let a = musicAudio;
100
+ if (opts.music.volume !== undefined) {
101
+ a = volume({ volume: opts.music.volume })(a);
102
+ }
103
+ if (opts.music.fadeIn !== undefined) {
104
+ a = afade({ type: 'in', duration: opts.music.fadeIn })(a);
105
+ }
106
+ const totalDur = durations.reduce((sum, d) => sum + d, 0)
107
+ - (clips.length - 1) * transitionDur;
108
+ if (opts.music.fadeOut !== undefined) {
109
+ a = afade({ type: 'out', start_time: totalDur - opts.music.fadeOut, duration: opts.music.fadeOut })(a);
110
+ }
111
+ audio = a;
112
+ }
113
+ if (audio) {
114
+ return sinkAv(outputPath, video, audio, opts.output);
115
+ }
116
+ const sinkId = g._addNode({
117
+ kind: 'Sink',
118
+ inputs: [_id(video)],
119
+ input_sorts: ['Video'],
120
+ target: { File: { path: outputPath } },
121
+ encoding: 'Container',
122
+ opts: {},
123
+ });
124
+ g._addRoot(sinkId);
125
+ return g;
126
+ }
127
+ //# sourceMappingURL=makeSlideshow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeSlideshow.js","sourceRoot":"","sources":["../../src/recipes/makeSlideshow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Stream } from '../types.js';
2
+ export declare function snip(input: Stream<'Video'>, start: number, end: number): Stream<'Video'>;
3
+ //# sourceMappingURL=snip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snip.d.ts","sourceRoot":"","sources":["../../src/recipes/snip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAgB,IAAI,CAClB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EACtB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,OAAO,CAAC,CAKjB"}
@@ -0,0 +1,6 @@
1
+ import { pipe } from '../graph.js';
2
+ import { trim, setpts } from '../ops/video.js';
3
+ export function snip(input, start, end) {
4
+ return pipe(trim({ start, end }), setpts({ expr: 'PTS-STARTPTS' }))(input);
5
+ }
6
+ //# sourceMappingURL=snip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snip.js","sourceRoot":"","sources":["../../src/recipes/snip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,IAAI,CAClB,KAAsB,EACtB,KAAa,EACb,GAAW;IAEX,OAAO,IAAI,CACT,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EACpB,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CACjC,CAAC,KAAK,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { GraphBuilder } from '../graph.js';
2
+ import { type SinkAvOpts } from '../output.js';
3
+ export interface SubtitleBurnOpts {
4
+ transcribeModel?: string;
5
+ language?: string;
6
+ fontSize?: number;
7
+ marginV?: number;
8
+ output?: SinkAvOpts;
9
+ }
10
+ export declare function subtitleBurn(inputPath: string, outputPath: string, opts?: SubtitleBurnOpts): GraphBuilder;
11
+ //# sourceMappingURL=subtitleBurn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitleBurn.d.ts","sourceRoot":"","sources":["../../src/recipes/subtitleBurn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAIvD,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,YAAY,CASd"}
@@ -0,0 +1,16 @@
1
+ import { GraphBuilder } from '../graph.js';
2
+ import { fileOn } from '../input.js';
3
+ import { sinkAv } from '../output.js';
4
+ import { transcribe } from '../ops/ai.js';
5
+ import { burnSubtitles } from '../ops/combine.js';
6
+ export function subtitleBurn(inputPath, outputPath, opts) {
7
+ const g = new GraphBuilder();
8
+ const [video, audio] = fileOn(g, inputPath);
9
+ const transcript = transcribe({ model: opts?.transcribeModel, language: opts?.language })(audio);
10
+ const burned = burnSubtitles(transcript, {
11
+ font_size: opts?.fontSize,
12
+ margin_v: opts?.marginV,
13
+ })(video);
14
+ return sinkAv(outputPath, burned, audio, opts?.output);
15
+ }
16
+ //# sourceMappingURL=subtitleBurn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitleBurn.js","sourceRoot":"","sources":["../../src/recipes/subtitleBurn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUlD,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,UAAkB,EAClB,IAAuB;IAEvB,MAAM,CAAC,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,EAAE;QACvC,SAAS,EAAE,IAAI,EAAE,QAAQ;QACzB,QAAQ,EAAE,IAAI,EAAE,OAAO;KACxB,CAAC,CAAC,KAAK,CAAC,CAAC;IACV,OAAO,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,10 @@
1
+ declare const __sort: unique symbol;
2
+ export type SortTag = 'Video' | 'Audio' | 'Alpha' | 'AV' | 'Detection' | 'Transcript' | 'Depth' | 'Segmentation' | 'Pose' | 'Text' | 'Scene' | 'Density' | 'AudioEvent';
3
+ export type Stream<S extends SortTag> = {
4
+ readonly [__sort]: S;
5
+ };
6
+ export type ParamValue = number | string | boolean | null | ParamValue[] | {
7
+ [key: string]: ParamValue;
8
+ };
9
+ export {};
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC;AAEpC,MAAM,MAAM,OAAO,GACf,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GAClC,WAAW,GAAG,YAAY,GAAG,OAAO,GACpC,cAAc,GAAG,MAAM,GAAG,MAAM,GAChC,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvC,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,OAAO,IAAI;IAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,EAAE,GACZ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@jtdigital/renderbox-sdk",
3
+ "version": "0.2.0",
4
+ "description": "Typed TypeScript SDK for renderbox video processing — compose video/audio/AI pipelines and build job messages.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "check": "tsc --noEmit",
17
+ "test": "vitest run",
18
+ "prepublishOnly": "tsc"
19
+ },
20
+ "files": ["dist"],
21
+ "license": "Apache-2.0",
22
+ "author": "JT Digital",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "homepage": "https://renderbox.dev/sdk/typescript",
27
+ "keywords": [
28
+ "renderbox",
29
+ "video",
30
+ "ffmpeg",
31
+ "pipeline",
32
+ "video-processing",
33
+ "jtdigital"
34
+ ],
35
+ "devDependencies": {
36
+ "typescript": "^5.7",
37
+ "vitest": "^3.2"
38
+ }
39
+ }