@kenkaiiii/gg-editor 0.1.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/LICENSE +21 -0
- package/README.md +453 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/ass.d.ts +75 -0
- package/dist/core/ass.d.ts.map +1 -0
- package/dist/core/ass.js +128 -0
- package/dist/core/ass.js.map +1 -0
- package/dist/core/ass.test.d.ts +2 -0
- package/dist/core/ass.test.d.ts.map +1 -0
- package/dist/core/ass.test.js +112 -0
- package/dist/core/ass.test.js.map +1 -0
- package/dist/core/audio-cleanup.d.ts +16 -0
- package/dist/core/audio-cleanup.d.ts.map +1 -0
- package/dist/core/audio-cleanup.js +79 -0
- package/dist/core/audio-cleanup.js.map +1 -0
- package/dist/core/audio-cleanup.test.d.ts +2 -0
- package/dist/core/audio-cleanup.test.d.ts.map +1 -0
- package/dist/core/audio-cleanup.test.js +41 -0
- package/dist/core/audio-cleanup.test.js.map +1 -0
- package/dist/core/audio-mix.d.ts +89 -0
- package/dist/core/audio-mix.d.ts.map +1 -0
- package/dist/core/audio-mix.js +156 -0
- package/dist/core/audio-mix.js.map +1 -0
- package/dist/core/audio-mix.test.d.ts +2 -0
- package/dist/core/audio-mix.test.d.ts.map +1 -0
- package/dist/core/audio-mix.test.js +91 -0
- package/dist/core/audio-mix.test.js.map +1 -0
- package/dist/core/auth/anthropic.d.ts +4 -0
- package/dist/core/auth/anthropic.d.ts.map +1 -0
- package/dist/core/auth/anthropic.js +78 -0
- package/dist/core/auth/anthropic.js.map +1 -0
- package/dist/core/auth/index.d.ts +7 -0
- package/dist/core/auth/index.d.ts.map +1 -0
- package/dist/core/auth/index.js +6 -0
- package/dist/core/auth/index.js.map +1 -0
- package/dist/core/auth/login.d.ts +13 -0
- package/dist/core/auth/login.d.ts.map +1 -0
- package/dist/core/auth/login.js +188 -0
- package/dist/core/auth/login.js.map +1 -0
- package/dist/core/auth/openai.d.ts +4 -0
- package/dist/core/auth/openai.d.ts.map +1 -0
- package/dist/core/auth/openai.js +170 -0
- package/dist/core/auth/openai.js.map +1 -0
- package/dist/core/auth/pkce.d.ts +5 -0
- package/dist/core/auth/pkce.d.ts.map +1 -0
- package/dist/core/auth/pkce.js +17 -0
- package/dist/core/auth/pkce.js.map +1 -0
- package/dist/core/auth/storage.d.ts +29 -0
- package/dist/core/auth/storage.d.ts.map +1 -0
- package/dist/core/auth/storage.js +127 -0
- package/dist/core/auth/storage.js.map +1 -0
- package/dist/core/auth/types.d.ts +22 -0
- package/dist/core/auth/types.d.ts.map +1 -0
- package/dist/core/auth/types.js +12 -0
- package/dist/core/auth/types.js.map +1 -0
- package/dist/core/clustering.d.ts +52 -0
- package/dist/core/clustering.d.ts.map +1 -0
- package/dist/core/clustering.js +163 -0
- package/dist/core/clustering.js.map +1 -0
- package/dist/core/clustering.test.d.ts +2 -0
- package/dist/core/clustering.test.d.ts.map +1 -0
- package/dist/core/clustering.test.js +112 -0
- package/dist/core/clustering.test.js.map +1 -0
- package/dist/core/color-match.d.ts +19 -0
- package/dist/core/color-match.d.ts.map +1 -0
- package/dist/core/color-match.js +118 -0
- package/dist/core/color-match.js.map +1 -0
- package/dist/core/color-match.test.d.ts +2 -0
- package/dist/core/color-match.test.d.ts.map +1 -0
- package/dist/core/color-match.test.js +40 -0
- package/dist/core/color-match.test.js.map +1 -0
- package/dist/core/ducking.d.ts +37 -0
- package/dist/core/ducking.d.ts.map +1 -0
- package/dist/core/ducking.js +71 -0
- package/dist/core/ducking.js.map +1 -0
- package/dist/core/ducking.test.d.ts +2 -0
- package/dist/core/ducking.test.d.ts.map +1 -0
- package/dist/core/ducking.test.js +38 -0
- package/dist/core/ducking.test.js.map +1 -0
- package/dist/core/edl-roundtrip.test.d.ts +2 -0
- package/dist/core/edl-roundtrip.test.d.ts.map +1 -0
- package/dist/core/edl-roundtrip.test.js +171 -0
- package/dist/core/edl-roundtrip.test.js.map +1 -0
- package/dist/core/edl.d.ts +41 -0
- package/dist/core/edl.d.ts.map +1 -0
- package/dist/core/edl.js +56 -0
- package/dist/core/edl.js.map +1 -0
- package/dist/core/edl.test.d.ts +2 -0
- package/dist/core/edl.test.d.ts.map +1 -0
- package/dist/core/edl.test.js +62 -0
- package/dist/core/edl.test.js.map +1 -0
- package/dist/core/envelope-sync.d.ts +52 -0
- package/dist/core/envelope-sync.d.ts.map +1 -0
- package/dist/core/envelope-sync.js +169 -0
- package/dist/core/envelope-sync.js.map +1 -0
- package/dist/core/envelope-sync.test.d.ts +2 -0
- package/dist/core/envelope-sync.test.d.ts.map +1 -0
- package/dist/core/envelope-sync.test.js +70 -0
- package/dist/core/envelope-sync.test.js.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts +2 -0
- package/dist/core/fcpxml-roundtrip.test.d.ts.map +1 -0
- package/dist/core/fcpxml-roundtrip.test.js +251 -0
- package/dist/core/fcpxml-roundtrip.test.js.map +1 -0
- package/dist/core/fcpxml.d.ts +172 -0
- package/dist/core/fcpxml.d.ts.map +1 -0
- package/dist/core/fcpxml.js +406 -0
- package/dist/core/fcpxml.js.map +1 -0
- package/dist/core/fcpxml.test.d.ts +2 -0
- package/dist/core/fcpxml.test.d.ts.map +1 -0
- package/dist/core/fcpxml.test.js +360 -0
- package/dist/core/fcpxml.test.js.map +1 -0
- package/dist/core/filler-words.d.ts +107 -0
- package/dist/core/filler-words.d.ts.map +1 -0
- package/dist/core/filler-words.js +221 -0
- package/dist/core/filler-words.js.map +1 -0
- package/dist/core/filler-words.test.d.ts +2 -0
- package/dist/core/filler-words.test.d.ts.map +1 -0
- package/dist/core/filler-words.test.js +177 -0
- package/dist/core/filler-words.test.js.map +1 -0
- package/dist/core/format.d.ts +36 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +57 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/format.test.d.ts +2 -0
- package/dist/core/format.test.d.ts.map +1 -0
- package/dist/core/format.test.js +81 -0
- package/dist/core/format.test.js.map +1 -0
- package/dist/core/frames.d.ts +35 -0
- package/dist/core/frames.d.ts.map +1 -0
- package/dist/core/frames.js +64 -0
- package/dist/core/frames.js.map +1 -0
- package/dist/core/hook-analysis.d.ts +90 -0
- package/dist/core/hook-analysis.d.ts.map +1 -0
- package/dist/core/hook-analysis.js +222 -0
- package/dist/core/hook-analysis.js.map +1 -0
- package/dist/core/hook-analysis.test.d.ts +2 -0
- package/dist/core/hook-analysis.test.d.ts.map +1 -0
- package/dist/core/hook-analysis.test.js +130 -0
- package/dist/core/hook-analysis.test.js.map +1 -0
- package/dist/core/hosts/detect.d.ts +17 -0
- package/dist/core/hosts/detect.d.ts.map +1 -0
- package/dist/core/hosts/detect.js +64 -0
- package/dist/core/hosts/detect.js.map +1 -0
- package/dist/core/hosts/detect.test.d.ts +2 -0
- package/dist/core/hosts/detect.test.d.ts.map +1 -0
- package/dist/core/hosts/detect.test.js +17 -0
- package/dist/core/hosts/detect.test.js.map +1 -0
- package/dist/core/hosts/index.d.ts +13 -0
- package/dist/core/hosts/index.d.ts.map +1 -0
- package/dist/core/hosts/index.js +30 -0
- package/dist/core/hosts/index.js.map +1 -0
- package/dist/core/hosts/lazy.d.ts +53 -0
- package/dist/core/hosts/lazy.d.ts.map +1 -0
- package/dist/core/hosts/lazy.js +125 -0
- package/dist/core/hosts/lazy.js.map +1 -0
- package/dist/core/hosts/lazy.test.d.ts +2 -0
- package/dist/core/hosts/lazy.test.d.ts.map +1 -0
- package/dist/core/hosts/lazy.test.js +117 -0
- package/dist/core/hosts/lazy.test.js.map +1 -0
- package/dist/core/hosts/none/adapter.d.ts +74 -0
- package/dist/core/hosts/none/adapter.d.ts.map +1 -0
- package/dist/core/hosts/none/adapter.js +99 -0
- package/dist/core/hosts/none/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/adapter.d.ts +87 -0
- package/dist/core/hosts/premiere/adapter.d.ts.map +1 -0
- package/dist/core/hosts/premiere/adapter.js +218 -0
- package/dist/core/hosts/premiere/adapter.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts +26 -0
- package/dist/core/hosts/premiere/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.js +326 -0
- package/dist/core/hosts/premiere/bridge-source.js.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts +2 -0
- package/dist/core/hosts/premiere/bridge-source.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge-source.test.js +36 -0
- package/dist/core/hosts/premiere/bridge-source.test.js.map +1 -0
- package/dist/core/hosts/premiere/bridge.d.ts +38 -0
- package/dist/core/hosts/premiere/bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/bridge.js +238 -0
- package/dist/core/hosts/premiere/bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts +47 -0
- package/dist/core/hosts/premiere/http-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.js +82 -0
- package/dist/core/hosts/premiere/http-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/http-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/http-bridge.test.js +113 -0
- package/dist/core/hosts/premiere/http-bridge.test.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts +91 -0
- package/dist/core/hosts/premiere/ws-bridge.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.js +303 -0
- package/dist/core/hosts/premiere/ws-bridge.js.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts +2 -0
- package/dist/core/hosts/premiere/ws-bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js +146 -0
- package/dist/core/hosts/premiere/ws-bridge.test.js.map +1 -0
- package/dist/core/hosts/resolve/adapter.d.ts +99 -0
- package/dist/core/hosts/resolve/adapter.d.ts.map +1 -0
- package/dist/core/hosts/resolve/adapter.js +187 -0
- package/dist/core/hosts/resolve/adapter.js.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts +17 -0
- package/dist/core/hosts/resolve/bridge-source.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge-source.js +660 -0
- package/dist/core/hosts/resolve/bridge-source.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.d.ts +51 -0
- package/dist/core/hosts/resolve/bridge.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.integration.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js +472 -0
- package/dist/core/hosts/resolve/bridge.integration.test.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.js +270 -0
- package/dist/core/hosts/resolve/bridge.js.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts +2 -0
- package/dist/core/hosts/resolve/bridge.test.d.ts.map +1 -0
- package/dist/core/hosts/resolve/bridge.test.js +50 -0
- package/dist/core/hosts/resolve/bridge.test.js.map +1 -0
- package/dist/core/hosts/types.d.ts +167 -0
- package/dist/core/hosts/types.d.ts.map +1 -0
- package/dist/core/hosts/types.js +27 -0
- package/dist/core/hosts/types.js.map +1 -0
- package/dist/core/keyframes.d.ts +35 -0
- package/dist/core/keyframes.d.ts.map +1 -0
- package/dist/core/keyframes.js +90 -0
- package/dist/core/keyframes.js.map +1 -0
- package/dist/core/keyframes.test.d.ts +2 -0
- package/dist/core/keyframes.test.d.ts.map +1 -0
- package/dist/core/keyframes.test.js +73 -0
- package/dist/core/keyframes.test.js.map +1 -0
- package/dist/core/keyword-captions.d.ts +75 -0
- package/dist/core/keyword-captions.d.ts.map +1 -0
- package/dist/core/keyword-captions.js +285 -0
- package/dist/core/keyword-captions.js.map +1 -0
- package/dist/core/keyword-captions.test.d.ts +2 -0
- package/dist/core/keyword-captions.test.d.ts.map +1 -0
- package/dist/core/keyword-captions.test.js +90 -0
- package/dist/core/keyword-captions.test.js.map +1 -0
- package/dist/core/loudness.d.ts +52 -0
- package/dist/core/loudness.d.ts.map +1 -0
- package/dist/core/loudness.js +120 -0
- package/dist/core/loudness.js.map +1 -0
- package/dist/core/loudness.test.d.ts +2 -0
- package/dist/core/loudness.test.d.ts.map +1 -0
- package/dist/core/loudness.test.js +34 -0
- package/dist/core/loudness.test.js.map +1 -0
- package/dist/core/marker-colors.d.ts +39 -0
- package/dist/core/marker-colors.d.ts.map +1 -0
- package/dist/core/marker-colors.js +83 -0
- package/dist/core/marker-colors.js.map +1 -0
- package/dist/core/marker-colors.test.d.ts +2 -0
- package/dist/core/marker-colors.test.d.ts.map +1 -0
- package/dist/core/marker-colors.test.js +116 -0
- package/dist/core/marker-colors.test.js.map +1 -0
- package/dist/core/media/ffmpeg.d.ts +27 -0
- package/dist/core/media/ffmpeg.d.ts.map +1 -0
- package/dist/core/media/ffmpeg.js +53 -0
- package/dist/core/media/ffmpeg.js.map +1 -0
- package/dist/core/multicam.d.ts +40 -0
- package/dist/core/multicam.d.ts.map +1 -0
- package/dist/core/multicam.js +77 -0
- package/dist/core/multicam.js.map +1 -0
- package/dist/core/multicam.test.d.ts +2 -0
- package/dist/core/multicam.test.d.ts.map +1 -0
- package/dist/core/multicam.test.js +56 -0
- package/dist/core/multicam.test.js.map +1 -0
- package/dist/core/punch-in.d.ts +72 -0
- package/dist/core/punch-in.d.ts.map +1 -0
- package/dist/core/punch-in.js +133 -0
- package/dist/core/punch-in.js.map +1 -0
- package/dist/core/punch-in.test.d.ts +2 -0
- package/dist/core/punch-in.test.d.ts.map +1 -0
- package/dist/core/punch-in.test.js +118 -0
- package/dist/core/punch-in.test.js.map +1 -0
- package/dist/core/reformat.d.ts +26 -0
- package/dist/core/reformat.d.ts.map +1 -0
- package/dist/core/reformat.js +31 -0
- package/dist/core/reformat.js.map +1 -0
- package/dist/core/reformat.test.d.ts +2 -0
- package/dist/core/reformat.test.d.ts.map +1 -0
- package/dist/core/reformat.test.js +29 -0
- package/dist/core/reformat.test.js.map +1 -0
- package/dist/core/reorder.d.ts +42 -0
- package/dist/core/reorder.d.ts.map +1 -0
- package/dist/core/reorder.js +80 -0
- package/dist/core/reorder.js.map +1 -0
- package/dist/core/reorder.test.d.ts +2 -0
- package/dist/core/reorder.test.d.ts.map +1 -0
- package/dist/core/reorder.test.js +88 -0
- package/dist/core/reorder.test.js.map +1 -0
- package/dist/core/review.d.ts +38 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +128 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/review.test.d.ts +2 -0
- package/dist/core/review.test.d.ts.map +1 -0
- package/dist/core/review.test.js +76 -0
- package/dist/core/review.test.js.map +1 -0
- package/dist/core/sessions.d.ts +40 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +61 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/sfx-on-cuts.d.ts +60 -0
- package/dist/core/sfx-on-cuts.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.js +90 -0
- package/dist/core/sfx-on-cuts.js.map +1 -0
- package/dist/core/sfx-on-cuts.test.d.ts +2 -0
- package/dist/core/sfx-on-cuts.test.d.ts.map +1 -0
- package/dist/core/sfx-on-cuts.test.js +53 -0
- package/dist/core/sfx-on-cuts.test.js.map +1 -0
- package/dist/core/silence.d.ts +41 -0
- package/dist/core/silence.d.ts.map +1 -0
- package/dist/core/silence.js +104 -0
- package/dist/core/silence.js.map +1 -0
- package/dist/core/silence.test.d.ts +2 -0
- package/dist/core/silence.test.d.ts.map +1 -0
- package/dist/core/silence.test.js +143 -0
- package/dist/core/silence.test.js.map +1 -0
- package/dist/core/skills-loader.d.ts +34 -0
- package/dist/core/skills-loader.d.ts.map +1 -0
- package/dist/core/skills-loader.js +80 -0
- package/dist/core/skills-loader.js.map +1 -0
- package/dist/core/skills-loader.test.d.ts +2 -0
- package/dist/core/skills-loader.test.d.ts.map +1 -0
- package/dist/core/skills-loader.test.js +68 -0
- package/dist/core/skills-loader.test.js.map +1 -0
- package/dist/core/skin-grade.d.ts +62 -0
- package/dist/core/skin-grade.d.ts.map +1 -0
- package/dist/core/skin-grade.js +270 -0
- package/dist/core/skin-grade.js.map +1 -0
- package/dist/core/skin-grade.test.d.ts +2 -0
- package/dist/core/skin-grade.test.d.ts.map +1 -0
- package/dist/core/skin-grade.test.js +182 -0
- package/dist/core/skin-grade.test.js.map +1 -0
- package/dist/core/speaker-changes.d.ts +30 -0
- package/dist/core/speaker-changes.d.ts.map +1 -0
- package/dist/core/speaker-changes.js +19 -0
- package/dist/core/speaker-changes.js.map +1 -0
- package/dist/core/speaker-changes.test.d.ts +2 -0
- package/dist/core/speaker-changes.test.d.ts.map +1 -0
- package/dist/core/speaker-changes.test.js +46 -0
- package/dist/core/speaker-changes.test.js.map +1 -0
- package/dist/core/speed-ramp.d.ts +60 -0
- package/dist/core/speed-ramp.d.ts.map +1 -0
- package/dist/core/speed-ramp.js +113 -0
- package/dist/core/speed-ramp.js.map +1 -0
- package/dist/core/speed-ramp.test.d.ts +2 -0
- package/dist/core/speed-ramp.test.d.ts.map +1 -0
- package/dist/core/speed-ramp.test.js +74 -0
- package/dist/core/speed-ramp.test.js.map +1 -0
- package/dist/core/srt.d.ts +56 -0
- package/dist/core/srt.d.ts.map +1 -0
- package/dist/core/srt.js +90 -0
- package/dist/core/srt.js.map +1 -0
- package/dist/core/srt.test.d.ts +2 -0
- package/dist/core/srt.test.d.ts.map +1 -0
- package/dist/core/srt.test.js +107 -0
- package/dist/core/srt.test.js.map +1 -0
- package/dist/core/stabilize.d.ts +15 -0
- package/dist/core/stabilize.d.ts.map +1 -0
- package/dist/core/stabilize.js +69 -0
- package/dist/core/stabilize.js.map +1 -0
- package/dist/core/styles-loader.d.ts +33 -0
- package/dist/core/styles-loader.d.ts.map +1 -0
- package/dist/core/styles-loader.js +67 -0
- package/dist/core/styles-loader.js.map +1 -0
- package/dist/core/styles-loader.test.d.ts +2 -0
- package/dist/core/styles-loader.test.d.ts.map +1 -0
- package/dist/core/styles-loader.test.js +72 -0
- package/dist/core/styles-loader.test.js.map +1 -0
- package/dist/core/text-overlay.d.ts +76 -0
- package/dist/core/text-overlay.d.ts.map +1 -0
- package/dist/core/text-overlay.js +233 -0
- package/dist/core/text-overlay.js.map +1 -0
- package/dist/core/text-overlay.test.d.ts +2 -0
- package/dist/core/text-overlay.test.d.ts.map +1 -0
- package/dist/core/text-overlay.test.js +103 -0
- package/dist/core/text-overlay.test.js.map +1 -0
- package/dist/core/vision.d.ts +53 -0
- package/dist/core/vision.d.ts.map +1 -0
- package/dist/core/vision.js +150 -0
- package/dist/core/vision.js.map +1 -0
- package/dist/core/vision.test.d.ts +2 -0
- package/dist/core/vision.test.d.ts.map +1 -0
- package/dist/core/vision.test.js +76 -0
- package/dist/core/vision.test.js.map +1 -0
- package/dist/core/whisper.d.ts +188 -0
- package/dist/core/whisper.d.ts.map +1 -0
- package/dist/core/whisper.js +380 -0
- package/dist/core/whisper.js.map +1 -0
- package/dist/core/whisper.test.d.ts +2 -0
- package/dist/core/whisper.test.d.ts.map +1 -0
- package/dist/core/whisper.test.js +262 -0
- package/dist/core/whisper.test.js.map +1 -0
- package/dist/director/delegate-tool.d.ts +22 -0
- package/dist/director/delegate-tool.d.ts.map +1 -0
- package/dist/director/delegate-tool.js +62 -0
- package/dist/director/delegate-tool.js.map +1 -0
- package/dist/director/delegate-tool.test.d.ts +2 -0
- package/dist/director/delegate-tool.test.d.ts.map +1 -0
- package/dist/director/delegate-tool.test.js +38 -0
- package/dist/director/delegate-tool.test.js.map +1 -0
- package/dist/director/director-prompt.d.ts +7 -0
- package/dist/director/director-prompt.d.ts.map +1 -0
- package/dist/director/director-prompt.js +52 -0
- package/dist/director/director-prompt.js.map +1 -0
- package/dist/director/director.d.ts +16 -0
- package/dist/director/director.d.ts.map +1 -0
- package/dist/director/director.js +28 -0
- package/dist/director/director.js.map +1 -0
- package/dist/director/executor.d.ts +19 -0
- package/dist/director/executor.d.ts.map +1 -0
- package/dist/director/executor.js +93 -0
- package/dist/director/executor.js.map +1 -0
- package/dist/director/index.d.ts +6 -0
- package/dist/director/index.d.ts.map +1 -0
- package/dist/director/index.js +5 -0
- package/dist/director/index.js.map +1 -0
- package/dist/director/types.d.ts +38 -0
- package/dist/director/types.d.ts.map +1 -0
- package/dist/director/types.js +2 -0
- package/dist/director/types.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/skills.d.ts +18 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +674 -0
- package/dist/skills.js.map +1 -0
- package/dist/system-prompt.d.ts +35 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +478 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/system-prompt.test.d.ts +2 -0
- package/dist/system-prompt.test.d.ts.map +1 -0
- package/dist/system-prompt.test.js +87 -0
- package/dist/system-prompt.test.js.map +1 -0
- package/dist/tools/add-fades.d.ts +13 -0
- package/dist/tools/add-fades.d.ts.map +1 -0
- package/dist/tools/add-fades.js +88 -0
- package/dist/tools/add-fades.js.map +1 -0
- package/dist/tools/add-marker.d.ts +31 -0
- package/dist/tools/add-marker.d.ts.map +1 -0
- package/dist/tools/add-marker.js +56 -0
- package/dist/tools/add-marker.js.map +1 -0
- package/dist/tools/add-sfx-at-cuts.d.ts +24 -0
- package/dist/tools/add-sfx-at-cuts.d.ts.map +1 -0
- package/dist/tools/add-sfx-at-cuts.js +120 -0
- package/dist/tools/add-sfx-at-cuts.js.map +1 -0
- package/dist/tools/add-track.d.ts +13 -0
- package/dist/tools/add-track.d.ts.map +1 -0
- package/dist/tools/add-track.js +26 -0
- package/dist/tools/add-track.js.map +1 -0
- package/dist/tools/analyze-hook.d.ts +28 -0
- package/dist/tools/analyze-hook.d.ts.map +1 -0
- package/dist/tools/analyze-hook.js +126 -0
- package/dist/tools/analyze-hook.js.map +1 -0
- package/dist/tools/append-clip.d.ts +10 -0
- package/dist/tools/append-clip.d.ts.map +1 -0
- package/dist/tools/append-clip.js +27 -0
- package/dist/tools/append-clip.js.map +1 -0
- package/dist/tools/apply-lut.d.ts +11 -0
- package/dist/tools/apply-lut.d.ts.map +1 -0
- package/dist/tools/apply-lut.js +33 -0
- package/dist/tools/apply-lut.js.map +1 -0
- package/dist/tools/burn-subtitles.d.ts +28 -0
- package/dist/tools/burn-subtitles.d.ts.map +1 -0
- package/dist/tools/burn-subtitles.js +87 -0
- package/dist/tools/burn-subtitles.js.map +1 -0
- package/dist/tools/clean-audio.d.ts +18 -0
- package/dist/tools/clean-audio.d.ts.map +1 -0
- package/dist/tools/clean-audio.js +54 -0
- package/dist/tools/clean-audio.js.map +1 -0
- package/dist/tools/clone-timeline.d.ts +9 -0
- package/dist/tools/clone-timeline.d.ts.map +1 -0
- package/dist/tools/clone-timeline.js +28 -0
- package/dist/tools/clone-timeline.js.map +1 -0
- package/dist/tools/cluster-takes.d.ts +11 -0
- package/dist/tools/cluster-takes.d.ts.map +1 -0
- package/dist/tools/cluster-takes.js +71 -0
- package/dist/tools/cluster-takes.js.map +1 -0
- package/dist/tools/color-match.d.ts +16 -0
- package/dist/tools/color-match.d.ts.map +1 -0
- package/dist/tools/color-match.js +55 -0
- package/dist/tools/color-match.js.map +1 -0
- package/dist/tools/compose-layered.d.ts +47 -0
- package/dist/tools/compose-layered.d.ts.map +1 -0
- package/dist/tools/compose-layered.js +103 -0
- package/dist/tools/compose-layered.js.map +1 -0
- package/dist/tools/compose-thumbnail.d.ts +35 -0
- package/dist/tools/compose-thumbnail.d.ts.map +1 -0
- package/dist/tools/compose-thumbnail.js +130 -0
- package/dist/tools/compose-thumbnail.js.map +1 -0
- package/dist/tools/concat-videos.d.ts +18 -0
- package/dist/tools/concat-videos.d.ts.map +1 -0
- package/dist/tools/concat-videos.js +79 -0
- package/dist/tools/concat-videos.js.map +1 -0
- package/dist/tools/copy-grade.d.ts +10 -0
- package/dist/tools/copy-grade.d.ts.map +1 -0
- package/dist/tools/copy-grade.js +29 -0
- package/dist/tools/copy-grade.js.map +1 -0
- package/dist/tools/create-timeline.d.ts +12 -0
- package/dist/tools/create-timeline.d.ts.map +1 -0
- package/dist/tools/create-timeline.js +35 -0
- package/dist/tools/create-timeline.js.map +1 -0
- package/dist/tools/crossfade-videos.d.ts +49 -0
- package/dist/tools/crossfade-videos.d.ts.map +1 -0
- package/dist/tools/crossfade-videos.js +121 -0
- package/dist/tools/crossfade-videos.js.map +1 -0
- package/dist/tools/cut-at.d.ts +10 -0
- package/dist/tools/cut-at.d.ts.map +1 -0
- package/dist/tools/cut-at.js +24 -0
- package/dist/tools/cut-at.js.map +1 -0
- package/dist/tools/cut-filler-words.d.ts +27 -0
- package/dist/tools/cut-filler-words.d.ts.map +1 -0
- package/dist/tools/cut-filler-words.js +165 -0
- package/dist/tools/cut-filler-words.js.map +1 -0
- package/dist/tools/detect-silence.d.ts +13 -0
- package/dist/tools/detect-silence.d.ts.map +1 -0
- package/dist/tools/detect-silence.js +98 -0
- package/dist/tools/detect-silence.js.map +1 -0
- package/dist/tools/detect-speaker-changes.d.ts +9 -0
- package/dist/tools/detect-speaker-changes.d.ts.map +1 -0
- package/dist/tools/detect-speaker-changes.js +42 -0
- package/dist/tools/detect-speaker-changes.js.map +1 -0
- package/dist/tools/dry-run.d.ts +23 -0
- package/dist/tools/dry-run.d.ts.map +1 -0
- package/dist/tools/dry-run.js +66 -0
- package/dist/tools/dry-run.js.map +1 -0
- package/dist/tools/dry-run.test.d.ts +2 -0
- package/dist/tools/dry-run.test.d.ts.map +1 -0
- package/dist/tools/dry-run.test.js +66 -0
- package/dist/tools/dry-run.test.js.map +1 -0
- package/dist/tools/duck-audio.d.ts +16 -0
- package/dist/tools/duck-audio.d.ts.map +1 -0
- package/dist/tools/duck-audio.js +73 -0
- package/dist/tools/duck-audio.js.map +1 -0
- package/dist/tools/extract-audio.d.ts +10 -0
- package/dist/tools/extract-audio.d.ts.map +1 -0
- package/dist/tools/extract-audio.js +30 -0
- package/dist/tools/extract-audio.js.map +1 -0
- package/dist/tools/extract-frame.d.ts +12 -0
- package/dist/tools/extract-frame.d.ts.map +1 -0
- package/dist/tools/extract-frame.js +63 -0
- package/dist/tools/extract-frame.js.map +1 -0
- package/dist/tools/generate-gif.d.ts +13 -0
- package/dist/tools/generate-gif.d.ts.map +1 -0
- package/dist/tools/generate-gif.js +94 -0
- package/dist/tools/generate-gif.js.map +1 -0
- package/dist/tools/get-markers.d.ts +13 -0
- package/dist/tools/get-markers.d.ts.map +1 -0
- package/dist/tools/get-markers.js +71 -0
- package/dist/tools/get-markers.js.map +1 -0
- package/dist/tools/get-timeline.d.ts +9 -0
- package/dist/tools/get-timeline.d.ts.map +1 -0
- package/dist/tools/get-timeline.js +43 -0
- package/dist/tools/get-timeline.js.map +1 -0
- package/dist/tools/grade-skin-tones.d.ts +31 -0
- package/dist/tools/grade-skin-tones.d.ts.map +1 -0
- package/dist/tools/grade-skin-tones.js +92 -0
- package/dist/tools/grade-skin-tones.js.map +1 -0
- package/dist/tools/host-info.d.ts +7 -0
- package/dist/tools/host-info.d.ts.map +1 -0
- package/dist/tools/host-info.js +33 -0
- package/dist/tools/host-info.js.map +1 -0
- package/dist/tools/host-tools.test.d.ts +2 -0
- package/dist/tools/host-tools.test.d.ts.map +1 -0
- package/dist/tools/host-tools.test.js +83 -0
- package/dist/tools/host-tools.test.js.map +1 -0
- package/dist/tools/import-edl.d.ts +9 -0
- package/dist/tools/import-edl.d.ts.map +1 -0
- package/dist/tools/import-edl.js +25 -0
- package/dist/tools/import-edl.js.map +1 -0
- package/dist/tools/import-subtitles.d.ts +9 -0
- package/dist/tools/import-subtitles.d.ts.map +1 -0
- package/dist/tools/import-subtitles.js +31 -0
- package/dist/tools/import-subtitles.js.map +1 -0
- package/dist/tools/import-to-media-pool.d.ts +10 -0
- package/dist/tools/import-to-media-pool.d.ts.map +1 -0
- package/dist/tools/import-to-media-pool.js +27 -0
- package/dist/tools/import-to-media-pool.js.map +1 -0
- package/dist/tools/index.d.ts +94 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +242 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +128 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/insert-broll.d.ts +13 -0
- package/dist/tools/insert-broll.d.ts.map +1 -0
- package/dist/tools/insert-broll.js +56 -0
- package/dist/tools/insert-broll.js.map +1 -0
- package/dist/tools/ken-burns.d.ts +26 -0
- package/dist/tools/ken-burns.d.ts.map +1 -0
- package/dist/tools/ken-burns.js +125 -0
- package/dist/tools/ken-burns.js.map +1 -0
- package/dist/tools/list-render-presets.d.ts +7 -0
- package/dist/tools/list-render-presets.d.ts.map +1 -0
- package/dist/tools/list-render-presets.js +30 -0
- package/dist/tools/list-render-presets.js.map +1 -0
- package/dist/tools/match-clip-color.d.ts +29 -0
- package/dist/tools/match-clip-color.d.ts.map +1 -0
- package/dist/tools/match-clip-color.js +99 -0
- package/dist/tools/match-clip-color.js.map +1 -0
- package/dist/tools/measure-loudness.d.ts +8 -0
- package/dist/tools/measure-loudness.d.ts.map +1 -0
- package/dist/tools/measure-loudness.js +40 -0
- package/dist/tools/measure-loudness.js.map +1 -0
- package/dist/tools/mix-audio.d.ts +46 -0
- package/dist/tools/mix-audio.d.ts.map +1 -0
- package/dist/tools/mix-audio.js +101 -0
- package/dist/tools/mix-audio.js.map +1 -0
- package/dist/tools/multicam-sync.d.ts +14 -0
- package/dist/tools/multicam-sync.d.ts.map +1 -0
- package/dist/tools/multicam-sync.js +75 -0
- package/dist/tools/multicam-sync.js.map +1 -0
- package/dist/tools/new-tools.test.d.ts +2 -0
- package/dist/tools/new-tools.test.d.ts.map +1 -0
- package/dist/tools/new-tools.test.js +511 -0
- package/dist/tools/new-tools.test.js.map +1 -0
- package/dist/tools/normalize-loudness.d.ts +21 -0
- package/dist/tools/normalize-loudness.d.ts.map +1 -0
- package/dist/tools/normalize-loudness.js +94 -0
- package/dist/tools/normalize-loudness.js.map +1 -0
- package/dist/tools/open-page.d.ts +17 -0
- package/dist/tools/open-page.d.ts.map +1 -0
- package/dist/tools/open-page.js +27 -0
- package/dist/tools/open-page.js.map +1 -0
- package/dist/tools/overlay-watermark.d.ts +28 -0
- package/dist/tools/overlay-watermark.d.ts.map +1 -0
- package/dist/tools/overlay-watermark.js +98 -0
- package/dist/tools/overlay-watermark.js.map +1 -0
- package/dist/tools/pick-best-takes.d.ts +20 -0
- package/dist/tools/pick-best-takes.d.ts.map +1 -0
- package/dist/tools/pick-best-takes.js +147 -0
- package/dist/tools/pick-best-takes.js.map +1 -0
- package/dist/tools/post-tools.test.d.ts +2 -0
- package/dist/tools/post-tools.test.d.ts.map +1 -0
- package/dist/tools/post-tools.test.js +83 -0
- package/dist/tools/post-tools.test.js.map +1 -0
- package/dist/tools/pre-render-check.d.ts +23 -0
- package/dist/tools/pre-render-check.d.ts.map +1 -0
- package/dist/tools/pre-render-check.js +134 -0
- package/dist/tools/pre-render-check.js.map +1 -0
- package/dist/tools/probe-media.d.ts +8 -0
- package/dist/tools/probe-media.d.ts.map +1 -0
- package/dist/tools/probe-media.js +32 -0
- package/dist/tools/probe-media.js.map +1 -0
- package/dist/tools/punch-in.d.ts +30 -0
- package/dist/tools/punch-in.d.ts.map +1 -0
- package/dist/tools/punch-in.js +130 -0
- package/dist/tools/punch-in.js.map +1 -0
- package/dist/tools/read-skill.d.ts +9 -0
- package/dist/tools/read-skill.d.ts.map +1 -0
- package/dist/tools/read-skill.js +24 -0
- package/dist/tools/read-skill.js.map +1 -0
- package/dist/tools/read-transcript.d.ts +14 -0
- package/dist/tools/read-transcript.d.ts.map +1 -0
- package/dist/tools/read-transcript.js +85 -0
- package/dist/tools/read-transcript.js.map +1 -0
- package/dist/tools/read-transcript.test.d.ts +2 -0
- package/dist/tools/read-transcript.test.d.ts.map +1 -0
- package/dist/tools/read-transcript.test.js +136 -0
- package/dist/tools/read-transcript.test.js.map +1 -0
- package/dist/tools/reformat-timeline.d.ts +25 -0
- package/dist/tools/reformat-timeline.d.ts.map +1 -0
- package/dist/tools/reformat-timeline.js +60 -0
- package/dist/tools/reformat-timeline.js.map +1 -0
- package/dist/tools/render.d.ts +10 -0
- package/dist/tools/render.d.ts.map +1 -0
- package/dist/tools/render.js +26 -0
- package/dist/tools/render.js.map +1 -0
- package/dist/tools/reorder-timeline.d.ts +12 -0
- package/dist/tools/reorder-timeline.d.ts.map +1 -0
- package/dist/tools/reorder-timeline.js +65 -0
- package/dist/tools/reorder-timeline.js.map +1 -0
- package/dist/tools/replace-clip.d.ts +10 -0
- package/dist/tools/replace-clip.d.ts.map +1 -0
- package/dist/tools/replace-clip.js +28 -0
- package/dist/tools/replace-clip.js.map +1 -0
- package/dist/tools/review-edit.d.ts +23 -0
- package/dist/tools/review-edit.d.ts.map +1 -0
- package/dist/tools/review-edit.js +47 -0
- package/dist/tools/review-edit.js.map +1 -0
- package/dist/tools/ripple-delete.d.ts +11 -0
- package/dist/tools/ripple-delete.d.ts.map +1 -0
- package/dist/tools/ripple-delete.js +27 -0
- package/dist/tools/ripple-delete.js.map +1 -0
- package/dist/tools/save-project.d.ts +7 -0
- package/dist/tools/save-project.d.ts.map +1 -0
- package/dist/tools/save-project.js +22 -0
- package/dist/tools/save-project.js.map +1 -0
- package/dist/tools/score-shot.d.ts +18 -0
- package/dist/tools/score-shot.d.ts.map +1 -0
- package/dist/tools/score-shot.js +127 -0
- package/dist/tools/score-shot.js.map +1 -0
- package/dist/tools/set-clip-speed.d.ts +10 -0
- package/dist/tools/set-clip-speed.d.ts.map +1 -0
- package/dist/tools/set-clip-speed.js +28 -0
- package/dist/tools/set-clip-speed.js.map +1 -0
- package/dist/tools/set-clip-volume.d.ts +10 -0
- package/dist/tools/set-clip-volume.d.ts.map +1 -0
- package/dist/tools/set-clip-volume.js +33 -0
- package/dist/tools/set-clip-volume.js.map +1 -0
- package/dist/tools/set-primary-correction.d.ts +14 -0
- package/dist/tools/set-primary-correction.d.ts.map +1 -0
- package/dist/tools/set-primary-correction.js +45 -0
- package/dist/tools/set-primary-correction.js.map +1 -0
- package/dist/tools/smart-reframe.d.ts +22 -0
- package/dist/tools/smart-reframe.d.ts.map +1 -0
- package/dist/tools/smart-reframe.js +39 -0
- package/dist/tools/smart-reframe.js.map +1 -0
- package/dist/tools/speed-ramp.d.ts +14 -0
- package/dist/tools/speed-ramp.d.ts.map +1 -0
- package/dist/tools/speed-ramp.js +71 -0
- package/dist/tools/speed-ramp.js.map +1 -0
- package/dist/tools/stabilize-video.d.ts +12 -0
- package/dist/tools/stabilize-video.d.ts.map +1 -0
- package/dist/tools/stabilize-video.js +63 -0
- package/dist/tools/stabilize-video.js.map +1 -0
- package/dist/tools/transcribe.d.ts +29 -0
- package/dist/tools/transcribe.d.ts.map +1 -0
- package/dist/tools/transcribe.js +116 -0
- package/dist/tools/transcribe.js.map +1 -0
- package/dist/tools/transition-videos.d.ts +29 -0
- package/dist/tools/transition-videos.d.ts.map +1 -0
- package/dist/tools/transition-videos.js +129 -0
- package/dist/tools/transition-videos.js.map +1 -0
- package/dist/tools/write-ass.d.ts +34 -0
- package/dist/tools/write-ass.d.ts.map +1 -0
- package/dist/tools/write-ass.js +101 -0
- package/dist/tools/write-ass.js.map +1 -0
- package/dist/tools/write-edl.d.ts +24 -0
- package/dist/tools/write-edl.d.ts.map +1 -0
- package/dist/tools/write-edl.js +59 -0
- package/dist/tools/write-edl.js.map +1 -0
- package/dist/tools/write-fcpxml.d.ts +20 -0
- package/dist/tools/write-fcpxml.d.ts.map +1 -0
- package/dist/tools/write-fcpxml.js +52 -0
- package/dist/tools/write-fcpxml.js.map +1 -0
- package/dist/tools/write-keyword-captions.d.ts +36 -0
- package/dist/tools/write-keyword-captions.d.ts.map +1 -0
- package/dist/tools/write-keyword-captions.js +183 -0
- package/dist/tools/write-keyword-captions.js.map +1 -0
- package/dist/tools/write-lower-third.d.ts +34 -0
- package/dist/tools/write-lower-third.d.ts.map +1 -0
- package/dist/tools/write-lower-third.js +52 -0
- package/dist/tools/write-lower-third.js.map +1 -0
- package/dist/tools/write-srt.d.ts +20 -0
- package/dist/tools/write-srt.d.ts.map +1 -0
- package/dist/tools/write-srt.js +72 -0
- package/dist/tools/write-srt.js.map +1 -0
- package/dist/tools/write-title-card.d.ts +25 -0
- package/dist/tools/write-title-card.d.ts.map +1 -0
- package/dist/tools/write-title-card.js +57 -0
- package/dist/tools/write-title-card.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +44 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +454 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +13 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +59 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +19 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +20 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/Header.d.ts +16 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +12 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/InputBox.d.ts +21 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -0
- package/dist/ui/components/InputBox.js +81 -0
- package/dist/ui/components/InputBox.js.map +1 -0
- package/dist/ui/components/Message.d.ts +14 -0
- package/dist/ui/components/Message.d.ts.map +1 -0
- package/dist/ui/components/Message.js +24 -0
- package/dist/ui/components/Message.js.map +1 -0
- package/dist/ui/components/SlashMenu.d.ts +19 -0
- package/dist/ui/components/SlashMenu.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.js +33 -0
- package/dist/ui/components/SlashMenu.js.map +1 -0
- package/dist/ui/components/SlashMenu.test.d.ts +2 -0
- package/dist/ui/components/SlashMenu.test.d.ts.map +1 -0
- package/dist/ui/components/SlashMenu.test.js +23 -0
- package/dist/ui/components/SlashMenu.test.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +6 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +16 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/ToolCallLine.d.ts +16 -0
- package/dist/ui/components/ToolCallLine.d.ts.map +1 -0
- package/dist/ui/components/ToolCallLine.js +35 -0
- package/dist/ui/components/ToolCallLine.js.map +1 -0
- package/dist/ui/render.d.ts +9 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +56 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/spinner-frames.d.ts +3 -0
- package/dist/ui/spinner-frames.d.ts.map +1 -0
- package/dist/ui/spinner-frames.js +16 -0
- package/dist/ui/spinner-frames.js.map +1 -0
- package/dist/ui/theme.d.ts +27 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +26 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve as resolvePath } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { compact, err } from "../core/format.js";
|
|
5
|
+
import { applyLoudnorm, measureLoudness, PLATFORM_TARGETS, } from "../core/loudness.js";
|
|
6
|
+
import { checkFfmpeg, probeMedia } from "../core/media/ffmpeg.js";
|
|
7
|
+
const PlatformEnum = z.enum([
|
|
8
|
+
"youtube",
|
|
9
|
+
"spotify",
|
|
10
|
+
"apple-podcasts",
|
|
11
|
+
"podcast",
|
|
12
|
+
"broadcast-r128",
|
|
13
|
+
"tiktok",
|
|
14
|
+
"instagram",
|
|
15
|
+
]);
|
|
16
|
+
const NormalizeLoudnessParams = z.object({
|
|
17
|
+
input: z.string().describe("Source media file (audio or video)."),
|
|
18
|
+
output: z.string().describe("Where to write the normalized file."),
|
|
19
|
+
platform: PlatformEnum.optional().describe("Preset target. youtube/spotify/tiktok/instagram=-14 LUFS; podcast/apple=-16; broadcast-r128=-23."),
|
|
20
|
+
integratedLufs: z
|
|
21
|
+
.number()
|
|
22
|
+
.negative()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Custom integrated loudness target. Overrides platform."),
|
|
25
|
+
truePeakDb: z.number().negative().optional().describe("True peak ceiling. Default -1 dBTP."),
|
|
26
|
+
loudnessRange: z.number().positive().optional().describe("LRA target. Default 11 LU."),
|
|
27
|
+
});
|
|
28
|
+
export function createNormalizeLoudnessTool(cwd) {
|
|
29
|
+
return {
|
|
30
|
+
name: "normalize_loudness",
|
|
31
|
+
description: "Two-pass EBU R128 loudness normalization (ffmpeg loudnorm). " +
|
|
32
|
+
"Writes a new file at the platform target. Default targets: youtube=-14, " +
|
|
33
|
+
"podcast=-16, broadcast-r128=-23 LUFS. Use BEFORE rendering to ensure your " +
|
|
34
|
+
"output meets the platform spec — loudness violations are the #1 reason " +
|
|
35
|
+
"uploads sound 'quiet' or 'too hot' to listeners.",
|
|
36
|
+
parameters: NormalizeLoudnessParams,
|
|
37
|
+
async execute({ input, output, platform, integratedLufs, truePeakDb, loudnessRange }, ctx) {
|
|
38
|
+
if (!checkFfmpeg())
|
|
39
|
+
return err("ffmpeg not on PATH", "install ffmpeg");
|
|
40
|
+
try {
|
|
41
|
+
const inAbs = resolvePath(cwd, input);
|
|
42
|
+
const outAbs = resolvePath(cwd, output);
|
|
43
|
+
if (inAbs === outAbs) {
|
|
44
|
+
return err("input and output paths are identical", "use a different output path");
|
|
45
|
+
}
|
|
46
|
+
let target;
|
|
47
|
+
if (integratedLufs !== undefined) {
|
|
48
|
+
target = { integratedLufs, truePeakDb, loudnessRange };
|
|
49
|
+
}
|
|
50
|
+
else if (platform) {
|
|
51
|
+
target = { ...PLATFORM_TARGETS[platform] };
|
|
52
|
+
if (truePeakDb !== undefined)
|
|
53
|
+
target.truePeakDb = truePeakDb;
|
|
54
|
+
if (loudnessRange !== undefined)
|
|
55
|
+
target.loudnessRange = loudnessRange;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return err("neither platform nor integratedLufs supplied", "pass platform=youtube|podcast|... OR integratedLufs=-14");
|
|
59
|
+
}
|
|
60
|
+
mkdirSync(dirname(outAbs), { recursive: true });
|
|
61
|
+
// Auto-detect mono → enable dual_mono so loudnorm measures correctly.
|
|
62
|
+
const probe = probeMedia(inAbs);
|
|
63
|
+
const dualMono = probe?.audioChannels === 1;
|
|
64
|
+
const measurement = await measureLoudness(inAbs, {
|
|
65
|
+
signal: ctx.signal,
|
|
66
|
+
dualMono,
|
|
67
|
+
});
|
|
68
|
+
await applyLoudnorm(inAbs, outAbs, measurement, target, {
|
|
69
|
+
signal: ctx.signal,
|
|
70
|
+
dualMono,
|
|
71
|
+
});
|
|
72
|
+
return compact({
|
|
73
|
+
ok: true,
|
|
74
|
+
path: outAbs,
|
|
75
|
+
...(dualMono ? { dualMono: true } : {}),
|
|
76
|
+
source: {
|
|
77
|
+
i: +measurement.inputI.toFixed(2),
|
|
78
|
+
tp: +measurement.inputTp.toFixed(2),
|
|
79
|
+
lra: +measurement.inputLra.toFixed(2),
|
|
80
|
+
},
|
|
81
|
+
target: {
|
|
82
|
+
i: target.integratedLufs,
|
|
83
|
+
tp: target.truePeakDb ?? -1,
|
|
84
|
+
lra: target.loudnessRange ?? 11,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return err(e.message);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=normalize-loudness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-loudness.js","sourceRoot":"","sources":["../../src/tools/normalize-loudness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
import type { VideoHost } from "../core/hosts/types.js";
|
|
4
|
+
declare const OpenPageParams: z.ZodObject<{
|
|
5
|
+
name: z.ZodEnum<{
|
|
6
|
+
media: "media";
|
|
7
|
+
cut: "cut";
|
|
8
|
+
edit: "edit";
|
|
9
|
+
fusion: "fusion";
|
|
10
|
+
color: "color";
|
|
11
|
+
fairlight: "fairlight";
|
|
12
|
+
deliver: "deliver";
|
|
13
|
+
}>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare function createOpenPageTool(host: VideoHost): AgentTool<typeof OpenPageParams>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=open-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-page.d.ts","sourceRoot":"","sources":["../../src/tools/open-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,QAAA,MAAM,cAAc;;;;;;;;;;iBAElB,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAoBpF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { err } from "../core/format.js";
|
|
3
|
+
const OpenPageParams = z.object({
|
|
4
|
+
name: z.enum(["media", "cut", "edit", "fusion", "color", "fairlight", "deliver"]),
|
|
5
|
+
});
|
|
6
|
+
export function createOpenPageTool(host) {
|
|
7
|
+
return {
|
|
8
|
+
name: "open_page",
|
|
9
|
+
description: "Switch the host UI to a workspace page. Resolve only — Premiere has no page " +
|
|
10
|
+
"concept and will return error: not_supported. Use to guide the user's eyes: " +
|
|
11
|
+
"media for import, edit for cuts, color for grading, deliver for render.",
|
|
12
|
+
parameters: OpenPageParams,
|
|
13
|
+
async execute({ name }) {
|
|
14
|
+
try {
|
|
15
|
+
if (typeof host.openPage !== "function") {
|
|
16
|
+
return err("not_supported", "page concept is Resolve-only");
|
|
17
|
+
}
|
|
18
|
+
await host.openPage(name);
|
|
19
|
+
return "ok";
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return err(e.message);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=open-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-page.js","sourceRoot":"","sources":["../../src/tools/open-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAGxC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAChD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,8EAA8E;YAC9E,8EAA8E;YAC9E,yEAAyE;QAC3E,UAAU,EAAE,cAAc;QAC1B,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE;YACpB,IAAI,CAAC;gBACH,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;oBACxC,OAAO,GAAG,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAC;gBAC9D,CAAC;gBACD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const OverlayWatermarkParams: z.ZodObject<{
|
|
4
|
+
input: z.ZodString;
|
|
5
|
+
watermark: z.ZodString;
|
|
6
|
+
output: z.ZodString;
|
|
7
|
+
position: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
center: "center";
|
|
9
|
+
"bottom-left": "bottom-left";
|
|
10
|
+
"bottom-right": "bottom-right";
|
|
11
|
+
"top-left": "top-left";
|
|
12
|
+
"top-right": "top-right";
|
|
13
|
+
}>>;
|
|
14
|
+
marginPx: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
scale: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export declare function createOverlayWatermarkTool(cwd: string): AgentTool<typeof OverlayWatermarkParams>;
|
|
19
|
+
/**
|
|
20
|
+
* Build overlay x/y formulas from a named position. ffmpeg's overlay filter
|
|
21
|
+
* supports `W`/`H` (main video) and `w`/`h` (overlay dimensions).
|
|
22
|
+
*/
|
|
23
|
+
export declare function positionFormula(pos: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "center", margin: number): {
|
|
24
|
+
x: string;
|
|
25
|
+
y: string;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=overlay-watermark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-watermark.d.ts","sourceRoot":"","sources":["../../src/tools/overlay-watermark.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;iBAgB1B,CAAC;AAEH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,sBAAsB,CAAC,CA0DhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,EACzE,MAAM,EAAE,MAAM,GACb;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAa1B"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve as resolvePath } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { compact, err } from "../core/format.js";
|
|
5
|
+
import { checkFfmpeg, runFfmpeg } from "../core/media/ffmpeg.js";
|
|
6
|
+
const OverlayWatermarkParams = z.object({
|
|
7
|
+
input: z.string().describe("Source video."),
|
|
8
|
+
watermark: z.string().describe("Image file (.png with transparency recommended)."),
|
|
9
|
+
output: z.string().describe("Output path."),
|
|
10
|
+
position: z
|
|
11
|
+
.enum(["top-left", "top-right", "bottom-left", "bottom-right", "center"])
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Default 'bottom-right'."),
|
|
14
|
+
marginPx: z.number().int().min(0).optional().describe("Pixels from each edge. Default 20."),
|
|
15
|
+
opacity: z.number().min(0).max(1).optional().describe("0-1. Default 0.85 (subtle but readable)."),
|
|
16
|
+
scale: z
|
|
17
|
+
.number()
|
|
18
|
+
.min(0.01)
|
|
19
|
+
.max(1)
|
|
20
|
+
.optional()
|
|
21
|
+
.describe("Watermark scale relative to input width. Default 0.15."),
|
|
22
|
+
});
|
|
23
|
+
export function createOverlayWatermarkTool(cwd) {
|
|
24
|
+
return {
|
|
25
|
+
name: "overlay_watermark",
|
|
26
|
+
description: "Composite a logo / watermark image over a video. PNG with transparency works best. " +
|
|
27
|
+
"Position presets cover the four corners + center. Default scale 15% of input width — " +
|
|
28
|
+
"big enough to read, small enough not to dominate.",
|
|
29
|
+
parameters: OverlayWatermarkParams,
|
|
30
|
+
async execute(args, ctx) {
|
|
31
|
+
if (!checkFfmpeg())
|
|
32
|
+
return err("ffmpeg not on PATH", "install ffmpeg");
|
|
33
|
+
try {
|
|
34
|
+
const inAbs = resolvePath(cwd, args.input);
|
|
35
|
+
const wmAbs = resolvePath(cwd, args.watermark);
|
|
36
|
+
const outAbs = resolvePath(cwd, args.output);
|
|
37
|
+
if (inAbs === outAbs || wmAbs === outAbs) {
|
|
38
|
+
return err("output collides with an input");
|
|
39
|
+
}
|
|
40
|
+
const pos = args.position ?? "bottom-right";
|
|
41
|
+
const m = args.marginPx ?? 20;
|
|
42
|
+
const opacity = args.opacity ?? 0.85;
|
|
43
|
+
const scale = args.scale ?? 0.15;
|
|
44
|
+
const xy = positionFormula(pos, m);
|
|
45
|
+
// Scale watermark relative to MAIN width (W in overlay coordinate
|
|
46
|
+
// system; we use the [in] [wm] complex filter so scale=W*x:-1).
|
|
47
|
+
const filter = `[1:v]format=rgba,colorchannelmixer=aa=${opacity}[wm0];` +
|
|
48
|
+
`[wm0][0:v]scale2ref=w=iw*${scale}:h=ow/mdar[wm][bg];` +
|
|
49
|
+
`[bg][wm]overlay=${xy.x}:${xy.y}[v]`;
|
|
50
|
+
mkdirSync(dirname(outAbs), { recursive: true });
|
|
51
|
+
const r = await runFfmpeg([
|
|
52
|
+
"-i",
|
|
53
|
+
inAbs,
|
|
54
|
+
"-i",
|
|
55
|
+
wmAbs,
|
|
56
|
+
"-filter_complex",
|
|
57
|
+
filter,
|
|
58
|
+
"-map",
|
|
59
|
+
"[v]",
|
|
60
|
+
"-map",
|
|
61
|
+
"0:a?",
|
|
62
|
+
"-c:v",
|
|
63
|
+
"libx264",
|
|
64
|
+
"-crf",
|
|
65
|
+
"20",
|
|
66
|
+
"-c:a",
|
|
67
|
+
"copy",
|
|
68
|
+
outAbs,
|
|
69
|
+
], { signal: ctx.signal });
|
|
70
|
+
if (r.code !== 0)
|
|
71
|
+
return err(`ffmpeg exited ${r.code}`);
|
|
72
|
+
return compact({ ok: true, path: outAbs, position: pos });
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return err(e.message);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build overlay x/y formulas from a named position. ffmpeg's overlay filter
|
|
82
|
+
* supports `W`/`H` (main video) and `w`/`h` (overlay dimensions).
|
|
83
|
+
*/
|
|
84
|
+
export function positionFormula(pos, margin) {
|
|
85
|
+
switch (pos) {
|
|
86
|
+
case "top-left":
|
|
87
|
+
return { x: `${margin}`, y: `${margin}` };
|
|
88
|
+
case "top-right":
|
|
89
|
+
return { x: `W-w-${margin}`, y: `${margin}` };
|
|
90
|
+
case "bottom-left":
|
|
91
|
+
return { x: `${margin}`, y: `H-h-${margin}` };
|
|
92
|
+
case "bottom-right":
|
|
93
|
+
return { x: `W-w-${margin}`, y: `H-h-${margin}` };
|
|
94
|
+
case "center":
|
|
95
|
+
return { x: "(W-w)/2", y: "(H-h)/2" };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=overlay-watermark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay-watermark.js","sourceRoot":"","sources":["../../src/tools/overlay-watermark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
declare const PickBestTakesParams: z.ZodObject<{
|
|
4
|
+
transcriptPath: z.ZodString;
|
|
5
|
+
videoPath: z.ZodOptional<z.ZodString>;
|
|
6
|
+
strategy: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
last: "last";
|
|
8
|
+
first: "first";
|
|
9
|
+
vision: "vision";
|
|
10
|
+
}>>;
|
|
11
|
+
threshold: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
visionDetail: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
low: "low";
|
|
14
|
+
high: "high";
|
|
15
|
+
}>>;
|
|
16
|
+
maxClusters: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export declare function createPickBestTakesTool(cwd: string): AgentTool<typeof PickBestTakesParams>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=pick-best-takes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick-best-takes.d.ts","sourceRoot":"","sources":["../../src/tools/pick-best-takes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQrD,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;iBA8BvB,CAAC;AAWH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAwH1F"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { clusterSegments } from "../core/clustering.js";
|
|
5
|
+
import { compact, err, summarizeList } from "../core/format.js";
|
|
6
|
+
import { extractAtTimes } from "../core/frames.js";
|
|
7
|
+
import { checkFfmpeg } from "../core/media/ffmpeg.js";
|
|
8
|
+
import { scoreFrames } from "../core/vision.js";
|
|
9
|
+
const PickBestTakesParams = z.object({
|
|
10
|
+
transcriptPath: z.string().describe("Transcript JSON file from `transcribe`."),
|
|
11
|
+
videoPath: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Video file. Required if strategy uses vision. Optional if strategy='last' or 'first'."),
|
|
15
|
+
strategy: z
|
|
16
|
+
.enum(["last", "first", "vision"])
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("How to pick within a cluster. " +
|
|
19
|
+
"'last' (default) — pick the latest take (speakers warm up). " +
|
|
20
|
+
"'first' — pick the earliest take. " +
|
|
21
|
+
"'vision' — score frames via score_shot, pick highest visual quality."),
|
|
22
|
+
threshold: z
|
|
23
|
+
.number()
|
|
24
|
+
.min(0)
|
|
25
|
+
.max(1)
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Cluster similarity threshold. Default 0.6."),
|
|
28
|
+
visionDetail: z.enum(["low", "high"]).optional(),
|
|
29
|
+
maxClusters: z
|
|
30
|
+
.number()
|
|
31
|
+
.int()
|
|
32
|
+
.positive()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Cap clusters processed (default 30)."),
|
|
35
|
+
});
|
|
36
|
+
export function createPickBestTakesTool(cwd) {
|
|
37
|
+
return {
|
|
38
|
+
name: "pick_best_takes",
|
|
39
|
+
description: "Composite: cluster transcript re-takes, then pick the best take per cluster using a " +
|
|
40
|
+
"configurable strategy ('last', 'first', or 'vision'). Returns picks + dropped segments " +
|
|
41
|
+
"with reasoning, ready to feed into write_edl/write_fcpxml. " +
|
|
42
|
+
"Replaces manual orchestration of cluster_takes -> score_shot -> winner-picking.",
|
|
43
|
+
parameters: PickBestTakesParams,
|
|
44
|
+
async execute(args, ctx) {
|
|
45
|
+
try {
|
|
46
|
+
const { transcriptPath, videoPath, strategy = "last", threshold = 0.6, visionDetail, maxClusters = 30, } = args;
|
|
47
|
+
// Load transcript
|
|
48
|
+
const tAbs = resolvePath(cwd, transcriptPath);
|
|
49
|
+
const t = JSON.parse(readFileSync(tAbs, "utf8"));
|
|
50
|
+
if (!t.segments || t.segments.length === 0) {
|
|
51
|
+
return err("transcript has no segments");
|
|
52
|
+
}
|
|
53
|
+
// Cluster
|
|
54
|
+
const clusters = clusterSegments(t.segments, { threshold });
|
|
55
|
+
const limited = clusters.slice(0, maxClusters);
|
|
56
|
+
if (limited.length === 0) {
|
|
57
|
+
return compact({
|
|
58
|
+
clustersFound: 0,
|
|
59
|
+
picks: [],
|
|
60
|
+
note: "no multi-take clusters detected; nothing to pick",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// Apply strategy
|
|
64
|
+
const picks = [];
|
|
65
|
+
if (strategy === "last" || strategy === "first") {
|
|
66
|
+
for (const c of limited) {
|
|
67
|
+
const indexes = c.memberIndexes;
|
|
68
|
+
const pickedIndex = strategy === "last" ? indexes[indexes.length - 1] : indexes[0];
|
|
69
|
+
const pickedTake = c.members[strategy === "last" ? indexes.length - 1 : 0];
|
|
70
|
+
picks.push({
|
|
71
|
+
cluster: c.id,
|
|
72
|
+
pickedIndex,
|
|
73
|
+
pickedTake: round3(pickedTake),
|
|
74
|
+
droppedIndexes: indexes.filter((i) => i !== pickedIndex),
|
|
75
|
+
reason: strategy === "last" ? "latest take (speaker warmed up)" : "earliest take",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// strategy === "vision"
|
|
81
|
+
if (!videoPath)
|
|
82
|
+
return err("videoPath required for strategy='vision'");
|
|
83
|
+
if (!checkFfmpeg())
|
|
84
|
+
return err("ffmpeg not on PATH", "install ffmpeg");
|
|
85
|
+
if (!process.env.OPENAI_API_KEY)
|
|
86
|
+
return err("OPENAI_API_KEY not set");
|
|
87
|
+
// Build a flat list of (clusterIdx, memberIdx, midSec) to score in one batch
|
|
88
|
+
const flat = [];
|
|
89
|
+
for (let ci = 0; ci < limited.length; ci++) {
|
|
90
|
+
const c = limited[ci];
|
|
91
|
+
for (let mi = 0; mi < c.members.length; mi++) {
|
|
92
|
+
const m = c.members[mi];
|
|
93
|
+
flat.push({
|
|
94
|
+
clusterIdx: ci,
|
|
95
|
+
memberIdx: mi,
|
|
96
|
+
midSec: (m.start + m.end) / 2,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const vAbs = resolvePath(cwd, videoPath);
|
|
101
|
+
const frames = await extractAtTimes(vAbs, flat.map((f) => f.midSec), { maxWidth: 1280, signal: ctx.signal });
|
|
102
|
+
const scores = await scoreFrames(frames, {
|
|
103
|
+
detail: visionDetail,
|
|
104
|
+
signal: ctx.signal,
|
|
105
|
+
});
|
|
106
|
+
// Group scores by cluster, pick max
|
|
107
|
+
for (let ci = 0; ci < limited.length; ci++) {
|
|
108
|
+
const c = limited[ci];
|
|
109
|
+
const clusterScores = flat
|
|
110
|
+
.map((f, i) => ({ ...f, score: scores[i].score, why: scores[i].why }))
|
|
111
|
+
.filter((x) => x.clusterIdx === ci);
|
|
112
|
+
const winner = clusterScores.reduce((best, cur) => cur.score > best.score ? cur : best);
|
|
113
|
+
const pickedIndex = c.memberIndexes[winner.memberIdx];
|
|
114
|
+
picks.push({
|
|
115
|
+
cluster: c.id,
|
|
116
|
+
pickedIndex,
|
|
117
|
+
pickedTake: round3(c.members[winner.memberIdx]),
|
|
118
|
+
droppedIndexes: c.memberIndexes.filter((i) => i !== pickedIndex),
|
|
119
|
+
reason: `vision: ${winner.why}`,
|
|
120
|
+
score: winner.score,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Compact output
|
|
125
|
+
const summary = summarizeList(picks, 30);
|
|
126
|
+
return compact({
|
|
127
|
+
clustersFound: clusters.length,
|
|
128
|
+
processed: limited.length,
|
|
129
|
+
strategy,
|
|
130
|
+
picks: summary.omitted > 0 ? summary.head.concat(summary.tail) : picks,
|
|
131
|
+
...(summary.omitted > 0 ? { omitted: summary.omitted } : {}),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
return err(e.message);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function round3(seg) {
|
|
141
|
+
return {
|
|
142
|
+
start: +seg.start.toFixed(2),
|
|
143
|
+
end: +seg.end.toFixed(2),
|
|
144
|
+
text: seg.text.length > 80 ? seg.text.slice(0, 79) + "…" : seg.text,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=pick-best-takes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick-best-takes.js","sourceRoot":"","sources":["../../src/tools/pick-best-takes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC9E,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,uFAAuF,CACxF;IACH,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SACjC,QAAQ,EAAE;SACV,QAAQ,CACP,gCAAgC;QAC9B,8DAA8D;QAC9D,oCAAoC;QACpC,sEAAsE,CACzE;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;CACpD,CAAC,CAAC;AAWH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,sFAAsF;YACtF,yFAAyF;YACzF,6DAA6D;YAC7D,iFAAiF;QACnF,UAAU,EAAE,mBAAmB;QAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,IAAI,CAAC;gBACH,MAAM,EACJ,cAAc,EACd,SAAS,EACT,QAAQ,GAAG,MAAM,EACjB,SAAS,GAAG,GAAG,EACf,YAAY,EACZ,WAAW,GAAG,EAAE,GACjB,GAAG,IAAI,CAAC;gBAET,kBAAkB;gBAClB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;gBAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;gBAC/D,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3C,OAAO,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC3C,CAAC;gBAED,UAAU;gBACV,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,OAAO,CAAC;wBACb,aAAa,EAAE,CAAC;wBAChB,KAAK,EAAE,EAAE;wBACT,IAAI,EAAE,kDAAkD;qBACzD,CAAC,CAAC;gBACL,CAAC;gBAED,iBAAiB;gBACjB,MAAM,KAAK,GAAiB,EAAE,CAAC;gBAE/B,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC;wBAChC,MAAM,WAAW,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;wBACnF,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC3E,KAAK,CAAC,IAAI,CAAC;4BACT,OAAO,EAAE,CAAC,CAAC,EAAE;4BACb,WAAW;4BACX,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;4BAC9B,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC;4BACxD,MAAM,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,eAAe;yBAClF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,wBAAwB;oBACxB,IAAI,CAAC,SAAS;wBAAE,OAAO,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBACvE,IAAI,CAAC,WAAW,EAAE;wBAAE,OAAO,GAAG,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;oBACvE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;wBAAE,OAAO,GAAG,CAAC,wBAAwB,CAAC,CAAC;oBAEtE,6EAA6E;oBAC7E,MAAM,IAAI,GAAqE,EAAE,CAAC;oBAClF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;wBAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;wBACtB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;4BAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BACxB,IAAI,CAAC,IAAI,CAAC;gCACR,UAAU,EAAE,EAAE;gCACd,SAAS,EAAE,EAAE;gCACb,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;6BAC9B,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBACzC,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,IAAI,EACJ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EACzB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CACvC,CAAC;oBACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;wBACvC,MAAM,EAAE,YAAY;wBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;qBACnB,CAAC,CAAC;oBAEH,oCAAoC;oBACpC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;wBAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;wBACtB,MAAM,aAAa,GAAG,IAAI;6BACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;6BACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;wBACtC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAChD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CACpC,CAAC;wBACF,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;wBACtD,KAAK,CAAC,IAAI,CAAC;4BACT,OAAO,EAAE,CAAC,CAAC,EAAE;4BACb,WAAW;4BACX,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;4BAC/C,cAAc,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC;4BAChE,MAAM,EAAE,WAAW,MAAM,CAAC,GAAG,EAAE;4BAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,iBAAiB;gBACjB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACzC,OAAO,OAAO,CAAC;oBACb,aAAa,EAAE,QAAQ,CAAC,MAAM;oBAC9B,SAAS,EAAE,OAAO,CAAC,MAAM;oBACzB,QAAQ;oBACR,KAAK,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;oBACtE,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7D,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,GAAiD;IAK/D,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5B,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-tools.test.d.ts","sourceRoot":"","sources":["../../src/tools/post-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { escapeFilterPath } from "./burn-subtitles.js";
|
|
3
|
+
import { escapeDrawtextValue } from "./compose-thumbnail.js";
|
|
4
|
+
import { buildConcatListBody } from "./concat-videos.js";
|
|
5
|
+
import { positionFormula } from "./overlay-watermark.js";
|
|
6
|
+
describe("positionFormula", () => {
|
|
7
|
+
it("top-left places at (margin, margin)", () => {
|
|
8
|
+
expect(positionFormula("top-left", 20)).toEqual({ x: "20", y: "20" });
|
|
9
|
+
});
|
|
10
|
+
it("top-right offsets x by W-w-margin", () => {
|
|
11
|
+
expect(positionFormula("top-right", 20)).toEqual({ x: "W-w-20", y: "20" });
|
|
12
|
+
});
|
|
13
|
+
it("bottom-left offsets y by H-h-margin", () => {
|
|
14
|
+
expect(positionFormula("bottom-left", 30)).toEqual({ x: "30", y: "H-h-30" });
|
|
15
|
+
});
|
|
16
|
+
it("bottom-right offsets both x and y", () => {
|
|
17
|
+
expect(positionFormula("bottom-right", 10)).toEqual({
|
|
18
|
+
x: "W-w-10",
|
|
19
|
+
y: "H-h-10",
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it("center centers via (W-w)/2 and (H-h)/2", () => {
|
|
23
|
+
expect(positionFormula("center", 0)).toEqual({ x: "(W-w)/2", y: "(H-h)/2" });
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("buildConcatListBody", () => {
|
|
27
|
+
it("emits one `file '<path>'` line per input", () => {
|
|
28
|
+
expect(buildConcatListBody(["/a.mp4", "/b.mp4"])).toBe("file '/a.mp4'\nfile '/b.mp4'");
|
|
29
|
+
});
|
|
30
|
+
it("shell-escapes embedded single quotes (POSIX form)", () => {
|
|
31
|
+
// Real-world fixture from Xinrea/bili-shadowreplay: paths with a single
|
|
32
|
+
// quote need ' → '\\'' escaping inside single-quoted shell strings, which
|
|
33
|
+
// ffmpeg's concat demuxer parses with the same convention.
|
|
34
|
+
expect(buildConcatListBody(["/dir/it's-fine.mp4"])).toBe("file '/dir/it'\\''s-fine.mp4'");
|
|
35
|
+
});
|
|
36
|
+
it("preserves spaces and other special chars unchanged", () => {
|
|
37
|
+
expect(buildConcatListBody(["/Users/me/My Files/clip [1].mp4"])).toBe("file '/Users/me/My Files/clip [1].mp4'");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("escapeDrawtextValue", () => {
|
|
41
|
+
// Rules cross-checked against real-world fixtures: GVCLab/CutClaw,
|
|
42
|
+
// g0ldyy/comet, ehendrix23/tesla_dashcam, nickslevine/budok-ai.
|
|
43
|
+
it("passes plain text unchanged", () => {
|
|
44
|
+
expect(escapeDrawtextValue("Hello World")).toBe("Hello World");
|
|
45
|
+
});
|
|
46
|
+
it("escapes single quotes", () => {
|
|
47
|
+
expect(escapeDrawtextValue("don't stop")).toBe("don\\'t stop");
|
|
48
|
+
});
|
|
49
|
+
it("escapes colons (drawtext arg separator)", () => {
|
|
50
|
+
expect(escapeDrawtextValue("note: hello")).toBe("note\\: hello");
|
|
51
|
+
});
|
|
52
|
+
it("escapes percent signs (drawtext expansion delimiter)", () => {
|
|
53
|
+
expect(escapeDrawtextValue("50% off")).toBe("50\\% off");
|
|
54
|
+
});
|
|
55
|
+
it("escapes backslash FIRST so other escapes don't double up", () => {
|
|
56
|
+
expect(escapeDrawtextValue("path\\to")).toBe("path\\\\to");
|
|
57
|
+
});
|
|
58
|
+
it("converts newlines to drawtext's literal \\n", () => {
|
|
59
|
+
expect(escapeDrawtextValue("line1\nline2")).toBe("line1\\nline2");
|
|
60
|
+
expect(escapeDrawtextValue("line1\r\nline2")).toBe("line1\\nline2");
|
|
61
|
+
});
|
|
62
|
+
it("handles a kitchen-sink string in correct order", () => {
|
|
63
|
+
// Order matters: backslash first, then colon, quote, percent, newline.
|
|
64
|
+
const out = escapeDrawtextValue("50% off: don't \\stop\nnow");
|
|
65
|
+
expect(out).toBe("50\\% off\\: don\\'t \\\\stop\\nnow");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("escapeFilterPath (subtitles= filter)", () => {
|
|
69
|
+
// Cross-platform rules verified against RightNow-AI/openfang's clip skill.
|
|
70
|
+
it("converts Windows backslashes to forward slashes", () => {
|
|
71
|
+
expect(escapeFilterPath("C:\\Users\\me\\subs.ass")).toBe("C\\:/Users/me/subs.ass");
|
|
72
|
+
});
|
|
73
|
+
it("escapes the drive-letter colon", () => {
|
|
74
|
+
expect(escapeFilterPath("D:/path/to/subs.srt")).toBe("D\\:/path/to/subs.srt");
|
|
75
|
+
});
|
|
76
|
+
it("escapes single quotes", () => {
|
|
77
|
+
expect(escapeFilterPath("/Users/me/it's-here.ass")).toBe("/Users/me/it\\'s-here.ass");
|
|
78
|
+
});
|
|
79
|
+
it("is a no-op for plain Unix paths", () => {
|
|
80
|
+
expect(escapeFilterPath("/tmp/subs.srt")).toBe("/tmp/subs.srt");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=post-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-tools.test.js","sourceRoot":"","sources":["../../src/tools/post-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
import type { VideoHost } from "../core/hosts/types.js";
|
|
4
|
+
declare const PreRenderCheckParams: z.ZodObject<{
|
|
5
|
+
loudnessSource: z.ZodOptional<z.ZodString>;
|
|
6
|
+
loudnessTarget: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
youtube: "youtube";
|
|
8
|
+
spotify: "spotify";
|
|
9
|
+
"apple-podcasts": "apple-podcasts";
|
|
10
|
+
podcast: "podcast";
|
|
11
|
+
"broadcast-r128": "broadcast-r128";
|
|
12
|
+
tiktok: "tiktok";
|
|
13
|
+
instagram: "instagram";
|
|
14
|
+
}>>;
|
|
15
|
+
expectCaptions: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
interface CheckIssue {
|
|
18
|
+
severity: "ok" | "warn" | "block";
|
|
19
|
+
note: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function createPreRenderCheckTool(host: VideoHost, cwd: string): AgentTool<typeof PreRenderCheckParams>;
|
|
22
|
+
export type { CheckIssue };
|
|
23
|
+
//# sourceMappingURL=pre-render-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-render-check.d.ts","sourceRoot":"","sources":["../../src/tools/pre-render-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,QAAA,MAAM,oBAAoB;;;;;;;;;;;;iBAwBxB,CAAC;AAEH,UAAU,UAAU;IAClB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,GACV,SAAS,CAAC,OAAO,oBAAoB,CAAC,CA6GxC;AAGD,YAAY,EAAE,UAAU,EAAE,CAAC"}
|