← Back to Skills Marketplace
heavenchenggong

Vimeo Locked-Embed Caption Extraction

by heavenchenggong · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ⚠ suspicious
39
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install vimeo-locked-captions
Description
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...
README (SKILL.md)

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 WEBVTT header + 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 expires parameter — typically valid for many days, but if it 403s, re-fetch step 1 to get a fresh signature.
  • If text_tracks returns [], the video has no captions enabled. Falling back to yt-dlp --write-auto-subs won'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_tracks is an array — check lang field 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/>
Usage Guidance
Install only if you will use it for videos and captions you are authorized to access. This may violate a publisher's privacy settings, terms, copyright expectations, or paywall restrictions; prefer an official transcript, permission from the publisher, or Vimeo-supported access where available.
Capability Assessment
Purpose & Capability
The stated purpose is to fetch captions from privacy-locked, domain-restricted Vimeo embeds by using a matching Referer header and a signed captions URL exposed in player configuration.
Instruction Scope
The instructions are step-by-step and include paywalled or third-party host scenarios, but do not require authorization or warn about site-owner terms, copyright, or privacy limits.
Install Mechanism
The artifact contains only markdown files and installs as a normal skill; no executable scripts, dependencies, or hidden installer behavior were present.
Credentials
Network use with curl is expected for transcript extraction, but the technique intentionally supplies a Referer to access data associated with content Vimeo blocks outside an approved domain.
Persistence & Privilege
Persistence is limited to copying SKILL.md into a local skills directory and registering trigger text in CLAUDE.md; no background worker, privilege escalation, or local sensitive-file access was found.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install vimeo-locked-captions
  3. After installation, invoke the skill by name or use /vimeo-locked-captions
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Initial release: three-curl method to extract auto-generated VTT captions from privacy-locked (domain-restricted) Vimeo embeds via Referer header. Discovered while analyzing Coatue × Boris Cherny interview.
Metadata
Slug vimeo-locked-captions
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is 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... It is an AI Agent Skill for Claude Code / OpenClaw, with 39 downloads so far.

How do I install Vimeo Locked-Embed Caption Extraction?

Run "/install vimeo-locked-captions" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Vimeo Locked-Embed Caption Extraction free?

Yes, Vimeo Locked-Embed Caption Extraction is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Vimeo Locked-Embed Caption Extraction support?

Vimeo Locked-Embed Caption Extraction is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Vimeo Locked-Embed Caption Extraction?

It is built and maintained by heavenchenggong (@heavenchenggong); the current version is v1.0.0.

💬 Comments