@thunderkiller/video-clipper 1.6.0 → 1.8.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 +21 -8
- package/dist/{cli.d.ts → app/cli/args.d.ts} +2 -2
- package/dist/app/cli/args.d.ts.map +1 -0
- package/dist/{cli.js → app/cli/args.js} +3 -3
- package/dist/app/cli/args.js.map +1 -0
- package/dist/{index.d.ts.map → app/cli/index.d.ts.map} +1 -1
- package/dist/{index.js → app/cli/index.js} +4 -4
- package/dist/app/cli/index.js.map +1 -0
- package/dist/{pipeline → app/cli/pipeline}/dumper.d.ts +1 -1
- package/dist/app/cli/pipeline/dumper.d.ts.map +1 -0
- package/dist/{pipeline → app/cli/pipeline}/dumper.js +2 -2
- package/dist/app/cli/pipeline/dumper.js.map +1 -0
- package/dist/{pipeline → app/cli/pipeline}/runner.d.ts +1 -1
- package/dist/app/cli/pipeline/runner.d.ts.map +1 -0
- package/dist/app/cli/pipeline/runner.js +248 -0
- package/dist/app/cli/pipeline/runner.js.map +1 -0
- package/dist/app/cli/pipeline/stages/audioProcessor.d.ts +17 -0
- package/dist/app/cli/pipeline/stages/audioProcessor.d.ts.map +1 -0
- package/dist/{pipeline → app/cli/pipeline}/stages/audioProcessor.js +17 -32
- package/dist/app/cli/pipeline/stages/audioProcessor.js.map +1 -0
- package/dist/app/cli/pipeline/stages/videoResolver.d.ts +4 -0
- package/dist/app/cli/pipeline/stages/videoResolver.d.ts.map +1 -0
- package/dist/{pipeline → app/cli/pipeline}/stages/videoResolver.js +6 -14
- package/dist/app/cli/pipeline/stages/videoResolver.js.map +1 -0
- package/dist/app/web/lib/activity/analysisActivity.d.ts +20 -0
- package/dist/app/web/lib/activity/analysisActivity.d.ts.map +1 -0
- package/dist/app/web/lib/activity/analysisActivity.js +194 -0
- package/dist/app/web/lib/activity/analysisActivity.js.map +1 -0
- package/dist/app/web/lib/activity/analysisLogging.d.ts +3 -0
- package/dist/app/web/lib/activity/analysisLogging.d.ts.map +1 -0
- package/dist/app/web/lib/activity/analysisLogging.js +17 -0
- package/dist/app/web/lib/activity/analysisLogging.js.map +1 -0
- package/dist/app/web/lib/analysisStream.d.ts +13 -0
- package/dist/app/web/lib/analysisStream.d.ts.map +1 -0
- package/dist/app/web/lib/analysisStream.js +83 -0
- package/dist/app/web/lib/analysisStream.js.map +1 -0
- package/dist/app/web/lib/api.d.ts +3 -0
- package/dist/app/web/lib/api.d.ts.map +1 -0
- package/dist/app/web/lib/api.js +21 -0
- package/dist/app/web/lib/api.js.map +1 -0
- package/dist/app/web/lib/configStore.d.ts +8 -0
- package/dist/app/web/lib/configStore.d.ts.map +1 -0
- package/dist/app/web/lib/configStore.js +67 -0
- package/dist/app/web/lib/configStore.js.map +1 -0
- package/dist/app/web/lib/format.d.ts +3 -0
- package/dist/app/web/lib/format.d.ts.map +1 -0
- package/dist/app/web/lib/format.js +17 -0
- package/dist/app/web/lib/format.js.map +1 -0
- package/dist/app/web/lib/index.d.ts +2 -0
- package/dist/app/web/lib/index.d.ts.map +1 -0
- package/dist/app/web/lib/index.js +2 -0
- package/dist/app/web/lib/index.js.map +1 -0
- package/dist/app/web/lib/services/analysis/analysisService.d.ts +5 -0
- package/dist/app/web/lib/services/analysis/analysisService.d.ts.map +1 -0
- package/dist/app/web/lib/services/analysis/analysisService.js +146 -0
- package/dist/app/web/lib/services/analysis/analysisService.js.map +1 -0
- package/dist/app/web/lib/services/analysis/streamEvents.d.ts +4 -0
- package/dist/app/web/lib/services/analysis/streamEvents.d.ts.map +1 -0
- package/dist/app/web/lib/services/analysis/streamEvents.js +69 -0
- package/dist/app/web/lib/services/analysis/streamEvents.js.map +1 -0
- package/dist/app/web/lib/services/analysis/transcriptService.d.ts +4 -0
- package/dist/app/web/lib/services/analysis/transcriptService.d.ts.map +1 -0
- package/dist/app/web/lib/services/analysis/transcriptService.js +34 -0
- package/dist/app/web/lib/services/analysis/transcriptService.js.map +1 -0
- package/dist/app/web/lib/services/artifacts/artifactStore.d.ts +14 -0
- package/dist/app/web/lib/services/artifacts/artifactStore.d.ts.map +1 -0
- package/dist/app/web/lib/services/artifacts/artifactStore.js +109 -0
- package/dist/app/web/lib/services/artifacts/artifactStore.js.map +1 -0
- package/dist/app/web/lib/services/clipping/clipService.d.ts +4 -0
- package/dist/app/web/lib/services/clipping/clipService.d.ts.map +1 -0
- package/dist/app/web/lib/services/clipping/clipService.js +73 -0
- package/dist/app/web/lib/services/clipping/clipService.js.map +1 -0
- package/dist/app/web/lib/services/config/webConfig.d.ts +10 -0
- package/dist/app/web/lib/services/config/webConfig.d.ts.map +1 -0
- package/dist/app/web/lib/services/config/webConfig.js +12 -0
- package/dist/app/web/lib/services/config/webConfig.js.map +1 -0
- package/dist/app/web/lib/services/http/responses.d.ts +8 -0
- package/dist/app/web/lib/services/http/responses.d.ts.map +1 -0
- package/dist/app/web/lib/services/http/responses.js +23 -0
- package/dist/app/web/lib/services/http/responses.js.map +1 -0
- package/dist/app/web/lib/services/publishing/draftService.d.ts +5 -0
- package/dist/app/web/lib/services/publishing/draftService.d.ts.map +1 -0
- package/dist/app/web/lib/services/publishing/draftService.js +70 -0
- package/dist/app/web/lib/services/publishing/draftService.js.map +1 -0
- package/dist/app/web/lib/services/publishing/metadataCache.d.ts +12 -0
- package/dist/app/web/lib/services/publishing/metadataCache.d.ts.map +1 -0
- package/dist/app/web/lib/services/publishing/metadataCache.js +44 -0
- package/dist/app/web/lib/services/publishing/metadataCache.js.map +1 -0
- package/dist/app/web/lib/services/publishing/metadataService.d.ts +5 -0
- package/dist/app/web/lib/services/publishing/metadataService.d.ts.map +1 -0
- package/dist/app/web/lib/services/publishing/metadataService.js +131 -0
- package/dist/app/web/lib/services/publishing/metadataService.js.map +1 -0
- package/dist/app/web/lib/services/publishing/uploadService.d.ts +9 -0
- package/dist/app/web/lib/services/publishing/uploadService.d.ts.map +1 -0
- package/dist/app/web/lib/services/publishing/uploadService.js +224 -0
- package/dist/app/web/lib/services/publishing/uploadService.js.map +1 -0
- package/dist/app/web/lib/services/publishing/uploadStreamEvents.d.ts +4 -0
- package/dist/app/web/lib/services/publishing/uploadStreamEvents.d.ts.map +1 -0
- package/dist/app/web/lib/services/publishing/uploadStreamEvents.js +45 -0
- package/dist/app/web/lib/services/publishing/uploadStreamEvents.js.map +1 -0
- package/dist/app/web/lib/services/youtube/authStore.d.ts +5 -0
- package/dist/app/web/lib/services/youtube/authStore.d.ts.map +1 -0
- package/dist/app/web/lib/services/youtube/authStore.js +46 -0
- package/dist/app/web/lib/services/youtube/authStore.js.map +1 -0
- package/dist/app/web/lib/services/youtube/catalogFactory.d.ts +3 -0
- package/dist/app/web/lib/services/youtube/catalogFactory.d.ts.map +1 -0
- package/dist/app/web/lib/services/youtube/catalogFactory.js +10 -0
- package/dist/app/web/lib/services/youtube/catalogFactory.js.map +1 -0
- package/dist/app/web/lib/services/youtube/uploadAuth.d.ts +14 -0
- package/dist/app/web/lib/services/youtube/uploadAuth.d.ts.map +1 -0
- package/dist/app/web/lib/services/youtube/uploadAuth.js +194 -0
- package/dist/app/web/lib/services/youtube/uploadAuth.js.map +1 -0
- package/dist/app/web/lib/toastStore.d.ts +9 -0
- package/dist/app/web/lib/toastStore.d.ts.map +1 -0
- package/dist/app/web/lib/toastStore.js +14 -0
- package/dist/app/web/lib/toastStore.js.map +1 -0
- package/dist/app/web/lib/uploadStream.d.ts +19 -0
- package/dist/app/web/lib/uploadStream.d.ts.map +1 -0
- package/dist/app/web/lib/uploadStream.js +68 -0
- package/dist/app/web/lib/uploadStream.js.map +1 -0
- package/dist/app/web/lib/videoWorkflow.d.ts +10 -0
- package/dist/app/web/lib/videoWorkflow.d.ts.map +1 -0
- package/dist/app/web/lib/videoWorkflow.js +39 -0
- package/dist/app/web/lib/videoWorkflow.js.map +1 -0
- package/dist/app/web/routes/api/analysis/transcript/+server.d.ts +3 -0
- package/dist/app/web/routes/api/analysis/transcript/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/analysis/transcript/+server.js +71 -0
- package/dist/app/web/routes/api/analysis/transcript/+server.js.map +1 -0
- package/dist/app/web/routes/api/clips/+server.d.ts +3 -0
- package/dist/app/web/routes/api/clips/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/clips/+server.js +25 -0
- package/dist/app/web/routes/api/clips/+server.js.map +1 -0
- package/dist/app/web/routes/api/config/+server.d.ts +4 -0
- package/dist/app/web/routes/api/config/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/config/+server.js +37 -0
- package/dist/app/web/routes/api/config/+server.js.map +1 -0
- package/dist/app/web/routes/api/library/analyses/+server.d.ts +3 -0
- package/dist/app/web/routes/api/library/analyses/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/library/analyses/+server.js +16 -0
- package/dist/app/web/routes/api/library/analyses/+server.js.map +1 -0
- package/dist/app/web/routes/api/library/analyses/[analysisId]/+server.d.ts +3 -0
- package/dist/app/web/routes/api/library/analyses/[analysisId]/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/library/analyses/[analysisId]/+server.js +31 -0
- package/dist/app/web/routes/api/library/analyses/[analysisId]/+server.js.map +1 -0
- package/dist/app/web/routes/api/library/clips/+server.d.ts +3 -0
- package/dist/app/web/routes/api/library/clips/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/library/clips/+server.js +29 -0
- package/dist/app/web/routes/api/library/clips/+server.js.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/+server.d.ts +3 -0
- package/dist/app/web/routes/api/publish/drafts/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/+server.js +23 -0
- package/dist/app/web/routes/api/publish/drafts/+server.js.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/[analysisId]/+server.d.ts +3 -0
- package/dist/app/web/routes/api/publish/drafts/[analysisId]/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/[analysisId]/+server.js +34 -0
- package/dist/app/web/routes/api/publish/drafts/[analysisId]/+server.js.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/generate/+server.d.ts +3 -0
- package/dist/app/web/routes/api/publish/drafts/generate/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/publish/drafts/generate/+server.js +33 -0
- package/dist/app/web/routes/api/publish/drafts/generate/+server.js.map +1 -0
- package/dist/app/web/routes/api/publish/thumbnails/+server.d.ts +3 -0
- package/dist/app/web/routes/api/publish/thumbnails/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/publish/thumbnails/+server.js +53 -0
- package/dist/app/web/routes/api/publish/thumbnails/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/callback/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/auth/callback/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/callback/+server.js +49 -0
- package/dist/app/web/routes/api/youtube/auth/callback/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/disconnect/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/auth/disconnect/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/disconnect/+server.js +16 -0
- package/dist/app/web/routes/api/youtube/auth/disconnect/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/manual/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/auth/manual/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/manual/+server.js +23 -0
- package/dist/app/web/routes/api/youtube/auth/manual/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/start/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/auth/start/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/start/+server.js +43 -0
- package/dist/app/web/routes/api/youtube/auth/start/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/status/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/auth/status/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/auth/status/+server.js +16 -0
- package/dist/app/web/routes/api/youtube/auth/status/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/channels/[channelId]/videos/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/channels/[channelId]/videos/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/channels/[channelId]/videos/+server.js +32 -0
- package/dist/app/web/routes/api/youtube/channels/[channelId]/videos/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/channels/resolve/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/channels/resolve/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/channels/resolve/+server.js +27 -0
- package/dist/app/web/routes/api/youtube/channels/resolve/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/uploads/+server.d.ts +5 -0
- package/dist/app/web/routes/api/youtube/uploads/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/uploads/+server.js +107 -0
- package/dist/app/web/routes/api/youtube/uploads/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/+server.js +28 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/+server.js.map +1 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/transcript/+server.d.ts +3 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/transcript/+server.d.ts.map +1 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/transcript/+server.js +27 -0
- package/dist/app/web/routes/api/youtube/videos/[videoId]/transcript/+server.js.map +1 -0
- package/dist/app/web/routes/videos/[videoId]/analysis/[analysisId]/+layout.server.d.ts +13 -0
- package/dist/app/web/routes/videos/[videoId]/analysis/[analysisId]/+layout.server.d.ts.map +1 -0
- package/dist/app/web/routes/videos/[videoId]/analysis/[analysisId]/+layout.server.js +50 -0
- package/dist/app/web/routes/videos/[videoId]/analysis/[analysisId]/+layout.server.js.map +1 -0
- package/dist/app/web/types/activity.d.ts +20 -0
- package/dist/app/web/types/activity.d.ts.map +1 -0
- package/dist/app/web/types/activity.js +2 -0
- package/dist/app/web/types/activity.js.map +1 -0
- package/dist/app/web/types/analysis.d.ts +152 -0
- package/dist/app/web/types/analysis.d.ts.map +1 -0
- package/dist/app/web/types/analysis.js +75 -0
- package/dist/app/web/types/analysis.js.map +1 -0
- package/dist/app/web/types/publish.d.ts +266 -0
- package/dist/app/web/types/publish.d.ts.map +1 -0
- package/dist/app/web/types/publish.js +126 -0
- package/dist/app/web/types/publish.js.map +1 -0
- package/dist/app/web/types/web.d.ts +9 -0
- package/dist/app/web/types/web.d.ts.map +1 -0
- package/dist/app/web/types/web.js +8 -0
- package/dist/app/web/types/web.js.map +1 -0
- package/dist/hooks.server.d.ts +3 -0
- package/dist/hooks.server.d.ts.map +1 -0
- package/dist/hooks.server.js +11 -0
- package/dist/hooks.server.js.map +1 -0
- package/dist/lib/config/env.d.ts +11 -0
- package/dist/lib/config/env.d.ts.map +1 -0
- package/dist/lib/config/env.js +81 -0
- package/dist/lib/config/env.js.map +1 -0
- package/dist/lib/config/fileStore.d.ts +5 -0
- package/dist/lib/config/fileStore.d.ts.map +1 -0
- package/dist/lib/config/fileStore.js +34 -0
- package/dist/lib/config/fileStore.js.map +1 -0
- package/dist/lib/config/index.d.ts +4 -0
- package/dist/lib/config/index.d.ts.map +1 -0
- package/dist/lib/config/index.js +3 -0
- package/dist/lib/config/index.js.map +1 -0
- package/dist/lib/config/registry.d.ts +25 -0
- package/dist/lib/config/registry.d.ts.map +1 -0
- package/dist/lib/config/registry.js +148 -0
- package/dist/lib/config/registry.js.map +1 -0
- package/dist/lib/index.d.ts +59 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +53 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/pipeline/stages/clipExporter.d.ts +10 -0
- package/dist/lib/pipeline/stages/clipExporter.d.ts.map +1 -0
- package/dist/{pipeline → lib/pipeline}/stages/clipExporter.js +10 -21
- package/dist/lib/pipeline/stages/clipExporter.js.map +1 -0
- package/dist/lib/pipeline/stages/segmentAnalyzer.d.ts +5 -0
- package/dist/lib/pipeline/stages/segmentAnalyzer.d.ts.map +1 -0
- package/dist/lib/pipeline/stages/segmentAnalyzer.js +40 -0
- package/dist/lib/pipeline/stages/segmentAnalyzer.js.map +1 -0
- package/dist/lib/pipeline/stages/segmentSelector.d.ts.map +1 -0
- package/dist/{pipeline → lib/pipeline}/stages/segmentSelector.js +2 -2
- package/dist/lib/pipeline/stages/segmentSelector.js.map +1 -0
- package/dist/lib/services/analysis/index.d.ts +9 -0
- package/dist/lib/services/analysis/index.d.ts.map +1 -0
- package/dist/lib/services/analysis/index.js +7 -0
- package/dist/lib/services/analysis/index.js.map +1 -0
- package/dist/lib/services/analysis/llm/LLMAnalyzer.d.ts +18 -0
- package/dist/lib/services/analysis/llm/LLMAnalyzer.d.ts.map +1 -0
- package/dist/lib/services/analysis/llm/LLMAnalyzer.js +66 -0
- package/dist/lib/services/analysis/llm/LLMAnalyzer.js.map +1 -0
- package/dist/lib/services/analysis/llm/index.d.ts +12 -0
- package/dist/lib/services/analysis/llm/index.d.ts.map +1 -0
- package/dist/{services/llmAnalyzer → lib/services/analysis/llm}/index.js +83 -62
- package/dist/lib/services/analysis/llm/index.js.map +1 -0
- package/dist/{services/segmentRanker → lib/services/analysis/ranker}/index.d.ts +2 -2
- package/dist/lib/services/analysis/ranker/index.d.ts.map +1 -0
- package/dist/{services/segmentRanker → lib/services/analysis/ranker}/index.js +4 -5
- package/dist/lib/services/analysis/ranker/index.js.map +1 -0
- package/dist/lib/services/analysis/refiner/index.d.ts +13 -0
- package/dist/lib/services/analysis/refiner/index.d.ts.map +1 -0
- package/dist/{services/clipRefiner → lib/services/analysis/refiner}/index.js +47 -37
- package/dist/lib/services/analysis/refiner/index.js.map +1 -0
- package/dist/{services/chunkBuilder → lib/services/analysis/transcript/chunker}/index.d.ts +1 -1
- package/dist/lib/services/analysis/transcript/chunker/index.d.ts.map +1 -0
- package/dist/lib/services/analysis/transcript/chunker/index.js.map +1 -0
- package/dist/{services/transcriptDetector/index.d.ts → lib/services/analysis/transcript/detector.d.ts} +8 -5
- package/dist/lib/services/analysis/transcript/detector.d.ts.map +1 -0
- package/dist/{services/transcriptDetector/index.js → lib/services/analysis/transcript/detector.js} +12 -7
- package/dist/lib/services/analysis/transcript/detector.js.map +1 -0
- package/dist/lib/services/analysis/transcript/index.d.ts +5 -0
- package/dist/lib/services/analysis/transcript/index.d.ts.map +1 -0
- package/dist/lib/services/analysis/transcript/index.js +4 -0
- package/dist/lib/services/analysis/transcript/index.js.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/base.d.ts +2 -2
- package/dist/lib/services/audio/analyzer/base.d.ts.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/base.js +1 -1
- package/dist/lib/services/audio/analyzer/base.js.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/factory.d.ts +8 -2
- package/dist/lib/services/audio/analyzer/factory.d.ts.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/factory.js +5 -5
- package/dist/lib/services/audio/analyzer/factory.js.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/gemini.d.ts +8 -1
- package/dist/lib/services/audio/analyzer/gemini.d.ts.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/gemini.js +10 -6
- package/dist/lib/services/audio/analyzer/gemini.js.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/index.d.ts +1 -0
- package/dist/lib/services/audio/analyzer/index.d.ts.map +1 -0
- package/dist/lib/services/audio/analyzer/index.js.map +1 -0
- package/dist/lib/services/audio/analyzer/whisper.d.ts +10 -0
- package/dist/lib/services/audio/analyzer/whisper.d.ts.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/whisper.js +11 -11
- package/dist/lib/services/audio/analyzer/whisper.js.map +1 -0
- package/dist/lib/services/audio/analyzer/yamnet.d.ts +9 -0
- package/dist/lib/services/audio/analyzer/yamnet.d.ts.map +1 -0
- package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/yamnet.js +8 -10
- package/dist/lib/services/audio/analyzer/yamnet.js.map +1 -0
- package/dist/lib/services/audio/index.d.ts +9 -0
- package/dist/lib/services/audio/index.d.ts.map +1 -0
- package/dist/lib/services/audio/index.js +7 -0
- package/dist/lib/services/audio/index.js.map +1 -0
- package/dist/{services/eventDetector/index.d.ts → lib/services/audio/processor/detector.d.ts} +3 -3
- package/dist/lib/services/audio/processor/detector.d.ts.map +1 -0
- package/dist/{services/eventDetector/index.js → lib/services/audio/processor/detector.js} +2 -2
- package/dist/lib/services/audio/processor/detector.js.map +1 -0
- package/dist/lib/services/audio/processor/slicer.d.ts +6 -0
- package/dist/lib/services/audio/processor/slicer.d.ts.map +1 -0
- package/dist/{services/audioDownloader/sliceAudio.js → lib/services/audio/processor/slicer.js} +8 -9
- package/dist/lib/services/audio/processor/slicer.js.map +1 -0
- package/dist/lib/services/audio/source/index.d.ts +3 -0
- package/dist/lib/services/audio/source/index.d.ts.map +1 -0
- package/dist/lib/services/audio/source/index.js +2 -0
- package/dist/lib/services/audio/source/index.js.map +1 -0
- package/dist/lib/services/audio/source/types.d.ts +5 -0
- package/dist/lib/services/audio/source/types.d.ts.map +1 -0
- package/dist/lib/services/audio/source/types.js +2 -0
- package/dist/lib/services/audio/source/types.js.map +1 -0
- package/dist/lib/services/audio/source/youtube.d.ts +4 -0
- package/dist/lib/services/audio/source/youtube.d.ts.map +1 -0
- package/dist/{services/audioDownloader/index.js → lib/services/audio/source/youtube.js} +36 -31
- package/dist/lib/services/audio/source/youtube.js.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/base.d.ts +2 -2
- package/dist/lib/services/audio/transcriber/base.d.ts.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/base.js +1 -1
- package/dist/lib/services/audio/transcriber/base.js.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/factory.d.ts +4 -2
- package/dist/lib/services/audio/transcriber/factory.d.ts.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/factory.js +5 -5
- package/dist/lib/services/audio/transcriber/factory.js.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/gemini.d.ts +1 -1
- package/dist/lib/services/audio/transcriber/gemini.d.ts.map +1 -0
- package/dist/lib/services/audio/transcriber/gemini.js.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/index.d.ts +1 -0
- package/dist/lib/services/audio/transcriber/index.d.ts.map +1 -0
- package/dist/lib/services/audio/transcriber/index.js.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/whisper.d.ts +3 -1
- package/dist/lib/services/audio/transcriber/whisper.d.ts.map +1 -0
- package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/whisper.js +8 -4
- package/dist/lib/services/audio/transcriber/whisper.js.map +1 -0
- package/dist/{services/clipGenerator → lib/services/video/clipper}/index.d.ts +21 -3
- package/dist/lib/services/video/clipper/index.d.ts.map +1 -0
- package/dist/{services/clipGenerator → lib/services/video/clipper}/index.js +96 -22
- package/dist/lib/services/video/clipper/index.js.map +1 -0
- package/dist/lib/services/video/index.d.ts +13 -0
- package/dist/lib/services/video/index.d.ts.map +1 -0
- package/dist/lib/services/video/index.js +9 -0
- package/dist/lib/services/video/index.js.map +1 -0
- package/dist/lib/services/video/source/index.d.ts +8 -0
- package/dist/lib/services/video/source/index.d.ts.map +1 -0
- package/dist/lib/services/video/source/index.js +6 -0
- package/dist/lib/services/video/source/index.js.map +1 -0
- package/dist/lib/services/video/source/types.d.ts +12 -0
- package/dist/lib/services/video/source/types.d.ts.map +1 -0
- package/dist/lib/services/video/source/types.js +2 -0
- package/dist/lib/services/video/source/types.js.map +1 -0
- package/dist/lib/services/video/source/youtube/catalog.d.ts +28 -0
- package/dist/lib/services/video/source/youtube/catalog.d.ts.map +1 -0
- package/dist/lib/services/video/source/youtube/catalog.js +177 -0
- package/dist/lib/services/video/source/youtube/catalog.js.map +1 -0
- package/dist/{services/videoDownloader/index.d.ts → lib/services/video/source/youtube/downloader.d.ts} +6 -4
- package/dist/lib/services/video/source/youtube/downloader.d.ts.map +1 -0
- package/dist/{services/videoDownloader/index.js → lib/services/video/source/youtube/downloader.js} +104 -50
- package/dist/lib/services/video/source/youtube/downloader.js.map +1 -0
- package/dist/lib/services/video/source/youtube/metadata.d.ts +14 -0
- package/dist/lib/services/video/source/youtube/metadata.d.ts.map +1 -0
- package/dist/{services/metadataExtractor/index.js → lib/services/video/source/youtube/metadata.js} +11 -15
- package/dist/lib/services/video/source/youtube/metadata.js.map +1 -0
- package/dist/{services/urlParser/index.d.ts → lib/services/video/source/youtube/parser.d.ts} +1 -1
- package/dist/lib/services/video/source/youtube/parser.d.ts.map +1 -0
- package/dist/{services/urlParser/index.js → lib/services/video/source/youtube/parser.js} +1 -1
- package/dist/lib/services/video/source/youtube/parser.js.map +1 -0
- package/dist/lib/services/video/source/youtube/subtitles.d.ts +61 -0
- package/dist/lib/services/video/source/youtube/subtitles.d.ts.map +1 -0
- package/dist/lib/services/video/source/youtube/subtitles.js +340 -0
- package/dist/lib/services/video/source/youtube/subtitles.js.map +1 -0
- package/dist/lib/types/analyzer.d.ts +32 -0
- package/dist/lib/types/analyzer.d.ts.map +1 -0
- package/dist/{types → lib/types}/analyzer.js.map +1 -1
- package/dist/{types → lib/types}/audio.d.ts +1 -1
- package/dist/lib/types/audio.d.ts.map +1 -0
- package/dist/lib/types/audio.js.map +1 -0
- package/dist/lib/types/cache.d.ts.map +1 -0
- package/dist/lib/types/cache.js.map +1 -0
- package/dist/lib/types/cli.d.ts.map +1 -0
- package/dist/lib/types/cli.js.map +1 -0
- package/dist/lib/types/config.d.ts +171 -0
- package/dist/lib/types/config.d.ts.map +1 -0
- package/dist/lib/types/config.js +462 -0
- package/dist/lib/types/config.js.map +1 -0
- package/dist/lib/types/downloader.d.ts +32 -0
- package/dist/lib/types/downloader.d.ts.map +1 -0
- package/dist/{types → lib/types}/downloader.js.map +1 -1
- package/dist/lib/types/factory.d.ts.map +1 -0
- package/dist/{types → lib/types}/factory.js.map +1 -1
- package/dist/{types → lib/types}/index.d.ts +10 -7
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/{types → lib/types}/index.js +2 -1
- package/dist/lib/types/index.js.map +1 -0
- package/dist/{types → lib/types}/pipeline.d.ts +21 -0
- package/dist/lib/types/pipeline.d.ts.map +1 -0
- package/dist/{types → lib/types}/pipeline.js.map +1 -1
- package/dist/{types → lib/types}/segment.d.ts +1 -1
- package/dist/lib/types/segment.d.ts.map +1 -0
- package/dist/lib/types/segment.js.map +1 -0
- package/dist/lib/types/transcript.d.ts.map +1 -0
- package/dist/lib/types/transcript.js.map +1 -0
- package/dist/{types → lib/types}/video.d.ts +11 -1
- package/dist/lib/types/video.d.ts.map +1 -0
- package/dist/lib/types/video.js.map +1 -0
- package/dist/lib/types/youtube.d.ts +89 -0
- package/dist/lib/types/youtube.d.ts.map +1 -0
- package/dist/lib/types/youtube.js +43 -0
- package/dist/lib/types/youtube.js.map +1 -0
- package/dist/lib/utils/cache.d.ts.map +1 -0
- package/dist/lib/utils/cache.js.map +1 -0
- package/dist/lib/utils/cacheBackend.d.ts.map +1 -0
- package/dist/lib/utils/cacheBackend.js.map +1 -0
- package/dist/lib/utils/cacheFactory.d.ts.map +1 -0
- package/dist/lib/utils/cacheFactory.js.map +1 -0
- package/dist/lib/utils/chunker.d.ts.map +1 -0
- package/dist/lib/utils/chunker.js.map +1 -0
- package/dist/lib/utils/fileCacheBackend.d.ts.map +1 -0
- package/dist/lib/utils/fileCacheBackend.js.map +1 -0
- package/dist/lib/utils/format.d.ts.map +1 -0
- package/dist/lib/utils/format.js.map +1 -0
- package/dist/lib/utils/logger.d.ts +10 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +54 -0
- package/dist/lib/utils/logger.js.map +1 -0
- package/dist/lib/utils/modelFactory.d.ts +9 -0
- package/dist/lib/utils/modelFactory.d.ts.map +1 -0
- package/dist/lib/utils/modelFactory.js +45 -0
- package/dist/lib/utils/modelFactory.js.map +1 -0
- package/dist/lib/utils/mongoCacheBackend.d.ts.map +1 -0
- package/dist/lib/utils/mongoCacheBackend.js.map +1 -0
- package/dist/lib/utils/paths.d.ts.map +1 -0
- package/dist/lib/utils/paths.js.map +1 -0
- package/dist/lib/utils/pythonBin.d.ts.map +1 -0
- package/dist/lib/utils/pythonBin.js.map +1 -0
- package/dist/lib/utils/retryAsync.d.ts +19 -0
- package/dist/lib/utils/retryAsync.d.ts.map +1 -0
- package/dist/lib/utils/retryAsync.js +38 -0
- package/dist/lib/utils/retryAsync.js.map +1 -0
- package/package.json +55 -16
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config/env.d.ts +0 -53
- package/dist/config/env.d.ts.map +0 -1
- package/dist/config/env.js +0 -15
- package/dist/config/env.js.map +0 -1
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -2
- package/dist/config/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib.d.ts +0 -17
- package/dist/lib.d.ts.map +0 -1
- package/dist/lib.js +0 -17
- package/dist/lib.js.map +0 -1
- package/dist/pipeline/dumper.d.ts.map +0 -1
- package/dist/pipeline/dumper.js.map +0 -1
- package/dist/pipeline/runner.d.ts.map +0 -1
- package/dist/pipeline/runner.js +0 -132
- package/dist/pipeline/runner.js.map +0 -1
- package/dist/pipeline/stages/audioProcessor.d.ts +0 -19
- package/dist/pipeline/stages/audioProcessor.d.ts.map +0 -1
- package/dist/pipeline/stages/audioProcessor.js.map +0 -1
- package/dist/pipeline/stages/clipExporter.d.ts +0 -14
- package/dist/pipeline/stages/clipExporter.d.ts.map +0 -1
- package/dist/pipeline/stages/clipExporter.js.map +0 -1
- package/dist/pipeline/stages/segmentAnalyzer.d.ts +0 -26
- package/dist/pipeline/stages/segmentAnalyzer.d.ts.map +0 -1
- package/dist/pipeline/stages/segmentAnalyzer.js +0 -47
- package/dist/pipeline/stages/segmentAnalyzer.js.map +0 -1
- package/dist/pipeline/stages/segmentSelector.d.ts.map +0 -1
- package/dist/pipeline/stages/segmentSelector.js.map +0 -1
- package/dist/pipeline/stages/videoResolver.d.ts +0 -11
- package/dist/pipeline/stages/videoResolver.d.ts.map +0 -1
- package/dist/pipeline/stages/videoResolver.js.map +0 -1
- package/dist/services/audioAnalyzers/base.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/base.js.map +0 -1
- package/dist/services/audioAnalyzers/factory.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/factory.js.map +0 -1
- package/dist/services/audioAnalyzers/gemini.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/gemini.js.map +0 -1
- package/dist/services/audioAnalyzers/index.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/index.js.map +0 -1
- package/dist/services/audioAnalyzers/whisper.d.ts +0 -13
- package/dist/services/audioAnalyzers/whisper.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/whisper.js.map +0 -1
- package/dist/services/audioAnalyzers/yamnet.d.ts +0 -13
- package/dist/services/audioAnalyzers/yamnet.d.ts.map +0 -1
- package/dist/services/audioAnalyzers/yamnet.js.map +0 -1
- package/dist/services/audioDownloader/index.d.ts +0 -2
- package/dist/services/audioDownloader/index.d.ts.map +0 -1
- package/dist/services/audioDownloader/index.js.map +0 -1
- package/dist/services/audioDownloader/sliceAudio.d.ts +0 -2
- package/dist/services/audioDownloader/sliceAudio.d.ts.map +0 -1
- package/dist/services/audioDownloader/sliceAudio.js.map +0 -1
- package/dist/services/chunkBuilder/index.d.ts.map +0 -1
- package/dist/services/chunkBuilder/index.js.map +0 -1
- package/dist/services/clipGenerator/index.d.ts.map +0 -1
- package/dist/services/clipGenerator/index.js.map +0 -1
- package/dist/services/clipRefiner/index.d.ts +0 -10
- package/dist/services/clipRefiner/index.d.ts.map +0 -1
- package/dist/services/clipRefiner/index.js.map +0 -1
- package/dist/services/eventDetector/index.d.ts.map +0 -1
- package/dist/services/eventDetector/index.js.map +0 -1
- package/dist/services/llmAnalyzer/LLMAnalyzer.d.ts +0 -41
- package/dist/services/llmAnalyzer/LLMAnalyzer.d.ts.map +0 -1
- package/dist/services/llmAnalyzer/LLMAnalyzer.js +0 -62
- package/dist/services/llmAnalyzer/LLMAnalyzer.js.map +0 -1
- package/dist/services/llmAnalyzer/index.d.ts +0 -9
- package/dist/services/llmAnalyzer/index.d.ts.map +0 -1
- package/dist/services/llmAnalyzer/index.js.map +0 -1
- package/dist/services/metadataExtractor/index.d.ts +0 -12
- package/dist/services/metadataExtractor/index.d.ts.map +0 -1
- package/dist/services/metadataExtractor/index.js.map +0 -1
- package/dist/services/segmentRanker/index.d.ts.map +0 -1
- package/dist/services/segmentRanker/index.js.map +0 -1
- package/dist/services/transcriptAnalyzers/base.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/base.js.map +0 -1
- package/dist/services/transcriptAnalyzers/factory.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/factory.js.map +0 -1
- package/dist/services/transcriptAnalyzers/gemini.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/gemini.js.map +0 -1
- package/dist/services/transcriptAnalyzers/index.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/index.js.map +0 -1
- package/dist/services/transcriptAnalyzers/whisper.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/whisper.js.map +0 -1
- package/dist/services/transcriptAnalyzers/ytdlp.d.ts +0 -26
- package/dist/services/transcriptAnalyzers/ytdlp.d.ts.map +0 -1
- package/dist/services/transcriptAnalyzers/ytdlp.js +0 -136
- package/dist/services/transcriptAnalyzers/ytdlp.js.map +0 -1
- package/dist/services/transcriptDetector/index.d.ts.map +0 -1
- package/dist/services/transcriptDetector/index.js.map +0 -1
- package/dist/services/urlParser/index.d.ts.map +0 -1
- package/dist/services/urlParser/index.js.map +0 -1
- package/dist/services/videoDownloader/index.d.ts.map +0 -1
- package/dist/services/videoDownloader/index.js.map +0 -1
- package/dist/types/analyzer.d.ts +0 -22
- package/dist/types/analyzer.d.ts.map +0 -1
- package/dist/types/audio.d.ts.map +0 -1
- package/dist/types/audio.js.map +0 -1
- package/dist/types/cache.d.ts.map +0 -1
- package/dist/types/cache.js.map +0 -1
- package/dist/types/cli.d.ts.map +0 -1
- package/dist/types/cli.js.map +0 -1
- package/dist/types/config.d.ts +0 -94
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -140
- package/dist/types/config.js.map +0 -1
- package/dist/types/downloader.d.ts +0 -11
- package/dist/types/downloader.d.ts.map +0 -1
- package/dist/types/factory.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/pipeline.d.ts.map +0 -1
- package/dist/types/segment.d.ts.map +0 -1
- package/dist/types/segment.js.map +0 -1
- package/dist/types/transcript.d.ts.map +0 -1
- package/dist/types/transcript.js.map +0 -1
- package/dist/types/video.d.ts.map +0 -1
- package/dist/types/video.js.map +0 -1
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/cacheBackend.d.ts.map +0 -1
- package/dist/utils/cacheBackend.js.map +0 -1
- package/dist/utils/cacheFactory.d.ts.map +0 -1
- package/dist/utils/cacheFactory.js.map +0 -1
- package/dist/utils/chunker.d.ts.map +0 -1
- package/dist/utils/chunker.js.map +0 -1
- package/dist/utils/fileCacheBackend.d.ts.map +0 -1
- package/dist/utils/fileCacheBackend.js.map +0 -1
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -7
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -27
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/modelFactory.d.ts +0 -14
- package/dist/utils/modelFactory.d.ts.map +0 -1
- package/dist/utils/modelFactory.js +0 -61
- package/dist/utils/modelFactory.js.map +0 -1
- package/dist/utils/mongoCacheBackend.d.ts.map +0 -1
- package/dist/utils/mongoCacheBackend.js.map +0 -1
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/pythonBin.d.ts.map +0 -1
- package/dist/utils/pythonBin.js.map +0 -1
- /package/dist/{index.d.ts → app/cli/index.d.ts} +0 -0
- /package/dist/{pipeline → lib/pipeline}/stages/segmentSelector.d.ts +0 -0
- /package/dist/{services/chunkBuilder → lib/services/analysis/transcript/chunker}/index.js +0 -0
- /package/dist/{services/audioAnalyzers → lib/services/audio/analyzer}/index.js +0 -0
- /package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/gemini.js +0 -0
- /package/dist/{services/transcriptAnalyzers → lib/services/audio/transcriber}/index.js +0 -0
- /package/dist/{types → lib/types}/analyzer.js +0 -0
- /package/dist/{types → lib/types}/audio.js +0 -0
- /package/dist/{types → lib/types}/cache.d.ts +0 -0
- /package/dist/{types → lib/types}/cache.js +0 -0
- /package/dist/{types → lib/types}/cli.d.ts +0 -0
- /package/dist/{types → lib/types}/cli.js +0 -0
- /package/dist/{types → lib/types}/downloader.js +0 -0
- /package/dist/{types → lib/types}/factory.d.ts +0 -0
- /package/dist/{types → lib/types}/factory.js +0 -0
- /package/dist/{types → lib/types}/pipeline.js +0 -0
- /package/dist/{types → lib/types}/segment.js +0 -0
- /package/dist/{types → lib/types}/transcript.d.ts +0 -0
- /package/dist/{types → lib/types}/transcript.js +0 -0
- /package/dist/{types → lib/types}/video.js +0 -0
- /package/dist/{utils → lib/utils}/cache.d.ts +0 -0
- /package/dist/{utils → lib/utils}/cache.js +0 -0
- /package/dist/{utils → lib/utils}/cacheBackend.d.ts +0 -0
- /package/dist/{utils → lib/utils}/cacheBackend.js +0 -0
- /package/dist/{utils → lib/utils}/cacheFactory.d.ts +0 -0
- /package/dist/{utils → lib/utils}/cacheFactory.js +0 -0
- /package/dist/{utils → lib/utils}/chunker.d.ts +0 -0
- /package/dist/{utils → lib/utils}/chunker.js +0 -0
- /package/dist/{utils → lib/utils}/fileCacheBackend.d.ts +0 -0
- /package/dist/{utils → lib/utils}/fileCacheBackend.js +0 -0
- /package/dist/{utils → lib/utils}/format.d.ts +0 -0
- /package/dist/{utils → lib/utils}/format.js +0 -0
- /package/dist/{utils → lib/utils}/mongoCacheBackend.d.ts +0 -0
- /package/dist/{utils → lib/utils}/mongoCacheBackend.js +0 -0
- /package/dist/{utils → lib/utils}/paths.d.ts +0 -0
- /package/dist/{utils → lib/utils}/paths.js +0 -0
- /package/dist/{utils → lib/utils}/pythonBin.d.ts +0 -0
- /package/dist/{utils → lib/utils}/pythonBin.js +0 -0
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,13 +141,22 @@ 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
|
-
| Doc | Description
|
|
143
|
-
| ------------------------------------------------ |
|
|
144
|
-
| [docs/configuration.md](docs/configuration.md) | Full environment variable reference, provider setup, FFmpeg presets
|
|
145
|
-
| [docs/advanced-usage.md](docs/advanced-usage.md) | Advanced CLI examples, caching, pre-downloaded videos
|
|
146
|
-
| [docs/audio-sync.md](docs/audio-sync.md) | Audio/video sync troubleshooting and `TIMESTAMP_OFFSET_SECONDS` guide
|
|
147
|
-
| [docs/yt-downloader.md](docs/yt-downloader.md) | yt-dlp download modes
|
|
148
|
-
| [docs/free-models.md](docs/free-models.md) | Free models that work well with this tool
|
|
149
|
-
| [docs/plan.md](docs/plan.md) | Full architecture and pipeline design
|
|
155
|
+
| Doc | Description |
|
|
156
|
+
| ------------------------------------------------ | --------------------------------------------------------------------------------------------- |
|
|
157
|
+
| [docs/configuration.md](docs/configuration.md) | Full environment variable reference, provider setup, FFmpeg presets, yt-dlp cookie auth guide |
|
|
158
|
+
| [docs/advanced-usage.md](docs/advanced-usage.md) | Advanced CLI examples, caching, pre-downloaded videos |
|
|
159
|
+
| [docs/audio-sync.md](docs/audio-sync.md) | Audio/video sync troubleshooting and `TIMESTAMP_OFFSET_SECONDS` guide |
|
|
160
|
+
| [docs/yt-downloader.md](docs/yt-downloader.md) | yt-dlp download modes, transcript bot-detection errors, and cookie troubleshooting |
|
|
161
|
+
| [docs/free-models.md](docs/free-models.md) | Free models that work well with this tool |
|
|
162
|
+
| [docs/plan.md](docs/plan.md) | Full architecture and pipeline design |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CliArgs } from '
|
|
1
|
+
import type { CliArgs } from '../../lib/types/index.js';
|
|
2
2
|
export type { CliArgs };
|
|
3
3
|
export declare function parseArgs(argv: string[]): CliArgs;
|
|
4
4
|
export declare function printUsage(): void;
|
|
5
|
-
//# sourceMappingURL=
|
|
5
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/app/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,YAAY,EAAE,OAAO,EAAE,CAAC;AAMxB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA+HjD;AAMD,wBAAgB,UAAU,IAAI,IAAI,CA0CjC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { config } from '
|
|
2
|
-
import { log } from '
|
|
1
|
+
import { config } from '../../lib/config/index.js';
|
|
2
|
+
import { log } from '../../lib/utils/logger.js';
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Argument parser
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
@@ -185,4 +185,4 @@ Examples:
|
|
|
185
185
|
npm run start -- https://youtube.com/watch?v=dQw4w9WgXcQ --max-parallel 5
|
|
186
186
|
`.trim());
|
|
187
187
|
}
|
|
188
|
-
//# sourceMappingURL=
|
|
188
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/app/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { log } from '
|
|
3
|
-
import { formatConfig } from '
|
|
4
|
-
import { config } from '
|
|
5
|
-
import { parseArgs, printUsage } from './
|
|
2
|
+
import { log } from '../../lib/utils/logger.js';
|
|
3
|
+
import { formatConfig } from '../../lib/utils/format.js';
|
|
4
|
+
import { config } from '../../lib/config/index.js';
|
|
5
|
+
import { parseArgs, printUsage } from './args.js';
|
|
6
6
|
import { runPipeline } from './pipeline/runner.js';
|
|
7
7
|
const args = parseArgs(process.argv);
|
|
8
8
|
if (args.help) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAErC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtC,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAChD,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC7C,GAAG,CAAC,IAAI,CACN,8FAA8F,CAC/F,CAAC;AACJ,CAAC;AAED,GAAG,CAAC,IAAI,CACN,kCAAkC,MAAM,CAAC,SAAS,GAAG;IACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,KAAK;QACrE,CAAC,CAAC,0BAA0B,IAAI,CAAC,gBAAgB,GAAG;QACpD,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/D,CAAC;AACF,GAAG,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5C,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dumper.d.ts","sourceRoot":"","sources":["../../../../src/app/cli/pipeline/dumper.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1E;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import { config } from '
|
|
4
|
-
import { log } from '
|
|
3
|
+
import { config } from '../../../lib/config/index.js';
|
|
4
|
+
import { log } from '../../../lib/utils/logger.js';
|
|
5
5
|
/**
|
|
6
6
|
* Writes the raw normalized transcript lines to
|
|
7
7
|
* `{OUTPUT_DIR}/transcript/{videoId}.json`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dumper.js","sourceRoot":"","sources":["../../../../src/app/cli/pipeline/dumper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAG3C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,KAAuB;IAC3E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,iCAAiC,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAAsB;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,+BAA+B,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/app/cli/pipeline/runner.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,qBAAqB,CAAC;AAenE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuO9D"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { config } from '../../../lib/config/index.js';
|
|
3
|
+
import { Cache } from '../../../lib/utils/cache.js';
|
|
4
|
+
import { createCacheBackend } from '../../../lib/utils/cacheFactory.js';
|
|
5
|
+
import { log } from '../../../lib/utils/logger.js';
|
|
6
|
+
import { getModel } from '../../../lib/utils/modelFactory.js';
|
|
7
|
+
import { dumpAnalysis, dumpTranscript } from './dumper.js';
|
|
8
|
+
import { resolveVideo } from './stages/videoResolver.js';
|
|
9
|
+
import { processAudio } from './stages/audioProcessor.js';
|
|
10
|
+
import { analyzeSegments, refineRankedSegments } from '../../../lib/pipeline/stages/segmentAnalyzer.js';
|
|
11
|
+
import { selectSegments } from '../../../lib/pipeline/stages/segmentSelector.js';
|
|
12
|
+
import { exportClips } from '../../../lib/pipeline/stages/clipExporter.js';
|
|
13
|
+
import { downloadAudio } from '../../../lib/services/audio/source/youtube.js';
|
|
14
|
+
async function outputResult(result, outputJsonPath) {
|
|
15
|
+
const json = JSON.stringify(result, null, 2);
|
|
16
|
+
if (outputJsonPath) {
|
|
17
|
+
await fs.writeFile(outputJsonPath, json, 'utf-8');
|
|
18
|
+
log.info(`Output written to ${outputJsonPath}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
console.log('\n' + json);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runs the full video-clipper pipeline for the given CLI arguments.
|
|
26
|
+
*
|
|
27
|
+
* Stage ordering:
|
|
28
|
+
* 1. resolveVideo — parse URL, extract video ID + metadata
|
|
29
|
+
* 2. downloadAudio — download WAV so Whisper/Gemini transcript providers can use it
|
|
30
|
+
* 3. processAudio — detect audio events per window (reuses downloaded WAV)
|
|
31
|
+
* 4a. analyzeSegments — fetch transcript + LLM pass 1 (informed by audio events)
|
|
32
|
+
* 5. selectSegments — merge signals, rank, threshold filter
|
|
33
|
+
* 4b. refineRankedSegments — LLM pass 2 to tighten clip boundaries
|
|
34
|
+
* 6. exportClips — download video + run ffmpeg (only if --clip)
|
|
35
|
+
*
|
|
36
|
+
* downloadAudio runs before analyzeSegments so that `audioPath` is available
|
|
37
|
+
* for Whisper/Gemini transcript providers. processAudio reuses the same WAV.
|
|
38
|
+
*
|
|
39
|
+
* Hard errors (invalid URL, transcript failure, all LLM chunks failed) are
|
|
40
|
+
* thrown so the caller can catch, log, and exit(1). Soft failures (audio
|
|
41
|
+
* detection, individual clip failures) are logged as warnings and the pipeline
|
|
42
|
+
* continues.
|
|
43
|
+
*/
|
|
44
|
+
export async function runPipeline(args) {
|
|
45
|
+
const threshold = args.threshold ?? config.SCORE_THRESHOLD;
|
|
46
|
+
const topN = args.topN ?? config.TOP_N_SEGMENTS;
|
|
47
|
+
const gameProfile = args.gameProfile ?? config.GAME_PROFILE;
|
|
48
|
+
const maxParallel = args.maxParallel ?? config.LLM_CONCURRENCY;
|
|
49
|
+
const cookies = {
|
|
50
|
+
cookiesFromBrowser: config.YT_DLP_COOKIES_FROM_BROWSER,
|
|
51
|
+
cookiesFile: config.YT_DLP_COOKIES_FILE,
|
|
52
|
+
quiet: config.YT_DLP_QUIET,
|
|
53
|
+
retryCount: config.YT_DLP_RETRY_COUNT,
|
|
54
|
+
segmentCookiesEnabled: config.YT_DLP_SEGMENT_COOKIES_ENABLED,
|
|
55
|
+
playerClient: config.YT_DLP_PLAYER_CLIENT,
|
|
56
|
+
noCheckCertificates: config.YT_DLP_NO_CHECK_CERTIFICATES,
|
|
57
|
+
forceIpv4: config.YT_DLP_FORCE_IPV4,
|
|
58
|
+
geoBypass: config.YT_DLP_GEO_BYPASS,
|
|
59
|
+
sleepRequests: config.YT_DLP_SLEEP_REQUESTS,
|
|
60
|
+
};
|
|
61
|
+
const audioDownloadConfig = {
|
|
62
|
+
...cookies,
|
|
63
|
+
ffmpegPath: config.FFMPEG_PATH,
|
|
64
|
+
};
|
|
65
|
+
const slicerConfig = {
|
|
66
|
+
ffmpegPath: config.FFMPEG_PATH,
|
|
67
|
+
ffprobePath: config.FFPROBE_PATH,
|
|
68
|
+
};
|
|
69
|
+
const clipperConfig = {
|
|
70
|
+
ffmpegPath: config.FFMPEG_PATH,
|
|
71
|
+
ffprobePath: config.FFPROBE_PATH,
|
|
72
|
+
timestampOffset: config.TIMESTAMP_OFFSET_SECONDS,
|
|
73
|
+
ffmpegPreset: config.FFMPEG_PRESET,
|
|
74
|
+
outputDir: config.OUTPUT_DIR,
|
|
75
|
+
};
|
|
76
|
+
const downloaderConfig = {
|
|
77
|
+
...cookies,
|
|
78
|
+
downloadDir: config.DOWNLOAD_DIR,
|
|
79
|
+
timestampOffset: config.TIMESTAMP_OFFSET_SECONDS,
|
|
80
|
+
llmConcurrency: config.LLM_CONCURRENCY,
|
|
81
|
+
};
|
|
82
|
+
const analyzerChainConfig = {
|
|
83
|
+
confidenceThreshold: config.AUDIO_CONFIDENCE_THRESHOLD,
|
|
84
|
+
whisperModel: config.AUDIO_WHISPER_MODEL,
|
|
85
|
+
gemini: {
|
|
86
|
+
apiKey: config.GOOGLE_GENERATIVE_AI_API_KEY,
|
|
87
|
+
model: config.AUDIO_GEMINI_MODEL,
|
|
88
|
+
extraInstructions: config.AUDIO_EXTRA_INSTRUCTIONS,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const transcriptChainConfig = {
|
|
92
|
+
...cookies,
|
|
93
|
+
whisperModel: config.AUDIO_WHISPER_MODEL,
|
|
94
|
+
};
|
|
95
|
+
const model = getModel(config.LLM_PROVIDER, config.LLM_MODEL, {
|
|
96
|
+
ZAI_API_KEY: config.ZAI_API_KEY,
|
|
97
|
+
OPENROUTER_API_KEY: config.OPENROUTER_API_KEY,
|
|
98
|
+
CUSTOM_OPENAI_BASE_URL: config.CUSTOM_OPENAI_BASE_URL,
|
|
99
|
+
CUSTOM_OPENAI_API_KEY: config.CUSTOM_OPENAI_API_KEY,
|
|
100
|
+
});
|
|
101
|
+
const backend = await createCacheBackend(config, args.noCache);
|
|
102
|
+
const cache = new Cache(backend);
|
|
103
|
+
try {
|
|
104
|
+
const { videoId, metadata } = await resolveVideo(args.url, args.maxDuration, cookies);
|
|
105
|
+
let audioPath = null;
|
|
106
|
+
const audioEnabled = config.AUDIO_DETECTION_ENABLED && !args.noAudio;
|
|
107
|
+
if (audioEnabled) {
|
|
108
|
+
try {
|
|
109
|
+
audioPath = await downloadAudio(videoId, `${config.OUTPUT_DIR}/audio`, audioDownloadConfig);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
113
|
+
log.warn(`Audio download failed — continuing without audio: ${message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const audioProcConfig = {
|
|
117
|
+
audioEnabled: config.AUDIO_DETECTION_ENABLED,
|
|
118
|
+
audioProvider: config.AUDIO_PROVIDER,
|
|
119
|
+
chunkLengthSec: config.CHUNK_LENGTH_SEC,
|
|
120
|
+
chunkOverlapSec: config.CHUNK_OVERLAP_SEC,
|
|
121
|
+
outputDir: config.OUTPUT_DIR,
|
|
122
|
+
audioDownloadConfig,
|
|
123
|
+
slicerConfig,
|
|
124
|
+
analyzerChainConfig,
|
|
125
|
+
};
|
|
126
|
+
const audioEvents = await processAudio(videoId, metadata.duration, cache, {
|
|
127
|
+
noAudio: args.noAudio,
|
|
128
|
+
gameProfile,
|
|
129
|
+
maxParallel,
|
|
130
|
+
audioPath,
|
|
131
|
+
}, audioProcConfig);
|
|
132
|
+
const callbacks = {
|
|
133
|
+
onChunkTextDelta: (chunkIndex, text) => {
|
|
134
|
+
process.stdout.write(text);
|
|
135
|
+
},
|
|
136
|
+
onChunkAnalyzed: (chunkIndex, evaluation) => {
|
|
137
|
+
if (evaluation.status === 'success') {
|
|
138
|
+
log.info(` ✓ chunk ${chunkIndex}: interesting=${evaluation.interesting}, score=${evaluation.score}`);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
onSegmentTextDelta: (rank, text) => {
|
|
142
|
+
process.stdout.write(text);
|
|
143
|
+
},
|
|
144
|
+
onSegmentRefined: (rank, segment) => {
|
|
145
|
+
log.info(` ✓ segment rank=${rank}: ${segment.start.toFixed(1)}s–${segment.end.toFixed(1)}s`);
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
const { lines, microBlocks, chunkEvals } = await analyzeSegments(videoId, audioPath, audioEvents, cache, {
|
|
149
|
+
maxChunks: args.maxChunks,
|
|
150
|
+
maxParallel,
|
|
151
|
+
noCache: args.noCache,
|
|
152
|
+
transcriptProvider: config.TRANSCRIPT_PROVIDER,
|
|
153
|
+
transcriptChainConfig,
|
|
154
|
+
microBlockSec: config.MICRO_BLOCK_SEC,
|
|
155
|
+
chunkLengthSec: config.CHUNK_LENGTH_SEC,
|
|
156
|
+
chunkOverlapSec: config.CHUNK_OVERLAP_SEC,
|
|
157
|
+
model,
|
|
158
|
+
maxRetries: config.LLM_MAX_RETRIES,
|
|
159
|
+
systemPrompt: config.LLM_SYSTEM_PROMPT ?? DEFAULT_SYSTEM_PROMPT,
|
|
160
|
+
llmModel: config.LLM_MODEL,
|
|
161
|
+
callbacks,
|
|
162
|
+
});
|
|
163
|
+
if (config.DUMP_OUTPUTS) {
|
|
164
|
+
await dumpTranscript(videoId, lines);
|
|
165
|
+
}
|
|
166
|
+
const rankedSegments = selectSegments(chunkEvals, audioEvents, {
|
|
167
|
+
threshold,
|
|
168
|
+
topN,
|
|
169
|
+
boostWindow: config.AUDIO_LLM_BOOST_WINDOW,
|
|
170
|
+
scoreBoost: config.AUDIO_LLM_SCORE_BOOST,
|
|
171
|
+
preRoll: config.AUDIO_CLIP_PRE_ROLL,
|
|
172
|
+
postRoll: config.AUDIO_CLIP_POST_ROLL,
|
|
173
|
+
});
|
|
174
|
+
const partialResult = {
|
|
175
|
+
video_id: videoId,
|
|
176
|
+
title: metadata.title,
|
|
177
|
+
duration: metadata.duration,
|
|
178
|
+
chunk_evaluations: chunkEvals,
|
|
179
|
+
segments: rankedSegments,
|
|
180
|
+
};
|
|
181
|
+
if (rankedSegments.length === 0) {
|
|
182
|
+
await outputResult(partialResult, args.outputJson);
|
|
183
|
+
if (config.DUMP_OUTPUTS)
|
|
184
|
+
await dumpAnalysis(videoId, partialResult);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const refinedSegments = await refineRankedSegments(rankedSegments, microBlocks, cache, {
|
|
188
|
+
maxParallel,
|
|
189
|
+
noCache: args.noCache,
|
|
190
|
+
maxRetries: config.LLM_MAX_RETRIES,
|
|
191
|
+
model,
|
|
192
|
+
callbacks,
|
|
193
|
+
});
|
|
194
|
+
const result = {
|
|
195
|
+
video_id: videoId,
|
|
196
|
+
title: metadata.title,
|
|
197
|
+
duration: metadata.duration,
|
|
198
|
+
chunk_evaluations: chunkEvals,
|
|
199
|
+
segments: refinedSegments,
|
|
200
|
+
};
|
|
201
|
+
await outputResult(result, args.outputJson);
|
|
202
|
+
if (config.DUMP_OUTPUTS)
|
|
203
|
+
await dumpAnalysis(videoId, result);
|
|
204
|
+
log.info('Done.');
|
|
205
|
+
if (!args.clip) {
|
|
206
|
+
log.info('Tip: run with --clip to download the video and generate mp4 clips.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const exporterConfig = {
|
|
210
|
+
downloader: downloaderConfig,
|
|
211
|
+
clipper: clipperConfig,
|
|
212
|
+
downloadSectionsMode: config.DOWNLOAD_SECTIONS_MODE,
|
|
213
|
+
};
|
|
214
|
+
const clipPaths = await exportClips(videoId, refinedSegments, {
|
|
215
|
+
localVideo: args.localVideo,
|
|
216
|
+
downloadSections: args.downloadSections,
|
|
217
|
+
videoPath: args.videoPath,
|
|
218
|
+
clipConcurrency: config.CLIP_CONCURRENCY,
|
|
219
|
+
}, exporterConfig);
|
|
220
|
+
if (clipPaths.length === 0) {
|
|
221
|
+
log.warn('No clips were generated successfully.');
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
log.info(`Done — ${clipPaths.length} clip${clipPaths.length !== 1 ? 's' : ''} saved:`);
|
|
225
|
+
for (const p of clipPaths) {
|
|
226
|
+
log.info(` ${p}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
await cache.close();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const DEFAULT_SYSTEM_PROMPT = `You are an expert video editor analyzing a YouTube transcript segment.
|
|
235
|
+
|
|
236
|
+
Identify if this segment contains a potentially interesting moment worth clipping.
|
|
237
|
+
|
|
238
|
+
Interesting moments include:
|
|
239
|
+
- surprising insights or revelations
|
|
240
|
+
- strong or controversial opinions
|
|
241
|
+
- humor or entertaining storytelling
|
|
242
|
+
- emotional moments
|
|
243
|
+
- key explanations of important concepts
|
|
244
|
+
- "aha" moments or turning points
|
|
245
|
+
|
|
246
|
+
If audio events are listed in the segment, treat them as strong positive signals —
|
|
247
|
+
they indicate high-action or high-energy moments that are often clip-worthy.`;
|
|
248
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/app/cli/pipeline/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AudioDownloadConfig } from '../../../../lib/services/audio/source/youtube.js';
|
|
2
|
+
import type { AnalyzerChainConfig } from '../../../../lib/services/audio/analyzer/index.js';
|
|
3
|
+
import type { SlicerConfig } from '../../../../lib/services/audio/processor/slicer.js';
|
|
4
|
+
import type { Cache } from '../../../../lib/utils/cache.js';
|
|
5
|
+
import type { AudioEvent, AudioProcessorOpts } from '../../../../lib/types/index.js';
|
|
6
|
+
export interface AudioProcessorConfig {
|
|
7
|
+
audioEnabled: boolean;
|
|
8
|
+
audioProvider: string;
|
|
9
|
+
chunkLengthSec: number;
|
|
10
|
+
chunkOverlapSec: number;
|
|
11
|
+
outputDir: string;
|
|
12
|
+
audioDownloadConfig: AudioDownloadConfig;
|
|
13
|
+
slicerConfig: SlicerConfig;
|
|
14
|
+
analyzerChainConfig: AnalyzerChainConfig;
|
|
15
|
+
}
|
|
16
|
+
export declare function processAudio(videoId: string, duration: number, cache: Cache, opts: AudioProcessorOpts, procConfig: AudioProcessorConfig): Promise<AudioEvent[]>;
|
|
17
|
+
//# sourceMappingURL=audioProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioProcessor.d.ts","sourceRoot":"","sources":["../../../../../src/app/cli/pipeline/stages/audioProcessor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAEjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAGjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAG5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,kBAAkB,EACxB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CAkGvB"}
|
|
@@ -1,55 +1,40 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import pLimit from 'p-limit';
|
|
3
|
-
import { downloadAudio } from '
|
|
4
|
-
import { createAnalyzerChain } from '
|
|
5
|
-
import { EventDetector } from '
|
|
6
|
-
import { sliceAudio } from '
|
|
7
|
-
import { buildWindows } from '
|
|
8
|
-
import { log } from '
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* Stage 3 — Audio Processor
|
|
12
|
-
*
|
|
13
|
-
* Downloads audio-only WAV, slices it into chunks using the generic
|
|
14
|
-
* `buildWindows` utility, runs event detection on each slice via an
|
|
15
|
-
* EventDetector (constructed from the ordered provider chain in config),
|
|
16
|
-
* and persists the results to cache.
|
|
17
|
-
*
|
|
18
|
-
* The provider chain is built once per run from `config.AUDIO_PROVIDER`
|
|
19
|
-
* (e.g. "gemini,whisper") via `createAnalyzerChain`. The EventDetector
|
|
20
|
-
* walks the chain in order, falling back to the next analyzer on failure.
|
|
21
|
-
*
|
|
22
|
-
* Returns an empty array immediately when audio detection is disabled via
|
|
23
|
-
* `--no-audio` or the `AUDIO_DETECTION_ENABLED` config flag.
|
|
24
|
-
*/
|
|
25
|
-
export async function processAudio(videoId, duration, cache, opts) {
|
|
26
|
-
const audioEnabled = config.AUDIO_DETECTION_ENABLED && !opts.noAudio;
|
|
3
|
+
import { downloadAudio } from '../../../../lib/services/audio/source/youtube.js';
|
|
4
|
+
import { createAnalyzerChain } from '../../../../lib/services/audio/analyzer/index.js';
|
|
5
|
+
import { EventDetector } from '../../../../lib/services/audio/processor/detector.js';
|
|
6
|
+
import { sliceAudio } from '../../../../lib/services/audio/processor/slicer.js';
|
|
7
|
+
import { buildWindows } from '../../../../lib/utils/chunker.js';
|
|
8
|
+
import { log } from '../../../../lib/utils/logger.js';
|
|
9
|
+
export async function processAudio(videoId, duration, cache, opts, procConfig) {
|
|
10
|
+
const audioEnabled = procConfig.audioEnabled && !opts.noAudio;
|
|
27
11
|
if (!audioEnabled)
|
|
28
12
|
return [];
|
|
29
|
-
const cached = await cache.readAudioEvents(videoId, opts.gameProfile,
|
|
13
|
+
const cached = await cache.readAudioEvents(videoId, opts.gameProfile, procConfig.audioProvider);
|
|
30
14
|
if (cached) {
|
|
31
15
|
log.info(`[cache hit] Audio events loaded from cache (${cached.length} events)`);
|
|
32
16
|
return cached;
|
|
33
17
|
}
|
|
34
18
|
try {
|
|
35
|
-
const audioPath = opts.audioPath ??
|
|
36
|
-
|
|
19
|
+
const audioPath = opts.audioPath ??
|
|
20
|
+
(await downloadAudio(videoId, `${procConfig.outputDir}/audio`, procConfig.audioDownloadConfig));
|
|
21
|
+
const chain = createAnalyzerChain(procConfig.audioProvider, procConfig.analyzerChainConfig);
|
|
37
22
|
const detector = new EventDetector(chain);
|
|
38
23
|
const providerNames = chain.map((a) => a.source).join(' → ');
|
|
39
24
|
log.info(`Detecting audio events (chain: ${providerNames}, profile: ${opts.gameProfile}, max ${opts.maxParallel} parallel)...`);
|
|
40
|
-
const windows = buildWindows(duration,
|
|
25
|
+
const windows = buildWindows(duration, procConfig.chunkLengthSec, procConfig.chunkOverlapSec);
|
|
41
26
|
const limit = pLimit(opts.maxParallel);
|
|
42
27
|
const results = await Promise.allSettled(windows.map((window) => limit(async () => {
|
|
43
28
|
log.info(` Processing audio chunk ${window.start}s - ${window.end}s...`);
|
|
44
|
-
const cachedChunk = await cache.readAudioChunk(videoId, opts.gameProfile,
|
|
29
|
+
const cachedChunk = await cache.readAudioChunk(videoId, opts.gameProfile, procConfig.audioProvider, window.start, window.end);
|
|
45
30
|
if (cachedChunk) {
|
|
46
31
|
log.info(` [cache hit] Audio chunk ${window.start}s - ${window.end}s (${cachedChunk.length} events)`);
|
|
47
32
|
return cachedChunk;
|
|
48
33
|
}
|
|
49
|
-
const slicePath = await sliceAudio(audioPath, window.start, window.end - window.start,
|
|
34
|
+
const slicePath = await sliceAudio(audioPath, window.start, window.end - window.start, procConfig.outputDir, procConfig.slicerConfig);
|
|
50
35
|
const events = await detector.detect(slicePath, opts.gameProfile, window.start, window.end - window.start);
|
|
51
36
|
await fs.unlink(slicePath);
|
|
52
|
-
await cache.writeAudioChunk(videoId, opts.gameProfile,
|
|
37
|
+
await cache.writeAudioChunk(videoId, opts.gameProfile, procConfig.audioProvider, window.start, window.end, events);
|
|
53
38
|
return events;
|
|
54
39
|
})));
|
|
55
40
|
const audioEvents = results
|
|
@@ -62,7 +47,7 @@ export async function processAudio(videoId, duration, cache, opts) {
|
|
|
62
47
|
})
|
|
63
48
|
.sort((a, b) => a.time - b.time);
|
|
64
49
|
log.info(`Audio event detection complete: ${audioEvents.length} events found`);
|
|
65
|
-
await cache.writeAudioEvents(videoId, opts.gameProfile,
|
|
50
|
+
await cache.writeAudioEvents(videoId, opts.gameProfile, procConfig.audioProvider, audioEvents);
|
|
66
51
|
return audioEvents;
|
|
67
52
|
}
|
|
68
53
|
catch (err) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioProcessor.js","sourceRoot":"","sources":["../../../../../src/app/cli/pipeline/stages/audioProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { YtDlpCookies } from '../../../../lib/services/video/source/youtube/metadata.js';
|
|
2
|
+
import type { VideoResolverResult } from '../../../../lib/types/index.js';
|
|
3
|
+
export declare function resolveVideo(rawUrl: string, maxDurationSec: number | undefined, cookies: YtDlpCookies): Promise<VideoResolverResult>;
|
|
4
|
+
//# sourceMappingURL=videoResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoResolver.d.ts","sourceRoot":"","sources":["../../../../../src/app/cli/pipeline/stages/videoResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAGnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAwB9B"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import { parseUrl } from '
|
|
2
|
-
import { extractMetadata } from '
|
|
3
|
-
import { log } from '
|
|
4
|
-
import { formatSeconds } from '
|
|
5
|
-
|
|
6
|
-
* Stage 1 — Video Resolver
|
|
7
|
-
*
|
|
8
|
-
* Parses a raw YouTube URL into a validated video ID, fetches metadata
|
|
9
|
-
* (title + duration), and enforces the optional --max-duration guard.
|
|
10
|
-
*
|
|
11
|
-
* @throws {Error} on invalid URL, metadata fetch failure, or exceeded duration
|
|
12
|
-
*/
|
|
13
|
-
export async function resolveVideo(rawUrl, maxDurationSec) {
|
|
1
|
+
import { parseUrl } from '../../../../lib/services/video/source/youtube/parser.js';
|
|
2
|
+
import { extractMetadata } from '../../../../lib/services/video/source/youtube/metadata.js';
|
|
3
|
+
import { log } from '../../../../lib/utils/logger.js';
|
|
4
|
+
import { formatSeconds } from '../../../../lib/utils/format.js';
|
|
5
|
+
export async function resolveVideo(rawUrl, maxDurationSec, cookies) {
|
|
14
6
|
let videoId;
|
|
15
7
|
try {
|
|
16
8
|
videoId = parseUrl(rawUrl);
|
|
@@ -19,7 +11,7 @@ export async function resolveVideo(rawUrl, maxDurationSec) {
|
|
|
19
11
|
throw new Error(`Invalid YouTube URL: ${rawUrl}`);
|
|
20
12
|
}
|
|
21
13
|
log.info(`Fetching metadata for ${videoId}...`);
|
|
22
|
-
const metadata = await extractMetadata(videoId);
|
|
14
|
+
const metadata = await extractMetadata(videoId, cookies);
|
|
23
15
|
log.info(`Video: "${metadata.title}" (${metadata.duration > 0 ? formatSeconds(metadata.duration) : 'duration unknown'})`);
|
|
24
16
|
if (maxDurationSec !== undefined && metadata.duration > 0) {
|
|
25
17
|
if (metadata.duration > maxDurationSec) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoResolver.js","sourceRoot":"","sources":["../../../../../src/app/cli/pipeline/stages/videoResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8CAA8C,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAEjF,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,cAAkC,EAClC,OAAqB;IAErB,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,yBAAyB,OAAO,KAAK,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,GAAG,CAAC,IAAI,CACN,WAAW,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAChH,CAAC;IAEF,IAAI,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC1D,IAAI,QAAQ,CAAC,QAAQ,GAAG,cAAc,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,+CAA+C;gBAC7C,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,cAAc,CAAC,GAAG,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ChunkEvaluation, RankedSegment } from '../../../../lib/types/index.js';
|
|
2
|
+
import type { AnalysisActivityItem, ActivityStatus } from '../../types/activity.js';
|
|
3
|
+
export interface AnalysisActivityState {
|
|
4
|
+
items: AnalysisActivityItem[];
|
|
5
|
+
nextId: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function createInitialActivityState(): AnalysisActivityState;
|
|
8
|
+
export declare function createStartedActivityState(): AnalysisActivityState;
|
|
9
|
+
export declare function appendSystemActivity(state: AnalysisActivityState, input: {
|
|
10
|
+
title: string;
|
|
11
|
+
status: ActivityStatus;
|
|
12
|
+
detail?: string;
|
|
13
|
+
}): AnalysisActivityState;
|
|
14
|
+
export declare function upsertChunkStarted(state: AnalysisActivityState, chunkIndex: number): AnalysisActivityState;
|
|
15
|
+
export declare function upsertChunkProgress(state: AnalysisActivityState, chunkIndex: number, text: string): AnalysisActivityState;
|
|
16
|
+
export declare function upsertChunkCompletion(state: AnalysisActivityState, chunkIndex: number, evaluation: ChunkEvaluation): AnalysisActivityState;
|
|
17
|
+
export declare function upsertSegmentProgress(state: AnalysisActivityState, rank: number, text: string): AnalysisActivityState;
|
|
18
|
+
export declare function upsertSegmentStarted(state: AnalysisActivityState, rank: number): AnalysisActivityState;
|
|
19
|
+
export declare function upsertSegmentCompletion(state: AnalysisActivityState, rank: number, segment: RankedSegment, formatTime: (seconds: number) => string): AnalysisActivityState;
|
|
20
|
+
//# sourceMappingURL=analysisActivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysisActivity.d.ts","sourceRoot":"","sources":["../../../../../src/app/web/lib/activity/analysisActivity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,0BAA0B,IAAI,qBAAqB,CAKlE;AAED,wBAAgB,0BAA0B,IAAI,qBAAqB,CAMlE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,qBAAqB,CAcvB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,MAAM,GACjB,qBAAqB,CAsBvB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,qBAAqB,CAiCvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,eAAe,GAC1B,qBAAqB,CAuCvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,qBAAqB,CAiCvB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,GACX,qBAAqB,CAsBvB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,qBAAqB,CAgCvB"}
|