@bendyline/squisq-cli 1.0.0 → 1.0.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.
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Native FFmpeg Encoder
3
+ *
4
+ * Encodes PNG frames to MP4 using a locally installed ffmpeg binary.
5
+ * Writes frames to a temporary directory, invokes ffmpeg as a child process,
6
+ * and reads the resulting MP4.
7
+ *
8
+ * This is the fast path — used when native ffmpeg is detected on the system.
9
+ * Falls back to the WASM encoder (in @bendyline/squisq-video) when unavailable.
10
+ */
11
+ import { execFile } from 'node:child_process';
12
+ import { writeFile, readFile, mkdir, rm } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { tmpdir } from 'node:os';
15
+ import { randomBytes } from 'node:crypto';
16
+ import { QUALITY_PRESETS, resolveDimensions } from '@bendyline/squisq-video';
17
+ /**
18
+ * Encode frame PNGs to MP4 using native ffmpeg.
19
+ *
20
+ * @param ffmpegPath - Absolute path to the ffmpeg binary
21
+ * @param frames - Array of PNG image bytes (one per frame)
22
+ * @param audio - Optional audio file bytes to mux
23
+ * @param outputPath - Where to write the final MP4
24
+ * @param options - Encoding options (fps, quality, dimensions, progress)
25
+ */
26
+ export async function framesToMp4Native(ffmpegPath, frames, audio, outputPath, options = {}) {
27
+ const fps = options.fps ?? 30;
28
+ const quality = options.quality ?? 'normal';
29
+ const { width, height } = resolveDimensions(options);
30
+ const preset = QUALITY_PRESETS[quality];
31
+ const onProgress = options.onProgress;
32
+ if (frames.length === 0) {
33
+ throw new Error('No frames provided for encoding');
34
+ }
35
+ // Create a temp working directory
36
+ const tmpId = randomBytes(8).toString('hex');
37
+ const workDir = join(tmpdir(), `squisq-video-${tmpId}`);
38
+ await mkdir(workDir, { recursive: true });
39
+ try {
40
+ onProgress?.(0, 'writing frames');
41
+ // Write frame PNGs to temp directory
42
+ const padLen = String(frames.length).length;
43
+ for (let i = 0; i < frames.length; i++) {
44
+ const name = `frame-${String(i + 1).padStart(padLen, '0')}.png`;
45
+ await writeFile(join(workDir, name), frames[i]);
46
+ if (onProgress && i % 10 === 0) {
47
+ onProgress(Math.round((i / frames.length) * 30), 'writing frames');
48
+ }
49
+ }
50
+ // Write audio if provided
51
+ let audioPath = null;
52
+ if (audio) {
53
+ audioPath = join(workDir, 'audio-input');
54
+ await writeFile(audioPath, audio);
55
+ }
56
+ onProgress?.(30, 'encoding');
57
+ // Build ffmpeg arguments
58
+ const padPattern = join(workDir, `frame-%0${padLen}d.png`);
59
+ const args = ['-y', '-framerate', String(fps), '-i', padPattern];
60
+ if (audioPath) {
61
+ args.push('-i', audioPath);
62
+ }
63
+ args.push('-c:v', 'libx264', '-preset', preset.preset, '-crf', String(preset.crf), '-pix_fmt', 'yuv420p', '-vf', `scale=${width}:${height}:force_original_aspect_ratio=decrease,pad=${width}:${height}:(ow-iw)/2:(oh-ih)/2`);
64
+ if (audioPath) {
65
+ args.push('-c:a', 'aac', '-b:a', '128k', '-shortest');
66
+ }
67
+ args.push(outputPath);
68
+ // Run ffmpeg
69
+ await new Promise((resolve, reject) => {
70
+ const proc = execFile(ffmpegPath, args, { timeout: 600000 }, (err) => {
71
+ if (err) {
72
+ reject(new Error(`ffmpeg failed: ${err.message}`));
73
+ }
74
+ else {
75
+ resolve();
76
+ }
77
+ });
78
+ // ffmpeg writes progress to stderr
79
+ proc.stderr?.on('data', () => {
80
+ // Could parse ffmpeg progress output here in the future
81
+ });
82
+ });
83
+ onProgress?.(100, 'done');
84
+ }
85
+ finally {
86
+ // Clean up temp directory
87
+ await rm(workDir, { recursive: true, force: true });
88
+ }
89
+ }
90
+ /**
91
+ * Encode frames using native ffmpeg and return the MP4 bytes (instead of writing to disk).
92
+ * Useful when the caller needs the bytes in memory.
93
+ */
94
+ export async function framesToMp4NativeBytes(ffmpegPath, frames, audio, options = {}) {
95
+ const tmpId = randomBytes(8).toString('hex');
96
+ const tmpOutput = join(tmpdir(), `squisq-video-out-${tmpId}.mp4`);
97
+ try {
98
+ await framesToMp4Native(ffmpegPath, frames, audio, tmpOutput, options);
99
+ const data = await readFile(tmpOutput);
100
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
101
+ }
102
+ finally {
103
+ await rm(tmpOutput, { force: true });
104
+ }
105
+ }
106
+ //# sourceMappingURL=nativeEncoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeEncoder.js","sourceRoot":"","sources":["../../src/util/nativeEncoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * readInput
3
+ *
4
+ * Unified input reader for the CLI. Accepts a path to a .md file,
5
+ * .zip/.dbk container, or a folder and returns a MemoryContentContainer
6
+ * (virtual file system) plus the parsed MarkdownDocument.
7
+ */
8
+ import type { MarkdownDocument } from '@bendyline/squisq/markdown';
9
+ import { MemoryContentContainer } from '@bendyline/squisq/storage';
10
+ export interface ReadInputResult {
11
+ container: MemoryContentContainer;
12
+ markdownDoc: MarkdownDocument;
13
+ }
14
+ /**
15
+ * Read input from a file path (markdown, ZIP/DBK container, or folder)
16
+ * and return a populated ContentContainer + parsed MarkdownDocument.
17
+ */
18
+ export declare function readInput(inputPath: string): Promise<ReadInputResult>;
19
+ //# sourceMappingURL=readInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readInput.d.ts","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,sBAAsB,CAAC;IAClC,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AA2CD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAc3E"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * readInput
3
+ *
4
+ * Unified input reader for the CLI. Accepts a path to a .md file,
5
+ * .zip/.dbk container, or a folder and returns a MemoryContentContainer
6
+ * (virtual file system) plus the parsed MarkdownDocument.
7
+ */
8
+ import { readFile, readdir, stat } from 'node:fs/promises';
9
+ import { join, extname } from 'node:path';
10
+ import { parseMarkdown } from '@bendyline/squisq/markdown';
11
+ import { MemoryContentContainer } from '@bendyline/squisq/storage';
12
+ import { zipToContainer } from '@bendyline/squisq-formats/container';
13
+ /** MIME type lookup by extension (common content types) */
14
+ const MIME_TYPES = {
15
+ '.md': 'text/markdown',
16
+ '.txt': 'text/plain',
17
+ '.json': 'application/json',
18
+ '.jpg': 'image/jpeg',
19
+ '.jpeg': 'image/jpeg',
20
+ '.png': 'image/png',
21
+ '.gif': 'image/gif',
22
+ '.webp': 'image/webp',
23
+ '.svg': 'image/svg+xml',
24
+ '.mp3': 'audio/mpeg',
25
+ '.wav': 'audio/wav',
26
+ '.ogg': 'audio/ogg',
27
+ '.mp4': 'video/mp4',
28
+ '.webm': 'video/webm',
29
+ };
30
+ function mimeFromExt(filePath) {
31
+ return MIME_TYPES[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
32
+ }
33
+ /**
34
+ * Recursively walk a directory and return all file paths (relative to root).
35
+ */
36
+ async function walkDir(root, prefix = '') {
37
+ const entries = await readdir(root, { withFileTypes: true });
38
+ const paths = [];
39
+ for (const entry of entries) {
40
+ const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
41
+ if (entry.isDirectory()) {
42
+ paths.push(...(await walkDir(join(root, entry.name), relPath)));
43
+ }
44
+ else if (entry.isFile()) {
45
+ paths.push(relPath);
46
+ }
47
+ }
48
+ return paths;
49
+ }
50
+ /**
51
+ * Read input from a file path (markdown, ZIP/DBK container, or folder)
52
+ * and return a populated ContentContainer + parsed MarkdownDocument.
53
+ */
54
+ export async function readInput(inputPath) {
55
+ const info = await stat(inputPath);
56
+ if (info.isDirectory()) {
57
+ return readFolder(inputPath);
58
+ }
59
+ const ext = extname(inputPath).toLowerCase();
60
+ if (ext === '.zip' || ext === '.dbk') {
61
+ return readContainer(inputPath);
62
+ }
63
+ // Default: treat as a markdown file
64
+ return readMarkdownFile(inputPath);
65
+ }
66
+ async function readMarkdownFile(filePath) {
67
+ const content = await readFile(filePath, 'utf-8');
68
+ const container = new MemoryContentContainer();
69
+ await container.writeDocument(content);
70
+ const markdownDoc = parseMarkdown(content);
71
+ return { container, markdownDoc };
72
+ }
73
+ async function readContainer(filePath) {
74
+ const data = await readFile(filePath);
75
+ const container = await zipToContainer(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
76
+ const markdown = await container.readDocument();
77
+ if (!markdown) {
78
+ throw new Error(`No markdown document found in container: ${filePath}`);
79
+ }
80
+ const markdownDoc = parseMarkdown(markdown);
81
+ return { container, markdownDoc };
82
+ }
83
+ async function readFolder(dirPath) {
84
+ const container = new MemoryContentContainer();
85
+ const files = await walkDir(dirPath);
86
+ for (const relPath of files) {
87
+ const absPath = join(dirPath, relPath);
88
+ const data = await readFile(absPath);
89
+ await container.writeFile(relPath, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), mimeFromExt(relPath));
90
+ }
91
+ const markdown = await container.readDocument();
92
+ if (!markdown) {
93
+ throw new Error(`No markdown document found in folder: ${dirPath}`);
94
+ }
95
+ const markdownDoc = parseMarkdown(markdown);
96
+ return { container, markdownDoc };
97
+ }
98
+ //# sourceMappingURL=readInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readInput.js","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq-cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Squisq CLI — convert markdown documents to DOCX, PDF, HTML, and more",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -37,10 +37,10 @@
37
37
  "test": "mocha"
38
38
  },
39
39
  "dependencies": {
40
- "@bendyline/squisq": "1.1.0",
41
- "@bendyline/squisq-formats": "1.1.0",
42
- "@bendyline/squisq-react": "1.0.2",
43
- "@bendyline/squisq-video": "1.0.0",
40
+ "@bendyline/squisq": "1.1.1",
41
+ "@bendyline/squisq-formats": "1.1.1",
42
+ "@bendyline/squisq-react": "1.0.3",
43
+ "@bendyline/squisq-video": "1.0.1",
44
44
  "commander": "^12.0.0",
45
45
  "playwright-core": "^1.48.0"
46
46
  },