@thunderkiller/video-clipper 1.5.6 → 1.7.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/README.md +13 -0
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +79 -72
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/stages/segmentAnalyzer.d.ts +1 -1
- package/dist/pipeline/stages/segmentAnalyzer.d.ts.map +1 -1
- package/dist/pipeline/stages/segmentAnalyzer.js +2 -2
- package/dist/pipeline/stages/segmentAnalyzer.js.map +1 -1
- package/dist/services/clipRefiner/index.d.ts +2 -1
- package/dist/services/clipRefiner/index.d.ts.map +1 -1
- package/dist/services/clipRefiner/index.js +3 -5
- package/dist/services/clipRefiner/index.js.map +1 -1
- package/dist/services/llmAnalyzer/LLMAnalyzer.d.ts +2 -2
- package/dist/services/llmAnalyzer/LLMAnalyzer.d.ts.map +1 -1
- package/dist/services/llmAnalyzer/LLMAnalyzer.js +2 -2
- package/dist/services/llmAnalyzer/LLMAnalyzer.js.map +1 -1
- package/dist/services/llmAnalyzer/index.d.ts +3 -2
- package/dist/services/llmAnalyzer/index.d.ts.map +1 -1
- package/dist/services/llmAnalyzer/index.js +5 -7
- package/dist/services/llmAnalyzer/index.js.map +1 -1
- package/dist/services/transcriptDetector/index.d.ts +2 -2
- package/dist/services/transcriptDetector/index.d.ts.map +1 -1
- package/dist/services/transcriptDetector/index.js.map +1 -1
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +12 -0
- package/dist/types/config.js.map +1 -1
- package/dist/utils/cache.d.ts +14 -18
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +32 -112
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/cacheBackend.d.ts +40 -0
- package/dist/utils/cacheBackend.d.ts.map +1 -0
- package/dist/utils/cacheBackend.js +28 -0
- package/dist/utils/cacheBackend.js.map +1 -0
- package/dist/utils/cacheFactory.d.ts +14 -0
- package/dist/utils/cacheFactory.d.ts.map +1 -0
- package/dist/utils/cacheFactory.js +31 -0
- package/dist/utils/cacheFactory.js.map +1 -0
- package/dist/utils/fileCacheBackend.d.ts +33 -0
- package/dist/utils/fileCacheBackend.d.ts.map +1 -0
- package/dist/utils/fileCacheBackend.js +123 -0
- package/dist/utils/fileCacheBackend.js.map +1 -0
- package/dist/utils/mongoCacheBackend.d.ts +51 -0
- package/dist/utils/mongoCacheBackend.d.ts.map +1 -0
- package/dist/utils/mongoCacheBackend.js +176 -0
- package/dist/utils/mongoCacheBackend.js.map +1 -0
- package/package.json +21 -2
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @thunderkiller/video-clipper
|
|
2
2
|
|
|
3
|
+
[](https://github.com/AmreetKumarkhuntia/video-clipper/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@thunderkiller/video-clipper)
|
|
5
|
+
[](https://github.com/AmreetKumarkhuntia/video-clipper/blob/master/LICENSE)
|
|
6
|
+
|
|
3
7
|
A TypeScript CLI (and library) that analyzes a YouTube video with an LLM, finds the most interesting moments, and optionally downloads the video and cuts clips automatically.
|
|
4
8
|
|
|
5
9
|
## How It Works
|
|
@@ -137,6 +141,15 @@ await runPipeline(args);
|
|
|
137
141
|
|
|
138
142
|
All public types and Zod schemas are exported from the package root. See [src/lib.ts](src/lib.ts) for the full surface.
|
|
139
143
|
|
|
144
|
+
## Contributing
|
|
145
|
+
|
|
146
|
+
1. Fork the repository
|
|
147
|
+
2. Create a feature branch (`git checkout -b feat/my-feature`)
|
|
148
|
+
3. Commit with [Conventional Commits](https://www.conventionalcommits.org/) — enforced by commitlint
|
|
149
|
+
4. Push and open a Pull Request
|
|
150
|
+
|
|
151
|
+
Pre-commit hooks run automatically: formatting (Prettier), type-check, and tests. Make sure `yt-dlp` and `ffmpeg` are installed locally.
|
|
152
|
+
|
|
140
153
|
## Documentation
|
|
141
154
|
|
|
142
155
|
| Doc | Description |
|
package/dist/config/env.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ export declare const config: {
|
|
|
28
28
|
AUDIO_LLM_BOOST_WINDOW: number;
|
|
29
29
|
AUDIO_LLM_SCORE_BOOST: number;
|
|
30
30
|
GAME_PROFILE: "valorant" | "fps" | "boss_fight" | "general";
|
|
31
|
+
CACHE_BACKEND: "file" | "mongodb";
|
|
32
|
+
MONGODB_DATABASE: string;
|
|
33
|
+
CACHE_TTL_SECONDS: number;
|
|
31
34
|
OPENAI_API_KEY?: string | undefined;
|
|
32
35
|
ANTHROPIC_API_KEY?: string | undefined;
|
|
33
36
|
GOOGLE_GENERATIVE_AI_API_KEY?: string | undefined;
|
|
@@ -45,5 +48,6 @@ export declare const config: {
|
|
|
45
48
|
FFPROBE_PATH?: string | undefined;
|
|
46
49
|
YT_DLP_COOKIES_FROM_BROWSER?: "chrome" | "firefox" | "safari" | "brave" | "edge" | "opera" | "chromium" | undefined;
|
|
47
50
|
YT_DLP_COOKIES_FILE?: string | undefined;
|
|
51
|
+
MONGODB_URI?: string | undefined;
|
|
48
52
|
};
|
|
49
53
|
//# sourceMappingURL=env.d.ts.map
|
package/dist/config/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAiBvB,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAiBvB,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,mBAAmB,CAAC;AAejE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAwG9D"}
|
package/dist/pipeline/runner.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import { config } from '../config/index.js';
|
|
3
3
|
import { Cache } from '../utils/cache.js';
|
|
4
|
+
import { createCacheBackend } from '../utils/cacheFactory.js';
|
|
4
5
|
import { log } from '../utils/logger.js';
|
|
5
6
|
import { dumpAnalysis, dumpTranscript } from './dumper.js';
|
|
6
7
|
import { resolveVideo } from './stages/videoResolver.js';
|
|
@@ -44,82 +45,88 @@ export async function runPipeline(args) {
|
|
|
44
45
|
const topN = args.topN ?? config.TOP_N_SEGMENTS;
|
|
45
46
|
const gameProfile = args.gameProfile ?? config.GAME_PROFILE;
|
|
46
47
|
const maxParallel = args.maxParallel ?? config.LLM_CONCURRENCY;
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
48
|
+
const backend = await createCacheBackend(config, args.noCache);
|
|
49
|
+
const cache = new Cache(backend);
|
|
50
|
+
try {
|
|
51
|
+
const { videoId, metadata } = await resolveVideo(args.url, args.maxDuration);
|
|
52
|
+
/** Downloaded before transcript so Whisper/Gemini transcript providers can
|
|
53
|
+
* use the WAV. Returns null when audio detection is disabled.
|
|
54
|
+
*/
|
|
55
|
+
let audioPath = null;
|
|
56
|
+
const audioEnabled = config.AUDIO_DETECTION_ENABLED && !args.noAudio;
|
|
57
|
+
if (audioEnabled) {
|
|
58
|
+
try {
|
|
59
|
+
audioPath = await downloadAudio(videoId, `${config.OUTPUT_DIR}/audio`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
63
|
+
log.warn(`Audio download failed — continuing without audio: ${message}`);
|
|
64
|
+
}
|
|
57
65
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
const audioEvents = await processAudio(videoId, metadata.duration, cache, {
|
|
67
|
+
noAudio: args.noAudio,
|
|
68
|
+
gameProfile,
|
|
69
|
+
maxParallel,
|
|
70
|
+
audioPath,
|
|
71
|
+
});
|
|
72
|
+
const { lines, microBlocks, chunkEvals } = await analyzeSegments(videoId, audioPath, audioEvents, cache, {
|
|
73
|
+
maxChunks: args.maxChunks,
|
|
74
|
+
maxParallel,
|
|
75
|
+
noCache: args.noCache,
|
|
76
|
+
});
|
|
77
|
+
if (config.DUMP_OUTPUTS) {
|
|
78
|
+
await dumpTranscript(videoId, lines);
|
|
61
79
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
const rankedSegments = selectSegments(chunkEvals, audioEvents, { threshold, topN });
|
|
81
|
+
const partialResult = {
|
|
82
|
+
video_id: videoId,
|
|
83
|
+
title: metadata.title,
|
|
84
|
+
duration: metadata.duration,
|
|
85
|
+
chunk_evaluations: chunkEvals,
|
|
86
|
+
segments: rankedSegments,
|
|
87
|
+
};
|
|
88
|
+
if (rankedSegments.length === 0) {
|
|
89
|
+
await outputResult(partialResult, args.outputJson);
|
|
90
|
+
if (config.DUMP_OUTPUTS)
|
|
91
|
+
await dumpAnalysis(videoId, partialResult);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const refinedSegments = await refineRankedSegments(rankedSegments, microBlocks, cache, {
|
|
95
|
+
maxParallel,
|
|
96
|
+
noCache: args.noCache,
|
|
97
|
+
});
|
|
98
|
+
const result = {
|
|
99
|
+
video_id: videoId,
|
|
100
|
+
title: metadata.title,
|
|
101
|
+
duration: metadata.duration,
|
|
102
|
+
chunk_evaluations: chunkEvals,
|
|
103
|
+
segments: refinedSegments,
|
|
104
|
+
};
|
|
105
|
+
await outputResult(result, args.outputJson);
|
|
87
106
|
if (config.DUMP_OUTPUTS)
|
|
88
|
-
await dumpAnalysis(videoId,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
};
|
|
102
|
-
await outputResult(result, args.outputJson);
|
|
103
|
-
if (config.DUMP_OUTPUTS)
|
|
104
|
-
await dumpAnalysis(videoId, result);
|
|
105
|
-
log.info('Done.');
|
|
106
|
-
if (!args.clip) {
|
|
107
|
-
log.info('Tip: run with --clip to download the video and generate mp4 clips.');
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const clipPaths = await exportClips(videoId, refinedSegments, {
|
|
111
|
-
localVideo: args.localVideo,
|
|
112
|
-
downloadSections: args.downloadSections,
|
|
113
|
-
videoPath: args.videoPath,
|
|
114
|
-
});
|
|
115
|
-
if (clipPaths.length === 0) {
|
|
116
|
-
log.warn('No clips were generated successfully.');
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
log.info(`Done — ${clipPaths.length} clip${clipPaths.length !== 1 ? 's' : ''} saved:`);
|
|
120
|
-
for (const p of clipPaths) {
|
|
121
|
-
log.info(` ${p}`);
|
|
107
|
+
await dumpAnalysis(videoId, result);
|
|
108
|
+
log.info('Done.');
|
|
109
|
+
if (!args.clip) {
|
|
110
|
+
log.info('Tip: run with --clip to download the video and generate mp4 clips.');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const clipPaths = await exportClips(videoId, refinedSegments, {
|
|
114
|
+
localVideo: args.localVideo,
|
|
115
|
+
downloadSections: args.downloadSections,
|
|
116
|
+
videoPath: args.videoPath,
|
|
117
|
+
});
|
|
118
|
+
if (clipPaths.length === 0) {
|
|
119
|
+
log.warn('No clips were generated successfully.');
|
|
122
120
|
}
|
|
121
|
+
else {
|
|
122
|
+
log.info(`Done — ${clipPaths.length} clip${clipPaths.length !== 1 ? 's' : ''} saved:`);
|
|
123
|
+
for (const p of clipPaths) {
|
|
124
|
+
log.info(` ${p}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await cache.close();
|
|
123
130
|
}
|
|
124
131
|
}
|
|
125
132
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAGrE,KAAK,UAAU,YAAY,CACzB,MAAsB,EACtB,cAAkC;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,qBAAqB,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAa;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,eAAe,CAAC;IAE/D,MAAM,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,5 +22,5 @@ export declare function analyzeSegments(videoId: string, audioPath: string | nul
|
|
|
22
22
|
* Separated from `analyzeSegments` because ranking (stage 5) must happen
|
|
23
23
|
* between the two passes.
|
|
24
24
|
*/
|
|
25
|
-
export declare function refineRankedSegments(rankedSegments: RankedSegment[], microBlocks: MicroBlock[],
|
|
25
|
+
export declare function refineRankedSegments(rankedSegments: RankedSegment[], microBlocks: MicroBlock[], cache: Cache, opts: Pick<SegmentAnalyzerOpts, 'maxParallel' | 'noCache'>): Promise<RankedSegment[]>;
|
|
26
26
|
//# sourceMappingURL=segmentAnalyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmentAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/pipeline/stages/segmentAnalyzer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,UAAU,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAiBhC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,aAAa,EAAE,EAC/B,WAAW,EAAE,UAAU,EAAE,EACzB,
|
|
1
|
+
{"version":3,"file":"segmentAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/pipeline/stages/segmentAnalyzer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,UAAU,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAiBhC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,aAAa,EAAE,EAC/B,WAAW,EAAE,UAAU,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,SAAS,CAAC,GACzD,OAAO,CAAC,aAAa,EAAE,CAAC,CAG1B"}
|
|
@@ -40,8 +40,8 @@ export async function analyzeSegments(videoId, audioPath, audioEvents, cache, op
|
|
|
40
40
|
* Separated from `analyzeSegments` because ranking (stage 5) must happen
|
|
41
41
|
* between the two passes.
|
|
42
42
|
*/
|
|
43
|
-
export async function refineRankedSegments(rankedSegments, microBlocks,
|
|
43
|
+
export async function refineRankedSegments(rankedSegments, microBlocks, cache, opts) {
|
|
44
44
|
log.info('Refining clip boundaries...');
|
|
45
|
-
return refineSegments(rankedSegments, microBlocks, opts.maxParallel, opts.noCache);
|
|
45
|
+
return refineSegments(rankedSegments, microBlocks, opts.maxParallel, cache, opts.noCache);
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=segmentAnalyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmentAnalyzer.js","sourceRoot":"","sources":["../../../src/pipeline/stages/segmentAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,SAAwB,EACxB,WAAyB,EACzB,KAAY,EACZ,IAAyB;IAEzB,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAE5D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;QACxE,OAAO;QACP,SAAS;QACT,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAA+B,EAC/B,WAAyB,EACzB,
|
|
1
|
+
{"version":3,"file":"segmentAnalyzer.js","sourceRoot":"","sources":["../../../src/pipeline/stages/segmentAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,SAAwB,EACxB,WAAyB,EACzB,KAAY,EACZ,IAAyB;IAEzB,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAE5D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;QACxE,OAAO;QACP,SAAS;QACT,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAA+B,EAC/B,WAAyB,EACzB,KAAY,EACZ,IAA0D;IAE1D,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACxC,OAAO,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5F,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CacheBackend } from '../../utils/cacheBackend.js';
|
|
1
2
|
import type { RankedSegment, MicroBlock } from '../../types/index.js';
|
|
2
3
|
/**
|
|
3
4
|
* Runs a second LLM pass on all ranked segments in parallel to tighten clip boundaries.
|
|
@@ -5,5 +6,5 @@ import type { RankedSegment, MicroBlock } from '../../types/index.js';
|
|
|
5
6
|
*
|
|
6
7
|
* @returns RankedSegment[] with refined (or original) start/end values
|
|
7
8
|
*/
|
|
8
|
-
export declare function refineSegments(segments: RankedSegment[], allBlocks: MicroBlock[], concurrency: number, noCache?: boolean): Promise<RankedSegment[]>;
|
|
9
|
+
export declare function refineSegments(segments: RankedSegment[], allBlocks: MicroBlock[], concurrency: number, cache: CacheBackend, noCache?: boolean): Promise<RankedSegment[]>;
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/clipRefiner/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/clipRefiner/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAqGtE;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,aAAa,EAAE,EACzB,SAAS,EAAE,UAAU,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,OAAO,UAAQ,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CAqB1B"}
|
|
@@ -4,7 +4,6 @@ import { z } from 'zod';
|
|
|
4
4
|
import { config } from '../../config/index.js';
|
|
5
5
|
import { log } from '../../utils/logger.js';
|
|
6
6
|
import { getModel } from '../../utils/modelFactory.js';
|
|
7
|
-
import { Cache } from '../../utils/cache.js';
|
|
8
7
|
const CONTEXT_PADDING_SEC = 30;
|
|
9
8
|
const RefinedBoundariesSchema = z.object({
|
|
10
9
|
clip_start: z.number().describe('Refined clip start time in seconds'),
|
|
@@ -53,8 +52,7 @@ Rules:
|
|
|
53
52
|
* Returns the segment with updated start/end if successful.
|
|
54
53
|
* Falls back to the original boundaries on failure.
|
|
55
54
|
*/
|
|
56
|
-
async function refineSegment(segment, allBlocks, noCache) {
|
|
57
|
-
const cache = new Cache(config.CACHE_DIR);
|
|
55
|
+
async function refineSegment(segment, allBlocks, cache, noCache) {
|
|
58
56
|
if (!noCache) {
|
|
59
57
|
const cached = await cache.readSegmentRefinement(segment.start, segment.end, segment.reason);
|
|
60
58
|
if (cached) {
|
|
@@ -86,10 +84,10 @@ async function refineSegment(segment, allBlocks, noCache) {
|
|
|
86
84
|
*
|
|
87
85
|
* @returns RankedSegment[] with refined (or original) start/end values
|
|
88
86
|
*/
|
|
89
|
-
export async function refineSegments(segments, allBlocks, concurrency, noCache = false) {
|
|
87
|
+
export async function refineSegments(segments, allBlocks, concurrency, cache, noCache = false) {
|
|
90
88
|
log.info(`Refining boundaries for ${segments.length} segment${segments.length !== 1 ? 's' : ''} (max ${concurrency} parallel)...`);
|
|
91
89
|
const limit = pLimit(concurrency);
|
|
92
|
-
const results = await Promise.allSettled(segments.map((segment) => limit(() => refineSegment(segment, allBlocks, noCache))));
|
|
90
|
+
const results = await Promise.allSettled(segments.map((segment) => limit(() => refineSegment(segment, allBlocks, cache, noCache))));
|
|
93
91
|
const refined = results.map((result, i) => {
|
|
94
92
|
if (result.status === 'fulfilled') {
|
|
95
93
|
return result.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/clipRefiner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/clipRefiner/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranscriptDetector } from '../transcriptDetector/index.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CacheBackend } from '../../utils/cacheBackend.js';
|
|
3
3
|
import type { MicroBlock, RankedSegment, LLMAnalyzerResult, LLMAnalyzerOpts } from '../../types/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* LLMAnalyzer — orchestrates transcript fetching + LLM-based segment analysis.
|
|
@@ -24,7 +24,7 @@ import type { MicroBlock, RankedSegment, LLMAnalyzerResult, LLMAnalyzerOpts } fr
|
|
|
24
24
|
export declare class LLMAnalyzer {
|
|
25
25
|
private readonly transcriptDetector;
|
|
26
26
|
private readonly cache;
|
|
27
|
-
constructor(transcriptDetector: TranscriptDetector, cache:
|
|
27
|
+
constructor(transcriptDetector: TranscriptDetector, cache: CacheBackend);
|
|
28
28
|
/**
|
|
29
29
|
* LLM pass 1 — fetch transcript then run chunk analysis.
|
|
30
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/LLMAnalyzer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"LLMAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/LLMAnalyzer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAEV,UAAU,EAIV,aAAa,EACb,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,kBAAkB,EAAE,kBAAkB,EACtC,KAAK,EAAE,YAAY;IAGtC;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqChE;;;OAGG;IACG,MAAM,CACV,cAAc,EAAE,aAAa,EAAE,EAC/B,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,SAAS,CAAC,GACrD,OAAO,CAAC,aAAa,EAAE,CAAC;CAI5B"}
|
|
@@ -43,7 +43,7 @@ export class LLMAnalyzer {
|
|
|
43
43
|
log.info(`Limiting evaluation to ${chunksToAnalyze.length} of ${chunks.length} chunks (--max-chunks ${chunkLimit})`);
|
|
44
44
|
}
|
|
45
45
|
log.info(`Analyzing chunks with ${config.LLM_MODEL} (${chunksToAnalyze.length} chunks, max ${opts.maxParallel} parallel)...`);
|
|
46
|
-
const chunkEvals = await analyzeChunks(chunksToAnalyze, lines, opts.audioEvents, opts.maxParallel, opts.noCache);
|
|
46
|
+
const chunkEvals = await analyzeChunks(chunksToAnalyze, lines, opts.audioEvents, opts.maxParallel, this.cache, opts.noCache);
|
|
47
47
|
const succeededCount = chunkEvals.filter((e) => e.status === 'success').length;
|
|
48
48
|
if (succeededCount === 0) {
|
|
49
49
|
throw new Error('All chunks failed LLM analysis. Check your API key and model config.');
|
|
@@ -56,7 +56,7 @@ export class LLMAnalyzer {
|
|
|
56
56
|
*/
|
|
57
57
|
async refine(rankedSegments, microBlocks, opts) {
|
|
58
58
|
log.info('Refining clip boundaries...');
|
|
59
|
-
return refineSegments(rankedSegments, microBlocks, opts.maxParallel, opts.noCache);
|
|
59
|
+
return refineSegments(rankedSegments, microBlocks, opts.maxParallel, this.cache, opts.noCache);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
//# sourceMappingURL=LLMAnalyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMAnalyzer.js","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/LLMAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAc/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,WAAW;IAEH;IACA;IAFnB,YACmB,kBAAsC,EACtC,
|
|
1
|
+
{"version":3,"file":"LLMAnalyzer.js","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/LLMAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAc/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,WAAW;IAEH;IACA;IAFnB,YACmB,kBAAsC,EACtC,KAAmB;QADnB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,IAAqB;QACjC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACzE,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,CACX,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC;QACvD,MAAM,eAAe,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAExF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CACN,0BAA0B,eAAe,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,yBAAyB,UAAU,GAAG,CAC3G,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,IAAI,CACN,yBAAyB,MAAM,CAAC,SAAS,KAAK,eAAe,CAAC,MAAM,gBAAgB,IAAI,CAAC,WAAW,eAAe,CACpH,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,aAAa,CACpC,eAAe,EACf,KAAK,EACL,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CACb,CAAC;QAEF,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC/E,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,cAA+B,EAC/B,WAAyB,EACzB,IAAsD;QAEtD,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACxC,OAAO,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;CACF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { LLMChunk, TranscriptLine, ChunkEvaluation, AudioEvent } from '../../types/index.js';
|
|
2
|
+
import type { CacheBackend } from '../../utils/cacheBackend.js';
|
|
2
3
|
/**
|
|
3
4
|
* Analyzes all LLM chunks via Promise.allSettled — one failure never aborts the rest.
|
|
4
5
|
* Each chunk receives only the transcript lines and audio events within its window.
|
|
5
|
-
* Pass noCache=true to bypass the
|
|
6
|
+
* Pass noCache=true to bypass the chunk cache.
|
|
6
7
|
*/
|
|
7
|
-
export declare function analyzeChunks(chunks: LLMChunk[], lines: TranscriptLine[], audioEvents: AudioEvent[], concurrency: number, noCache?: boolean): Promise<ChunkEvaluation[]>;
|
|
8
|
+
export declare function analyzeChunks(chunks: LLMChunk[], lines: TranscriptLine[], audioEvents: AudioEvent[], concurrency: number, cache: CacheBackend, noCache?: boolean): Promise<ChunkEvaluation[]>;
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAEd,eAAe,EACf,UAAU,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAyJhE;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,QAAQ,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,OAAO,UAAQ,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAoD5B"}
|
|
@@ -4,7 +4,6 @@ import { config } from '../../config/index.js';
|
|
|
4
4
|
import { log } from '../../utils/logger.js';
|
|
5
5
|
import { formatSeconds } from '../../utils/format.js';
|
|
6
6
|
import { getModel } from '../../utils/modelFactory.js';
|
|
7
|
-
import { Cache } from '../../utils/cache.js';
|
|
8
7
|
import { AnalyzedSegmentSchema } from '../../types/index.js';
|
|
9
8
|
const BACKOFF_BASE_MS = 1000;
|
|
10
9
|
const BACKOFF_JITTER_MS = 500;
|
|
@@ -64,9 +63,8 @@ ${semanticRules}- clip_start and clip_end must be within [${chunk.start}, ${chun
|
|
|
64
63
|
/**
|
|
65
64
|
* Analyzes a single LLM chunk with exponential backoff + jitter on rate-limit errors.
|
|
66
65
|
*/
|
|
67
|
-
async function analyzeChunk(chunk, chunkLines, chunkAudioEvents, noCache, chunkIndex) {
|
|
66
|
+
async function analyzeChunk(chunk, chunkLines, chunkAudioEvents, cache, noCache, chunkIndex) {
|
|
68
67
|
if (!noCache) {
|
|
69
|
-
const cache = new Cache(config.CACHE_DIR);
|
|
70
68
|
const cached = await cache.readChunk(chunk, chunkAudioEvents);
|
|
71
69
|
if (cached && cached.status === 'success') {
|
|
72
70
|
log.info(`[chunk] cache hit (${formatSeconds(chunk.start)}–${formatSeconds(chunk.end)})`);
|
|
@@ -103,7 +101,7 @@ async function analyzeChunk(chunk, chunkLines, chunkAudioEvents, noCache, chunkI
|
|
|
103
101
|
clip_start: object.clip_start,
|
|
104
102
|
clip_end: object.clip_end,
|
|
105
103
|
};
|
|
106
|
-
await
|
|
104
|
+
await cache.writeChunk(chunk, evaluation, chunkAudioEvents);
|
|
107
105
|
}
|
|
108
106
|
return object;
|
|
109
107
|
}
|
|
@@ -127,15 +125,15 @@ async function analyzeChunk(chunk, chunkLines, chunkAudioEvents, noCache, chunkI
|
|
|
127
125
|
/**
|
|
128
126
|
* Analyzes all LLM chunks via Promise.allSettled — one failure never aborts the rest.
|
|
129
127
|
* Each chunk receives only the transcript lines and audio events within its window.
|
|
130
|
-
* Pass noCache=true to bypass the
|
|
128
|
+
* Pass noCache=true to bypass the chunk cache.
|
|
131
129
|
*/
|
|
132
|
-
export async function analyzeChunks(chunks, lines, audioEvents, concurrency, noCache = false) {
|
|
130
|
+
export async function analyzeChunks(chunks, lines, audioEvents, concurrency, cache, noCache = false) {
|
|
133
131
|
log.info(`Analyzing ${chunks.length} chunk${chunks.length !== 1 ? 's' : ''} (max ${concurrency} parallel)...`);
|
|
134
132
|
const limit = pLimit(concurrency);
|
|
135
133
|
const results = await Promise.allSettled(chunks.map((chunk, i) => {
|
|
136
134
|
const chunkLines = lines.filter((l) => l.start >= chunk.start && l.start < chunk.end);
|
|
137
135
|
const chunkAudioEvents = audioEvents.filter((e) => e.time >= chunk.start && e.time < chunk.end);
|
|
138
|
-
return limit(() => analyzeChunk(chunk, chunkLines, chunkAudioEvents, noCache, i));
|
|
136
|
+
return limit(() => analyzeChunk(chunk, chunkLines, chunkAudioEvents, cache, noCache, i));
|
|
139
137
|
}));
|
|
140
138
|
let succeeded = 0;
|
|
141
139
|
const evaluations = await Promise.all(results.map(async (result, i) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/llmAnalyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAU7D,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;6EAa+C,CAAC;AAE9E,SAAS,gBAAgB,CAAC,GAAY;IACpC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CACL,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAClB,KAAe,EACf,UAA4B,EAC5B,gBAA8B,EAC9B,oBAA6B;IAE7B,MAAM,aAAa,GAAG,oBAAoB;QACxC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;;CAEL,CAAC;IAEA,MAAM,cAAc,GAClB,UAAU,CAAC,MAAM,GAAG,CAAC;QACnB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACxE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAEjB,MAAM,YAAY,GAChB,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,mDAAmD,gBAAgB;aAChE,KAAK,EAAE;aACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;aAC/B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACvF;aACA,IAAI,CAAC,IAAI,CAAC,IAAI;QACnB,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;SACA,KAAK,CAAC,KAAK;OACb,KAAK,CAAC,GAAG;;EAEd,cAAc;EACd,YAAY;;EAEZ,aAAa,6CAA6C,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG;wCAC7C,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,KAAe,EACf,UAA4B,EAC5B,gBAA8B,EAC9B,KAAmB,EACnB,OAAgB,EAChB,UAAkB;IAElB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,sBAAsB,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1F,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC;gBACtC,KAAK,EAAE,QAAQ,EAAE;gBACjB,MAAM,EAAE,qBAAqB;gBAC7B,MAAM,EAAE,MAAM,CAAC,iBAAiB,IAAI,qBAAqB;gBACzD,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CACN,SAAS,UAAU,mCAAmC,MAAM,CAAC,WAAW,WAAW,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,MAAM,EAAE,CAC3H,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,UAAU,GAAoB;oBAClC,MAAM,EAAE,SAAkB;oBAC1B,WAAW,EAAE,UAAU;oBACvB,WAAW,EAAE,KAAK,CAAC,KAAK;oBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;oBACpB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC;gBACF,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAEhB,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC9D,MAAM,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC;gBACzF,GAAG,CAAC,IAAI,CACN,mCAAmC,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,GAAG,CAAC,KAAK;oBAC/E,eAAe,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAC1C,CAAC;gBACF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAkB,EAClB,KAAuB,EACvB,WAAyB,EACzB,WAAmB,EACnB,KAAmB,EACnB,OAAO,GAAG,KAAK;IAEf,GAAG,CAAC,IAAI,CACN,aAAa,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,WAAW,eAAe,CACrG,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACtF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CACnD,CAAC;QACF,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CACH,CAAC;IAEF,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,WAAW,GAAsB,MAAM,OAAO,CAAC,GAAG,CACtD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,SAAS,EAAE,CAAC;YACZ,MAAM,GAAG,GAAoB,MAAM,CAAC,KAAK,CAAC;YAC1C,MAAM,UAAU,GAAoB;gBAClC,MAAM,EAAE,SAAkB;gBAC1B,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;gBACpB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;YACF,OAAO,UAAU,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO;gBACL,MAAM,EAAE,QAAiB;gBACzB,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;gBACpB,KAAK;aACN,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,IAAI,CAAC,sBAAsB,SAAS,IAAI,MAAM,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAC9E,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranscriptAnalyzer } from '../transcriptAnalyzers/index.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CacheBackend } from '../../utils/cacheBackend.js';
|
|
3
3
|
import type { TranscriptDetectorResult } from '../../types/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Top-level transcript detector.
|
|
@@ -39,7 +39,7 @@ export declare class TranscriptDetector {
|
|
|
39
39
|
* @param audioPath - Path to the downloaded WAV, or null if audio is not yet available
|
|
40
40
|
* @param cache - Cache instance for read/write of transcript lines
|
|
41
41
|
*/
|
|
42
|
-
detect(videoId: string, audioPath: string | null, cache:
|
|
42
|
+
detect(videoId: string, audioPath: string | null, cache: CacheBackend): Promise<TranscriptDetectorResult>;
|
|
43
43
|
/**
|
|
44
44
|
* Walks the analyzer chain in order.
|
|
45
45
|
* Falls back to the next analyzer whenever one throws.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/transcriptDetector/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/transcriptDetector/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAIV,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,kBAAkB,EAAE;IAMxD;;;;;;;;;;OAUG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,wBAAwB,CAAC;IAkBpC;;;OAGG;YACW,cAAc;IAgC5B,qDAAqD;IACrD,OAAO,CAAC,gBAAgB;IAIxB,gEAAgE;IAChE,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/transcriptDetector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,KAA2B;QAA3B,UAAK,GAAL,KAAK,CAAsB;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,OAAe,EACf,SAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/transcriptDetector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAU/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,KAA2B;QAA3B,UAAK,GAAL,KAAK,CAAsB;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,OAAe,EACf,SAAwB,EACxB,KAAmB;QAEnB,IAAI,KAAuB,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,6CAA6C,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;YAC9E,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc,CAC1B,OAAe,EACf,SAAwB;QAExB,IAAI,SAAkB,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACxD,GAAG,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;gBAC1E,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,CAAC;gBAChB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEjE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC5C,GAAG,CAAC,IAAI,CACN,eAAe,QAAQ,CAAC,MAAM,6BAA6B,UAAU,KAAK,OAAO,EAAE,CACpF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,iCAAiC,OAAO,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC;IAClB,CAAC;IAED,qDAAqD;IAC7C,gBAAgB,CAAC,KAAuB;QAC9C,OAAO,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC;IAED,gEAAgE;IACxD,WAAW,CAAC,WAAyB;QAC3C,OAAO,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACxF,CAAC;CACF"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -82,6 +82,13 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
82
82
|
chromium: "chromium";
|
|
83
83
|
}>>;
|
|
84
84
|
YT_DLP_COOKIES_FILE: z.ZodOptional<z.ZodString>;
|
|
85
|
+
CACHE_BACKEND: z.ZodDefault<z.ZodEnum<{
|
|
86
|
+
file: "file";
|
|
87
|
+
mongodb: "mongodb";
|
|
88
|
+
}>>;
|
|
89
|
+
MONGODB_URI: z.ZodOptional<z.ZodString>;
|
|
90
|
+
MONGODB_DATABASE: z.ZodDefault<z.ZodString>;
|
|
91
|
+
CACHE_TTL_SECONDS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
85
92
|
}, z.core.$strip>;
|
|
86
93
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
87
94
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4BxB,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4BxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsIrB,CAAC;AAEL,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
package/dist/types/config.js
CHANGED
|
@@ -97,6 +97,11 @@ export const ConfigSchema = z
|
|
|
97
97
|
.enum(['chrome', 'firefox', 'safari', 'brave', 'edge', 'opera', 'chromium'])
|
|
98
98
|
.optional(),
|
|
99
99
|
YT_DLP_COOKIES_FILE: z.string().optional(),
|
|
100
|
+
// ---- Cache backend -------------------------------------------------------
|
|
101
|
+
CACHE_BACKEND: z.enum(['file', 'mongodb']).default('file'),
|
|
102
|
+
MONGODB_URI: z.string().optional(),
|
|
103
|
+
MONGODB_DATABASE: z.string().default('video-clipper-cache'),
|
|
104
|
+
CACHE_TTL_SECONDS: z.coerce.number().min(0).default(0),
|
|
100
105
|
})
|
|
101
106
|
.superRefine((data, ctx) => {
|
|
102
107
|
const provider = data.LLM_PROVIDER;
|
|
@@ -124,5 +129,12 @@ export const ConfigSchema = z
|
|
|
124
129
|
message: 'Cannot set both YT_DLP_COOKIES_FROM_BROWSER and YT_DLP_COOKIES_FILE. Use only one.',
|
|
125
130
|
});
|
|
126
131
|
}
|
|
132
|
+
if (data.CACHE_BACKEND === 'mongodb' && (!data.MONGODB_URI || data.MONGODB_URI.trim() === '')) {
|
|
133
|
+
ctx.addIssue({
|
|
134
|
+
code: z.ZodIssueCode.custom,
|
|
135
|
+
path: ['MONGODB_URI'],
|
|
136
|
+
message: 'MONGODB_URI is required when CACHE_BACKEND is "mongodb"',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
127
139
|
});
|
|
128
140
|
//# sourceMappingURL=config.js.map
|