Movie digest
Watch and digest a local video file — transcribe its narration and export keyframes so Claude can actually read what happens. Use whenever someone points at a video on disk (.mp4, .mkv, .mov, .webm, .avi) and wants it watched, summarized, broken down, analyzed, or when a screen recording narrates a bug/feature/review out loud: "digest this movie", "watch this", "what's in this footage", "transcribe and break down this clip", or any bug-report / UI-review screen recording. Local files only.From its SKILL.md
npx -y skills add ShreddyKrueger75/movie-digestAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 18 days oldThe repository was created 18 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.6 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
movie-digest
Claude can't decode video or hear audio. This skill splits the job: a script does the mechanical part — transcribes the spoken audio with timestamps and exports one keyframe per scene — and then Claude reads the transcript and views the frames to write the digest.
The audio is the point. A narrated screen recording (someone talking through
a bug) is nearly useless as frames alone — the actual report is in the voice.
Transcribe first, read transcript.md, then look at the frames. Skipping the
transcript and pulling frames with raw ffmpeg is the #1 way to miss the whole
message.
Prerequisites
brew install ffmpeg
pip install faster-whisper scenedetect
ffmpeg/ffprobe are required. faster-whisper and scenedetect are
optional and auto-detected — without the first it skips the transcript; without
the second it samples frames at even time intervals (fine for screen
recordings).
Setup (first run)
On first run in an interactive terminal, the script prompts for three defaults:
(1) Diff-threshold mode — how aggressive frame selection is
(2) Generate HTML report by default?
(3) Output directory
Your choices save to ~/.movie-digest.json — reconfigure anytime by deleting that file.
Non-interactive runs (e.g., Claude running the script) auto-write defaults (mode standard, HTML report on) without prompting.
Run (the one path)
python3 scripts/digest_movie.py "/path/to/CLIP.mov" \
--out "/path/to/CLIP.digest" --model small --max-frames 25
Then read <out>/transcript.md first, then view the frames listed in
<out>/frames_index.md in batches of ~10–15. Anchor every claim to a timestamp.
Flags that matter:
--mode insano|strict|standard|lenient— frame selection comprehensiveness (default standard).--no-report— skip HTML report (frames + digest.md only).--analyze— synthesize a structured bug report from the digest (requiresANTHROPIC_API_KEY).--analyze-model MODEL— Claude model used by--analyze(default claude-haiku-4-5-20251001).--json— machine-readable summary: JSON object with output_dir/manifest/outputs instead of human summary.--model tiny|base|small|medium|large-v3— accuracy vs speed; choose based on clip length and importance:tiny— only for short clips (under ~2 minutes) with continuous narration. On longer or sparsely-narrated recordings it fabricates plausible-sounding text instead of failing.small— the safe default for anything longer, and for anything where the narration is the point (bug reports, reviews).- Bigger models (
base,medium,large-v3) = slower but more accurate. Usebasefor a real film or when a transcript reads like nonsense — re-run with a larger model before acting on it. - Segments marked
⚠️ low-confidencein transcript.md have low Whisper confidence and may be misheard — re-check with a larger model before quoting.
--max-frames N— cap on keyframes (default 60; 12–20 for a short clip).--diff-threshold N— override mode's threshold (lower = more frames, default 1.5 for standard).--no-dedup— turn OFF diff selection + pointer; use plain interval/scene sampling instead.--no-frames— transcript only, fast. Use when you only need the narration.--no-transcribe— frames only (silent footage).--language en— skip auto-detect.
Outputs under --out:
transcript.md timestamped, grep-friendly <- READ FIRST
transcript.srt subtitles
transcript.json raw {start,end,text} segments
frames/ NNNN_HHhMMmSSs.jpg keyframes (640px)
frames_index.md frame -> timestamp + change score + POINTER table
digest.md transcript + keyframes woven by time
report.html self-contained HTML review document
clicks.json suspected click/flash moments (diff mode)
manifest.json metadata + full frame list (+ pointer) + transcript paths
QA mode (default): changed frames only + pointer
This is built for bug-report / UI-review screen recordings, so by default it does two things a plain frame-dump can't:
- Diff-based selection. A screen recording is ~90% static. Instead of one frame every N seconds (a pile of duplicates), it samples densely, then keeps only the frames that changed from the last kept one — a block placed, a menu opened, a cable drawn. 169 sampled → ~12 meaningful.
- Pointer localization. Each kept frame's
pointercolumn is the centroid of what changed vs the previous frame ≈ where the cursor / action was, as a region (top-right,center, …) + normalized(x,y).changeis the magnitude — a big number is a new screen/dialog; a small one is a local edit.
Read frames_index.md and let the pointer + change columns tell you where to
look in each frame before you open it. A failure often shows as the absence of
change — the user says "wire it across" and the next frames don't change: that
gap IS the bug. Needs Pillow + numpy (auto-detected; falls back to interval if
missing). --no-dedup restores plain sampling.
Enhanced outputs
Every digest now includes:
- digest.md — the quick read: transcript segments woven together with keyframes that fall within each segment's time window. Pointer/region marked inline. One document = one bug report. Trailing "Unmatched frames" section for frames that fall outside any transcript segment (silence gaps, after the last spoken line).
- report.html — self-contained (no external assets): transcript on the left, keyframes on the right, pointer overlay. Shareable, no post-processing needed. Also includes the unmatched frames section.
- clicks.json — detects small, localized changes (likely click flashes or menu appearances). Frames tagged with the suspected action moment. For QA mode only; empty if no candidate clicks found.
- bug_report.md (with
--analyze) — Claude synthesizes a structured bug report: issue title, steps to reproduce, expected/actual behavior, affected areas, and key timestamps. RequiresANTHROPIC_API_KEYenvironment variable.
The first three are auto-generated and graceful when transcript is absent (frames only).
Bug report generation is opt-in via --analyze.
Gotchas (learned the hard way)
- macOS screen-recording filenames contain a narrow no-break space (U+202F)
before "PM" —
Screen Recording 2026-07-23 at 9.40.00 PM.mov. A literal path copied from a message will NOT match on the command line. Resolve with a glob, or copy to a space-free path first:
The script prints this exact hint if it can't find the file.f=$(ls *Recording*9.40*.mov); cp "$f" /tmp/clip.mov python3 scripts/digest_movie.py /tmp/clip.mov --out /tmp/clip.digest --model small --model tinymishears a word or two — it heard "tempo" as "VPN" and "chorus" fine but garbled a product name once. Cross-check any load-bearing term against the matching frame before quoting it as fact.scenedetectcan import but fail if its OpenCV backend is missing/broken. The script catches that and falls back to interval sampling automatically — you'll seeWARN: scene detection failed ... falling back. Not an error.- Transcription is the slow part. On Apple Silicon
tiny/baserun faster than real time;large-v3is much slower. For a 1–2 min screen recording,tiny --no-framesreturns in seconds. - Silent clip → 0 segments. Expected; lean on the frames.
- Digests must run sequentially. Running several concurrently has hung. Sequential throughput is fine: ~40 minutes of video transcribed in about 5 minutes.
Troubleshooting
| Symptom | Fix |
|---|---|
ERROR: file not found on a path that exists | Filename has a U+202F space — glob it (see Gotchas). |
WARN: faster-whisper not installed | pip install faster-whisper — transcript was skipped. |
WARN: scenedetect not installed / scene detection failed | Harmless; frames sampled at intervals instead. |
| 0 segments on a clip you know has talking | Wrong --language, or the audio track is silent/very quiet — try --model base and confirm audio=yes in the [probe] line. |
What ships with it: 5 files
48.2 KB alongside SKILL.md, 1 of them executable
scripts/
- digest_movie.pyruns41.6 KB
- .gitignore83 B
- LICENSE1.1 KB
- README.md5.2 KB
- requirements.txt251 B