@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.
- package/README.md +78 -0
- package/dist/__tests__/convert.test.d.ts +7 -0
- package/dist/__tests__/convert.test.d.ts.map +1 -0
- package/dist/__tests__/convert.test.js +127 -0
- package/dist/__tests__/convert.test.js.map +1 -0
- package/dist/__tests__/readInput.test.d.ts +5 -0
- package/dist/__tests__/readInput.test.d.ts.map +1 -0
- package/dist/__tests__/readInput.test.js +83 -0
- package/dist/__tests__/readInput.test.js.map +1 -0
- package/dist/commands/convert.d.ts +15 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +182 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/video.d.ts +15 -0
- package/dist/commands/video.d.ts.map +1 -0
- package/dist/commands/video.js +253 -0
- package/dist/commands/video.js.map +1 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -425
- package/dist/index.js.map +1 -1
- package/dist/nativeEncoder-EXDP2O5B.js +0 -0
- package/dist/util/detectFfmpeg.d.ts +15 -0
- package/dist/util/detectFfmpeg.d.ts.map +1 -0
- package/dist/util/detectFfmpeg.js +29 -0
- package/dist/util/detectFfmpeg.js.map +1 -0
- package/dist/util/nativeEncoder.d.ts +27 -0
- package/dist/util/nativeEncoder.d.ts.map +1 -0
- package/dist/util/nativeEncoder.js +106 -0
- package/dist/util/nativeEncoder.js.map +1 -0
- package/dist/util/readInput.d.ts +19 -0
- package/dist/util/readInput.d.ts.map +1 -0
- package/dist/util/readInput.js +98 -0
- package/dist/util/readInput.js.map +1 -0
- package/package.json +5 -5
|
@@ -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.
|
|
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.
|
|
41
|
-
"@bendyline/squisq-formats": "1.1.
|
|
42
|
-
"@bendyline/squisq-react": "1.0.
|
|
43
|
-
"@bendyline/squisq-video": "1.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
|
},
|