一键导入
zoom-video-download
Download the video (MP4) from a Zoom recording share page. "zoom video download", "zoom 録画 ダウンロード", "zoom 動画 ダウンロード" などで起動。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Download the video (MP4) from a Zoom recording share page. "zoom video download", "zoom 録画 ダウンロード", "zoom 動画 ダウンロード" などで起動。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Ask OpenAI Codex CLI for an autonomous second AI opinion. "ask codex", "codex と相談" などで起動。
Request GitHub Copilot review on a Pull Request. "PR レビュー依頼", "copilot review" などで起動。
Extract VTT transcript from a Zoom recording share page. "zoom transcript", "zoom 文字起こし" などで起動。
Round-trip code review through difit. Use when the user mentions "difit", "diff review", "open the diff", "let me look at this", or "review this PR locally". Launch mode arg — "open" (default, no comments at launch), "explain" (AI annotates its own change), "review" (AI posts findings on human code).
Stop tool execution before exhausting your Claude usage — set a 5h/7d usage-% or per-session cost threshold.
Install or uninstall the limit-usage statusLine wrapper (edits settings.json).
基于 SOC 职业分类
| name | zoom-video-download |
| description | Download the video (MP4) from a Zoom recording share page. "zoom video download", "zoom 録画 ダウンロード", "zoom 動画 ダウンロード" などで起動。 |
| metadata | {"author":"pokutuna","compatibility":"Requires playwright-cli (or playwright MCP), uv, and curl"} |
| allowed-tools | Bash(uv run *),Bash(playwright-cli *),Bash(curl *),Bash(python3 *),mcp__playwright__browser_navigate,mcp__playwright__browser_snapshot,mcp__playwright__browser_fill_form,mcp__playwright__browser_click,mcp__playwright__browser_evaluate,mcp__playwright__browser_run_code,mcp__playwright__browser_close |
Download the MP4 video from a Zoom recording share page.
A Zoom recording is served as one or more single MP4 files (not HLS segments) from
ssrweb.zoom.us. The signed URL alone is NOT enough to download — the server also requires the
session cookies and a Referer header (any zoom.us value works; the host need not match the
recording's region). The flow is therefore:
<video> source URL directly from the play page.curl using those cookies + a Referer header (curl streams, resumes, and shows
progress for the large file).Ask the user for:
https://<region>.zoom.us/rec/share/...).mp4; default to the recording title)When playwright-cli is available, run the bundled script — it performs the entire flow
(navigate → passcode → URL extraction → cookie export → curl download) deterministically in one
command:
uv run --script ${CLAUDE_PLUGIN_ROOT}/skills/zoom-video-download/scripts/download_zoom_video.py \
--url '<recording_share_url>' \
--output '<output_file_path>' \
--passcode '<passcode>' # omit if the recording has no passcode
Notes:
--passcode as a single argument; the script JSON-encodes it internally, so
shell-special characters in the passcode are handled safely. Single-quote it so the shell
does not interpret #, !, $, etc. (e.g. --passcode '#jZ4R==v').curl -C -); re-running continues an interrupted download,
and re-running on an already-complete file is a no-op success (exit 0). Transient curl errors
are retried automatically (3 attempts).--keep-open leaves the browser open (useful for debugging); by default the browser is closed
as soon as the video URL and cookies are extracted — including on failure (wrong passcode etc.),
so no stray browser is left behind.0 success,
2 passcode required but not given, 3 no <video> source found, 4 download failed
(curl error / HTTP non-2xx / empty or non-MP4 output), 5 passcode incorrect.Verify afterwards that the output is a valid MP4 (e.g. ffprobe).
If playwright-cli is not installed: npm install -g playwright-cli (and uv for the script).
If only the playwright MCP server is available (no playwright-cli), perform the same flow
with MCP tools. The helper script's logic, step by step:
Call mcp__playwright__browser_navigate with the recording share URL. If the page title is
"パスコードが必要" / "Passcode required", do step 2; otherwise skip to step 3.
mcp__playwright__browser_snapshot — find the passcode input and submit button refsmcp__playwright__browser_fill_form — fill the passcodemcp__playwright__browser_click — click "レコーディングを視聴" / "Watch recording"The page then navigates to .../rec/play/....
Call mcp__playwright__browser_evaluate with this function (no need to press Play). A recording
usually has two <video> elements — ..._as_<W>x<H>.mp4 (high-res shared screen) and
..._avo_<W>x<H>.mp4 (low-res speaker overlay); pick the largest by width:
() => {
const vids = Array.from(document.querySelectorAll('video'));
const scored = vids.map(v => {
const u = v.currentSrc || v.src;
const m = u && u.match(/_(\d+)x(\d+)\.mp4/);
return { url: u, w: m ? parseInt(m[1], 10) : 0 };
}).filter(x => x.url);
scored.sort((a, b) => b.w - a.w);
return scored[0] ? scored[0].url : '';
}
If empty, the player may still be loading (retry), or the recording is audio-only / download-disabled.
Call mcp__playwright__browser_run_code with this function and save the returned text to a file
(e.g. /tmp/zoom_cookies.txt):
async (page) => {
const cookies = await page.context().cookies();
const lines = ['# Netscape HTTP Cookie File'];
for (const c of cookies) {
const includeSub = c.domain.startsWith('.') ? 'TRUE' : 'FALSE';
const secure = c.secure ? 'TRUE' : 'FALSE';
const expires = c.expires && c.expires > 0 ? Math.floor(c.expires) : 0;
lines.push([c.domain, includeSub, c.path || '/', secure, expires, c.name, c.value].join('\t'));
}
return lines.join('\n');
}
UA='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36'
curl --fail -C - -o '<output_file_path>' \
-b /tmp/zoom_cookies.txt \
-H "Referer: https://zoom.us/" \
-H "User-Agent: $UA" \
-w 'DONE http=%{http_code} size=%{size_download} time=%{time_total}s\n' \
'<video_url>'
Call mcp__playwright__browser_close; remove the temp cookie file.
Referer header are missing/expired. Re-export cookies
(step 4) while the browser session is still open, and confirm Referer is set. The signed URL
is NOT self-authenticating — both cookies and a Referer are required.<video> element / empty URL: the player may still be loading (retry), or the recording
is download-disabled or audio-only.<video> is a separate file (_as_ = shared screen,
_avo_ = small speaker overlay). Download both URLs if needed; mux with ffmpeg only if you
specifically need them combined.DateLessThan in its policy). If
resume fails, re-run to fetch a fresh URL, then resume._as_ track is a
screen/slide share; for mostly-static content (slides, code) even a 1080p recording can be a few
hundred kbps. That is the source bitrate, not a wrong-track selection — there is no higher-quality
source to fetch (Zoom serves only the _as_ and _avo_ files, no adaptive/HLS variants).