Vimeo Locked-Embed Caption Extraction
/install vimeo-locked-captions
Vimeo Locked-Embed Caption Extraction
Problem
A page embeds a Vimeo video using \x3Ciframe src="https://player.vimeo.com/video/{ID}?h={HASH}">.
The video is "domain-restricted" — opening the player URL directly returns a privacy error,
and yt-dlp / browser automation also fail because Vimeo enforces the Referer check.
But you only need the transcript, not the video. Vimeo's auto-generated captions are served from a separate signed URL that the player HTML embeds in a JSON config — and that HTML is fetched whenever the Referer matches the allowed domain. So you can pull the captions without ever playing the video.
Trigger Conditions
- Page contains
\x3Ciframe src="https://player.vimeo.com/video/...">and no transcript text. - Direct visit to the player URL shows "Sorry / 抱歉 — video cannot be played here due to privacy settings."
- You want a transcript-driven analysis (interview, panel, fireside chat, conference talk).
Solution
Three commands. Replace {ID}, {HASH}, and {HOST} with values from the embed.
# 1. Fetch the player HTML with the correct Referer and grep out the text_tracks JSON.
curl -s -H 'Referer: https://{HOST}/' \
'https://player.vimeo.com/video/{ID}?h={HASH}' \
| grep -oE '"text_tracks":\[[^]]*\]'
That returns something like:
"text_tracks":[{"id":303147651,"lang":"en-x-autogen",
"url":"https://captions.vimeo.com/captions/303147651.vtt?expires=...&sig=...",
"kind":"subtitles","label":"English (auto-generated)",
"provenance":"ai_generated","default":true}]
# 2. Download the VTT (the signed URL works without Referer).
curl -s 'https://captions.vimeo.com/captions/{CAP_ID}.vtt?expires=...&sig=...' \
-o /tmp/transcript.vtt
# 3. Strip WEBVTT cues/timestamps to get plain text.
awk '/-->/{next} /^[0-9]+$/{next} /^WEBVTT/{next} /^$/{next} {print}' \
/tmp/transcript.vtt > /tmp/transcript.txt
wc -w /tmp/transcript.txt
How to find ID, HASH, HOST
From the embed iframe's src attribute on the host page:
https://player.vimeo.com/video/1195836424?h=a0154d0f4b
└────┬────┘ └────┬────┘
ID HASH
HOST is the hostname of the page that embeds the iframe (e.g. www.coatue.com). If you
don't have the iframe URL, open the host page in playwright/devtools and inspect:
[...document.querySelectorAll('iframe')].map(f => f.src)
Verification
- VTT file should be > 1 KB and contain
WEBVTTheader + numbered cues. - Stripped text file word count should be plausible for the video length (≈ 150 wpm for normal speech).
Notes
- The VTT is auto-generated (
provenance":"ai_generated"). Proper nouns and brand-name acronyms are often misheard ("Computer Use" → "CP", "Cherny" → "Cherney"). Re-read the transcript with that bias in mind, especially for names, product codenames, and numbers. - The signed URL has an
expiresparameter — typically valid for many days, but if it 403s, re-fetch step 1 to get a fresh signature. - If
text_tracksreturns[], the video has no captions enabled. Falling back toyt-dlp --write-auto-subswon't help (same Referer block); use Whisper on a screen recording instead. - This works because Vimeo enforces playback restrictions on the video stream but
not on the player's HTML config payload, which leaks the captions URL. This has been
the behavior for years; if Vimeo ever closes it, the fallback is to drive the embed
inside playwright with the correct Referer and read
player.getTextTracks()via the Vimeo Player API. - For multilingual content,
text_tracksis an array — checklangfield for other available subtitle tracks beyond auto-generated English.
Example
Coatue × Boris Cherny interview, May 2026:
- Embed page:
https://www.coatue.com/blog/video/interview-with-claude-code-creator - Iframe src:
https://player.vimeo.com/video/1195836424?h=a0154d0f4b - Direct visit → "由于隐私设置,该视频无法在此处播放"
- One curl with
Referer: https://www.coatue.com/→ captions URL leaked - Final transcript: 881 VTT lines / 2309 words / ~12 minutes of dialogue.
References
- Vimeo Player text-tracks docs (Player API; useful as a fallback when the HTML scrape stops working)
- WebVTT spec: \x3Chttps://www.w3.org/TR/webvtt1/>
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install vimeo-locked-captions - 安装完成后,直接呼叫该 Skill 的名称或使用
/vimeo-locked-captions触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Vimeo Locked-Embed Caption Extraction 是什么?
Extract auto-generated captions/transcript from a privacy-locked (domain-restricted) Vimeo embed when the player refuses to play. Use when: (1) you need a tr... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 39 次。
如何安装 Vimeo Locked-Embed Caption Extraction?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install vimeo-locked-captions」即可一键安装,无需额外配置。
Vimeo Locked-Embed Caption Extraction 是免费的吗?
是的,Vimeo Locked-Embed Caption Extraction 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Vimeo Locked-Embed Caption Extraction 支持哪些平台?
Vimeo Locked-Embed Caption Extraction 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Vimeo Locked-Embed Caption Extraction?
由 heavenchenggong(@heavenchenggong)开发并维护,当前版本 v1.0.0。