@steipete/summarize-core 0.11.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/content/bun.js +21 -0
- package/dist/esm/content/bun.js.map +1 -0
- package/dist/esm/content/direct-media.js +100 -0
- package/dist/esm/content/direct-media.js.map +1 -0
- package/dist/esm/content/index.js +2 -1
- package/dist/esm/content/index.js.map +1 -1
- package/dist/esm/content/link-preview/client.js +6 -0
- package/dist/esm/content/link-preview/client.js.map +1 -1
- package/dist/esm/content/link-preview/content/fetcher.js +19 -2
- package/dist/esm/content/link-preview/content/fetcher.js.map +1 -1
- package/dist/esm/content/link-preview/content/firecrawl.js.map +1 -1
- package/dist/esm/content/link-preview/content/html.js.map +1 -1
- package/dist/esm/content/link-preview/content/index.js +29 -12
- package/dist/esm/content/link-preview/content/index.js.map +1 -1
- package/dist/esm/content/link-preview/content/utils.js.map +1 -1
- package/dist/esm/content/link-preview/content/video.js +1 -1
- package/dist/esm/content/link-preview/content/video.js.map +1 -1
- package/dist/esm/content/local-file.js +58 -0
- package/dist/esm/content/local-file.js.map +1 -0
- package/dist/esm/content/transcript/index.js +2 -0
- package/dist/esm/content/transcript/index.js.map +1 -1
- package/dist/esm/content/transcript/providers/generic-direct-media.js +47 -0
- package/dist/esm/content/transcript/providers/generic-direct-media.js.map +1 -0
- package/dist/esm/content/transcript/providers/generic-embedded.js +126 -0
- package/dist/esm/content/transcript/providers/generic-embedded.js.map +1 -0
- package/dist/esm/content/transcript/providers/generic-twitter.js +78 -0
- package/dist/esm/content/transcript/providers/generic-twitter.js.map +1 -0
- package/dist/esm/content/transcript/providers/generic.js +12 -248
- package/dist/esm/content/transcript/providers/generic.js.map +1 -1
- package/dist/esm/content/transcript/providers/podcast/apple-flow.js.map +1 -1
- package/dist/esm/content/transcript/providers/podcast/media.js +9 -1
- package/dist/esm/content/transcript/providers/podcast/media.js.map +1 -1
- package/dist/esm/content/transcript/providers/podcast/provider-flow.js +157 -0
- package/dist/esm/content/transcript/providers/podcast/provider-flow.js.map +1 -0
- package/dist/esm/content/transcript/providers/podcast/rss-feed.js +123 -0
- package/dist/esm/content/transcript/providers/podcast/rss-feed.js.map +1 -0
- package/dist/esm/content/transcript/providers/podcast/rss-transcript.js +113 -0
- package/dist/esm/content/transcript/providers/podcast/rss-transcript.js.map +1 -0
- package/dist/esm/content/transcript/providers/podcast/rss.js +2 -226
- package/dist/esm/content/transcript/providers/podcast/rss.js.map +1 -1
- package/dist/esm/content/transcript/providers/podcast/spotify-flow.js.map +1 -1
- package/dist/esm/content/transcript/providers/podcast.js +26 -155
- package/dist/esm/content/transcript/providers/podcast.js.map +1 -1
- package/dist/esm/content/transcript/providers/transcription-capability.js +22 -0
- package/dist/esm/content/transcript/providers/transcription-capability.js.map +1 -0
- package/dist/esm/content/transcript/providers/transcription-start.js +43 -32
- package/dist/esm/content/transcript/providers/transcription-start.js.map +1 -1
- package/dist/esm/content/transcript/providers/youtube/api.js +3 -2
- package/dist/esm/content/transcript/providers/youtube/api.js.map +1 -1
- package/dist/esm/content/transcript/providers/youtube/captions-player.js +173 -0
- package/dist/esm/content/transcript/providers/youtube/captions-player.js.map +1 -0
- package/dist/esm/content/transcript/providers/youtube/captions-shared.js +8 -0
- package/dist/esm/content/transcript/providers/youtube/captions-shared.js.map +1 -0
- package/dist/esm/content/transcript/providers/youtube/captions-transcript.js +361 -0
- package/dist/esm/content/transcript/providers/youtube/captions-transcript.js.map +1 -0
- package/dist/esm/content/transcript/providers/youtube/captions.js +2 -557
- package/dist/esm/content/transcript/providers/youtube/captions.js.map +1 -1
- package/dist/esm/content/transcript/providers/youtube/provider-flow.js +217 -0
- package/dist/esm/content/transcript/providers/youtube/provider-flow.js.map +1 -0
- package/dist/esm/content/transcript/providers/youtube/yt-dlp.js +33 -9
- package/dist/esm/content/transcript/providers/youtube/yt-dlp.js.map +1 -1
- package/dist/esm/content/transcript/providers/youtube.js +42 -194
- package/dist/esm/content/transcript/providers/youtube.js.map +1 -1
- package/dist/esm/content/transcript/transcription-config.js +24 -4
- package/dist/esm/content/transcript/transcription-config.js.map +1 -1
- package/dist/esm/content/url.js +5 -33
- package/dist/esm/content/url.js.map +1 -1
- package/dist/esm/processes.js.map +1 -1
- package/dist/esm/prompts/format.js +6 -0
- package/dist/esm/prompts/format.js.map +1 -1
- package/dist/esm/prompts/link-summary.js +27 -3
- package/dist/esm/prompts/link-summary.js.map +1 -1
- package/dist/esm/transcription/onnx-cli.js.map +1 -1
- package/dist/esm/transcription/whisper/assemblyai.js +132 -0
- package/dist/esm/transcription/whisper/assemblyai.js.map +1 -0
- package/dist/esm/transcription/whisper/chunking.js +64 -0
- package/dist/esm/transcription/whisper/chunking.js.map +1 -0
- package/dist/esm/transcription/whisper/cloud-providers.js +69 -0
- package/dist/esm/transcription/whisper/cloud-providers.js.map +1 -0
- package/dist/esm/transcription/whisper/core.js +320 -390
- package/dist/esm/transcription/whisper/core.js.map +1 -1
- package/dist/esm/transcription/whisper/gemini.js +324 -0
- package/dist/esm/transcription/whisper/gemini.js.map +1 -0
- package/dist/esm/transcription/whisper/groq.js +62 -1
- package/dist/esm/transcription/whisper/groq.js.map +1 -1
- package/dist/esm/transcription/whisper/preferences.js +16 -0
- package/dist/esm/transcription/whisper/preferences.js.map +1 -0
- package/dist/esm/transcription/whisper/provider-setup.js +62 -0
- package/dist/esm/transcription/whisper/provider-setup.js.map +1 -0
- package/dist/esm/transcription/whisper/remote-provider-attempts.js +189 -0
- package/dist/esm/transcription/whisper/remote-provider-attempts.js.map +1 -0
- package/dist/esm/transcription/whisper/remote.js +220 -0
- package/dist/esm/transcription/whisper/remote.js.map +1 -0
- package/dist/esm/transcription/whisper/whisper-cpp.js +21 -18
- package/dist/esm/transcription/whisper/whisper-cpp.js.map +1 -1
- package/dist/types/content/bun.d.ts +6 -0
- package/dist/types/content/direct-media.d.ts +9 -0
- package/dist/types/content/index.d.ts +2 -1
- package/dist/types/content/link-preview/client.d.ts +3 -1
- package/dist/types/content/link-preview/content/fetcher.d.ts +1 -1
- package/dist/types/content/link-preview/content/html.d.ts +1 -1
- package/dist/types/content/link-preview/deps.d.ts +8 -2
- package/dist/types/content/link-preview/types.d.ts +1 -1
- package/dist/types/content/local-file.d.ts +16 -0
- package/dist/types/content/transcript/providers/generic-direct-media.d.ts +11 -0
- package/dist/types/content/transcript/providers/generic-embedded.d.ts +16 -0
- package/dist/types/content/transcript/providers/generic-twitter.d.ts +11 -0
- package/dist/types/content/transcript/providers/podcast/flow-context.d.ts +3 -0
- package/dist/types/content/transcript/providers/podcast/media.d.ts +4 -2
- package/dist/types/content/transcript/providers/podcast/provider-flow.d.ts +7 -0
- package/dist/types/content/transcript/providers/podcast/rss-feed.d.ts +15 -0
- package/dist/types/content/transcript/providers/podcast/rss-transcript.d.ts +12 -0
- package/dist/types/content/transcript/providers/podcast/rss.d.ts +2 -24
- package/dist/types/content/transcript/providers/transcription-capability.d.ts +18 -0
- package/dist/types/content/transcript/providers/transcription-start.d.ts +11 -3
- package/dist/types/content/transcript/providers/youtube/captions-player.d.ts +12 -0
- package/dist/types/content/transcript/providers/youtube/captions-shared.d.ts +42 -0
- package/dist/types/content/transcript/providers/youtube/captions-transcript.d.ts +4 -0
- package/dist/types/content/transcript/providers/youtube/captions.d.ts +2 -19
- package/dist/types/content/transcript/providers/youtube/provider-flow.d.ts +34 -0
- package/dist/types/content/transcript/providers/youtube/yt-dlp.d.ts +4 -2
- package/dist/types/content/transcript/transcription-config.d.ts +6 -0
- package/dist/types/content/transcript/types.d.ts +1 -0
- package/dist/types/content/url.d.ts +2 -3
- package/dist/types/prompts/format.d.ts +1 -0
- package/dist/types/prompts/link-summary.d.ts +2 -1
- package/dist/types/transcription/whisper/assemblyai.d.ts +17 -0
- package/dist/types/transcription/whisper/chunking.d.ts +11 -0
- package/dist/types/transcription/whisper/cloud-providers.d.ts +22 -0
- package/dist/types/transcription/whisper/core.d.ts +12 -14
- package/dist/types/transcription/whisper/gemini.d.ts +14 -0
- package/dist/types/transcription/whisper/preferences.d.ts +4 -0
- package/dist/types/transcription/whisper/provider-setup.d.ts +30 -0
- package/dist/types/transcription/whisper/remote-provider-attempts.d.ts +51 -0
- package/dist/types/transcription/whisper/remote.d.ts +51 -0
- package/dist/types/transcription/whisper/types.d.ts +1 -1
- package/dist/types/transcription/whisper/whisper-cpp.d.ts +4 -3
- package/package.json +14 -10
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { transcribeWithAssemblyAi, transcribeFileWithAssemblyAi } from "./assemblyai.js";
|
|
2
|
+
import { MAX_OPENAI_UPLOAD_BYTES } from "./constants.js";
|
|
3
|
+
import { transcribeWithFal } from "./fal.js";
|
|
4
|
+
import { isFfmpegAvailable, transcodeBytesToMp3 } from "./ffmpeg.js";
|
|
5
|
+
import { transcribeFileWithGemini, transcribeWithGemini } from "./gemini.js";
|
|
6
|
+
import { shouldRetryOpenAiViaFfmpeg, transcribeWithOpenAi } from "./openai.js";
|
|
7
|
+
import { formatBytes, wrapError } from "./utils.js";
|
|
8
|
+
export async function attemptRemoteBytesProvider(args) {
|
|
9
|
+
const executor = BYTE_PROVIDER_EXECUTORS[args.provider];
|
|
10
|
+
return executor(args);
|
|
11
|
+
}
|
|
12
|
+
export async function attemptRemoteFileProvider(args) {
|
|
13
|
+
if (args.provider === "assemblyai") {
|
|
14
|
+
try {
|
|
15
|
+
const text = await transcribeFileWithAssemblyAi({
|
|
16
|
+
filePath: args.filePath,
|
|
17
|
+
mediaType: args.mediaType,
|
|
18
|
+
apiKey: args.assemblyaiApiKey,
|
|
19
|
+
});
|
|
20
|
+
if (text)
|
|
21
|
+
return { kind: "result", result: { text, provider: "assemblyai", error: null, notes: [] } };
|
|
22
|
+
return { kind: "error", error: new Error("AssemblyAI transcription returned empty text") };
|
|
23
|
+
}
|
|
24
|
+
catch (caught) {
|
|
25
|
+
return {
|
|
26
|
+
kind: "error",
|
|
27
|
+
error: caught instanceof Error ? caught : wrapError("AssemblyAI transcription failed", caught),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (args.provider === "gemini") {
|
|
32
|
+
try {
|
|
33
|
+
const text = await transcribeFileWithGemini({
|
|
34
|
+
filePath: args.filePath,
|
|
35
|
+
mediaType: args.mediaType,
|
|
36
|
+
filename: args.filename,
|
|
37
|
+
apiKey: args.geminiApiKey,
|
|
38
|
+
env: args.env,
|
|
39
|
+
});
|
|
40
|
+
if (text)
|
|
41
|
+
return { kind: "result", result: { text, provider: "gemini", error: null, notes: [] } };
|
|
42
|
+
return { kind: "error", error: new Error("Gemini transcription returned empty text") };
|
|
43
|
+
}
|
|
44
|
+
catch (caught) {
|
|
45
|
+
return {
|
|
46
|
+
kind: "error",
|
|
47
|
+
error: wrapError("Gemini transcription failed", caught),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { kind: "delegate-to-bytes" };
|
|
52
|
+
}
|
|
53
|
+
const BYTE_PROVIDER_EXECUTORS = {
|
|
54
|
+
assemblyai: async ({ state, assemblyaiApiKey }) => {
|
|
55
|
+
try {
|
|
56
|
+
const text = await transcribeWithAssemblyAi(state.bytes, state.mediaType, assemblyaiApiKey);
|
|
57
|
+
if (text) {
|
|
58
|
+
return {
|
|
59
|
+
state,
|
|
60
|
+
result: { text, provider: "assemblyai", error: null, notes: [] },
|
|
61
|
+
error: null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
state,
|
|
66
|
+
result: null,
|
|
67
|
+
error: new Error("AssemblyAI transcription returned empty text"),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (caught) {
|
|
71
|
+
return {
|
|
72
|
+
state,
|
|
73
|
+
result: null,
|
|
74
|
+
error: caught instanceof Error ? caught : wrapError("AssemblyAI transcription failed", caught),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
gemini: async ({ state, geminiApiKey, env }) => {
|
|
79
|
+
try {
|
|
80
|
+
const text = await transcribeWithGemini(state.bytes, state.mediaType, state.filename, geminiApiKey, { env });
|
|
81
|
+
if (text) {
|
|
82
|
+
return {
|
|
83
|
+
state,
|
|
84
|
+
result: { text, provider: "gemini", error: null, notes: [] },
|
|
85
|
+
error: null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return { state, result: null, error: new Error("Gemini transcription returned empty text") };
|
|
89
|
+
}
|
|
90
|
+
catch (caught) {
|
|
91
|
+
return {
|
|
92
|
+
state,
|
|
93
|
+
result: null,
|
|
94
|
+
error: wrapError("Gemini transcription failed", caught),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
openai: async ({ state, openaiApiKey, env, notes, onProgress, transcribeOversizedBytesWithChunking, }) => {
|
|
99
|
+
let nextState = state;
|
|
100
|
+
if (nextState.bytes.byteLength > MAX_OPENAI_UPLOAD_BYTES &&
|
|
101
|
+
transcribeOversizedBytesWithChunking &&
|
|
102
|
+
openaiApiKey) {
|
|
103
|
+
const canChunk = await isFfmpegAvailable();
|
|
104
|
+
if (canChunk) {
|
|
105
|
+
return {
|
|
106
|
+
state: nextState,
|
|
107
|
+
result: await transcribeOversizedBytesWithChunking({
|
|
108
|
+
bytes: nextState.bytes,
|
|
109
|
+
mediaType: nextState.mediaType,
|
|
110
|
+
filename: nextState.filename,
|
|
111
|
+
onProgress,
|
|
112
|
+
}),
|
|
113
|
+
error: null,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
notes.push(`Media too large for Whisper upload (${formatBytes(nextState.bytes.byteLength)}); transcribing first ${formatBytes(MAX_OPENAI_UPLOAD_BYTES)} only (install ffmpeg for full transcription)`);
|
|
117
|
+
nextState = {
|
|
118
|
+
...nextState,
|
|
119
|
+
bytes: nextState.bytes.slice(0, MAX_OPENAI_UPLOAD_BYTES),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
let error = null;
|
|
123
|
+
try {
|
|
124
|
+
const text = await transcribeWithOpenAi(nextState.bytes, nextState.mediaType, nextState.filename, openaiApiKey, { env });
|
|
125
|
+
if (text) {
|
|
126
|
+
return {
|
|
127
|
+
state: nextState,
|
|
128
|
+
result: { text, provider: "openai", error: null, notes: [] },
|
|
129
|
+
error: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
error = new Error("OpenAI transcription returned empty text");
|
|
133
|
+
}
|
|
134
|
+
catch (caught) {
|
|
135
|
+
error = wrapError("OpenAI transcription failed", caught);
|
|
136
|
+
}
|
|
137
|
+
if (error && shouldRetryOpenAiViaFfmpeg(error)) {
|
|
138
|
+
const canTranscode = await isFfmpegAvailable();
|
|
139
|
+
if (canTranscode) {
|
|
140
|
+
try {
|
|
141
|
+
notes.push("OpenAI could not decode media; transcoding via ffmpeg and retrying");
|
|
142
|
+
const mp3Bytes = await transcodeBytesToMp3(nextState.bytes);
|
|
143
|
+
const retried = await transcribeWithOpenAi(mp3Bytes, "audio/mpeg", "audio.mp3", openaiApiKey, { env });
|
|
144
|
+
if (retried) {
|
|
145
|
+
return {
|
|
146
|
+
state: { bytes: mp3Bytes, mediaType: "audio/mpeg", filename: "audio.mp3" },
|
|
147
|
+
result: { text: retried, provider: "openai", error: null, notes: [] },
|
|
148
|
+
error: null,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
error = new Error("OpenAI transcription returned empty text after ffmpeg transcode");
|
|
152
|
+
nextState = { bytes: mp3Bytes, mediaType: "audio/mpeg", filename: "audio.mp3" };
|
|
153
|
+
}
|
|
154
|
+
catch (caught) {
|
|
155
|
+
notes.push(`ffmpeg transcode failed; cannot retry OpenAI decode error: ${caught instanceof Error ? caught.message : String(caught)}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
notes.push("OpenAI could not decode media; install ffmpeg to enable transcoding retry");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { state: nextState, result: null, error };
|
|
163
|
+
},
|
|
164
|
+
fal: async ({ state, falApiKey, notes }) => {
|
|
165
|
+
if (!state.mediaType.toLowerCase().startsWith("audio/")) {
|
|
166
|
+
notes.push(`Skipping FAL transcription: unsupported mediaType ${state.mediaType}`);
|
|
167
|
+
return { state, result: null, error: null, skipped: true };
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const text = await transcribeWithFal(state.bytes, state.mediaType, falApiKey);
|
|
171
|
+
if (text) {
|
|
172
|
+
return {
|
|
173
|
+
state,
|
|
174
|
+
result: { text, provider: "fal", error: null, notes: [] },
|
|
175
|
+
error: null,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return { state, result: null, error: new Error("FAL transcription returned empty text") };
|
|
179
|
+
}
|
|
180
|
+
catch (caught) {
|
|
181
|
+
return {
|
|
182
|
+
state,
|
|
183
|
+
result: null,
|
|
184
|
+
error: wrapError("FAL transcription failed", caught),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=remote-provider-attempts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-provider-attempts.js","sourceRoot":"","sources":["../../../../src/transcription/whisper/remote-provider-attempts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { cloudProviderLabel, formatCloudFallbackTargets, resolveCloudProviderOrder, } from "./cloud-providers.js";
|
|
6
|
+
import { DEFAULT_SEGMENT_SECONDS, MAX_OPENAI_UPLOAD_BYTES } from "./constants.js";
|
|
7
|
+
import { isFfmpegAvailable } from "./ffmpeg.js";
|
|
8
|
+
import { buildMissingTranscriptionProviderMessage } from "./provider-setup.js";
|
|
9
|
+
import { attemptRemoteBytesProvider, attemptRemoteFileProvider, } from "./remote-provider-attempts.js";
|
|
10
|
+
import { formatBytes, readFirstBytes } from "./utils.js";
|
|
11
|
+
function withMergedNotes(result, notes) {
|
|
12
|
+
if (result.notes.length === 0)
|
|
13
|
+
return { ...result, notes };
|
|
14
|
+
return { ...result, notes: [...notes, ...result.notes] };
|
|
15
|
+
}
|
|
16
|
+
function buildNoProviderResult({ notes, groqApiKey, groqError, }) {
|
|
17
|
+
if (groqApiKey) {
|
|
18
|
+
return {
|
|
19
|
+
text: null,
|
|
20
|
+
provider: "groq",
|
|
21
|
+
error: groqError ?? new Error("No transcription providers available"),
|
|
22
|
+
notes,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
text: null,
|
|
27
|
+
provider: null,
|
|
28
|
+
error: new Error(buildMissingTranscriptionProviderMessage()),
|
|
29
|
+
notes,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function transcribeBytesAcrossProviders({ providerOrder, bytes, mediaType, filename, notes, groqApiKey, groqError = null, assemblyaiApiKey, geminiApiKey, openaiApiKey, falApiKey, env, onProgress, transcribeOversizedBytesWithChunking, }) {
|
|
33
|
+
if (providerOrder.length === 0) {
|
|
34
|
+
return buildNoProviderResult({ notes, groqApiKey, groqError });
|
|
35
|
+
}
|
|
36
|
+
let currentBytes = bytes;
|
|
37
|
+
let currentMediaType = mediaType;
|
|
38
|
+
let currentFilename = filename;
|
|
39
|
+
let lastFailure = null;
|
|
40
|
+
for (const [index, provider] of providerOrder.entries()) {
|
|
41
|
+
const attempt = await attemptRemoteBytesProvider({
|
|
42
|
+
provider,
|
|
43
|
+
state: {
|
|
44
|
+
bytes: currentBytes,
|
|
45
|
+
mediaType: currentMediaType,
|
|
46
|
+
filename: currentFilename,
|
|
47
|
+
},
|
|
48
|
+
assemblyaiApiKey,
|
|
49
|
+
geminiApiKey,
|
|
50
|
+
openaiApiKey,
|
|
51
|
+
falApiKey,
|
|
52
|
+
env,
|
|
53
|
+
notes,
|
|
54
|
+
onProgress,
|
|
55
|
+
transcribeOversizedBytesWithChunking,
|
|
56
|
+
});
|
|
57
|
+
currentBytes = attempt.state.bytes;
|
|
58
|
+
currentMediaType = attempt.state.mediaType;
|
|
59
|
+
currentFilename = attempt.state.filename;
|
|
60
|
+
if (attempt.result)
|
|
61
|
+
return withMergedNotes(attempt.result, notes);
|
|
62
|
+
if (!attempt.error)
|
|
63
|
+
continue;
|
|
64
|
+
lastFailure = { provider, error: attempt.error };
|
|
65
|
+
const remaining = providerOrder.slice(index + 1).filter((candidate) => {
|
|
66
|
+
if (candidate !== "fal")
|
|
67
|
+
return true;
|
|
68
|
+
return currentMediaType.toLowerCase().startsWith("audio/");
|
|
69
|
+
});
|
|
70
|
+
if (remaining.length > 0) {
|
|
71
|
+
notes.push(`${cloudProviderLabel(provider, false)} transcription failed; falling back to ${formatCloudFallbackTargets(remaining)}: ${attempt.error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (lastFailure) {
|
|
75
|
+
return {
|
|
76
|
+
text: null,
|
|
77
|
+
provider: lastFailure.provider,
|
|
78
|
+
error: lastFailure.error,
|
|
79
|
+
notes,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return buildNoProviderResult({ notes, groqApiKey, groqError });
|
|
83
|
+
}
|
|
84
|
+
export async function transcribeBytesWithRemoteFallbacks({ bytes, mediaType, filename, notes, groqApiKey, groqError = null, assemblyaiApiKey, geminiApiKey, openaiApiKey, falApiKey, env, onProgress, transcribeOversizedBytesWithChunking, }) {
|
|
85
|
+
return await transcribeBytesAcrossProviders({
|
|
86
|
+
providerOrder: resolveCloudProviderOrder({
|
|
87
|
+
assemblyaiApiKey,
|
|
88
|
+
geminiApiKey,
|
|
89
|
+
openaiApiKey,
|
|
90
|
+
falApiKey,
|
|
91
|
+
}),
|
|
92
|
+
bytes,
|
|
93
|
+
mediaType,
|
|
94
|
+
filename,
|
|
95
|
+
notes,
|
|
96
|
+
groqApiKey,
|
|
97
|
+
groqError,
|
|
98
|
+
assemblyaiApiKey,
|
|
99
|
+
geminiApiKey,
|
|
100
|
+
openaiApiKey,
|
|
101
|
+
falApiKey,
|
|
102
|
+
env,
|
|
103
|
+
onProgress,
|
|
104
|
+
transcribeOversizedBytesWithChunking,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
export async function transcribeFileWithRemoteFallbacks({ filePath, mediaType, filename, notes, groqApiKey, groqError = null, assemblyaiApiKey, geminiApiKey, openaiApiKey, falApiKey, env, totalDurationSeconds, onProgress, transcribeChunkedFile, }) {
|
|
108
|
+
const providerOrder = resolveCloudProviderOrder({
|
|
109
|
+
assemblyaiApiKey,
|
|
110
|
+
geminiApiKey,
|
|
111
|
+
openaiApiKey,
|
|
112
|
+
falApiKey,
|
|
113
|
+
});
|
|
114
|
+
if (providerOrder.length === 0) {
|
|
115
|
+
return buildNoProviderResult({ notes, groqApiKey, groqError });
|
|
116
|
+
}
|
|
117
|
+
const stat = await fs.stat(filePath);
|
|
118
|
+
onProgress?.({
|
|
119
|
+
partIndex: null,
|
|
120
|
+
parts: null,
|
|
121
|
+
processedDurationSeconds: null,
|
|
122
|
+
totalDurationSeconds,
|
|
123
|
+
});
|
|
124
|
+
let cachedBytes = null;
|
|
125
|
+
const readFileBytes = async () => {
|
|
126
|
+
if (cachedBytes)
|
|
127
|
+
return cachedBytes;
|
|
128
|
+
cachedBytes = new Uint8Array(await fs.readFile(filePath));
|
|
129
|
+
return cachedBytes;
|
|
130
|
+
};
|
|
131
|
+
let lastFailure = null;
|
|
132
|
+
for (const [index, provider] of providerOrder.entries()) {
|
|
133
|
+
const fileAttempt = await attemptRemoteFileProvider({
|
|
134
|
+
provider,
|
|
135
|
+
filePath,
|
|
136
|
+
mediaType,
|
|
137
|
+
filename,
|
|
138
|
+
assemblyaiApiKey,
|
|
139
|
+
geminiApiKey,
|
|
140
|
+
env,
|
|
141
|
+
});
|
|
142
|
+
if (fileAttempt.kind === "result")
|
|
143
|
+
return withMergedNotes(fileAttempt.result, notes);
|
|
144
|
+
if (fileAttempt.kind === "delegate-to-bytes") {
|
|
145
|
+
if (provider === "openai" && stat.size > MAX_OPENAI_UPLOAD_BYTES) {
|
|
146
|
+
const canChunk = await isFfmpegAvailable();
|
|
147
|
+
if (canChunk) {
|
|
148
|
+
return withMergedNotes(await transcribeChunkedFile({
|
|
149
|
+
filePath,
|
|
150
|
+
segmentSeconds: DEFAULT_SEGMENT_SECONDS,
|
|
151
|
+
totalDurationSeconds,
|
|
152
|
+
onProgress,
|
|
153
|
+
}), notes);
|
|
154
|
+
}
|
|
155
|
+
notes.push(`Media too large for Whisper upload (${formatBytes(stat.size)}); install ffmpeg to enable chunked transcription`);
|
|
156
|
+
const head = await readFirstBytes(filePath, MAX_OPENAI_UPLOAD_BYTES);
|
|
157
|
+
return withMergedNotes(await transcribeBytesAcrossProviders({
|
|
158
|
+
providerOrder: providerOrder.slice(index),
|
|
159
|
+
bytes: head,
|
|
160
|
+
mediaType,
|
|
161
|
+
filename,
|
|
162
|
+
notes: [],
|
|
163
|
+
groqApiKey,
|
|
164
|
+
groqError,
|
|
165
|
+
assemblyaiApiKey,
|
|
166
|
+
geminiApiKey,
|
|
167
|
+
openaiApiKey,
|
|
168
|
+
falApiKey,
|
|
169
|
+
env,
|
|
170
|
+
onProgress,
|
|
171
|
+
}), notes);
|
|
172
|
+
}
|
|
173
|
+
return withMergedNotes(await transcribeBytesAcrossProviders({
|
|
174
|
+
providerOrder: providerOrder.slice(index),
|
|
175
|
+
bytes: await readFileBytes(),
|
|
176
|
+
mediaType,
|
|
177
|
+
filename,
|
|
178
|
+
notes: [],
|
|
179
|
+
groqApiKey,
|
|
180
|
+
groqError,
|
|
181
|
+
assemblyaiApiKey,
|
|
182
|
+
geminiApiKey,
|
|
183
|
+
openaiApiKey,
|
|
184
|
+
falApiKey,
|
|
185
|
+
env,
|
|
186
|
+
onProgress,
|
|
187
|
+
}), notes);
|
|
188
|
+
}
|
|
189
|
+
lastFailure = { provider, error: fileAttempt.error };
|
|
190
|
+
const remaining = providerOrder.slice(index + 1);
|
|
191
|
+
if (remaining.length > 0) {
|
|
192
|
+
notes.push(`${cloudProviderLabel(provider, false)} transcription failed; falling back to ${formatCloudFallbackTargets(remaining)}: ${fileAttempt.error.message}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (lastFailure) {
|
|
196
|
+
return {
|
|
197
|
+
text: null,
|
|
198
|
+
provider: lastFailure.provider,
|
|
199
|
+
error: lastFailure.error,
|
|
200
|
+
notes,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return buildNoProviderResult({ notes, groqApiKey, groqError });
|
|
204
|
+
}
|
|
205
|
+
export async function transcribeOversizedBytesViaTempFile({ bytes, mediaType, filename, onProgress, transcribeFile, }) {
|
|
206
|
+
const tempFile = join(tmpdir(), `summarize-whisper-${randomUUID()}`);
|
|
207
|
+
try {
|
|
208
|
+
await fs.writeFile(tempFile, bytes);
|
|
209
|
+
return await transcribeFile({
|
|
210
|
+
filePath: tempFile,
|
|
211
|
+
mediaType,
|
|
212
|
+
filename,
|
|
213
|
+
onProgress,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
await fs.unlink(tempFile).catch(() => { });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../../src/transcription/whisper/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,21 +6,21 @@ import { spawnTracked } from "../../processes.js";
|
|
|
6
6
|
import { DISABLE_LOCAL_WHISPER_CPP_ENV, WHISPER_CPP_BINARY_ENV, WHISPER_CPP_MODEL_PATH_ENV, } from "./constants.js";
|
|
7
7
|
import { isFfmpegAvailable, runFfmpegTranscodeToMp3, runFfmpegTranscodeToMp3Lenient, } from "./ffmpeg.js";
|
|
8
8
|
import { wrapError } from "./utils.js";
|
|
9
|
-
export async function isWhisperCppReady() {
|
|
10
|
-
if (!isWhisperCppEnabled())
|
|
9
|
+
export async function isWhisperCppReady(env) {
|
|
10
|
+
if (!isWhisperCppEnabled(env))
|
|
11
11
|
return false;
|
|
12
|
-
if (!(await isWhisperCliAvailable()))
|
|
12
|
+
if (!(await isWhisperCliAvailable(env)))
|
|
13
13
|
return false;
|
|
14
|
-
const model = await resolveWhisperCppModelPath();
|
|
14
|
+
const model = await resolveWhisperCppModelPath(env);
|
|
15
15
|
return Boolean(model);
|
|
16
16
|
}
|
|
17
|
-
export async function resolveWhisperCppModelNameForDisplay() {
|
|
18
|
-
const modelPath = await resolveWhisperCppModelPath();
|
|
17
|
+
export async function resolveWhisperCppModelNameForDisplay(env) {
|
|
18
|
+
const modelPath = await resolveWhisperCppModelPath(env);
|
|
19
19
|
return modelPath ? resolveWhisperCppModelLabelFromPath(modelPath) : null;
|
|
20
20
|
}
|
|
21
|
-
export async function transcribeWithWhisperCppFile({ filePath, mediaType, totalDurationSeconds, onProgress, }) {
|
|
21
|
+
export async function transcribeWithWhisperCppFile({ filePath, mediaType, totalDurationSeconds, onProgress, env, }) {
|
|
22
22
|
const notes = [];
|
|
23
|
-
const modelPath = await resolveWhisperCppModelPath();
|
|
23
|
+
const modelPath = await resolveWhisperCppModelPath(env);
|
|
24
24
|
if (!modelPath) {
|
|
25
25
|
return {
|
|
26
26
|
text: null,
|
|
@@ -92,7 +92,7 @@ export async function transcribeWithWhisperCppFile({ filePath, mediaType, totalD
|
|
|
92
92
|
];
|
|
93
93
|
try {
|
|
94
94
|
await new Promise((resolve, reject) => {
|
|
95
|
-
const { proc, handle } = spawnTracked(resolveWhisperCppBinary(), args, {
|
|
95
|
+
const { proc, handle } = spawnTracked(resolveWhisperCppBinary(env), args, {
|
|
96
96
|
stdio: ["ignore", "ignore", "pipe"],
|
|
97
97
|
label: "whisper.cpp",
|
|
98
98
|
kind: "whisper.cpp",
|
|
@@ -166,11 +166,12 @@ export async function transcribeWithWhisperCppFile({ filePath, mediaType, totalD
|
|
|
166
166
|
await effectivePath.cleanup?.().catch(() => { });
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
-
function isWhisperCppEnabled() {
|
|
170
|
-
|
|
169
|
+
function isWhisperCppEnabled(env) {
|
|
170
|
+
const source = env ?? process.env;
|
|
171
|
+
return (source[DISABLE_LOCAL_WHISPER_CPP_ENV] ?? "").trim() !== "1";
|
|
171
172
|
}
|
|
172
|
-
async function isWhisperCliAvailable() {
|
|
173
|
-
const bin = resolveWhisperCppBinary();
|
|
173
|
+
async function isWhisperCliAvailable(env) {
|
|
174
|
+
const bin = resolveWhisperCppBinary(env);
|
|
174
175
|
return new Promise((resolve) => {
|
|
175
176
|
const { proc } = spawnTracked(bin, ["--help"], {
|
|
176
177
|
stdio: ["ignore", "ignore", "ignore"],
|
|
@@ -182,12 +183,14 @@ async function isWhisperCliAvailable() {
|
|
|
182
183
|
proc.on("close", (code) => resolve(code === 0));
|
|
183
184
|
});
|
|
184
185
|
}
|
|
185
|
-
function resolveWhisperCppBinary() {
|
|
186
|
-
const
|
|
186
|
+
function resolveWhisperCppBinary(env) {
|
|
187
|
+
const source = env ?? process.env;
|
|
188
|
+
const override = (source[WHISPER_CPP_BINARY_ENV] ?? "").trim();
|
|
187
189
|
return override.length > 0 ? override : "whisper-cli";
|
|
188
190
|
}
|
|
189
|
-
async function resolveWhisperCppModelPath() {
|
|
190
|
-
const
|
|
191
|
+
async function resolveWhisperCppModelPath(env) {
|
|
192
|
+
const source = env ?? process.env;
|
|
193
|
+
const override = (source[WHISPER_CPP_MODEL_PATH_ENV] ?? "").trim();
|
|
191
194
|
if (override) {
|
|
192
195
|
try {
|
|
193
196
|
const stat = await fs.stat(override);
|
|
@@ -197,7 +200,7 @@ async function resolveWhisperCppModelPath() {
|
|
|
197
200
|
return null;
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
|
-
const home = (
|
|
203
|
+
const home = (source.HOME ?? source.USERPROFILE ?? "").trim();
|
|
201
204
|
const cacheCandidate = home
|
|
202
205
|
? join(home, ".summarize", "cache", "whisper-cpp", "models", "ggml-base.bin")
|
|
203
206
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whisper-cpp.js","sourceRoot":"","sources":["../../../../src/transcription/whisper/whisper-cpp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"whisper-cpp.js","sourceRoot":"","sources":["../../../../src/transcription/whisper/whisper-cpp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAwC;IAExC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,GAAwC;IAExC,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,SAAS,CAAC,CAAC,CAAC,mCAAmC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EACjD,QAAQ,EACR,SAAS,EACT,oBAAoB,EACpB,UAAU,EACV,GAAG,GAOJ;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI,KAAK,CAAC,oEAAoE,CAAC;YACtF,KAAK;SACN,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,8BAA8B,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,IAAI,KAAK,CACd,yDAAyD,SAAS,gCAAgC,CACnG;YACD,KAAK;SACN,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,IAAI,cAAc;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAoC,EAAE,CAAC;QAC7F,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAoC,EAAE,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO;YACL,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC;YACpC,0FAA0F;YAC1F,6CAA6C;YAC7C,IAAI,CAAC;gBACH,MAAM,uBAAuB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,8BAA8B,CAAC;oBACnC,SAAS,EAAE,QAAQ;oBACnB,UAAU,EAAE,aAAa,CAAC,IAAI;iBAC/B,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;gBACxE,KAAK,CAAC,IAAI,CAAC,yCAAyC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,UAAU,EAAE,CAAC;gBACX,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,IAAI;gBACX,wBAAwB,EAAE,IAAI;gBAC9B,oBAAoB;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,GAAG,UAAU,MAAM,CAAC;QAEtC,MAAM,IAAI,GAAG;YACX,SAAS;YACT,SAAS;YACT,YAAY;YACZ,MAAM;YACN,iBAAiB;YACjB,aAAa;YACb,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,UAAU;YACV,aAAa,CAAC,IAAI;SACnB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;oBACxE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;oBACnC,KAAK,EAAE,aAAa;oBACpB,IAAI,EAAE,aAAa;iBACpB,CAAC,CAAC;gBACH,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,mBAAmB,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBACxC,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;wBAC1B,MAAM,IAAI,KAAK,CAAC;oBAClB,CAAC;oBAED,qFAAqF;oBACrF,kEAAkE;oBAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;wBACvD,IAAI,CAAC,KAAK;4BAAE,SAAS;wBACrB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;4BAAE,SAAS;wBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACxD,IAAI,GAAG,KAAK,mBAAmB;4BAAE,SAAS;wBAC1C,mBAAmB,GAAG,GAAG,CAAC;wBAC1B,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;wBACzC,MAAM,SAAS,GACb,OAAO,oBAAoB,KAAK,QAAQ,IAAI,oBAAoB,GAAG,CAAC;4BAClE,CAAC,CAAC,CAAC,oBAAoB,GAAG,GAAG,CAAC,GAAG,GAAG;4BACpC,CAAC,CAAC,IAAI,CAAC;wBACX,UAAU,EAAE,CAAC;4BACX,SAAS,EAAE,IAAI;4BACf,KAAK,EAAE,IAAI;4BACX,wBAAwB,EAAE,SAAS;4BACnC,oBAAoB;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,IAAI,IAAI,SAAS,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBACnF,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,aAAa;gBACvB,KAAK,EAAE,SAAS,CAAC,oBAAoB,EAAE,KAAK,CAAC;gBAC7C,KAAK;aACN,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,aAAa;gBACvB,KAAK,EAAE,IAAI,KAAK,CAAC,iCAAiC,CAAC;gBACnD,KAAK;aACN,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,sBAAsB,mCAAmC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAwC;IACnE,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAClC,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAwC;IAC3E,MAAM,GAAG,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC7C,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACrC,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAwC;IACvE,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,GAAwC;IAExC,MAAM,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,cAAc,GAAG,IAAI;QACzB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAO,cAAc,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mCAAmC,CAAC,SAAiB;IAC5D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IACrD,IAAI,IAAI,GAAG,IAAI;SACZ,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,8BAA8B,CAAC,SAAiB;IACvD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjE,OAAO,CACL,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,WAAW,CACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
type RequestHeaders = Record<string, string>;
|
|
2
|
+
export declare function isBunRuntime(): boolean;
|
|
3
|
+
export declare function withBunCompressionHeaders(headers: RequestHeaders): RequestHeaders;
|
|
4
|
+
export declare function withBunIdentityEncoding(headers: RequestHeaders): RequestHeaders;
|
|
5
|
+
export declare function isBunCompressedResponseError(error: unknown): boolean;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type DirectMediaKind = "video" | "audio";
|
|
2
|
+
export declare const DIRECT_MEDIA_EXTENSIONS: readonly ["mp4", "mov", "m4v", "mkv", "webm", "mpeg", "mpg", "avi", "wmv", "flv", "m3u8", "mp3", "m4a", "wav", "flac", "aac", "ogg", "opus", "aiff", "wma"];
|
|
3
|
+
export declare function normalizePathForExtension(value: string): string;
|
|
4
|
+
export declare function resolveDirectMediaExtension(value: string): string | null;
|
|
5
|
+
export declare function isDirectMediaUrl(url: string): boolean;
|
|
6
|
+
export declare function isDirectMediaExtension(ext: string): boolean;
|
|
7
|
+
export declare function inferDirectMediaKind(value: string): DirectMediaKind | null;
|
|
8
|
+
export declare function isDirectVideoInput(value: string): boolean;
|
|
9
|
+
export declare function resolveDirectMediaType(value: string, kindHint?: DirectMediaKind | null): string | null;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export type { MediaCache, MediaCacheEntry, TranscriptCache, TranscriptCacheGetResult, TranscriptCacheSetArgs, } from "./cache/types.js";
|
|
2
|
+
export { NEGATIVE_TTL_MS } from "./transcript/cache.js";
|
|
2
3
|
export { createLinkPreviewClient, type LinkPreviewClient, type LinkPreviewClientOptions, } from "./link-preview/client.js";
|
|
3
4
|
export { DEFAULT_CACHE_MODE, DEFAULT_MAX_CONTENT_CHARACTERS, DEFAULT_TIMEOUT_MS, type ExtractedLinkContent, type FetchLinkContentOptions, } from "./link-preview/content/types.js";
|
|
4
5
|
export type { ConvertHtmlToMarkdown, FirecrawlScrapeResult, LinkPreviewDeps, LinkPreviewProgressEvent, ReadTweetWithBird, ScrapeWithFirecrawl, } from "./link-preview/deps.js";
|
|
5
6
|
export { ProgressKind } from "./link-preview/deps.js";
|
|
6
7
|
export { CACHE_MODES, type CacheMode, type CacheStatus, type TranscriptSource, } from "./link-preview/types.js";
|
|
7
|
-
export { DIRECT_MEDIA_EXTENSIONS, extractYouTubeVideoId, isDirectMediaExtension, isDirectMediaUrl, isPodcastHost, isTwitterBroadcastUrl, isTwitterStatusUrl, isYouTubeUrl, isYouTubeVideoUrl, shouldPreferUrlMode, } from "./url.js";
|
|
8
|
+
export { DIRECT_MEDIA_EXTENSIONS, extractYouTubeVideoId, inferDirectMediaKind, isDirectMediaExtension, isDirectMediaUrl, isDirectVideoInput, isPodcastHost, isTwitterBroadcastUrl, isTwitterStatusUrl, isYouTubeUrl, isYouTubeVideoUrl, shouldPreferUrlMode, } from "./url.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MediaCache, TranscriptCache } from "../cache/types.js";
|
|
2
|
+
import { type TranscriptionConfig } from "../transcript/transcription-config.js";
|
|
2
3
|
import type { ExtractedLinkContent, FetchLinkContentOptions } from "./content/types.js";
|
|
3
4
|
import type { ConvertHtmlToMarkdown, LinkPreviewDeps, LinkPreviewProgressEvent, ResolveTwitterCookies, ScrapeWithFirecrawl } from "./deps.js";
|
|
4
|
-
import { type TranscriptionConfig } from "../transcript/transcription-config.js";
|
|
5
5
|
/** Public client used by external consumers to fetch link content. */
|
|
6
6
|
export interface LinkPreviewClient {
|
|
7
7
|
fetchLinkContent(url: string, options?: FetchLinkContentOptions): Promise<ExtractedLinkContent>;
|
|
@@ -16,6 +16,8 @@ export interface LinkPreviewClientOptions {
|
|
|
16
16
|
transcription?: Partial<TranscriptionConfig> | null;
|
|
17
17
|
falApiKey?: string | null;
|
|
18
18
|
groqApiKey?: string | null;
|
|
19
|
+
assemblyaiApiKey?: string | null;
|
|
20
|
+
geminiApiKey?: string | null;
|
|
19
21
|
openaiApiKey?: string | null;
|
|
20
22
|
convertHtmlToMarkdown?: ConvertHtmlToMarkdown | null;
|
|
21
23
|
transcriptCache?: TranscriptCache | null;
|
|
@@ -8,7 +8,7 @@ export interface HtmlDocumentFetchResult {
|
|
|
8
8
|
html: string;
|
|
9
9
|
finalUrl: string;
|
|
10
10
|
}
|
|
11
|
-
export declare function fetchHtmlDocument(fetchImpl: typeof fetch, url: string,
|
|
11
|
+
export declare function fetchHtmlDocument(fetchImpl: typeof fetch, url: string, options?: {
|
|
12
12
|
timeoutMs?: number;
|
|
13
13
|
onProgress?: ((event: LinkPreviewProgressEvent) => void) | null;
|
|
14
14
|
}): Promise<HtmlDocumentFetchResult>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LinkPreviewDeps } from "../deps.js";
|
|
2
2
|
import type { FirecrawlDiagnostics } from "../types.js";
|
|
3
|
-
import type { ExtractedLinkContent, FetchLinkContentOptions, MarkdownMode } from "./types.js";
|
|
4
3
|
import { extractReadabilityFromHtml } from "./readability.js";
|
|
4
|
+
import type { ExtractedLinkContent, FetchLinkContentOptions, MarkdownMode } from "./types.js";
|
|
5
5
|
export declare function buildResultFromHtmlDocument({ url, html, cacheMode, maxCharacters, youtubeTranscriptMode, mediaTranscriptMode, transcriptTimestamps, firecrawlDiagnostics, markdownRequested, markdownMode, timeoutMs, deps, readabilityCandidate, }: {
|
|
6
6
|
url: string;
|
|
7
7
|
html: string;
|