Community코딩 & 개발github.com

watch — 비디오 전체 시청

URL(YouTube, Loom, Zoom 녹화, 직접 mp4)로 모든 비디오를 시청합니다. 단순한 대본(transcript)뿐만 아니라 화면에 실제로 보이는 것(frames)까지 분석합니다. 장면 변화(scene change) 감지로 프레임을 추출하여 그래픽, 데모, 편집, B-롤을 놓치지 않습니다. 오디오: yt-dlp로 자막을 우선 추출하고, Whisper를 대체 수단으로 사용합니다. 사용자가 /watch <url>을 입력하거나 "이 비디오 봐줘", "이 녹화/통화/강의 살펴봐", "화면에 뭐가 보여?"라고 요청할 때 사용합니다. 트리거: /watch, watch this vi

watch — 비디오 전체 시청란 무엇인가요?

이 스킬은 AI 에이전트(Claude 등)가 비디오 콘텐츠를 완전히 이해할 수 있도록 설계되었습니다. 주어진 비디오 URL(YouTube, Loom, Zoom 녹화, 직접 mp4 파일)을 분석하여 화면에 표시되는 프레임 이미지와 오디오 대본을 텍스트로 추출합니다. 기존의 단순 대본 읽기 방식과 달리, ffmpeg의 장면 감지(scene detection) 기능을 사용하여 중요한 장면 변화 시점의 프레임만 선별적으로 추출함으로써 그래픽, UI 변경, 데모, 편집 컷을 놓치지 않습니다. 대본은 yt-dlp를 통해 YouTube 자막을 우선 시도하고, 실패 시 Whisper 음성 인식 모델로 대체합니다. 이 스킬은 주로 Claude Code 환경에서 사용되며, /watch 명령어로 트리거됩니다. 사용자는 비디오 URL만 제공하면 되며, 에이전트가 전체 분석을 수행하여 TL;DR, 핵심 개념, 화면에 표시된 시각적 요소, 타임스탬프가 포함된 주요 순간을 보고합니다. YouTube의 2025년 대응 보안(쿠키, PO-token, n-challenge)을 처리하는 yt.sh 스크립트가 포함되어 있으며, 분석 결과는 사용자 확인 후 Obsidian 등 지식 베이스에 저장할 수 있습니다.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/akimov121-hub/watch/tree/main

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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 / "로봇이 아닙니다" / "이미지만" 오류가 발생합니다:

  1. 로그인 계정의 쿠키 (~/.config/watch/cookies.txt);
  2. PO-토큰 (출처 증명) — bgutil(스크립트 모드, Node)로 로컬 생성;
  3. 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>에 저장 — 프로젝트를 지저분하게 하지 않음.
  • 명시적 요청 없이 외부에 게시하거나 전송하지 않음.
  • 로그인이 필요한 비공개 비디오를 우회하지 않음 — 대신 사용자에게 알림.

관련 스킬