@sylphx/video-reader-mcp 0.1.0 → 0.1.2
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 +229 -41
- package/bin/native/video-reader-mcp-server +0 -0
- package/bin/video-reader-mcp +48 -0
- package/dist/doctor-cli.js +167 -0
- package/package.json +23 -10
- package/src/doctor-cli.ts +18 -0
- package/src/doctor.ts +132 -0
- package/src/engine/rust-asr.ts +98 -0
- package/src/engine/rust-frames.ts +95 -0
- package/src/engine/rust-timeline.ts +164 -0
- package/src/engine/rust-video-evidence.ts +132 -0
- package/src/handlers/readVideo.ts +41 -0
- package/src/handlers/videoEvidence.ts +161 -0
- package/src/mcp.ts +302 -0
- package/src/schemas/readVideo.ts +79 -0
- package/src/schemas/videoEvidence.ts +53 -0
- package/src/sdk.ts +44 -0
- package/src/types/timeline.ts +119 -0
- package/src/utils/agentIndex.ts +107 -0
- package/src/utils/asr.ts +59 -0
- package/src/utils/errors.ts +16 -0
- package/src/utils/exec.ts +76 -0
- package/src/utils/ffmpeg.ts +81 -0
- package/src/utils/ffprobe.ts +137 -0
- package/src/utils/frameOcr.ts +99 -0
- package/src/utils/frames.ts +93 -0
- package/src/utils/pathUtils.ts +36 -0
- package/src/utils/scenes.ts +63 -0
- package/src/utils/structuralKeyframes.ts +73 -0
- package/src/utils/subtitles.ts +101 -0
- package/src/video/readCoordinator.ts +240 -0
- package/dist/handlers/readVideo.js +0 -24
- package/dist/index.js +0 -59
- package/dist/mcp.js +0 -181
- package/dist/schemas/readVideo.js +0 -33
- package/dist/types/timeline.js +0 -1
- package/dist/utils/asr.js +0 -26
- package/dist/utils/errors.js +0 -14
- package/dist/utils/exec.js +0 -56
- package/dist/utils/ffmpeg.js +0 -66
- package/dist/utils/ffprobe.js +0 -79
- package/dist/utils/pathUtils.js +0 -31
- package/dist/utils/scenes.js +0 -49
- package/dist/utils/subtitles.js +0 -85
- package/dist/video/readCoordinator.js +0 -81
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { access } from 'node:fs/promises';
|
|
2
|
-
import { tryAsrTranscript } from '../utils/asr.js';
|
|
3
|
-
import { extractSubtitles } from '../utils/ffmpeg.js';
|
|
4
|
-
import { collectProbeWarnings, findSubtitleStreams, mapChapters, mapStreams, runFfprobe, secondsToMs, } from '../utils/ffprobe.js';
|
|
5
|
-
import { resolvePath } from '../utils/pathUtils.js';
|
|
6
|
-
import { detectScenes } from '../utils/scenes.js';
|
|
7
|
-
const DEFAULT_SCENE_THRESHOLD = 0.4;
|
|
8
|
-
export const buildTimelineDocument = async (sourcePath, args, version) => {
|
|
9
|
-
const includeStreams = args.include_streams ?? true;
|
|
10
|
-
const includeChapters = args.include_chapters ?? true;
|
|
11
|
-
const includeSubtitles = args.include_subtitles ?? true;
|
|
12
|
-
const includeScenes = args.include_scenes ?? true;
|
|
13
|
-
const includeTranscript = args.include_transcript ?? false;
|
|
14
|
-
const sceneThreshold = args.scene_threshold ?? DEFAULT_SCENE_THRESHOLD;
|
|
15
|
-
const warnings = [];
|
|
16
|
-
const probe = await runFfprobe(sourcePath);
|
|
17
|
-
warnings.push(...collectProbeWarnings(probe, includeStreams));
|
|
18
|
-
const format = {
|
|
19
|
-
...(probe.format.format_name ? { format_name: probe.format.format_name } : {}),
|
|
20
|
-
duration_ms: secondsToMs(probe.format.duration),
|
|
21
|
-
...(probe.format.bit_rate ? { bit_rate: Number.parseInt(probe.format.bit_rate, 10) } : {}),
|
|
22
|
-
...(probe.format.size ? { size_bytes: Number.parseInt(probe.format.size, 10) } : {}),
|
|
23
|
-
...(probe.format.tags ? { tags: probe.format.tags } : {}),
|
|
24
|
-
};
|
|
25
|
-
let subtitles = [];
|
|
26
|
-
if (includeSubtitles) {
|
|
27
|
-
const subtitleStreams = findSubtitleStreams(probe.streams);
|
|
28
|
-
const extracted = await extractSubtitles(sourcePath, subtitleStreams);
|
|
29
|
-
subtitles = extracted.subtitles;
|
|
30
|
-
warnings.push(...extracted.warnings);
|
|
31
|
-
}
|
|
32
|
-
let scenes = [];
|
|
33
|
-
if (includeScenes) {
|
|
34
|
-
const detected = await detectScenes(sourcePath, sceneThreshold);
|
|
35
|
-
scenes = detected.scenes;
|
|
36
|
-
if (detected.warning)
|
|
37
|
-
warnings.push(detected.warning);
|
|
38
|
-
}
|
|
39
|
-
let transcript = [];
|
|
40
|
-
if (includeTranscript) {
|
|
41
|
-
const asr = await tryAsrTranscript(sourcePath, true);
|
|
42
|
-
transcript = asr.transcript;
|
|
43
|
-
if (asr.warning)
|
|
44
|
-
warnings.push(asr.warning);
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
provenance: {
|
|
48
|
-
source: sourcePath,
|
|
49
|
-
tool: 'read_video',
|
|
50
|
-
version,
|
|
51
|
-
extracted_at: new Date().toISOString(),
|
|
52
|
-
},
|
|
53
|
-
format,
|
|
54
|
-
streams: includeStreams ? mapStreams(probe.streams) : [],
|
|
55
|
-
chapters: includeChapters ? mapChapters(probe.chapters) : [],
|
|
56
|
-
scenes,
|
|
57
|
-
subtitles,
|
|
58
|
-
transcript,
|
|
59
|
-
warnings,
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
export const processVideoSource = async (userPath, args, version) => {
|
|
63
|
-
try {
|
|
64
|
-
const sourcePath = resolvePath(userPath);
|
|
65
|
-
await access(sourcePath);
|
|
66
|
-
const data = await buildTimelineDocument(sourcePath, args, version);
|
|
67
|
-
return {
|
|
68
|
-
source: userPath,
|
|
69
|
-
success: true,
|
|
70
|
-
data,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
-
return {
|
|
76
|
-
source: userPath,
|
|
77
|
-
success: false,
|
|
78
|
-
error: message,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
};
|