dsh-convert-core 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +149 -0
- package/bin/media-to-md.mjs +168 -0
- package/bin/tita-convert.mjs +85 -0
- package/docs/media-to-md.md +143 -0
- package/lib/adapters/anydoc.d.ts +73 -0
- package/lib/adapters/anydoc.d.ts.map +1 -0
- package/lib/adapters/anydoc.js +295 -0
- package/lib/adapters/anydoc.js.map +1 -0
- package/lib/adapters/iddoc.d.ts +28 -0
- package/lib/adapters/iddoc.d.ts.map +1 -0
- package/lib/adapters/iddoc.js +153 -0
- package/lib/adapters/iddoc.js.map +1 -0
- package/lib/adapters/index.d.ts +41 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +115 -0
- package/lib/adapters/index.js.map +1 -0
- package/lib/adapters/scanned.d.ts +28 -0
- package/lib/adapters/scanned.d.ts.map +1 -0
- package/lib/adapters/scanned.js +121 -0
- package/lib/adapters/scanned.js.map +1 -0
- package/lib/adapters/text.d.ts +29 -0
- package/lib/adapters/text.d.ts.map +1 -0
- package/lib/adapters/text.js +135 -0
- package/lib/adapters/text.js.map +1 -0
- package/lib/adapters/types.d.ts +65 -0
- package/lib/adapters/types.d.ts.map +1 -0
- package/lib/adapters/types.js +11 -0
- package/lib/adapters/types.js.map +1 -0
- package/lib/contract.d.ts +185 -0
- package/lib/contract.d.ts.map +1 -0
- package/lib/contract.js +59 -0
- package/lib/contract.js.map +1 -0
- package/lib/delivery.d.ts +36 -0
- package/lib/delivery.d.ts.map +1 -0
- package/lib/delivery.js +97 -0
- package/lib/delivery.js.map +1 -0
- package/lib/http.d.ts +34 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +372 -0
- package/lib/http.js.map +1 -0
- package/lib/markdown.d.ts +32 -0
- package/lib/markdown.d.ts.map +1 -0
- package/lib/markdown.js +145 -0
- package/lib/markdown.js.map +1 -0
- package/lib/media/binaries.d.ts +26 -0
- package/lib/media/binaries.d.ts.map +1 -0
- package/lib/media/binaries.js +60 -0
- package/lib/media/binaries.js.map +1 -0
- package/lib/media/convert.d.ts +19 -0
- package/lib/media/convert.d.ts.map +1 -0
- package/lib/media/convert.js +210 -0
- package/lib/media/convert.js.map +1 -0
- package/lib/media/index.d.ts +27 -0
- package/lib/media/index.d.ts.map +1 -0
- package/lib/media/index.js +27 -0
- package/lib/media/index.js.map +1 -0
- package/lib/media/markdown.d.ts +40 -0
- package/lib/media/markdown.d.ts.map +1 -0
- package/lib/media/markdown.js +89 -0
- package/lib/media/markdown.js.map +1 -0
- package/lib/media/media.d.ts +45 -0
- package/lib/media/media.d.ts.map +1 -0
- package/lib/media/media.js +167 -0
- package/lib/media/media.js.map +1 -0
- package/lib/media/models.d.ts +31 -0
- package/lib/media/models.d.ts.map +1 -0
- package/lib/media/models.js +87 -0
- package/lib/media/models.js.map +1 -0
- package/lib/media/scanned.d.ts +18 -0
- package/lib/media/scanned.d.ts.map +1 -0
- package/lib/media/scanned.js +179 -0
- package/lib/media/scanned.js.map +1 -0
- package/lib/media/types.d.ts +154 -0
- package/lib/media/types.d.ts.map +1 -0
- package/lib/media/types.js +23 -0
- package/lib/media/types.js.map +1 -0
- package/lib/server.d.ts +35 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +64 -0
- package/lib/server.js.map +1 -0
- package/lib/service.d.ts +170 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +562 -0
- package/lib/service.js.map +1 -0
- package/package.json +59 -0
- package/scripts/asr.py +55 -0
- package/scripts/ocr.py +40 -0
- package/scripts/pdf_pages.py +49 -0
- package/scripts/vendor.mjs +76 -0
- package/src/adapters/anydoc.ts +356 -0
- package/src/adapters/iddoc.ts +171 -0
- package/src/adapters/index.ts +147 -0
- package/src/adapters/scanned.ts +139 -0
- package/src/adapters/text.ts +146 -0
- package/src/adapters/types.ts +76 -0
- package/src/contract.ts +230 -0
- package/src/delivery.ts +124 -0
- package/src/http.ts +394 -0
- package/src/markdown.ts +141 -0
- package/src/media/binaries.ts +67 -0
- package/src/media/convert.ts +232 -0
- package/src/media/index.ts +43 -0
- package/src/media/markdown.ts +105 -0
- package/src/media/media.ts +204 -0
- package/src/media/models.ts +124 -0
- package/src/media/scanned.ts +200 -0
- package/src/media/types.ts +171 -0
- package/src/server.ts +85 -0
- package/src/service.ts +639 -0
- package/web/app.js +382 -0
- package/web/index.html +217 -0
- package/web/styles.css +263 -0
- package/web/vendor/icons.js +25 -0
- package/web/vendor/vue.global.prod.js +14 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document engine: `@firecrawl/anydoc` (MIT, Rust, prebuilt Node binding).
|
|
3
|
+
*
|
|
4
|
+
* One adapter replaces what used to be five (pdfjs text-layer reader, mammoth,
|
|
5
|
+
* the high-quality docling tier, plus the format routing between them). anydoc
|
|
6
|
+
* covers doc/docx/docm, ppt/pps/pot/pptx/pptm/ppsx/ppsm, xls/xlsx/xlsm/xlsb,
|
|
7
|
+
* odt/ods/odp, rtf, epub, csv and text-layer pdf, detects the format from the
|
|
8
|
+
* bytes, and needs no Python, no models and no external binary.
|
|
9
|
+
*
|
|
10
|
+
* The one thing it cannot do for us is the 0013 image contract: Markdown has no
|
|
11
|
+
* way to embed bytes, so an embedded image renders as its alt text while the
|
|
12
|
+
* bytes stay on `document.assets`. Retrieval only reads local relative image
|
|
13
|
+
* paths, so this adapter re-materialises every embedded image into `assets/`
|
|
14
|
+
* and puts a real `` reference back where the document had it.
|
|
15
|
+
*/
|
|
16
|
+
import { createRequire } from 'node:module';
|
|
17
|
+
import { readFile } from 'node:fs/promises';
|
|
18
|
+
import { basename, extname } from 'node:path';
|
|
19
|
+
import { sha1, sha256 } from '../markdown.js';
|
|
20
|
+
import { AdapterError } from './types.js';
|
|
21
|
+
export const ANYDOC_EXTENSIONS = [
|
|
22
|
+
// Word
|
|
23
|
+
'.doc', '.docx', '.docm',
|
|
24
|
+
// PowerPoint
|
|
25
|
+
'.ppt', '.pps', '.pot', '.pptx', '.pptm', '.ppsx', '.ppsm',
|
|
26
|
+
// Excel
|
|
27
|
+
'.xls', '.xlsx', '.xlsm', '.xlsb',
|
|
28
|
+
// OpenDocument
|
|
29
|
+
'.odt', '.ods', '.odp',
|
|
30
|
+
// Other containers anydoc reads
|
|
31
|
+
'.rtf', '.epub', '.csv', '.pdf',
|
|
32
|
+
];
|
|
33
|
+
const MEDIA_EXTENSIONS = {
|
|
34
|
+
'image/png': 'png',
|
|
35
|
+
'image/jpeg': 'jpg',
|
|
36
|
+
'image/jpg': 'jpg',
|
|
37
|
+
'image/gif': 'gif',
|
|
38
|
+
'image/webp': 'webp',
|
|
39
|
+
'image/tiff': 'tiff',
|
|
40
|
+
'image/bmp': 'bmp',
|
|
41
|
+
'image/svg+xml': 'svg',
|
|
42
|
+
'image/avif': 'avif',
|
|
43
|
+
'image/heic': 'heic',
|
|
44
|
+
};
|
|
45
|
+
let modulePromise;
|
|
46
|
+
let moduleVersion;
|
|
47
|
+
let moduleError;
|
|
48
|
+
/** Load the binding once; the platform binary ships as an optional dependency. */
|
|
49
|
+
export async function loadAnydoc() {
|
|
50
|
+
if (!modulePromise) {
|
|
51
|
+
modulePromise = (async () => {
|
|
52
|
+
const loaded = (await import('@firecrawl/anydoc'));
|
|
53
|
+
const candidate = typeof loaded.toMarkdown === 'function' ? loaded : loaded.default;
|
|
54
|
+
if (!candidate || typeof candidate.toMarkdown !== 'function')
|
|
55
|
+
throw new Error('找不到 toMarkdown 导出');
|
|
56
|
+
try {
|
|
57
|
+
const require = createRequire(import.meta.url);
|
|
58
|
+
const pkg = JSON.parse(await readFile(require.resolve('@firecrawl/anydoc/package.json'), 'utf8'));
|
|
59
|
+
moduleVersion = pkg.version;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* version is cosmetic */
|
|
63
|
+
}
|
|
64
|
+
return candidate;
|
|
65
|
+
})().catch(error => {
|
|
66
|
+
moduleError = error instanceof Error ? error.message : String(error);
|
|
67
|
+
modulePromise = undefined;
|
|
68
|
+
throw error;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return await modulePromise;
|
|
72
|
+
}
|
|
73
|
+
export async function anydocAvailability() {
|
|
74
|
+
try {
|
|
75
|
+
await loadAnydoc();
|
|
76
|
+
return { available: true, ...(moduleVersion ? { versions: { '@firecrawl/anydoc': moduleVersion } } : {}) };
|
|
77
|
+
}
|
|
78
|
+
catch (cause) {
|
|
79
|
+
return {
|
|
80
|
+
available: false,
|
|
81
|
+
reason: `无法加载 @firecrawl/anydoc:${moduleError ?? (cause instanceof Error ? cause.message : String(cause))}`,
|
|
82
|
+
suggestion: '在 packages/dsh-convert-core 目录执行 pnpm install;Apple Silicon 需要 @firecrawl/anydoc-darwin-arm64(随 optionalDependencies 自动安装)。',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function extensionFor(asset) {
|
|
87
|
+
const mediaType = asset.mediaType?.split(';')[0]?.trim().toLowerCase();
|
|
88
|
+
if (mediaType && MEDIA_EXTENSIONS[mediaType])
|
|
89
|
+
return MEDIA_EXTENSIONS[mediaType];
|
|
90
|
+
const fromPart = asset.originPart ? /\.([a-zA-Z0-9]{2,5})$/.exec(asset.originPart)?.[1]?.toLowerCase() : undefined;
|
|
91
|
+
if (fromPart && fromPart !== 'bin')
|
|
92
|
+
return fromPart;
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/** In document order, every inline image that points at an embedded asset. */
|
|
96
|
+
function collectEmbeddedImages(document) {
|
|
97
|
+
const found = [];
|
|
98
|
+
for (const block of document.blocks ?? []) {
|
|
99
|
+
for (const inline of block.content ?? []) {
|
|
100
|
+
if (inline.kind !== 'image')
|
|
101
|
+
continue;
|
|
102
|
+
const source = inline.source;
|
|
103
|
+
if (!source || source.kind !== 'asset' || typeof source.assetId !== 'number')
|
|
104
|
+
continue;
|
|
105
|
+
const asset = document.assets?.[source.assetId];
|
|
106
|
+
if (!asset)
|
|
107
|
+
continue;
|
|
108
|
+
found.push({ assetId: source.assetId, alt: (inline.alt ?? '').trim(), asset });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return found;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Put real image references back into the Markdown.
|
|
115
|
+
*
|
|
116
|
+
* anydoc renders an embedded image as its alt text, so placement is a match on
|
|
117
|
+
* that text. A standalone-line match is used only when it is unambiguous;
|
|
118
|
+
* anything that cannot be located is appended under a `## 图片` heading rather
|
|
119
|
+
* than guessed at, and the count is reported.
|
|
120
|
+
*/
|
|
121
|
+
export function placeImageReferences(markdown, images) {
|
|
122
|
+
const lines = markdown.split('\n');
|
|
123
|
+
const consumed = new Set();
|
|
124
|
+
const remaining = [];
|
|
125
|
+
const warnings = [];
|
|
126
|
+
for (const image of images) {
|
|
127
|
+
const alt = image.alt.trim();
|
|
128
|
+
let index = -1;
|
|
129
|
+
if (alt) {
|
|
130
|
+
// Only accept a line that is exactly the alt text, and only once.
|
|
131
|
+
const candidates = lines
|
|
132
|
+
.map((line, position) => (line.trim() === alt && !consumed.has(position) ? position : -1))
|
|
133
|
+
.filter(position => position >= 0);
|
|
134
|
+
if (candidates.length === 1)
|
|
135
|
+
index = candidates[0];
|
|
136
|
+
}
|
|
137
|
+
if (index >= 0) {
|
|
138
|
+
consumed.add(index);
|
|
139
|
+
lines[index] = ``;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
remaining.push(image);
|
|
143
|
+
}
|
|
144
|
+
let output = lines.join('\n');
|
|
145
|
+
if (remaining.length > 0) {
|
|
146
|
+
const section = remaining.map(image => ``).join('\n\n');
|
|
147
|
+
output = `${output.trimEnd()}\n\n## 图片\n\n${section}\n`;
|
|
148
|
+
warnings.push(`${remaining.length} 张内嵌图片在正文中没有可定位的占位(无 alt 文本或 alt 不唯一),已追加到文末「图片」小节。`);
|
|
149
|
+
}
|
|
150
|
+
return { markdown: output, placed: images.length - remaining.length, appended: remaining.length, warnings };
|
|
151
|
+
}
|
|
152
|
+
function sourceFormatFor(anydocFormat, filename) {
|
|
153
|
+
const format = anydocFormat ?? extname(filename).replace('.', '').toLowerCase();
|
|
154
|
+
if (format === 'pdf')
|
|
155
|
+
return 'pdf';
|
|
156
|
+
if (format === 'csv')
|
|
157
|
+
return 'text';
|
|
158
|
+
return 'office';
|
|
159
|
+
}
|
|
160
|
+
/** anydoc's error codes are already precise; keep them instead of flattening. */
|
|
161
|
+
const ANYDOC_SUGGESTIONS = {
|
|
162
|
+
needsOcr: '该 PDF 是扫描件/纯图片页,anydoc 本地不做 OCR(它只覆盖文本层 PDF)。走扫描档:把 adapter 指定为 "scanned",' +
|
|
163
|
+
'或设环境变量 SCANNED_OCR=1 让 .pdf 直接走它 —— 扫描档用 pypdfium2 渲染页图 + 本地 RapidOCR 识别文字,不出网,' +
|
|
164
|
+
'但不做版面还原;需要版面/表格/公式时见 issues/0017 的可选高质量档。' +
|
|
165
|
+
'不要使用 anydoc 的 ocr:"hosted":它会把整份文档发往 Firecrawl Parse 云端,与 0015 的本地优先原则冲突。',
|
|
166
|
+
encrypted: '文档有密码保护,请先去掉密码再转换。',
|
|
167
|
+
unsupported: '该格式不在本版范围内(doc/docx/ppt/pptx/xls/xlsx/odt/ods/odp/rtf/epub/csv/文本层 PDF)。',
|
|
168
|
+
malformed: '文件结构损坏,无法提取有意义的内容。',
|
|
169
|
+
resourceLimit: '文件触发了 anydoc 的解压/嵌套安全上限,可能是文档炸弹或异常嵌套。',
|
|
170
|
+
missingPart: '文档缺少必需的结构部件(可能被截断或由非标准工具生成)。',
|
|
171
|
+
};
|
|
172
|
+
function toAdapterError(cause) {
|
|
173
|
+
const error = cause;
|
|
174
|
+
const code = typeof error?.code === 'string' ? error.code : undefined;
|
|
175
|
+
if (code && code !== 'io') {
|
|
176
|
+
const pages = Array.isArray(error.pages) && error.pages.length > 0 ? `(第 ${error.pages.slice(0, 8).join(', ')} 页)` : '';
|
|
177
|
+
return new AdapterError(`ANYDOC_${code.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase()}`, `${error.message || code}${pages}`, ANYDOC_SUGGESTIONS[code]);
|
|
178
|
+
}
|
|
179
|
+
return new AdapterError('ANYDOC_FAILED', error instanceof Error ? error.message : String(cause), ANYDOC_SUGGESTIONS.malformed);
|
|
180
|
+
}
|
|
181
|
+
async function run(context) {
|
|
182
|
+
const sourcePath = context.inputPath;
|
|
183
|
+
if (!sourcePath)
|
|
184
|
+
throw new AdapterError('INPUT_REQUIRED', '文档适配器需要文件路径。');
|
|
185
|
+
const anydoc = await loadAnydoc().catch(cause => {
|
|
186
|
+
throw new AdapterError('DEPENDENCY_MISSING', `无法加载 @firecrawl/anydoc:${cause instanceof Error ? cause.message : String(cause)}`, '在 packages/dsh-convert-core 目录执行 pnpm install。');
|
|
187
|
+
});
|
|
188
|
+
const filename = context.filename || basename(sourcePath);
|
|
189
|
+
const bytes = await readFile(sourcePath);
|
|
190
|
+
context.report(0.15, 'detect', '识别文档格式');
|
|
191
|
+
let detected = null;
|
|
192
|
+
try {
|
|
193
|
+
detected = anydoc.formatFromBytes(new Uint8Array(bytes));
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
detected = null;
|
|
197
|
+
}
|
|
198
|
+
context.report(0.35, 'convert', `解析 ${detected ?? extname(filename)}`);
|
|
199
|
+
let markdown;
|
|
200
|
+
let document = {};
|
|
201
|
+
const assetNote = [];
|
|
202
|
+
try {
|
|
203
|
+
markdown = await anydoc.toMarkdown(sourcePath);
|
|
204
|
+
}
|
|
205
|
+
catch (cause) {
|
|
206
|
+
throw toAdapterError(cause);
|
|
207
|
+
}
|
|
208
|
+
// `toDocument` covers the OOXML / OpenDocument / RTF / EPUB / CSV family. PDF
|
|
209
|
+
// renders straight to Markdown through pdf-inspector and *rejects* the
|
|
210
|
+
// document model, so a PDF simply has no embedded assets to place.
|
|
211
|
+
if (detected !== 'pdf') {
|
|
212
|
+
try {
|
|
213
|
+
document = await anydoc.toDocument(new Uint8Array(bytes));
|
|
214
|
+
}
|
|
215
|
+
catch (cause) {
|
|
216
|
+
const error = cause;
|
|
217
|
+
// Never lose a good Markdown because the asset model was unavailable.
|
|
218
|
+
assetNote.push(`内嵌资源枚举失败(${error?.code ?? 'unknown'}: ${error?.message ?? String(cause)}),本次只交付 Markdown,未落地图片。`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!markdown.trim()) {
|
|
222
|
+
throw new AdapterError('CONTENT_REQUIRED', '文档解析后没有内容(可能全为图片或受保护内容)。');
|
|
223
|
+
}
|
|
224
|
+
// ---- asset glue: bytes live on the document model, not in the Markdown ----
|
|
225
|
+
const embedded = collectEmbeddedImages(document);
|
|
226
|
+
const images = [];
|
|
227
|
+
const assets = [];
|
|
228
|
+
const warnings = [];
|
|
229
|
+
let skippedObjects = 0;
|
|
230
|
+
for (const entry of embedded) {
|
|
231
|
+
const data = entry.asset.data ? Buffer.from(entry.asset.data) : undefined;
|
|
232
|
+
if (!data || data.length === 0) {
|
|
233
|
+
skippedObjects += 1;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (!entry.asset.mediaType?.startsWith('image/')) {
|
|
237
|
+
// 0013 only consumes images; other embedded objects are reported, not dropped.
|
|
238
|
+
skippedObjects += 1;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const extension = extensionFor(entry.asset);
|
|
242
|
+
if (!extension) {
|
|
243
|
+
skippedObjects += 1;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const digest = sha1(data);
|
|
247
|
+
const rel = `assets/img-${digest.slice(0, 12)}.${extension}`;
|
|
248
|
+
images.push({ rel, alt: entry.alt });
|
|
249
|
+
assets.push({
|
|
250
|
+
rel,
|
|
251
|
+
data,
|
|
252
|
+
...(entry.asset.mediaType ? { contentType: entry.asset.mediaType } : {}),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const placement = placeImageReferences(markdown, images);
|
|
256
|
+
for (const note of assetNote)
|
|
257
|
+
warnings.push({ code: 'ASSET_ENUMERATION_FAILED', message: note });
|
|
258
|
+
if (placement.appended > 0) {
|
|
259
|
+
warnings.push({ code: 'IMAGES_APPENDED', message: placement.warnings[0] });
|
|
260
|
+
}
|
|
261
|
+
if (skippedObjects > 0) {
|
|
262
|
+
warnings.push({
|
|
263
|
+
code: 'EMBEDDED_OBJECTS_SKIPPED',
|
|
264
|
+
message: `文档里有 ${skippedObjects} 个内嵌对象不是可落地的图片(非 image/* 或缺少字节),未写入 assets/。`,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (embedded.length > 0) {
|
|
268
|
+
warnings.push({
|
|
269
|
+
code: 'IMAGES_LOCALIZED',
|
|
270
|
+
message: `内嵌图片 ${embedded.length} 张已落地为本地 assets/ 并改写正文引用(${placement.placed} 张原位、${placement.appended} 张追加)。`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
const heading = /^#{1,6}\s+(.+)$/m.exec(placement.markdown)?.[1]?.trim();
|
|
274
|
+
return {
|
|
275
|
+
title: (context.request.title?.trim() || heading || basename(filename, extname(filename))).slice(0, 300),
|
|
276
|
+
markdown: placement.markdown.trim(),
|
|
277
|
+
sourceFormat: sourceFormatFor(detected, filename),
|
|
278
|
+
parser: `anydoc@${moduleVersion ?? 'unknown'}/${detected ?? 'unknown'}`,
|
|
279
|
+
sourcePath,
|
|
280
|
+
warnings,
|
|
281
|
+
dependencyVersions: { '@firecrawl/anydoc': moduleVersion ?? 'unknown' },
|
|
282
|
+
externalId: `sha256:${sha256(bytes)}`,
|
|
283
|
+
assets,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
export const anydocAdapter = {
|
|
287
|
+
id: 'anydoc',
|
|
288
|
+
description: 'DOC/DOCX/PPT/PPTX/XLS/XLSX/ODT/ODS/ODP/RTF/EPUB/CSV/文本层 PDF → GFM Markdown(Rust 内核,无模型、无外部二进制;内嵌图片落地到 assets/)',
|
|
289
|
+
kinds: ['file'],
|
|
290
|
+
extensions: ANYDOC_EXTENSIONS,
|
|
291
|
+
availability: () => ({ available: true, ...(moduleVersion ? { versions: { '@firecrawl/anydoc': moduleVersion } } : {}) }),
|
|
292
|
+
probe: anydocAvailability,
|
|
293
|
+
run,
|
|
294
|
+
};
|
|
295
|
+
//# sourceMappingURL=anydoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anydoc.js","sourceRoot":"","sources":["../../src/adapters/anydoc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iddoc —— 音视频 / 图片 adapter(issue 0017 的 video 档)。
|
|
3
|
+
*
|
|
4
|
+
* 这个文件**只做契约映射**:能力全在同包的 `src/media/` 里(纯本地管线:
|
|
5
|
+
* ffmpeg 抽帧 + 可选的字幕/转写 + 可选的画面 OCR),这里负责
|
|
6
|
+
*
|
|
7
|
+
* 1. 把内核的 `AdapterContext` 翻译成该包的 options(**含 env 旋钮**);
|
|
8
|
+
* 2. 把 `MediaToMarkdownResult` 映射成 `AdapterOutput`(assets 交给内核写盘);
|
|
9
|
+
* 3. 把它抛出的错误原样转成 `AdapterError`,保留 `code` 与可操作建议。
|
|
10
|
+
*
|
|
11
|
+
* 与文档档(anydoc)一样:引擎独立于 adapter,内核只管契约。
|
|
12
|
+
*
|
|
13
|
+
* 环境变量(都是**显式**开关,默认不下载模型、不对图片做 OCR):
|
|
14
|
+
* IDDOC_ASR=1 允许在无字幕时下载模型并本地转写
|
|
15
|
+
* IDDOC_ASR_MODEL whisper 模型(默认 small;中文建议 large-v3-turbo)
|
|
16
|
+
* IDDOC_ASR_LANG 语言代码(默认自动检测;中文建议 zh)
|
|
17
|
+
* IDDOC_OCR_FRAMES=1 对关键帧做画面文字 OCR
|
|
18
|
+
* IDDOC_IMAGE_OCR=1 对图片输入做 OCR(默认关闭:图片直接收录)
|
|
19
|
+
* IDDOC_UVX / IDDOC_PYTHON 自定义 uvx 与 Python 版本
|
|
20
|
+
* IDDOC_SAMPLES / IDDOC_MAX_FRAMES / IDDOC_SCENE 抽帧参数
|
|
21
|
+
*/
|
|
22
|
+
import { type Adapter } from './types.js';
|
|
23
|
+
export declare const IDDOC_VIDEO_EXTENSIONS: string[];
|
|
24
|
+
export declare const IDDOC_AUDIO_EXTENSIONS: string[];
|
|
25
|
+
export declare const IDDOC_IMAGE_EXTENSIONS: string[];
|
|
26
|
+
export declare const IDDOC_EXTENSIONS: string[];
|
|
27
|
+
export declare const iddocAdapter: Adapter;
|
|
28
|
+
//# sourceMappingURL=iddoc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iddoc.d.ts","sourceRoot":"","sources":["../../src/adapters/iddoc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAYH,OAAO,EAAgB,KAAK,OAAO,EAAyF,MAAM,YAAY,CAAA;AAE9I,eAAO,MAAM,sBAAsB,UAElC,CAAA;AACD,eAAO,MAAM,sBAAsB,UAElC,CAAA;AACD,eAAO,MAAM,sBAAsB,UAAmB,CAAA;AACtD,eAAO,MAAM,gBAAgB,UAAoF,CAAA;AAyHjH,eAAO,MAAM,YAAY,EAAE,OAQ1B,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iddoc —— 音视频 / 图片 adapter(issue 0017 的 video 档)。
|
|
3
|
+
*
|
|
4
|
+
* 这个文件**只做契约映射**:能力全在同包的 `src/media/` 里(纯本地管线:
|
|
5
|
+
* ffmpeg 抽帧 + 可选的字幕/转写 + 可选的画面 OCR),这里负责
|
|
6
|
+
*
|
|
7
|
+
* 1. 把内核的 `AdapterContext` 翻译成该包的 options(**含 env 旋钮**);
|
|
8
|
+
* 2. 把 `MediaToMarkdownResult` 映射成 `AdapterOutput`(assets 交给内核写盘);
|
|
9
|
+
* 3. 把它抛出的错误原样转成 `AdapterError`,保留 `code` 与可操作建议。
|
|
10
|
+
*
|
|
11
|
+
* 与文档档(anydoc)一样:引擎独立于 adapter,内核只管契约。
|
|
12
|
+
*
|
|
13
|
+
* 环境变量(都是**显式**开关,默认不下载模型、不对图片做 OCR):
|
|
14
|
+
* IDDOC_ASR=1 允许在无字幕时下载模型并本地转写
|
|
15
|
+
* IDDOC_ASR_MODEL whisper 模型(默认 small;中文建议 large-v3-turbo)
|
|
16
|
+
* IDDOC_ASR_LANG 语言代码(默认自动检测;中文建议 zh)
|
|
17
|
+
* IDDOC_OCR_FRAMES=1 对关键帧做画面文字 OCR
|
|
18
|
+
* IDDOC_IMAGE_OCR=1 对图片输入做 OCR(默认关闭:图片直接收录)
|
|
19
|
+
* IDDOC_UVX / IDDOC_PYTHON 自定义 uvx 与 Python 版本
|
|
20
|
+
* IDDOC_SAMPLES / IDDOC_MAX_FRAMES / IDDOC_SCENE 抽帧参数
|
|
21
|
+
*/
|
|
22
|
+
import { stat } from 'node:fs/promises';
|
|
23
|
+
import { IMAGE_EXTENSIONS, MediaToMarkdownError, convertMedia, probeTools, } from '../media/index.js';
|
|
24
|
+
import { AdapterError } from './types.js';
|
|
25
|
+
export const IDDOC_VIDEO_EXTENSIONS = [
|
|
26
|
+
'.mp4', '.m4v', '.mov', '.mkv', '.webm', '.avi', '.flv', '.wmv', '.mpg', '.mpeg', '.ogv',
|
|
27
|
+
];
|
|
28
|
+
export const IDDOC_AUDIO_EXTENSIONS = [
|
|
29
|
+
'.mp3', '.m4a', '.wav', '.aac', '.flac', '.ogg', '.opus', '.aiff', '.aif', '.amr', '.wma',
|
|
30
|
+
];
|
|
31
|
+
export const IDDOC_IMAGE_EXTENSIONS = IMAGE_EXTENSIONS;
|
|
32
|
+
export const IDDOC_EXTENSIONS = [...IDDOC_VIDEO_EXTENSIONS, ...IDDOC_AUDIO_EXTENSIONS, ...IDDOC_IMAGE_EXTENSIONS];
|
|
33
|
+
const INSTALL_HINT = '装 ffmpeg(含 ffprobe)后重试:macOS `brew install ffmpeg`,Debian/Ubuntu `apt install ffmpeg`。';
|
|
34
|
+
function envFlag(name) {
|
|
35
|
+
const value = (process.env[name] ?? '').trim().toLowerCase();
|
|
36
|
+
return value === '1' || value === 'true' || value === 'yes' || value === 'on';
|
|
37
|
+
}
|
|
38
|
+
function envInt(name) {
|
|
39
|
+
const parsed = Number.parseInt((process.env[name] ?? '').trim(), 10);
|
|
40
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
41
|
+
}
|
|
42
|
+
function envFloat(name) {
|
|
43
|
+
const parsed = Number.parseFloat((process.env[name] ?? '').trim());
|
|
44
|
+
return Number.isFinite(parsed) && parsed >= 0 && parsed <= 1 ? parsed : undefined;
|
|
45
|
+
}
|
|
46
|
+
/** 路由用的廉价同步检查;真正的探测在 probe() 与首次使用时。 */
|
|
47
|
+
function availabilitySync() {
|
|
48
|
+
return { available: true };
|
|
49
|
+
}
|
|
50
|
+
async function probeAvailability() {
|
|
51
|
+
const versions = await probeTools({ ...(process.env.IDDOC_UVX ? { uvxPath: process.env.IDDOC_UVX } : {}) });
|
|
52
|
+
if (!versions.ffprobe || !versions.ffmpeg) {
|
|
53
|
+
const missing = [!versions.ffprobe ? 'ffprobe' : null, !versions.ffmpeg ? 'ffmpeg' : null].filter(Boolean).join('、');
|
|
54
|
+
return { available: false, reason: `缺少外部二进制:${missing}`, suggestion: INSTALL_HINT };
|
|
55
|
+
}
|
|
56
|
+
const reported = {};
|
|
57
|
+
if (versions.ffmpeg)
|
|
58
|
+
reported.ffmpeg = versions.ffmpeg;
|
|
59
|
+
if (versions.ffprobe)
|
|
60
|
+
reported.ffprobe = versions.ffprobe;
|
|
61
|
+
if (versions.uvx)
|
|
62
|
+
reported.uvx = versions.uvx;
|
|
63
|
+
return { available: true, versions: reported };
|
|
64
|
+
}
|
|
65
|
+
function toOptions(context, file) {
|
|
66
|
+
const model = (process.env.IDDOC_ASR_MODEL ?? '').trim() || 'small';
|
|
67
|
+
const language = (process.env.IDDOC_ASR_LANG ?? '').trim();
|
|
68
|
+
const frames = {
|
|
69
|
+
...(envInt('IDDOC_SAMPLES') ? { samples: envInt('IDDOC_SAMPLES') } : {}),
|
|
70
|
+
...(envInt('IDDOC_MAX_FRAMES') ? { maxFrames: envInt('IDDOC_MAX_FRAMES') } : {}),
|
|
71
|
+
...(envFloat('IDDOC_SCENE') !== undefined ? { sceneThreshold: envFloat('IDDOC_SCENE') } : {}),
|
|
72
|
+
};
|
|
73
|
+
const tools = {
|
|
74
|
+
...(process.env.IDDOC_UVX?.trim() ? { uvxPath: process.env.IDDOC_UVX.trim() } : {}),
|
|
75
|
+
...(process.env.IDDOC_PYTHON?.trim() ? { pythonVersion: process.env.IDDOC_PYTHON.trim() } : {}),
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
file,
|
|
79
|
+
...(context.request.title?.trim() ? { title: context.request.title.trim() } : {}),
|
|
80
|
+
mode: 'auto',
|
|
81
|
+
asr: {
|
|
82
|
+
model,
|
|
83
|
+
...(language ? { language } : {}),
|
|
84
|
+
allowModelDownload: envFlag('IDDOC_ASR'),
|
|
85
|
+
},
|
|
86
|
+
...(Object.keys(frames).length > 0 ? { frames } : {}),
|
|
87
|
+
...(Object.keys(tools).length > 0 ? { tools } : {}),
|
|
88
|
+
...(envFlag('IDDOC_IMAGE_OCR') ? { imageOcr: true } : {}),
|
|
89
|
+
...(envFlag('IDDOC_OCR_FRAMES') ? { ocrFrames: true } : {}),
|
|
90
|
+
...(context.signal ? { signal: context.signal } : {}),
|
|
91
|
+
onProgress: progress => context.report(progress.progress, progress.stage, progress.message),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function toPreparedAssets(assets) {
|
|
95
|
+
return assets.map(asset => ({
|
|
96
|
+
rel: asset.rel,
|
|
97
|
+
data: asset.data,
|
|
98
|
+
...(asset.contentType ? { contentType: asset.contentType } : {}),
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
async function run(context) {
|
|
102
|
+
if (!context.inputPath) {
|
|
103
|
+
throw new AdapterError('INPUT_REQUIRED', 'iddoc 只处理本地文件(kind=file):音频、视频或图片。');
|
|
104
|
+
}
|
|
105
|
+
const file = context.inputPath;
|
|
106
|
+
const fileInfo = await stat(file).catch(() => undefined);
|
|
107
|
+
if (!fileInfo?.isFile())
|
|
108
|
+
throw new AdapterError('INPUT_NOT_A_FILE', `输入不是文件:${file}`);
|
|
109
|
+
const versions = await probeTools({ ...(process.env.IDDOC_UVX ? { uvxPath: process.env.IDDOC_UVX } : {}) });
|
|
110
|
+
if (!versions.ffprobe || !versions.ffmpeg) {
|
|
111
|
+
throw new AdapterError('DEPENDENCY_MISSING', 'iddoc 需要 ffmpeg 与 ffprobe。', INSTALL_HINT);
|
|
112
|
+
}
|
|
113
|
+
let result;
|
|
114
|
+
try {
|
|
115
|
+
result = await convertMedia(toOptions(context, file));
|
|
116
|
+
}
|
|
117
|
+
catch (cause) {
|
|
118
|
+
if (cause instanceof MediaToMarkdownError) {
|
|
119
|
+
throw new AdapterError(cause.code, cause.message, cause.suggestion);
|
|
120
|
+
}
|
|
121
|
+
throw new AdapterError('ADAPTER_FAILED', cause instanceof Error ? cause.message : String(cause));
|
|
122
|
+
}
|
|
123
|
+
const warnings = result.warnings.map(warning => ({ code: warning.code, message: warning.message }));
|
|
124
|
+
const suffix = result.meta.transcriptSource === 'subtitle'
|
|
125
|
+
? '+subtitle'
|
|
126
|
+
: result.meta.transcriptSource === 'transcription' ? '+asr' : '';
|
|
127
|
+
// 文档类按格式命名(pdf/office),媒体类按容器命名(mp4/png),与既有 parser 约定保持一致。
|
|
128
|
+
const parserKind = result.meta.sourceFormat === 'image'
|
|
129
|
+
? (result.meta.containerExtension ?? 'image')
|
|
130
|
+
: `${result.meta.sourceFormat}${suffix}`;
|
|
131
|
+
const assets = toPreparedAssets(result.assets);
|
|
132
|
+
return {
|
|
133
|
+
title: result.title,
|
|
134
|
+
markdown: result.markdown,
|
|
135
|
+
sourceFormat: result.meta.sourceFormat,
|
|
136
|
+
parser: `iddoc@1/${parserKind}`,
|
|
137
|
+
sourcePath: file,
|
|
138
|
+
warnings,
|
|
139
|
+
dependencyVersions: result.dependencyVersions,
|
|
140
|
+
externalId: result.externalId,
|
|
141
|
+
...(assets.length > 0 ? { assets } : {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export const iddocAdapter = {
|
|
145
|
+
id: 'iddoc',
|
|
146
|
+
description: '本地音视频 / 图片 → Markdown 与本地图片(能力来自内核自带的 src/media/:字幕优先;转写需显式开启;图片直接收录)',
|
|
147
|
+
kinds: ['file'],
|
|
148
|
+
extensions: IDDOC_EXTENSIONS,
|
|
149
|
+
availability: availabilitySync,
|
|
150
|
+
probe: probeAvailability,
|
|
151
|
+
run,
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=iddoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iddoc.js","sourceRoot":"","sources":["../../src/adapters/iddoc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter registry.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order stays trivial and explicit: an explicit override, then the
|
|
5
|
+
* media adapter (`iddoc`, by extension), then the document engine, then the text
|
|
6
|
+
* pass-through. Unknown extensions are only treated as text when the bytes are
|
|
7
|
+
* actually textual — guessing there is how "converted successfully" becomes a lie.
|
|
8
|
+
*
|
|
9
|
+
* `.pdf` 默认仍走 anydoc(文本层最好、零依赖);只有显式 `SCANNED_OCR=1` 才改走
|
|
10
|
+
* `scanned`(纯图片页的轻量 OCR 档)。
|
|
11
|
+
*/
|
|
12
|
+
import type { ConvertRequest } from '../contract.js';
|
|
13
|
+
import { type Adapter, type AdapterAvailability } from './types.js';
|
|
14
|
+
export declare const ADAPTERS: Adapter[];
|
|
15
|
+
export declare function findAdapter(id: string): Adapter | undefined;
|
|
16
|
+
/** Cheap binary sniff: NUL bytes or invalid UTF-8 in the head means "not text". */
|
|
17
|
+
export declare function looksTextual(path: string): Promise<boolean>;
|
|
18
|
+
export declare const SUPPORTED_EXTENSIONS: string[];
|
|
19
|
+
export declare function resolveAdapter(request: ConvertRequest, filename: string, inputPath: string | undefined): Promise<Adapter>;
|
|
20
|
+
export interface AdapterCapability {
|
|
21
|
+
id: string;
|
|
22
|
+
description: string;
|
|
23
|
+
kinds: ConvertRequest['kind'][];
|
|
24
|
+
extensions: string[];
|
|
25
|
+
availability: AdapterAvailability;
|
|
26
|
+
}
|
|
27
|
+
export interface CapabilityReport {
|
|
28
|
+
adapters: AdapterCapability[];
|
|
29
|
+
/** Engine-level runtime facts; documents need no external binary, iddoc needs ffmpeg. */
|
|
30
|
+
runtime: Record<string, {
|
|
31
|
+
available: boolean;
|
|
32
|
+
version?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
}>;
|
|
35
|
+
defaults: Record<string, string>;
|
|
36
|
+
/** Extensions the document engine covers. */
|
|
37
|
+
extensions: string[];
|
|
38
|
+
}
|
|
39
|
+
/** Everything the console and the DSH settings panel need to tell the truth. */
|
|
40
|
+
export declare function capabilityReport(): Promise<CapabilityReport>;
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAKpD,OAAO,EAAgB,KAAK,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEjF,eAAO,MAAM,QAAQ,EAAE,OAAO,EAA+D,CAAA;AAE7F,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE3D;AAED,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBjE;AAED,eAAO,MAAM,oBAAoB,UAAkE,CAAA;AAEnG,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgClB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,EAAE,mBAAmB,CAAA;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,gFAAgF;AAChF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAyClE"}
|