watch — Claude가 비디오를 끝까지 시청합니다
비디오를 Claude가 기본적으로 읽을 수 있는 형태로 분할합니다: 프레임 이미지 (Read 도구로 확인) + 대본(텍스트). 결과적으로 단어뿐만 아니라 화면에서 일어나는 일까지 이해합니다.
이중 언어. 이 문서는 영어 버전입니다. 러시아어 미러는
SKILL.ru.md입니다. 사용자가 사용하는 언어로 작업하며, 워크플로우와 명령어는 동일합니다.
종속성 (install.sh로 한 번 설치)
확인: command -v yt-dlp ffmpeg whisper node
yt-dlp→~/.local/bin/yt-dlp(Python 3.12 기준~/.local/python312— 시스템 Python은 보통 너무 오래됨; 최신 yt-dlp는 3.10+ 필요);ffmpeg→imageio-ffmpeg에서 가져와~/.local/bin/ffmpeg로 심볼릭 링크;whisper→openai-whisper(시스템 Python 기준; 모델은 처음 사용 시 다운로드);node→~/.local/node(v24) — YouTube 방어를 우회하는 데 필요.
YouTube의 경우, install.sh는 다음도 설정합니다:
- PO-토큰 제공자 (
bgutil),~/.local/bgutil-pot/server/build/아래 스크립트 모드로 빌드; - Node.js 런타임 + EJS 컴포넌트, YouTube의 n-challenge 해결용;
- 로그인된 YouTube 계정의 쿠키,
~/.config/watch/cookies.txt에 저장.
쿠키가 만료되면(YouTube가 다시 "로봇이 아닙니다" 확인을 요청), 사용자에게 "Get cookies.txt LOCALLY" 같은 브라우저 확장 프로그램으로 cookies.txt를 다시 내보내 ~/.config/watch/cookies.txt에 저장하도록 요청하세요.
항상 래퍼를 통해 다운로드 bash ~/.claude/skills/watch/yt.sh … — 자동으로 올바른 YouTube 플래그를 추가합니다. 직접 mp4/Loom/Zoom URL의 경우 추가 플래그는 무해합니다.
워크플로우
1. 설정
- 작업 폴더 만들기:
mkdir -p /tmp/watch/<slug>(slug = URL/주제에서 짧은 이름). - URL 구문 분석 (YouTube / Loom / Zoom 공유 링크 / 직접 비디오 파일). 로컬 파일은 다운로드 단계를 건너뜁니다 — 직접 작업합니다.
2. 대본 — 자막 우선 (무료, 사용 가능한 경우)
bash ~/.claude/skills/watch/yt.sh --write-subs --write-auto-subs --sub-langs "en,ru" \
--skip-download --convert-subs srt -o "/tmp/watch/<slug>/subs.%(ext)s" "<URL>"
.srt 파일이 나타나면 타임스탬프가 포함된 바로 사용 가능한 대본입니다 — 사용하세요.
3. 비디오 다운로드 (프레임 및 Whisper 대체용으로 필요)
bash ~/.claude/skills/watch/yt.sh -f "bv*[height<=480]+ba/b[height<=480]/18/best" \
-o "/tmp/watch/<slug>/video.%(ext)s" "<URL>"
.mp4 또는 .webm 파일을 받게 됩니다 — 이후 실제 파일 이름(video.*)을 사용하세요.
자막이 없는 경우, Whisper로 오디오를 전사합니다 (모델 small; base는 빠른 테스트에 적합):
whisper "/tmp/watch/<slug>/video.webm" --model small --language en \
--output_format srt --output_dir "/tmp/watch/<slug>/"
첫 실행 시 모델을 다운로드합니다 (small의 경우 약 460MB) — 정상적인 일회성 동작입니다.
비영어 오디오의 경우 --language en을 생략하거나 올바른 언어 코드를 설정하세요. Whisper는 느립니다: 34분 클립은 몇 분이 걸리므로 백그라운드에서 실행하세요.
4. 장면 변화별 프레임 (핵심 단계 — 타이머 기반 아님)
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "select='gt(scene,0.3)',showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
- 임계값
0.3— 장면 밀도에 따라0.2–0.4조정 (낮은 임계값 = 더 많은 프레임). scenes.log의 showinfo 로그에서 각 프레임의 타임스탬프(pts_time)를 가져옵니다.- 프레임이 너무 많으면(긴 비디오), 약 60–150개의 가장 유용한 프레임을 유지하고 시간상 가까운 프레임은 제거합니다. 긴 비디오 디코딩은 시간이 걸리므로 백그라운드에서 실행하세요.
대체 — 장면이 너무 적은 경우(0–2 프레임). 매끄럽고 편집되지 않은 영상(연속 촬영, 드론, 토크쇼)은 장면 변화가 거의 없습니다. 이 경우 고정 간격으로 샘플링합니다:
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "fps=1/5,scale=960:-1,showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
비디오 길이에 따라 간격(1/5 = 5초마다 한 프레임)을 조정하여 약 150프레임 내로 유지하세요. i번째 프레임의 타임스탬프 = i × 간격.
4a. YouTube: 모든 것이 yt.sh를 거치는 이유
YouTube(2025년 이후)는 다음 세 가지를 모두 요구하며, 그렇지 않으면 HTTP 403 / "로봇이 아닙니다" / "이미지만" 오류가 발생합니다:
- 로그인 계정의 쿠키 (
~/.config/watch/cookies.txt); - PO-토큰 (출처 증명) —
bgutil(스크립트 모드, Node)로 로컬 생성; - n-challenge 해결 — Node 런타임 + EJS 컴포넌트 (
--remote-components ejs:github). 이 모든 것은yt.sh에 이미 내장되어 있습니다 — 그냥 호출하세요. 직접 mp4/Loom/Zoom 소스에는 이러한 방어 기능이 없습니다. "로봇이 아닙니다" 확인을 다시 요청하면 쿠키가 만료된 것입니다 — 새cookies.txt를 요청하세요.
5. 분석
- 대본(
.srt)을 읽습니다. - 추출된 프레임을 시각적으로 확인합니다(Read 도구 사용): 슬라이드, 코드, 데모, 그래픽.
- 타임스탬프를 사용하여 시각적 요소와 대본을 연결합니다.
6. 보고서
제공:
- TL;DR (3–5줄);
- 타임스탬프가 있는 핵심 개념;
- 텍스트에 없는 화면에 표시된 내용(차트, UI, 데모);
- 타임스탬프가 있는 주목할 만한 순간/인용문.
7. 지식 베이스 저장 (먼저 물어보기)
질문: "이 분석을 지식 베이스(Obsidian)에 저장할까요?" 예인 경우, 관련 노트에 대한 링크가 포함된 마크다운 노트를 적절한 폴더에 작성합니다. 확인 없이 저장하지 마세요.
규칙
- 작업 파일은 임시 폴더
/tmp/watch/<slug>에 저장 — 프로젝트를 지저분하게 하지 않음. - 명시적 요청 없이 외부에 게시하거나 전송하지 않음.
- 로그인이 필요한 비공개 비디오를 우회하지 않음 — 대신 사용자에게 알림.