Communitygithub.com

JinxinHu/open_claude_skills

Pull the slides out of a recorded seminar, lecture or conference talk (YouTube, Vimeo, Panopto, Zoom recording or a local video file) as one PNG per slide change, timestamped and built into a PDF. Use this whenever the user wants the slides, figures or a slide deck from a talk video, e.g. "grab the slides from this seminar", "get the figures from this YouTube talk", "make a PDF of the slides in this recording", "I only have the video, not the slides", even if they never say "crawl", "extract" or "frames".

What is open_claude_skills?

open_claude_skills is a Claude Code agent skill that pull the slides out of a recorded seminar, lecture or conference talk (YouTube, Vimeo, Panopto, Zoom recording or a local video file) as one PNG per slide change, timestamped and built into a PDF. Use this whenever the user wants the slides, figures or a slide deck from a talk video, e.g. "grab the slides from this seminar", "get the figures from this YouTube talk", "make a PDF of the slides in this recording", "I only have the video, not the slides", even if they never say "crawl", "extract" or "frames".

Works with✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/JinxinHu/open_claude_skills/tree/HEAD/video-seminar-crawling

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Slides from a seminar video

scripts/ holds one tool in two forms that do the same thing:

ScriptUse on
scripts/extract_slides.shLinux, macOS, Git Bash or WSL on Windows
scripts/extract_slides.ps1Windows PowerShell, no bash needed
scripts/slides.texBeamer template the scripts copy next to the frames

How it works: yt-dlp downloads the video stream only (no audio, at most 1080p). ffmpeg samples it at 1 frame/s and keeps the first frame plus every frame whose scene-change score clears a threshold, so each kept frame is a new slide or a new build step. The showinfo log gives each frame's video time. The output folder then holds:

  • slide_001.png, slide_002.png, ...: one per slide change
  • timestamps.txt: the video time of each, in seconds
  • frame_list.tex and slides.tex: pdflatex slides.tex gives one page per slide with its h:mm:ss time underneath

Steps

  1. Check the tools. Run ffmpeg -version and yt-dlp --version. If one is missing, install it (below) or tell the user how. yt-dlp is not needed for a local file.

  2. Pick the script for the platform. On Windows, use the PowerShell one unless the user is clearly in Git Bash or WSL.

  3. Run it on the URL or file the user gave, into a folder named after the talk (for example -o speaker_topic_frames), not inside the skill folder.

    bash scripts/extract_slides.sh -u "https://www.youtube.com/watch?v=ID" -o talk_frames
    bash scripts/extract_slides.sh -i "recording.mp4" -o talk_frames
    
    powershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -Url "https://www.youtube.com/watch?v=ID" -OutDir talk_frames
    powershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -InputFile "C:\path\to\recording.mp4" -OutDir talk_frames
    

    -ExecutionPolicy Bypass gets past Windows' default block on scripts, for that run only.

  4. Look at the frames before reporting. Open a few PNGs (first, middle, last) and check:

    • Webcam or speaker view beside the slides: the speaker's movement triggers false slide changes. Find the slide area in one frame and rerun with a crop, -c W:H:X:Y / -Crop W:H:X:Y (ffmpeg crop syntax: width, height, then top-left corner).
    • Too few frames (builds or small changes missed): rerun with a lower threshold, -t 0.05 / -Threshold 0.05.
    • Too many frames (video, animations, camera noise): raise it to 0.2-0.3, or crop.
    • Duplicates: delete the extra PNGs and their lines in frame_list.tex.
  5. Build the PDF if the user wants one: cd into the output folder and run pdflatex slides.tex (or latexmk -pdf slides.tex).

  6. Report the frame count, the output folder, the PDF, and anything left for the user, such as duplicates you kept on purpose.

Options

bashPowerShellMeaningDefault
-u URL-Url URLVideo to download (any site yt-dlp supports)
-i FILE-InputFile FILELocal video instead of a download
-o DIR-OutDir DIROutput foldervideo_frames
-t X-Threshold XScene-change threshold, 0-10.10
-c W:H:X:Y-Crop W:H:X:YCrop to the slide area firstnone
-b NAME-Browser NAMEUse this browser's login cookies (chrome, firefox, edge, ...)none

Installing the tools

  • Windows: winget install --id yt-dlp.yt-dlp and winget install --id Gyan.FFmpeg, then close and reopen PowerShell so it finds them.
  • macOS: brew install yt-dlp ffmpeg
  • Linux: sudo apt install ffmpeg (or the distro's equivalent) and pip install -U yt-dlp
  • LaTeX (only for the PDF): TeX Live or MiKTeX. MiKTeX's latexmk needs Perl; plain pdflatex does not.

Troubleshooting

  • Recording behind a sign-in (Panopto, Zoom cloud, a university portal): pass -b chrome / -Browser chrome (or the browser the user is signed in with). If yt-dlp still cannot get it, ask the user to download the video and use -i.
  • $'\r': command not found or pipefail: invalid option name in Git Bash: the .sh file has Windows line endings. Run sed -i 's/\r$//' scripts/extract_slides.sh once.
  • yt-dlp errors on YouTube ("Sign in to confirm", format errors): update it first, yt-dlp -U or pip install -U yt-dlp, which fixes most of them.
  • No network to the video host (sandboxed or cloud session): say so, and give the user the command to run on their own machine.

Only fetch recordings the user is allowed to access, and keep the frames for their own notes and study unless the talk's licence says otherwise.

Related Skills