@bendyline/squisq-cli 1.0.1 → 1.1.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 +50 -7
- package/dist/__tests__/readInput.test.js +38 -1
- package/dist/__tests__/readInput.test.js.map +1 -1
- package/dist/api.d.ts +106 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +324 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/convert.js +33 -4
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/video.d.ts +2 -5
- package/dist/commands/video.d.ts.map +1 -1
- package/dist/commands/video.js +27 -158
- package/dist/commands/video.js.map +1 -1
- package/dist/nativeEncoder-MWHOONST.js +88 -0
- package/dist/nativeEncoder-MWHOONST.js.map +1 -0
- package/dist/util/readInput.d.ts +18 -6
- package/dist/util/readInput.d.ts.map +1 -1
- package/dist/util/readInput.js +51 -7
- package/dist/util/readInput.js.map +1 -1
- package/package.json +26 -14
package/dist/commands/convert.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { writeFile, mkdir } from 'node:fs/promises';
|
|
14
14
|
import { dirname, basename, extname, join, resolve } from 'node:path';
|
|
15
15
|
import { readInput } from '../util/readInput.js';
|
|
16
|
-
const ALL_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'dbk'];
|
|
16
|
+
const ALL_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'epub', 'dbk'];
|
|
17
17
|
function parseFormats(value) {
|
|
18
18
|
const requested = value.split(',').map((s) => s.trim().toLowerCase());
|
|
19
19
|
const valid = [];
|
|
@@ -77,11 +77,15 @@ async function runConvert(inputPath, opts) {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
console.error(`Reading: ${resolvedInput}`);
|
|
80
|
-
const
|
|
80
|
+
const result = await readInput(resolvedInput);
|
|
81
|
+
const { container } = result;
|
|
82
|
+
if (!result.markdownDoc) {
|
|
83
|
+
throw new Error('Convert command requires a markdown document. JSON Doc input is not supported for convert — use the video command instead.');
|
|
84
|
+
}
|
|
81
85
|
// Apply transform if requested
|
|
82
|
-
let exportMarkdownDoc = markdownDoc;
|
|
86
|
+
let exportMarkdownDoc = result.markdownDoc;
|
|
83
87
|
if (opts.transform) {
|
|
84
|
-
exportMarkdownDoc = await applyTransformToMarkdown(markdownDoc, container, opts.transform, opts.theme);
|
|
88
|
+
exportMarkdownDoc = await applyTransformToMarkdown(result.markdownDoc, container, opts.transform, opts.theme);
|
|
85
89
|
console.error(` Applied transform: ${opts.transform}`);
|
|
86
90
|
}
|
|
87
91
|
const themeId = opts.theme;
|
|
@@ -132,6 +136,31 @@ async function runConvert(inputPath, opts) {
|
|
|
132
136
|
await writeFile(outPath, html, 'utf-8');
|
|
133
137
|
break;
|
|
134
138
|
}
|
|
139
|
+
case 'epub': {
|
|
140
|
+
const { markdownDocToEpub } = await import('@bendyline/squisq-formats/epub');
|
|
141
|
+
const images = await collectContainerImages(container);
|
|
142
|
+
// Collect audio narration from container if Doc has audio segments
|
|
143
|
+
const epubAudio = new Map();
|
|
144
|
+
const audioSegments = result.doc?.audio?.segments;
|
|
145
|
+
if (audioSegments?.length) {
|
|
146
|
+
for (const seg of audioSegments) {
|
|
147
|
+
const data = await container.readFile(seg.src);
|
|
148
|
+
if (data)
|
|
149
|
+
epubAudio.set(seg.src, data);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const hasNarration = epubAudio.size > 0;
|
|
153
|
+
const buf = await markdownDocToEpub(exportMarkdownDoc, {
|
|
154
|
+
title: baseName,
|
|
155
|
+
themeId,
|
|
156
|
+
images,
|
|
157
|
+
audio: hasNarration ? epubAudio : undefined,
|
|
158
|
+
audioSegments: hasNarration ? audioSegments : undefined,
|
|
159
|
+
totalDuration: hasNarration ? result.doc?.duration : undefined,
|
|
160
|
+
});
|
|
161
|
+
await writeFile(outPath, Buffer.from(buf));
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
135
164
|
case 'dbk': {
|
|
136
165
|
const { containerToZip } = await import('@bendyline/squisq-formats/container');
|
|
137
166
|
const blob = await containerToZip(container);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAItE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/video.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* video command
|
|
3
3
|
*
|
|
4
|
-
* Renders a squisq document to MP4 video by
|
|
5
|
-
*
|
|
6
|
-
* 2. Generating a self-contained render HTML
|
|
7
|
-
* 3. Capturing frames via Playwright headless browser
|
|
8
|
-
* 4. Encoding to MP4 using native ffmpeg (fast) or ffmpeg.wasm (fallback)
|
|
4
|
+
* Renders a squisq document to MP4 video by delegating to the
|
|
5
|
+
* programmatic renderDocToMp4 API.
|
|
9
6
|
*
|
|
10
7
|
* Usage:
|
|
11
8
|
* squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC3D"}
|
package/dist/commands/video.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* video command
|
|
3
3
|
*
|
|
4
|
-
* Renders a squisq document to MP4 video by
|
|
5
|
-
*
|
|
6
|
-
* 2. Generating a self-contained render HTML
|
|
7
|
-
* 3. Capturing frames via Playwright headless browser
|
|
8
|
-
* 4. Encoding to MP4 using native ffmpeg (fast) or ffmpeg.wasm (fallback)
|
|
4
|
+
* Renders a squisq document to MP4 video by delegating to the
|
|
5
|
+
* programmatic renderDocToMp4 API.
|
|
9
6
|
*
|
|
10
7
|
* Usage:
|
|
11
8
|
* squisq video <input> [-o output.mp4] [--fps 30] [--quality normal] [--orientation landscape]
|
|
@@ -13,7 +10,7 @@
|
|
|
13
10
|
import { mkdir } from 'node:fs/promises';
|
|
14
11
|
import { dirname, basename, extname, resolve } from 'node:path';
|
|
15
12
|
import { readInput } from '../util/readInput.js';
|
|
16
|
-
import {
|
|
13
|
+
import { renderDocToMp4 } from '../api.js';
|
|
17
14
|
const VALID_QUALITIES = ['draft', 'normal', 'high'];
|
|
18
15
|
const VALID_ORIENTATIONS = ['landscape', 'portrait'];
|
|
19
16
|
const VALID_CAPTIONS = ['off', 'standard', 'social'];
|
|
@@ -76,166 +73,38 @@ async function runVideo(inputPath, opts) {
|
|
|
76
73
|
await mkdir(dirname(outputPath), { recursive: true });
|
|
77
74
|
// ── Step 1: Read input ──────────────────────────────────────────
|
|
78
75
|
console.error(`Reading: ${resolvedInput}`);
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const images = new Map();
|
|
87
|
-
for (const imgPath of imagePaths) {
|
|
88
|
-
const data = await container.readFile(imgPath);
|
|
89
|
-
if (data) {
|
|
90
|
-
images.set(imgPath, data);
|
|
91
|
-
}
|
|
76
|
+
const result = await readInput(resolvedInput);
|
|
77
|
+
const { container } = result;
|
|
78
|
+
// ── Step 2: Get or parse Doc ────────────────────────────────────
|
|
79
|
+
let doc;
|
|
80
|
+
if (result.doc) {
|
|
81
|
+
console.error('Using pre-built Doc JSON');
|
|
82
|
+
doc = result.doc;
|
|
92
83
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (doc.audio?.segments?.length) {
|
|
97
|
-
for (const seg of doc.audio.segments) {
|
|
98
|
-
const data = await container.readFile(seg.src);
|
|
99
|
-
if (data) {
|
|
100
|
-
audio.set(seg.src, data);
|
|
101
|
-
// Also map by name for the audio URL rewriting in the player
|
|
102
|
-
audio.set(seg.name, data);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// For encoding, concatenate audio segments into one file
|
|
106
|
-
// The player handles segment playback internally, but the encoder
|
|
107
|
-
// needs a single audio track. We'll use the first segment as a
|
|
108
|
-
// representative — full audio concatenation would need ffmpeg.
|
|
109
|
-
// For now, pass audio map to the render HTML so the player handles it.
|
|
110
|
-
if (audio.size > 0) {
|
|
111
|
-
// Use the first segment's raw bytes — the encoder will handle it
|
|
112
|
-
const firstSeg = doc.audio.segments[0];
|
|
113
|
-
const firstData = await container.readFile(firstSeg.src);
|
|
114
|
-
if (firstData) {
|
|
115
|
-
concatenatedAudio = new Uint8Array(firstData);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
84
|
+
else if (result.markdownDoc) {
|
|
85
|
+
const { markdownToDoc } = await import('@bendyline/squisq/doc');
|
|
86
|
+
doc = markdownToDoc(result.markdownDoc);
|
|
118
87
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const { PLAYER_BUNDLE } = await import('@bendyline/squisq-react/standalone-source');
|
|
122
|
-
const { resolveDimensions } = await import('@bendyline/squisq-video');
|
|
123
|
-
const dimensions = resolveDimensions({
|
|
124
|
-
orientation,
|
|
125
|
-
width: opts.width ? parseInt(opts.width, 10) : undefined,
|
|
126
|
-
height: opts.height ? parseInt(opts.height, 10) : undefined,
|
|
127
|
-
});
|
|
128
|
-
const renderHtml = generateRenderHtml(doc, {
|
|
129
|
-
playerScript: PLAYER_BUNDLE,
|
|
130
|
-
images,
|
|
131
|
-
audio: audio.size > 0 ? audio : undefined,
|
|
132
|
-
width: dimensions.width,
|
|
133
|
-
height: dimensions.height,
|
|
134
|
-
captionStyle,
|
|
135
|
-
});
|
|
136
|
-
console.error(`Viewport: ${dimensions.width}x${dimensions.height}, ${fps} fps, quality: ${quality}, captions: ${captions}`);
|
|
137
|
-
// ── Step 5: Capture frames via Playwright ───────────────────────
|
|
138
|
-
const { chromium } = await import('playwright-core');
|
|
139
|
-
const browser = await chromium.launch({ headless: true });
|
|
140
|
-
const page = await browser.newPage({
|
|
141
|
-
viewport: { width: dimensions.width, height: dimensions.height },
|
|
142
|
-
});
|
|
143
|
-
// Capture page errors so they don't vanish silently
|
|
144
|
-
const pageErrors = [];
|
|
145
|
-
page.on('pageerror', (err) => pageErrors.push(err.message));
|
|
146
|
-
page.on('console', (msg) => {
|
|
147
|
-
if (msg.type() === 'error')
|
|
148
|
-
pageErrors.push(msg.text());
|
|
149
|
-
});
|
|
150
|
-
// Load the render HTML — use 'load' since everything is inline (no network)
|
|
151
|
-
await page.setContent(renderHtml, { waitUntil: 'load' });
|
|
152
|
-
// Give React one frame to mount and run useEffect
|
|
153
|
-
await page.waitForTimeout(500);
|
|
154
|
-
// Wait for the render API to be available
|
|
155
|
-
try {
|
|
156
|
-
await page.waitForFunction(() => typeof window.getDuration === 'function', { timeout: 15000 });
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
await browser.close();
|
|
160
|
-
const errorDetail = pageErrors.length
|
|
161
|
-
? `\nPage errors:\n ${pageErrors.join('\n ')}`
|
|
162
|
-
: '\nNo page errors captured — the player may have failed to mount.';
|
|
163
|
-
throw new Error(`Render API did not initialize within 15 seconds.${errorDetail}`);
|
|
164
|
-
}
|
|
165
|
-
// Get duration from the player
|
|
166
|
-
const duration = await page.evaluate(() => {
|
|
167
|
-
return window.getDuration();
|
|
168
|
-
});
|
|
169
|
-
if (duration <= 0) {
|
|
170
|
-
await browser.close();
|
|
171
|
-
throw new Error('Document has zero duration — nothing to render');
|
|
172
|
-
}
|
|
173
|
-
const totalFrames = Math.ceil(duration * fps);
|
|
174
|
-
console.error(`Duration: ${duration.toFixed(1)}s, ${totalFrames} frames to capture`);
|
|
175
|
-
const frames = [];
|
|
176
|
-
const frameInterval = 1 / fps;
|
|
177
|
-
// Optional: render cover frame (time 0)
|
|
178
|
-
const hasCover = await page.evaluate(() => {
|
|
179
|
-
const w = window;
|
|
180
|
-
return typeof w.hasCoverBlock === 'function' ? w.hasCoverBlock() : false;
|
|
181
|
-
});
|
|
182
|
-
if (hasCover) {
|
|
183
|
-
const coverFrameCount = 2 * fps;
|
|
184
|
-
await page.evaluate(() => {
|
|
185
|
-
window.showCover();
|
|
186
|
-
});
|
|
187
|
-
await page.waitForTimeout(100);
|
|
188
|
-
const coverScreenshot = await page.screenshot({ type: 'png' });
|
|
189
|
-
const coverFrame = new Uint8Array(coverScreenshot);
|
|
190
|
-
for (let i = 0; i < coverFrameCount; i++) {
|
|
191
|
-
frames.push(coverFrame);
|
|
192
|
-
}
|
|
193
|
-
await page.evaluate(() => {
|
|
194
|
-
window.hideCover();
|
|
195
|
-
});
|
|
196
|
-
writeProgress('Capturing', coverFrameCount, totalFrames + coverFrameCount);
|
|
197
|
-
}
|
|
198
|
-
// Capture animation frames
|
|
199
|
-
const totalWithCover = totalFrames + frames.length;
|
|
200
|
-
for (let i = 0; i < totalFrames; i++) {
|
|
201
|
-
const time = i * frameInterval;
|
|
202
|
-
await page.evaluate((t) => {
|
|
203
|
-
return window.seekTo(t);
|
|
204
|
-
}, time);
|
|
205
|
-
const screenshot = await page.screenshot({ type: 'png' });
|
|
206
|
-
frames.push(new Uint8Array(screenshot));
|
|
207
|
-
if (i % Math.max(1, Math.floor(fps / 2)) === 0 || i === totalFrames - 1) {
|
|
208
|
-
writeProgress('Capturing', frames.length, totalWithCover);
|
|
209
|
-
}
|
|
88
|
+
else {
|
|
89
|
+
throw new Error('No document found in input');
|
|
210
90
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const exportOptions = {
|
|
91
|
+
console.error(`Rendering: ${fps} fps, quality: ${quality}, orientation: ${orientation}, captions: ${captions}`);
|
|
92
|
+
// ── Step 3: Render via programmatic API ─────────────────────────
|
|
93
|
+
const result2 = await renderDocToMp4(doc, container, {
|
|
94
|
+
outputPath,
|
|
216
95
|
fps,
|
|
217
96
|
quality: quality,
|
|
218
97
|
orientation: orientation,
|
|
219
|
-
width:
|
|
220
|
-
height:
|
|
221
|
-
|
|
222
|
-
|
|
98
|
+
width: opts.width ? parseInt(opts.width, 10) : undefined,
|
|
99
|
+
height: opts.height ? parseInt(opts.height, 10) : undefined,
|
|
100
|
+
captionStyle,
|
|
101
|
+
coverPreRoll: 2,
|
|
102
|
+
onProgress: (phase, percent) => {
|
|
103
|
+
writeProgress(phase, percent, 100);
|
|
223
104
|
},
|
|
224
|
-
};
|
|
225
|
-
if (ffmpegPath) {
|
|
226
|
-
console.error(`Using native ffmpeg: ${ffmpegPath}`);
|
|
227
|
-
const { framesToMp4Native } = await import('../util/nativeEncoder.js');
|
|
228
|
-
await framesToMp4Native(ffmpegPath, frames, concatenatedAudio, outputPath, exportOptions);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
throw new Error('ffmpeg is required but not found in PATH.\n' +
|
|
232
|
-
'Install it with:\n' +
|
|
233
|
-
' macOS: brew install ffmpeg\n' +
|
|
234
|
-
' Ubuntu: sudo apt install ffmpeg\n' +
|
|
235
|
-
' Windows: winget install ffmpeg');
|
|
236
|
-
}
|
|
105
|
+
});
|
|
237
106
|
clearProgress();
|
|
238
|
-
console.error(` ✓ ${outputPath}`);
|
|
107
|
+
console.error(` ✓ ${outputPath} (${result2.duration.toFixed(1)}s, ${result2.frameCount} frames)`);
|
|
239
108
|
console.error('Done.');
|
|
240
109
|
}
|
|
241
110
|
// ── Progress helpers ──────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAgB3C,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAC7D,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,UAAU,CAAU,CAAC;AAC9D,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAU,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uCAAuC,CAAC;SACpD,QAAQ,CAAC,SAAS,EAAE,kDAAkD,CAAC;SACvE,QAAQ,CAAC,UAAU,EAAE,wCAAwC,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,IAAI,CAAC;SACjE,MAAM,CACL,mBAAmB,EACnB,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EACnE,QAAQ,CACT;SACA,MAAM,CACL,wBAAwB,EACxB,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAC1E,WAAW,CACZ;SACA,MAAM,CACL,oBAAoB,EACpB,kBAAkB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAC5D,KAAK,CACN;SACA,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,SAA6B,EAAE,IAAyB,EAAE,EAAE;QAC5F,IAAI,CAAC;YACH,uDAAuD;YACvD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAC1B,CAAC;YACD,MAAM,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,IAAyB;IAClE,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC,mBAAmB;IACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAA2C,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC;IACpD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAkD,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,aAAa,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;IACxC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAA2C,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,QAAkC,CAAC;IAE1F,wBAAwB;IACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM;QAC5B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAEvD,iCAAiC;IACjC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,mEAAmE;IACnE,OAAO,CAAC,KAAK,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7B,mEAAmE;IACnE,IAAI,GAAQ,CAAC;IACb,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACnB,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAChE,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,KAAK,CACX,cAAc,GAAG,kBAAkB,OAAO,kBAAkB,WAAW,eAAe,QAAQ,EAAE,CACjG,CAAC;IAEF,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE;QACnD,UAAU;QACV,GAAG;QACH,OAAO,EAAE,OAAuB;QAChC,WAAW,EAAE,WAA+B;QAC5C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,YAAY;QACZ,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IAEH,aAAa,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CACX,OAAO,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,UAAU,CACpF,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,qEAAqE;AAErE,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa,EAAE,MAAe;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/util/nativeEncoder.ts
|
|
2
|
+
import { execFile } from "child_process";
|
|
3
|
+
import { writeFile, readFile, mkdir, rm } from "fs/promises";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { tmpdir } from "os";
|
|
6
|
+
import { randomBytes } from "crypto";
|
|
7
|
+
import { QUALITY_PRESETS, resolveDimensions } from "@bendyline/squisq-video";
|
|
8
|
+
async function framesToMp4Native(ffmpegPath, frames, audio, outputPath, options = {}) {
|
|
9
|
+
const fps = options.fps ?? 30;
|
|
10
|
+
const quality = options.quality ?? "normal";
|
|
11
|
+
const { width, height } = resolveDimensions(options);
|
|
12
|
+
const preset = QUALITY_PRESETS[quality];
|
|
13
|
+
const onProgress = options.onProgress;
|
|
14
|
+
if (frames.length === 0) {
|
|
15
|
+
throw new Error("No frames provided for encoding");
|
|
16
|
+
}
|
|
17
|
+
const tmpId = randomBytes(8).toString("hex");
|
|
18
|
+
const workDir = join(tmpdir(), `squisq-video-${tmpId}`);
|
|
19
|
+
await mkdir(workDir, { recursive: true });
|
|
20
|
+
try {
|
|
21
|
+
onProgress?.(0, "writing frames");
|
|
22
|
+
const padLen = String(frames.length).length;
|
|
23
|
+
for (let i = 0; i < frames.length; i++) {
|
|
24
|
+
const name = `frame-${String(i + 1).padStart(padLen, "0")}.png`;
|
|
25
|
+
await writeFile(join(workDir, name), frames[i]);
|
|
26
|
+
if (onProgress && i % 10 === 0) {
|
|
27
|
+
onProgress(Math.round(i / frames.length * 30), "writing frames");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
let audioPath = null;
|
|
31
|
+
if (audio) {
|
|
32
|
+
audioPath = join(workDir, "audio-input");
|
|
33
|
+
await writeFile(audioPath, audio);
|
|
34
|
+
}
|
|
35
|
+
onProgress?.(30, "encoding");
|
|
36
|
+
const padPattern = join(workDir, `frame-%0${padLen}d.png`);
|
|
37
|
+
const args = ["-y", "-framerate", String(fps), "-i", padPattern];
|
|
38
|
+
if (audioPath) {
|
|
39
|
+
args.push("-i", audioPath);
|
|
40
|
+
}
|
|
41
|
+
args.push(
|
|
42
|
+
"-c:v",
|
|
43
|
+
"libx264",
|
|
44
|
+
"-preset",
|
|
45
|
+
preset.preset,
|
|
46
|
+
"-crf",
|
|
47
|
+
String(preset.crf),
|
|
48
|
+
"-pix_fmt",
|
|
49
|
+
"yuv420p",
|
|
50
|
+
"-vf",
|
|
51
|
+
`scale=${width}:${height}:force_original_aspect_ratio=decrease,pad=${width}:${height}:(ow-iw)/2:(oh-ih)/2`
|
|
52
|
+
);
|
|
53
|
+
if (audioPath) {
|
|
54
|
+
args.push("-c:a", "aac", "-b:a", "128k", "-shortest");
|
|
55
|
+
}
|
|
56
|
+
args.push(outputPath);
|
|
57
|
+
await new Promise((resolve, reject) => {
|
|
58
|
+
const proc = execFile(ffmpegPath, args, { timeout: 6e5 }, (err) => {
|
|
59
|
+
if (err) {
|
|
60
|
+
reject(new Error(`ffmpeg failed: ${err.message}`));
|
|
61
|
+
} else {
|
|
62
|
+
resolve();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
proc.stderr?.on("data", () => {
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
onProgress?.(100, "done");
|
|
69
|
+
} finally {
|
|
70
|
+
await rm(workDir, { recursive: true, force: true });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function framesToMp4NativeBytes(ffmpegPath, frames, audio, options = {}) {
|
|
74
|
+
const tmpId = randomBytes(8).toString("hex");
|
|
75
|
+
const tmpOutput = join(tmpdir(), `squisq-video-out-${tmpId}.mp4`);
|
|
76
|
+
try {
|
|
77
|
+
await framesToMp4Native(ffmpegPath, frames, audio, tmpOutput, options);
|
|
78
|
+
const data = await readFile(tmpOutput);
|
|
79
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
80
|
+
} finally {
|
|
81
|
+
await rm(tmpOutput, { force: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
framesToMp4Native,
|
|
86
|
+
framesToMp4NativeBytes
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=nativeEncoder-MWHOONST.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util/nativeEncoder.ts"],"sourcesContent":["/**\n * Native FFmpeg Encoder\n *\n * Encodes PNG frames to MP4 using a locally installed ffmpeg binary.\n * Writes frames to a temporary directory, invokes ffmpeg as a child process,\n * and reads the resulting MP4.\n *\n * This is the fast path — used when native ffmpeg is detected on the system.\n * Falls back to the WASM encoder (in @bendyline/squisq-video) when unavailable.\n */\n\nimport { execFile } from 'node:child_process';\nimport { writeFile, readFile, mkdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\n\nimport type { VideoExportOptions } from '@bendyline/squisq-video';\nimport { QUALITY_PRESETS, resolveDimensions } from '@bendyline/squisq-video';\n\n/**\n * Encode frame PNGs to MP4 using native ffmpeg.\n *\n * @param ffmpegPath - Absolute path to the ffmpeg binary\n * @param frames - Array of PNG image bytes (one per frame)\n * @param audio - Optional audio file bytes to mux\n * @param outputPath - Where to write the final MP4\n * @param options - Encoding options (fps, quality, dimensions, progress)\n */\nexport async function framesToMp4Native(\n ffmpegPath: string,\n frames: Uint8Array[],\n audio: Uint8Array | null,\n outputPath: string,\n options: VideoExportOptions = {},\n): Promise<void> {\n const fps = options.fps ?? 30;\n const quality = options.quality ?? 'normal';\n const { width, height } = resolveDimensions(options);\n const preset = QUALITY_PRESETS[quality];\n const onProgress = options.onProgress;\n\n if (frames.length === 0) {\n throw new Error('No frames provided for encoding');\n }\n\n // Create a temp working directory\n const tmpId = randomBytes(8).toString('hex');\n const workDir = join(tmpdir(), `squisq-video-${tmpId}`);\n await mkdir(workDir, { recursive: true });\n\n try {\n onProgress?.(0, 'writing frames');\n\n // Write frame PNGs to temp directory\n const padLen = String(frames.length).length;\n for (let i = 0; i < frames.length; i++) {\n const name = `frame-${String(i + 1).padStart(padLen, '0')}.png`;\n await writeFile(join(workDir, name), frames[i]);\n\n if (onProgress && i % 10 === 0) {\n onProgress(Math.round((i / frames.length) * 30), 'writing frames');\n }\n }\n\n // Write audio if provided\n let audioPath: string | null = null;\n if (audio) {\n audioPath = join(workDir, 'audio-input');\n await writeFile(audioPath, audio);\n }\n\n onProgress?.(30, 'encoding');\n\n // Build ffmpeg arguments\n const padPattern = join(workDir, `frame-%0${padLen}d.png`);\n const args = ['-y', '-framerate', String(fps), '-i', padPattern];\n\n if (audioPath) {\n args.push('-i', audioPath);\n }\n\n args.push(\n '-c:v',\n 'libx264',\n '-preset',\n preset.preset,\n '-crf',\n String(preset.crf),\n '-pix_fmt',\n 'yuv420p',\n '-vf',\n `scale=${width}:${height}:force_original_aspect_ratio=decrease,pad=${width}:${height}:(ow-iw)/2:(oh-ih)/2`,\n );\n\n if (audioPath) {\n args.push('-c:a', 'aac', '-b:a', '128k', '-shortest');\n }\n\n args.push(outputPath);\n\n // Run ffmpeg\n await new Promise<void>((resolve, reject) => {\n const proc = execFile(ffmpegPath, args, { timeout: 600_000 }, (err) => {\n if (err) {\n reject(new Error(`ffmpeg failed: ${err.message}`));\n } else {\n resolve();\n }\n });\n\n // ffmpeg writes progress to stderr\n proc.stderr?.on('data', () => {\n // Could parse ffmpeg progress output here in the future\n });\n });\n\n onProgress?.(100, 'done');\n } finally {\n // Clean up temp directory\n await rm(workDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Encode frames using native ffmpeg and return the MP4 bytes (instead of writing to disk).\n * Useful when the caller needs the bytes in memory.\n */\nexport async function framesToMp4NativeBytes(\n ffmpegPath: string,\n frames: Uint8Array[],\n audio: Uint8Array | null,\n options: VideoExportOptions = {},\n): Promise<Uint8Array> {\n const tmpId = randomBytes(8).toString('hex');\n const tmpOutput = join(tmpdir(), `squisq-video-out-${tmpId}.mp4`);\n\n try {\n await framesToMp4Native(ffmpegPath, frames, audio, tmpOutput, options);\n const data = await readFile(tmpOutput);\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n } finally {\n await rm(tmpOutput, { force: true });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/util/readInput.d.ts
CHANGED
|
@@ -1,19 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* readInput
|
|
3
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.
|
|
4
|
+
* Unified input reader for the CLI. Accepts a path to a .md file, .json file
|
|
5
|
+
* (Doc schema), .zip/.dbk container, or a folder and returns a MemoryContentContainer
|
|
6
|
+
* (virtual file system) plus either the parsed MarkdownDocument or a pre-built Doc.
|
|
7
|
+
*
|
|
8
|
+
* When a .json file or a container/folder containing doc.json is provided, the
|
|
9
|
+
* Doc is returned directly and markdownDoc will be null. Callers should check
|
|
10
|
+
* result.doc first; when present, skip markdownToDoc() and use it directly.
|
|
7
11
|
*/
|
|
8
12
|
import type { MarkdownDocument } from '@bendyline/squisq/markdown';
|
|
13
|
+
import type { Doc } from '@bendyline/squisq/schemas';
|
|
9
14
|
import { MemoryContentContainer } from '@bendyline/squisq/storage';
|
|
10
15
|
export interface ReadInputResult {
|
|
11
16
|
container: MemoryContentContainer;
|
|
12
|
-
|
|
17
|
+
/** Parsed markdown document. Null when input is a Doc JSON file. */
|
|
18
|
+
markdownDoc: MarkdownDocument | null;
|
|
19
|
+
/** Pre-built Doc from JSON input. Present when input is .json or contains doc.json. */
|
|
20
|
+
doc?: Doc;
|
|
13
21
|
}
|
|
14
22
|
/**
|
|
15
|
-
* Read input from a file path (markdown, ZIP/DBK container, or folder)
|
|
16
|
-
* and return a populated ContentContainer + parsed MarkdownDocument.
|
|
23
|
+
* Read input from a file path (markdown, JSON Doc, ZIP/DBK container, or folder)
|
|
24
|
+
* and return a populated ContentContainer + parsed MarkdownDocument or Doc.
|
|
25
|
+
*
|
|
26
|
+
* When the input is a .json file (or a container/folder containing doc.json),
|
|
27
|
+
* the result will have `doc` populated and `markdownDoc` set to null.
|
|
28
|
+
* Otherwise, `markdownDoc` is populated and `doc` is undefined.
|
|
17
29
|
*/
|
|
18
30
|
export declare function readInput(inputPath: string): Promise<ReadInputResult>;
|
|
19
31
|
//# sourceMappingURL=readInput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readInput.d.ts","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"readInput.d.ts","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,sBAAsB,CAAC;IAClC,oEAAoE;IACpE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,uFAAuF;IACvF,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AA2CD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3E"}
|
package/dist/util/readInput.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* readInput
|
|
3
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.
|
|
4
|
+
* Unified input reader for the CLI. Accepts a path to a .md file, .json file
|
|
5
|
+
* (Doc schema), .zip/.dbk container, or a folder and returns a MemoryContentContainer
|
|
6
|
+
* (virtual file system) plus either the parsed MarkdownDocument or a pre-built Doc.
|
|
7
|
+
*
|
|
8
|
+
* When a .json file or a container/folder containing doc.json is provided, the
|
|
9
|
+
* Doc is returned directly and markdownDoc will be null. Callers should check
|
|
10
|
+
* result.doc first; when present, skip markdownToDoc() and use it directly.
|
|
7
11
|
*/
|
|
8
12
|
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
9
13
|
import { join, extname } from 'node:path';
|
|
@@ -48,8 +52,12 @@ async function walkDir(root, prefix = '') {
|
|
|
48
52
|
return paths;
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
|
-
* Read input from a file path (markdown, ZIP/DBK container, or folder)
|
|
52
|
-
* and return a populated ContentContainer + parsed MarkdownDocument.
|
|
55
|
+
* Read input from a file path (markdown, JSON Doc, ZIP/DBK container, or folder)
|
|
56
|
+
* and return a populated ContentContainer + parsed MarkdownDocument or Doc.
|
|
57
|
+
*
|
|
58
|
+
* When the input is a .json file (or a container/folder containing doc.json),
|
|
59
|
+
* the result will have `doc` populated and `markdownDoc` set to null.
|
|
60
|
+
* Otherwise, `markdownDoc` is populated and `doc` is undefined.
|
|
53
61
|
*/
|
|
54
62
|
export async function readInput(inputPath) {
|
|
55
63
|
const info = await stat(inputPath);
|
|
@@ -60,6 +68,9 @@ export async function readInput(inputPath) {
|
|
|
60
68
|
if (ext === '.zip' || ext === '.dbk') {
|
|
61
69
|
return readContainer(inputPath);
|
|
62
70
|
}
|
|
71
|
+
if (ext === '.json') {
|
|
72
|
+
return readDocJsonFile(inputPath);
|
|
73
|
+
}
|
|
63
74
|
// Default: treat as a markdown file
|
|
64
75
|
return readMarkdownFile(inputPath);
|
|
65
76
|
}
|
|
@@ -70,12 +81,36 @@ async function readMarkdownFile(filePath) {
|
|
|
70
81
|
const markdownDoc = parseMarkdown(content);
|
|
71
82
|
return { container, markdownDoc };
|
|
72
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Read a standalone Doc JSON file. The container is empty (no media bundled);
|
|
86
|
+
* callers should populate it or set basePath for media resolution.
|
|
87
|
+
*/
|
|
88
|
+
async function readDocJsonFile(filePath) {
|
|
89
|
+
const content = await readFile(filePath, 'utf-8');
|
|
90
|
+
const doc = JSON.parse(content);
|
|
91
|
+
const container = new MemoryContentContainer();
|
|
92
|
+
return { container, markdownDoc: null, doc };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Known filenames for Doc JSON inside containers and folders.
|
|
96
|
+
* Checked in priority order before falling back to markdown discovery.
|
|
97
|
+
*/
|
|
98
|
+
const DOC_JSON_NAMES = ['doc.json', 'story.json'];
|
|
73
99
|
async function readContainer(filePath) {
|
|
74
100
|
const data = await readFile(filePath);
|
|
75
101
|
const container = await zipToContainer(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
|
|
102
|
+
// Check for Doc JSON inside the container first
|
|
103
|
+
for (const name of DOC_JSON_NAMES) {
|
|
104
|
+
const jsonData = await container.readFile(name);
|
|
105
|
+
if (jsonData) {
|
|
106
|
+
const decoder = new TextDecoder();
|
|
107
|
+
const doc = JSON.parse(decoder.decode(jsonData));
|
|
108
|
+
return { container, markdownDoc: null, doc };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
76
111
|
const markdown = await container.readDocument();
|
|
77
112
|
if (!markdown) {
|
|
78
|
-
throw new Error(`No markdown document found in container: ${filePath}`);
|
|
113
|
+
throw new Error(`No markdown document or doc.json found in container: ${filePath}`);
|
|
79
114
|
}
|
|
80
115
|
const markdownDoc = parseMarkdown(markdown);
|
|
81
116
|
return { container, markdownDoc };
|
|
@@ -88,9 +123,18 @@ async function readFolder(dirPath) {
|
|
|
88
123
|
const data = await readFile(absPath);
|
|
89
124
|
await container.writeFile(relPath, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), mimeFromExt(relPath));
|
|
90
125
|
}
|
|
126
|
+
// Check for Doc JSON inside the folder first
|
|
127
|
+
for (const name of DOC_JSON_NAMES) {
|
|
128
|
+
const jsonData = await container.readFile(name);
|
|
129
|
+
if (jsonData) {
|
|
130
|
+
const decoder = new TextDecoder();
|
|
131
|
+
const doc = JSON.parse(decoder.decode(jsonData));
|
|
132
|
+
return { container, markdownDoc: null, doc };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
91
135
|
const markdown = await container.readDocument();
|
|
92
136
|
if (!markdown) {
|
|
93
|
-
throw new Error(`No markdown document found in folder: ${dirPath}`);
|
|
137
|
+
throw new Error(`No markdown document or doc.json found in folder: ${dirPath}`);
|
|
94
138
|
}
|
|
95
139
|
const markdownDoc = parseMarkdown(markdown);
|
|
96
140
|
return { container, markdownDoc };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readInput.js","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"readInput.js","sourceRoot":"","sources":["../../src/util/readInput.ts"],"names":[],"mappings":"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"}
|