Add video support (--video) to clip/dub and a new caption command#139
Merged
Conversation
URL sources (YouTube/media pages) were always downloaded audio-only, so clip cut audio clips from videos and dub had no URL path at all. Now: - youtube.download_audio becomes download_media with a video flag: video=True fetches best video+audio merged to mp4. A shared validate_video_flag rejects --video for local sources (their video is already operated on directly, and a requested flag is never dropped silently). - assembly clip --video downloads the full video for a URL source, so the clips are cut from the video. - assembly dub gains URL sources (mirroring clip's download-then-process flow, default output in the cwd) and --video, so the dub keeps the picture. - New assembly caption command: transcribe (or reuse a transcript with -t), fetch the SRT export, and burn open captions into the video with ffmpeg's subtitles filter (audio copied untouched; explicit -map 0:v makes audio-only input a clean error instead of a silent uncaptioned copy). --chars-per-caption and --font-size shape the captions; URL sources always download the full video. https://claude.ai/code/session_01Vie2WKBt5zjUWwLbxp9BpN
alexkroman
pushed a commit
that referenced
this pull request
Jun 13, 2026
…mediafile refactor Reconciles the shared-scaffolding refactor with three upstream changes: the language-native voice rotation (#136), the dub --video flag and the new caption command (#139), and the exec-module splits (#138). - run_dub keeps upstream's YouTube-download branch and _dub_and_emit split, with this branch's early validation (--voice parse, URL echo, out-path checks) threaded through; the parsed --voice pair rides in a frozen _VoicePlan. - caption_exec now uses the shared mediafile helpers too (it had copied the same scaffolding), which also gives caption the upfront out-path validation, the samefile self-overwrite guard, the transcript status check, and the './-' ffmpeg path hardening. - mediafile grows the caption-shaped pieces: validate_out (hoisted from dub_exec), a general resolve_transcript (diarized variant delegates), a kind= parameter for validate_local_media, and a suggestion override for ffmpeg_failure. - test_dub_pipeline's YouTube-source tests move to test_dub_sources.py to stay under the 500-line file gate. https://claude.ai/code/session_018TuAQTvp9PVy5EdhsDWo2h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
URL sources (YouTube/media pages) were always downloaded audio-only, so
clip cut audio clips from videos and dub had no URL path at all. Now:
video=True fetches best video+audio merged to mp4. A shared
validate_video_flag rejects --video for local sources (their video is
already operated on directly, and a requested flag is never dropped
silently).
the clips are cut from the video.
flow, default output in the cwd) and --video, so the dub keeps the
picture.
-t), fetch the SRT export, and burn open captions into the video with
ffmpeg's subtitles filter (audio copied untouched; explicit -map 0:v
makes audio-only input a clean error instead of a silent uncaptioned
copy). --chars-per-caption and --font-size shape the captions; URL
sources always download the full video.
https://claude.ai/code/session_01Vie2WKBt5zjUWwLbxp9BpN