vidpipe 1.0.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 +243 -0
- package/assets/fonts/Montserrat-Bold.ttf +0 -0
- package/assets/fonts/Montserrat-Regular.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/dist/__tests__/agents.test.d.ts +2 -0
- package/dist/__tests__/agents.test.d.ts.map +1 -0
- package/dist/__tests__/agents.test.js +434 -0
- package/dist/__tests__/agents.test.js.map +1 -0
- package/dist/__tests__/aspectRatio.test.d.ts +2 -0
- package/dist/__tests__/aspectRatio.test.d.ts.map +1 -0
- package/dist/__tests__/aspectRatio.test.js +406 -0
- package/dist/__tests__/aspectRatio.test.js.map +1 -0
- package/dist/__tests__/captionGenerator.test.d.ts +2 -0
- package/dist/__tests__/captionGenerator.test.d.ts.map +1 -0
- package/dist/__tests__/captionGenerator.test.js +435 -0
- package/dist/__tests__/captionGenerator.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +81 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/faceDetection.test.d.ts +2 -0
- package/dist/__tests__/faceDetection.test.d.ts.map +1 -0
- package/dist/__tests__/faceDetection.test.js +372 -0
- package/dist/__tests__/faceDetection.test.js.map +1 -0
- package/dist/__tests__/ffmpegTools.test.d.ts +2 -0
- package/dist/__tests__/ffmpegTools.test.d.ts.map +1 -0
- package/dist/__tests__/ffmpegTools.test.js +464 -0
- package/dist/__tests__/ffmpegTools.test.js.map +1 -0
- package/dist/__tests__/integration/captionBurn.test.d.ts +2 -0
- package/dist/__tests__/integration/captionBurn.test.d.ts.map +1 -0
- package/dist/__tests__/integration/captionBurn.test.js +103 -0
- package/dist/__tests__/integration/captionBurn.test.js.map +1 -0
- package/dist/__tests__/integration/clipComposite.test.d.ts +2 -0
- package/dist/__tests__/integration/clipComposite.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clipComposite.test.js +56 -0
- package/dist/__tests__/integration/clipComposite.test.js.map +1 -0
- package/dist/__tests__/integration/faceDetection.test.d.ts +2 -0
- package/dist/__tests__/integration/faceDetection.test.d.ts.map +1 -0
- package/dist/__tests__/integration/faceDetection.test.js +85 -0
- package/dist/__tests__/integration/faceDetection.test.js.map +1 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.d.ts +2 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.js +88 -0
- package/dist/__tests__/integration/ffmpegPipeline.test.js.map +1 -0
- package/dist/__tests__/integration/fixture.d.ts +19 -0
- package/dist/__tests__/integration/fixture.d.ts.map +1 -0
- package/dist/__tests__/integration/fixture.js +112 -0
- package/dist/__tests__/integration/fixture.js.map +1 -0
- package/dist/__tests__/integration/fixture.test.d.ts +2 -0
- package/dist/__tests__/integration/fixture.test.d.ts.map +1 -0
- package/dist/__tests__/integration/fixture.test.js +27 -0
- package/dist/__tests__/integration/fixture.test.js.map +1 -0
- package/dist/__tests__/integration/realCaptions.test.d.ts +2 -0
- package/dist/__tests__/integration/realCaptions.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realCaptions.test.js +226 -0
- package/dist/__tests__/integration/realCaptions.test.js.map +1 -0
- package/dist/__tests__/integration/realPipeline.test.d.ts +2 -0
- package/dist/__tests__/integration/realPipeline.test.d.ts.map +1 -0
- package/dist/__tests__/integration/realPipeline.test.js +210 -0
- package/dist/__tests__/integration/realPipeline.test.js.map +1 -0
- package/dist/__tests__/integration/silenceRemoval.test.d.ts +2 -0
- package/dist/__tests__/integration/silenceRemoval.test.d.ts.map +1 -0
- package/dist/__tests__/integration/silenceRemoval.test.js +93 -0
- package/dist/__tests__/integration/silenceRemoval.test.js.map +1 -0
- package/dist/__tests__/pipeline.test.d.ts +2 -0
- package/dist/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline.test.js +434 -0
- package/dist/__tests__/pipeline.test.js.map +1 -0
- package/dist/__tests__/services.test.d.ts +2 -0
- package/dist/__tests__/services.test.d.ts.map +1 -0
- package/dist/__tests__/services.test.js +655 -0
- package/dist/__tests__/services.test.js.map +1 -0
- package/dist/__tests__/silenceRemoval.test.d.ts +2 -0
- package/dist/__tests__/silenceRemoval.test.d.ts.map +1 -0
- package/dist/__tests__/silenceRemoval.test.js +266 -0
- package/dist/__tests__/silenceRemoval.test.js.map +1 -0
- package/dist/__tests__/singlePassEdit.test.d.ts +2 -0
- package/dist/__tests__/singlePassEdit.test.d.ts.map +1 -0
- package/dist/__tests__/singlePassEdit.test.js +321 -0
- package/dist/__tests__/singlePassEdit.test.js.map +1 -0
- package/dist/__tests__/smoke.test.d.ts +2 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +8 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/__tests__/utilities.test.d.ts +2 -0
- package/dist/__tests__/utilities.test.d.ts.map +1 -0
- package/dist/__tests__/utilities.test.js +268 -0
- package/dist/__tests__/utilities.test.js.map +1 -0
- package/dist/agents/BaseAgent.d.ts +52 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -0
- package/dist/agents/BaseAgent.js +108 -0
- package/dist/agents/BaseAgent.js.map +1 -0
- package/dist/agents/BlogAgent.d.ts +3 -0
- package/dist/agents/BlogAgent.d.ts.map +1 -0
- package/dist/agents/BlogAgent.js +163 -0
- package/dist/agents/BlogAgent.js.map +1 -0
- package/dist/agents/ChapterAgent.d.ts +11 -0
- package/dist/agents/ChapterAgent.d.ts.map +1 -0
- package/dist/agents/ChapterAgent.js +191 -0
- package/dist/agents/ChapterAgent.js.map +1 -0
- package/dist/agents/MediumVideoAgent.d.ts +3 -0
- package/dist/agents/MediumVideoAgent.d.ts.map +1 -0
- package/dist/agents/MediumVideoAgent.js +219 -0
- package/dist/agents/MediumVideoAgent.js.map +1 -0
- package/dist/agents/ShortsAgent.d.ts +3 -0
- package/dist/agents/ShortsAgent.d.ts.map +1 -0
- package/dist/agents/ShortsAgent.js +243 -0
- package/dist/agents/ShortsAgent.js.map +1 -0
- package/dist/agents/SilenceRemovalAgent.d.ts +9 -0
- package/dist/agents/SilenceRemovalAgent.d.ts.map +1 -0
- package/dist/agents/SilenceRemovalAgent.js +208 -0
- package/dist/agents/SilenceRemovalAgent.js.map +1 -0
- package/dist/agents/SocialMediaAgent.d.ts +4 -0
- package/dist/agents/SocialMediaAgent.d.ts.map +1 -0
- package/dist/agents/SocialMediaAgent.js +248 -0
- package/dist/agents/SocialMediaAgent.js.map +1 -0
- package/dist/agents/SummaryAgent.d.ts +11 -0
- package/dist/agents/SummaryAgent.d.ts.map +1 -0
- package/dist/agents/SummaryAgent.js +333 -0
- package/dist/agents/SummaryAgent.js.map +1 -0
- package/dist/config/brand.d.ts +29 -0
- package/dist/config/brand.d.ts.map +1 -0
- package/dist/config/brand.js +83 -0
- package/dist/config/brand.js.map +1 -0
- package/dist/config/environment.d.ts +36 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +44 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/config/logger.d.ts +5 -0
- package/dist/config/logger.d.ts.map +1 -0
- package/dist/config/logger.js +13 -0
- package/dist/config/logger.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline.d.ts +57 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +287 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/services/captionGeneration.d.ts +7 -0
- package/dist/services/captionGeneration.d.ts.map +1 -0
- package/dist/services/captionGeneration.js +29 -0
- package/dist/services/captionGeneration.js.map +1 -0
- package/dist/services/fileWatcher.d.ts +19 -0
- package/dist/services/fileWatcher.d.ts.map +1 -0
- package/dist/services/fileWatcher.js +120 -0
- package/dist/services/fileWatcher.js.map +1 -0
- package/dist/services/gitOperations.d.ts +3 -0
- package/dist/services/gitOperations.d.ts.map +1 -0
- package/dist/services/gitOperations.js +43 -0
- package/dist/services/gitOperations.js.map +1 -0
- package/dist/services/socialPosting.d.ts +38 -0
- package/dist/services/socialPosting.d.ts.map +1 -0
- package/dist/services/socialPosting.js +102 -0
- package/dist/services/socialPosting.js.map +1 -0
- package/dist/services/transcription.d.ts +3 -0
- package/dist/services/transcription.d.ts.map +1 -0
- package/dist/services/transcription.js +100 -0
- package/dist/services/transcription.js.map +1 -0
- package/dist/services/videoIngestion.d.ts +3 -0
- package/dist/services/videoIngestion.d.ts.map +1 -0
- package/dist/services/videoIngestion.js +103 -0
- package/dist/services/videoIngestion.js.map +1 -0
- package/dist/tools/captions/captionGenerator.d.ts +84 -0
- package/dist/tools/captions/captionGenerator.d.ts.map +1 -0
- package/dist/tools/captions/captionGenerator.js +390 -0
- package/dist/tools/captions/captionGenerator.js.map +1 -0
- package/dist/tools/ffmpeg/aspectRatio.d.ts +101 -0
- package/dist/tools/ffmpeg/aspectRatio.d.ts.map +1 -0
- package/dist/tools/ffmpeg/aspectRatio.js +338 -0
- package/dist/tools/ffmpeg/aspectRatio.js.map +1 -0
- package/dist/tools/ffmpeg/audioExtraction.d.ts +16 -0
- package/dist/tools/ffmpeg/audioExtraction.d.ts.map +1 -0
- package/dist/tools/ffmpeg/audioExtraction.js +86 -0
- package/dist/tools/ffmpeg/audioExtraction.js.map +1 -0
- package/dist/tools/ffmpeg/captionBurning.d.ts +8 -0
- package/dist/tools/ffmpeg/captionBurning.d.ts.map +1 -0
- package/dist/tools/ffmpeg/captionBurning.js +71 -0
- package/dist/tools/ffmpeg/captionBurning.js.map +1 -0
- package/dist/tools/ffmpeg/clipExtraction.d.ts +23 -0
- package/dist/tools/ffmpeg/clipExtraction.d.ts.map +1 -0
- package/dist/tools/ffmpeg/clipExtraction.js +178 -0
- package/dist/tools/ffmpeg/clipExtraction.js.map +1 -0
- package/dist/tools/ffmpeg/faceDetection.d.ts +127 -0
- package/dist/tools/ffmpeg/faceDetection.d.ts.map +1 -0
- package/dist/tools/ffmpeg/faceDetection.js +500 -0
- package/dist/tools/ffmpeg/faceDetection.js.map +1 -0
- package/dist/tools/ffmpeg/frameCapture.d.ts +10 -0
- package/dist/tools/ffmpeg/frameCapture.d.ts.map +1 -0
- package/dist/tools/ffmpeg/frameCapture.js +48 -0
- package/dist/tools/ffmpeg/frameCapture.js.map +1 -0
- package/dist/tools/ffmpeg/silenceDetection.d.ts +10 -0
- package/dist/tools/ffmpeg/silenceDetection.d.ts.map +1 -0
- package/dist/tools/ffmpeg/silenceDetection.js +55 -0
- package/dist/tools/ffmpeg/silenceDetection.js.map +1 -0
- package/dist/tools/ffmpeg/singlePassEdit.d.ts +25 -0
- package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +1 -0
- package/dist/tools/ffmpeg/singlePassEdit.js +123 -0
- package/dist/tools/ffmpeg/singlePassEdit.js.map +1 -0
- package/dist/tools/search/exaClient.d.ts +8 -0
- package/dist/tools/search/exaClient.d.ts.map +1 -0
- package/dist/tools/search/exaClient.js +38 -0
- package/dist/tools/search/exaClient.js.map +1 -0
- package/dist/tools/whisper/whisperClient.d.ts +3 -0
- package/dist/tools/whisper/whisperClient.d.ts.map +1 -0
- package/dist/tools/whisper/whisperClient.js +77 -0
- package/dist/tools/whisper/whisperClient.js.map +1 -0
- package/dist/types/index.d.ts +305 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +44 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for video-auto-note-taker CLI pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Domain types covering transcription, video metadata, short-clip planning,
|
|
5
|
+
* social-media post generation, and end-to-end pipeline orchestration.
|
|
6
|
+
*
|
|
7
|
+
* ### Timestamp convention
|
|
8
|
+
* All `start` and `end` fields are in **seconds from the beginning of the video**
|
|
9
|
+
* (floating-point, e.g. 12.345). This matches Whisper's output format and
|
|
10
|
+
* FFmpeg's `-ss` / `-to` parameters.
|
|
11
|
+
*/
|
|
12
|
+
/** Social-media platforms supported for post generation. */
|
|
13
|
+
export declare enum Platform {
|
|
14
|
+
TikTok = "tiktok",
|
|
15
|
+
YouTube = "youtube",
|
|
16
|
+
Instagram = "instagram",
|
|
17
|
+
LinkedIn = "linkedin",
|
|
18
|
+
X = "x"
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A single word with precise start/end timestamps from Whisper.
|
|
22
|
+
*
|
|
23
|
+
* Word-level timestamps are the foundation of the karaoke caption system —
|
|
24
|
+
* each word knows exactly when it's spoken, enabling per-word highlighting.
|
|
25
|
+
* Whisper produces these via its `--word_timestamps` flag.
|
|
26
|
+
*
|
|
27
|
+
* @property word - The spoken word (may include leading/trailing whitespace)
|
|
28
|
+
* @property start - When this word begins, in seconds from video start
|
|
29
|
+
* @property end - When this word ends, in seconds from video start
|
|
30
|
+
*/
|
|
31
|
+
export interface Word {
|
|
32
|
+
word: string;
|
|
33
|
+
start: number;
|
|
34
|
+
end: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A sentence/phrase-level segment from Whisper transcription.
|
|
38
|
+
*
|
|
39
|
+
* Segments are Whisper's natural grouping of words into sentences or clauses.
|
|
40
|
+
* They're used for SRT/VTT subtitle generation (one cue per segment) and for
|
|
41
|
+
* silence removal (segments that fall entirely within a removed region are dropped).
|
|
42
|
+
*
|
|
43
|
+
* @property id - Sequential segment index (0-based)
|
|
44
|
+
* @property text - Full text of the segment
|
|
45
|
+
* @property start - Segment start time in seconds
|
|
46
|
+
* @property end - Segment end time in seconds
|
|
47
|
+
* @property words - The individual words with their own timestamps
|
|
48
|
+
*/
|
|
49
|
+
export interface Segment {
|
|
50
|
+
id: number;
|
|
51
|
+
text: string;
|
|
52
|
+
start: number;
|
|
53
|
+
end: number;
|
|
54
|
+
words: Word[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Complete transcript result from Whisper.
|
|
58
|
+
*
|
|
59
|
+
* Contains both segment-level and word-level data. The top-level `words` array
|
|
60
|
+
* is a flat list of all words across all segments — this is the primary input
|
|
61
|
+
* for the ASS caption generator's karaoke highlighting.
|
|
62
|
+
*
|
|
63
|
+
* @property text - Full transcript as a single string
|
|
64
|
+
* @property segments - Sentence/phrase-level segments
|
|
65
|
+
* @property words - Flat array of all words with timestamps (used by ASS captions)
|
|
66
|
+
* @property language - Detected language code (e.g. "en")
|
|
67
|
+
* @property duration - Total video duration in seconds
|
|
68
|
+
*/
|
|
69
|
+
export interface Transcript {
|
|
70
|
+
text: string;
|
|
71
|
+
segments: Segment[];
|
|
72
|
+
words: Word[];
|
|
73
|
+
language: string;
|
|
74
|
+
duration: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Metadata for a video file after ingestion into the repo structure.
|
|
78
|
+
*
|
|
79
|
+
* @property originalPath - Where the file was picked up from (e.g. recordings/ folder)
|
|
80
|
+
* @property repoPath - Canonical path within the repo's asset directory
|
|
81
|
+
* @property videoDir - Directory containing all generated assets for this video
|
|
82
|
+
* @property slug - URL/filesystem-safe name derived from the filename (e.g. "my-video-2024-01-15")
|
|
83
|
+
* @property filename - Original filename with extension
|
|
84
|
+
* @property duration - Video duration in seconds (from ffprobe)
|
|
85
|
+
* @property size - File size in bytes
|
|
86
|
+
* @property createdAt - File creation timestamp
|
|
87
|
+
*/
|
|
88
|
+
export interface VideoFile {
|
|
89
|
+
originalPath: string;
|
|
90
|
+
repoPath: string;
|
|
91
|
+
videoDir: string;
|
|
92
|
+
slug: string;
|
|
93
|
+
filename: string;
|
|
94
|
+
duration: number;
|
|
95
|
+
size: number;
|
|
96
|
+
createdAt: Date;
|
|
97
|
+
}
|
|
98
|
+
export type AspectRatio = '16:9' | '9:16' | '1:1' | '4:5';
|
|
99
|
+
export type VideoPlatform = 'tiktok' | 'youtube-shorts' | 'instagram-reels' | 'instagram-feed' | 'linkedin' | 'youtube' | 'twitter';
|
|
100
|
+
/**
|
|
101
|
+
* Caption rendering style.
|
|
102
|
+
* - `'shorts'` — large centered pop captions for short-form clips (landscape 16:9)
|
|
103
|
+
* - `'medium'` — smaller bottom-positioned captions for longer content
|
|
104
|
+
* - `'portrait'` — Opus Clips style for 9:16 vertical video (green highlight,
|
|
105
|
+
* scale-pop animation, larger fonts for small-screen viewing)
|
|
106
|
+
*/
|
|
107
|
+
export type CaptionStyle = 'shorts' | 'medium' | 'portrait';
|
|
108
|
+
export interface ShortClipVariant {
|
|
109
|
+
path: string;
|
|
110
|
+
aspectRatio: AspectRatio;
|
|
111
|
+
platform: VideoPlatform;
|
|
112
|
+
width: number;
|
|
113
|
+
height: number;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A single time range within a short clip.
|
|
117
|
+
*
|
|
118
|
+
* Short clips can be **composite** — made of multiple non-contiguous segments
|
|
119
|
+
* from the original video, concatenated together. Each segment describes one
|
|
120
|
+
* contiguous range.
|
|
121
|
+
*
|
|
122
|
+
* @property start - Start time in the original video (seconds)
|
|
123
|
+
* @property end - End time in the original video (seconds)
|
|
124
|
+
* @property description - Human-readable description of what happens in this segment
|
|
125
|
+
*/
|
|
126
|
+
export interface ShortSegment {
|
|
127
|
+
start: number;
|
|
128
|
+
end: number;
|
|
129
|
+
description: string;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A planned short clip (15–60s) extracted from the full video.
|
|
133
|
+
*
|
|
134
|
+
* May be a single contiguous segment or a **composite** of multiple segments
|
|
135
|
+
* concatenated together (e.g. an intro + punchline from different parts of
|
|
136
|
+
* the video). The `segments` array defines the source time ranges; `totalDuration`
|
|
137
|
+
* is the sum of all segment durations.
|
|
138
|
+
*
|
|
139
|
+
* @property id - Unique identifier (e.g. "short-1")
|
|
140
|
+
* @property title - Human-readable title for the clip
|
|
141
|
+
* @property slug - Filesystem-safe slug (e.g. "typescript-tip-generics")
|
|
142
|
+
* @property segments - One or more time ranges from the original video
|
|
143
|
+
* @property totalDuration - Sum of all segment durations in seconds
|
|
144
|
+
* @property outputPath - Path to the extracted video file
|
|
145
|
+
* @property captionedPath - Path to the captioned version (if generated)
|
|
146
|
+
* @property description - Short description for social media
|
|
147
|
+
* @property tags - Hashtags / topic tags
|
|
148
|
+
* @property variants - Platform-specific aspect-ratio variants (portrait, square, etc.)
|
|
149
|
+
*/
|
|
150
|
+
export interface ShortClip {
|
|
151
|
+
id: string;
|
|
152
|
+
title: string;
|
|
153
|
+
slug: string;
|
|
154
|
+
segments: ShortSegment[];
|
|
155
|
+
totalDuration: number;
|
|
156
|
+
outputPath: string;
|
|
157
|
+
captionedPath?: string;
|
|
158
|
+
description: string;
|
|
159
|
+
tags: string[];
|
|
160
|
+
variants?: ShortClipVariant[];
|
|
161
|
+
}
|
|
162
|
+
/** A planned medium clip segment */
|
|
163
|
+
export interface MediumSegment {
|
|
164
|
+
start: number;
|
|
165
|
+
end: number;
|
|
166
|
+
description: string;
|
|
167
|
+
}
|
|
168
|
+
export interface MediumClip {
|
|
169
|
+
id: string;
|
|
170
|
+
title: string;
|
|
171
|
+
slug: string;
|
|
172
|
+
segments: MediumSegment[];
|
|
173
|
+
totalDuration: number;
|
|
174
|
+
outputPath: string;
|
|
175
|
+
captionedPath?: string;
|
|
176
|
+
description: string;
|
|
177
|
+
tags: string[];
|
|
178
|
+
hook: string;
|
|
179
|
+
topic: string;
|
|
180
|
+
}
|
|
181
|
+
export interface SocialPost {
|
|
182
|
+
platform: Platform;
|
|
183
|
+
content: string;
|
|
184
|
+
hashtags: string[];
|
|
185
|
+
links: string[];
|
|
186
|
+
characterCount: number;
|
|
187
|
+
outputPath: string;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* A chapter marker for YouTube's chapters feature.
|
|
191
|
+
*
|
|
192
|
+
* @property timestamp - Start time in seconds (YouTube shows these as clickable markers)
|
|
193
|
+
* @property title - Short chapter title (shown in the progress bar)
|
|
194
|
+
* @property description - Longer description for the README/summary
|
|
195
|
+
*/
|
|
196
|
+
export interface Chapter {
|
|
197
|
+
timestamp: number;
|
|
198
|
+
title: string;
|
|
199
|
+
description: string;
|
|
200
|
+
}
|
|
201
|
+
export interface VideoSnapshot {
|
|
202
|
+
timestamp: number;
|
|
203
|
+
description: string;
|
|
204
|
+
outputPath: string;
|
|
205
|
+
}
|
|
206
|
+
export interface VideoSummary {
|
|
207
|
+
title: string;
|
|
208
|
+
overview: string;
|
|
209
|
+
keyTopics: string[];
|
|
210
|
+
snapshots: VideoSnapshot[];
|
|
211
|
+
markdownPath: string;
|
|
212
|
+
}
|
|
213
|
+
export declare enum PipelineStage {
|
|
214
|
+
Ingestion = "ingestion",
|
|
215
|
+
Transcription = "transcription",
|
|
216
|
+
SilenceRemoval = "silence-removal",
|
|
217
|
+
Chapters = "chapters",
|
|
218
|
+
Captions = "captions",
|
|
219
|
+
CaptionBurn = "caption-burn",
|
|
220
|
+
Summary = "summary",
|
|
221
|
+
Shorts = "shorts",
|
|
222
|
+
MediumClips = "medium-clips",
|
|
223
|
+
SocialMedia = "social-media",
|
|
224
|
+
ShortPosts = "short-posts",
|
|
225
|
+
MediumClipPosts = "medium-clip-posts",
|
|
226
|
+
Blog = "blog",
|
|
227
|
+
GitPush = "git-push"
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Per-stage outcome record for pipeline observability.
|
|
231
|
+
*
|
|
232
|
+
* @property stage - Which pipeline stage this result is for
|
|
233
|
+
* @property success - Whether the stage completed without throwing
|
|
234
|
+
* @property error - Error message if the stage failed
|
|
235
|
+
* @property duration - Wall-clock time in milliseconds
|
|
236
|
+
*/
|
|
237
|
+
export interface StageResult {
|
|
238
|
+
stage: PipelineStage;
|
|
239
|
+
success: boolean;
|
|
240
|
+
error?: string;
|
|
241
|
+
duration: number;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Complete output of a pipeline run.
|
|
245
|
+
*
|
|
246
|
+
* Fields are optional because stages can fail independently — a failed
|
|
247
|
+
* transcription means no summary, but the video metadata is still available.
|
|
248
|
+
*
|
|
249
|
+
* @property totalDuration - Total pipeline wall-clock time in milliseconds
|
|
250
|
+
*/
|
|
251
|
+
export interface PipelineResult {
|
|
252
|
+
video: VideoFile;
|
|
253
|
+
transcript?: Transcript;
|
|
254
|
+
editedVideoPath?: string;
|
|
255
|
+
captions?: string[];
|
|
256
|
+
captionedVideoPath?: string;
|
|
257
|
+
summary?: VideoSummary;
|
|
258
|
+
chapters?: Chapter[];
|
|
259
|
+
shorts: ShortClip[];
|
|
260
|
+
mediumClips: MediumClip[];
|
|
261
|
+
socialPosts: SocialPost[];
|
|
262
|
+
blogPost?: string;
|
|
263
|
+
stageResults: StageResult[];
|
|
264
|
+
totalDuration: number;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Result of the silence removal stage.
|
|
268
|
+
*
|
|
269
|
+
* @property editedPath - Path to the video with silence regions cut out
|
|
270
|
+
* @property removals - Time ranges that were removed (in original video time).
|
|
271
|
+
* Used by {@link adjustTranscript} to shift transcript timestamps.
|
|
272
|
+
* @property keepSegments - Inverse of removals — the time ranges that were kept.
|
|
273
|
+
* Used by the single-pass caption burn to re-create the edit from the original.
|
|
274
|
+
* @property wasEdited - False if no silence was found and the video is unchanged
|
|
275
|
+
*/
|
|
276
|
+
export interface SilenceRemovalResult {
|
|
277
|
+
editedPath: string;
|
|
278
|
+
removals: {
|
|
279
|
+
start: number;
|
|
280
|
+
end: number;
|
|
281
|
+
}[];
|
|
282
|
+
keepSegments: {
|
|
283
|
+
start: number;
|
|
284
|
+
end: number;
|
|
285
|
+
}[];
|
|
286
|
+
wasEdited: boolean;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Standard result wrapper for all Copilot SDK agent calls.
|
|
290
|
+
*
|
|
291
|
+
* @property success - Whether the agent completed its task
|
|
292
|
+
* @property data - The parsed result (type varies by agent)
|
|
293
|
+
* @property error - Error message if the agent failed
|
|
294
|
+
* @property usage - Token counts for cost tracking
|
|
295
|
+
*/
|
|
296
|
+
export interface AgentResult<T = unknown> {
|
|
297
|
+
success: boolean;
|
|
298
|
+
data?: T;
|
|
299
|
+
error?: string;
|
|
300
|
+
usage?: {
|
|
301
|
+
promptTokens: number;
|
|
302
|
+
completionTokens: number;
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for video-auto-note-taker CLI pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Domain types covering transcription, video metadata, short-clip planning,
|
|
5
|
+
* social-media post generation, and end-to-end pipeline orchestration.
|
|
6
|
+
*
|
|
7
|
+
* ### Timestamp convention
|
|
8
|
+
* All `start` and `end` fields are in **seconds from the beginning of the video**
|
|
9
|
+
* (floating-point, e.g. 12.345). This matches Whisper's output format and
|
|
10
|
+
* FFmpeg's `-ss` / `-to` parameters.
|
|
11
|
+
*/
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// PLATFORM
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/** Social-media platforms supported for post generation. */
|
|
16
|
+
export var Platform;
|
|
17
|
+
(function (Platform) {
|
|
18
|
+
Platform["TikTok"] = "tiktok";
|
|
19
|
+
Platform["YouTube"] = "youtube";
|
|
20
|
+
Platform["Instagram"] = "instagram";
|
|
21
|
+
Platform["LinkedIn"] = "linkedin";
|
|
22
|
+
Platform["X"] = "x";
|
|
23
|
+
})(Platform || (Platform = {}));
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// PIPELINE
|
|
26
|
+
// ============================================================================
|
|
27
|
+
export var PipelineStage;
|
|
28
|
+
(function (PipelineStage) {
|
|
29
|
+
PipelineStage["Ingestion"] = "ingestion";
|
|
30
|
+
PipelineStage["Transcription"] = "transcription";
|
|
31
|
+
PipelineStage["SilenceRemoval"] = "silence-removal";
|
|
32
|
+
PipelineStage["Chapters"] = "chapters";
|
|
33
|
+
PipelineStage["Captions"] = "captions";
|
|
34
|
+
PipelineStage["CaptionBurn"] = "caption-burn";
|
|
35
|
+
PipelineStage["Summary"] = "summary";
|
|
36
|
+
PipelineStage["Shorts"] = "shorts";
|
|
37
|
+
PipelineStage["MediumClips"] = "medium-clips";
|
|
38
|
+
PipelineStage["SocialMedia"] = "social-media";
|
|
39
|
+
PipelineStage["ShortPosts"] = "short-posts";
|
|
40
|
+
PipelineStage["MediumClipPosts"] = "medium-clip-posts";
|
|
41
|
+
PipelineStage["Blog"] = "blog";
|
|
42
|
+
PipelineStage["GitPush"] = "git-push";
|
|
43
|
+
})(PipelineStage || (PipelineStage = {}));
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,4DAA4D;AAC5D,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,+BAAmB,CAAA;IACnB,mCAAuB,CAAA;IACvB,iCAAqB,CAAA;IACrB,mBAAO,CAAA;AACT,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AA8PD,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,MAAM,CAAN,IAAY,aAeX;AAfD,WAAY,aAAa;IACvB,wCAAuB,CAAA;IACvB,gDAA+B,CAAA;IAC/B,mDAAkC,CAAA;IAClC,sCAAqB,CAAA;IACrB,sCAAqB,CAAA;IACrB,6CAA4B,CAAA;IAC5B,oCAAmB,CAAA;IACnB,kCAAiB,CAAA;IACjB,6CAA4B,CAAA;IAC5B,6CAA4B,CAAA;IAC5B,2CAA0B,CAAA;IAC1B,sDAAqC,CAAA;IACrC,8BAAa,CAAA;IACb,qCAAoB,CAAA;AACtB,CAAC,EAfW,aAAa,KAAb,aAAa,QAexB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vidpipe",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered pipeline that watches for video recordings and generates transcripts, summaries, short clips, and social media posts",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"vidpipe": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"assets/",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"start": "tsx src/index.ts",
|
|
18
|
+
"build": "tsc && node -e \"const fs=require('fs');const f='dist/index.js';const c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!')){fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)}\"",
|
|
19
|
+
"dev": "tsx watch src/index.ts",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"test:coverage": "vitest run --coverage",
|
|
23
|
+
"test:integration": "vitest run --testPathPattern=integration",
|
|
24
|
+
"test:unit": "vitest run --testPathPattern='__tests__/(?!integration)'"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"video",
|
|
28
|
+
"transcription",
|
|
29
|
+
"ai",
|
|
30
|
+
"notes",
|
|
31
|
+
"copilot"
|
|
32
|
+
],
|
|
33
|
+
"author": "htekdev",
|
|
34
|
+
"license": "ISC",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/htekdev/vidpipe.git"
|
|
38
|
+
},
|
|
39
|
+
"type": "module",
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@github/copilot-sdk": "^0.1.23",
|
|
42
|
+
"chokidar": "^5.0.0",
|
|
43
|
+
"commander": "^14.0.3",
|
|
44
|
+
"dotenv": "^17.2.4",
|
|
45
|
+
"exa-js": "^2.3.0",
|
|
46
|
+
"fluent-ffmpeg": "^2.1.3",
|
|
47
|
+
"openai": "^6.18.0",
|
|
48
|
+
"sharp": "^0.34.5",
|
|
49
|
+
"slugify": "^1.6.6",
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"uuid": "^13.0.0",
|
|
52
|
+
"winston": "^3.19.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/fluent-ffmpeg": "^2.1.28",
|
|
56
|
+
"@types/node": "^25.2.1",
|
|
57
|
+
"@types/sharp": "^0.31.1",
|
|
58
|
+
"@types/uuid": "^10.0.0",
|
|
59
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
60
|
+
"tsx": "^4.21.0",
|
|
61
|
+
"vitest": "^4.0.18"
|
|
62
|
+
}
|
|
63
|
+
}
|