avd — agent-video-downloader
yt-dlp for cloud AI agents. One command downloads videos from TikTok, Instagram, Douyin, Rednote (Xiaohongshu), Reddit, X.com — no browser, no cookies, no login. Built for Claude / Cursor / Cline / GLM / GPT agents that need video bytes in task workflows.
Install:
pip install agent-video-downloader
avd agent-setup
Live on PyPI: https://pypi.org/project/agent-video-downloader/
Quickstart — one command for AI agents
pip install agent-video-downloader
avd agent-setup
avd download 'https://www.tiktok.com/@anyuser/video/<numeric-id>'
avd agent-setup auto-installs ffmpeg, all Python deps, and the XHS-Downloader repo (for Rednote). It's idempotent — safe to re-run anytime. Zero manual steps for an AI agent.
For the full agent usage guide (8 steps, decision tree, MCP server config, env vars):
avd agent-instructions
Why
yt-dlp is broken from datacenter IPs for TikTok, Twitter, Reddit, Instagram, Douyin. Cloud CLI agents (Claude Code, GLM CLI, Cursor, Cline) that need to download videos for tasks (transcription, OCR, content analysis, archival) have no reliable path. avd fixes that with direct-API fallback chains that work from cloud IPs without login.
All six platforms download real video bytes (verified live 2026-10-03 from a Hong Kong datacenter IP, total 1.2 GB downloaded through avd itself):
| Platform | Method | Sample download |
|---|---|---|
| TikTok | TikWM mirror API | 2.0 MB / 10.5 s |
| Twitter/X | api.fxtwitter.com → video.twimg.com | 156 MB / 74.8 s 4K |
| rapidsave.com + v.redd.it CMAF/DASH + ffmpeg mux | 6.1 MB / 16.1 s | |
| yt-dlp + facebookexternalhit/1.1 UA | 8.4 MB / 77.3 s | |
| Douyin | api.douyin.wtf public demo (zero-config) | 3.6 MB / 27.6 s |
| Rednote (XHS) | XHS-Downloader (curl_cffi chrome146) | 8.4 MB / 720p |
Real-world batch test — 21/24 videos downloaded via avd itself
A 24-URL batch (4 per platform minimum, large videos first) was run through avd itself to validate the system on real public content rather than curated samples:
- TikTok: 4/4 ✅
- Twitter: 4/4 ✅ (largest file: 185 MB 4K video)
- Instagram: 4/4 ✅
- Reddit: 4/4 ✅ (largest file: 283 MB / 372 s interview)
- Douyin: 4/4 ✅
- Rednote: 1/4 ⚠️ (1 verified image; 3 bot-walled without cookie — documented limitation)
Total: 1.2 GB of real video content downloaded through avd itself.
Commands
| Command | Purpose |
|---|---|
avd agent-setup |
One-command bootstrap — installs ffmpeg, deps, XHS-Downloader |
avd agent-instructions |
Print step-by-step usage guide for AI agents |
avd download <url> |
Download one URL |
avd batch <file> |
Batch download (one URL per line, # comments OK) |
avd verify <path> |
Verify a downloaded file's integrity |
avd test --smoke |
End-to-end self-test on one URL per platform |
avd jobs |
List recent jobs |
avd dlq |
List dead-letter queue entries |
avd replay <dlq_id> |
Replay a failed job |
avd mcp |
Start MCP server (stdio JSON-RPC 2.0) |
avd supported |
Show supported platforms |
avd agents |
Show agent versions |
Install
From PyPI (recommended)
pip install agent-video-downloader
avd agent-setup
From source (development)
git clone https://github.com/hamza140202/agent-video-downloader
cd agent-video-downloader
pip install -e .[dev]
avd agent-setup
System requirements
- Python 3.10+ (tested on 3.10, 3.11, 3.12, 3.13)
ffmpeg/ffprobe(auto-installed byavd agent-setupon Debian/Ubuntu; manual on other systems)git(for cloning XHS-Downloader on first Rednote download)
Configuration (env vars)
| Var | Default | Description |
|---|---|---|
AVD_DOWNLOAD_DIR |
./download |
Default download destination |
AVD_LOG_LEVEL |
INFO |
DEBUG/INFO/WARNING/ERROR |
AVD_REDDIT_CLIENT_ID |
— | Reddit OAuth (only needed if rapidsave.com fails — rare) |
AVD_REDDIT_CLIENT_SECRET |
— | same |
AVD_REDDIT_USERNAME |
— | throwaway Reddit username |
AVD_REDDIT_PASSWORD |
— | throwaway Reddit password |
AVD_DOUYIN_DTK_URL |
— | self-hosted Evil0ctal DTK (optional — defaults to public demo) |
AVD_XHS_DOWNLOADER_PATH |
~/XHS-Downloader |
override XHS-Downloader clone path |
AVD_XHS_COOKIE |
— | XHS cookie (optional, unlocks HD Rednote videos) |
AVD_PROXY |
— | SOCKS5/HTTP proxy URL for all requests |
Architecture (4 plain-Python agents, no LLM in runtime loop)
URL → Orchestrator → [TikTok|Twitter|Reddit|Instagram|Rednote|Douyin] extractors (fallback chain)
→ Verifier (6-layer: size, magic bytes, ffprobe, duration, streams, moov)
→ Truth Agent (cross-check vs source platform: oEmbed / syndication / RSS / OG)
→ verified MP4 + manifest
- Orchestrator — owns the extractor registry, drives the fallback chain, persists job state to SQLite
- Verifier — 6-layer integrity check (size + magic bytes + ffprobe + duration + streams + moov atom)
- Truth Agent — cross-references downloaded metadata against source platform
- Tester — runs end-to-end on
tests/sample_urls.json
Per-platform fallback chains (slot-based state machine, ytagent doctrine):
- TikTok: TikWM → embed/v2 → tiklydown → oEmbed
- Twitter/X: fxtwitter → syndication → unrollnow → vxtwitter
- Reddit: rapidsave.com/info + v.redd.it CMAF/DASH direct + ffmpeg mux → rapidsave server-side mux → yt-dlp+OAuth → RSS image
- Instagram: yt-dlp+facebookexternalhit UA → embed/captioned+fb-UA → embed+android-UA → embed+ios-UA → ddinstagram mirror
- Douyin: api.douyin.wtf demo → self-hosted DTK sidecar → yt-dlp
- Rednote: XHS-Downloader (curl_cffi) → curl_cffi direct → yt-dlp
Full design: docs/architecture.md · Full research: docs/research-report.md
Documentation
For users
README.md— this file (install + quickstart + commands)- Run
avd agent-instructions— interactive step-by-step usage guide
For developers / agents modifying the code
CLAUDE.md— project memory (read first if modifying)AGENTS.md— agent contracts + perfection prompting rulesTECHSTACK.md— every dependency, every version, whyPHASES.md— development phases with exit criteriaPLAN.md— concrete execution plan with task IDsSKILLS.md— per-agent skill spec sheets
Deep technical references
docs/research-report.md— live-verified endpoint research per platformdocs/architecture.md— system design with ASCII diagramdocs/endpoint-matrix.md— living endpoint table
License
MIT. See LICENSE.
Repo
- Primary: https://github.com/hamza140202/agent-video-downloader
- PyPI: https://pypi.org/project/agent-video-downloader/
- Issues: file on GitHub with the
metadata.extractor_chainandmetadata.slots_triedfrom your run's manifest attached
Changelog
v1.2.0 (2026-10-03) — PyPI release
- One-command install:
pip install agent-video-downloader && avd agent-setup - New
avd agent-setupcommand (auto-install ffmpeg, deps, XHS-Downloader) - New
avd agent-instructionscommand (8-step AI agent usage guide) - Auto-bootstrap on first Rednote download (no manual setup)
- Reddit extractor fix: probe BOTH CMAF and DASH format ladders
- Rednote extractor fix: parse XHS-Downloader stdout for actual success
- Verifier: adaptive min_size_bytes (50KB images / 5KB audio / 1MB video)
- Verifier: skip slow integrity_decode for files > 50 MB
- Real-world batch test: 21/24 videos downloaded via
avditself (1.2 GB) - Published to PyPI: https://pypi.org/project/agent-video-downloader/1.2.0/
v1.1.0 (2026-10-03) — all 6 platforms real downloads
- Replaced honest-empties with verified-working methods per ytagent doctrine
- TikTok via TikWM (2 MB MP4 verified)
- Twitter via fxtwitter (156 MB 4K MP4 verified)
- Reddit via rapidsave.com + v.redd.it CMAF + ffmpeg mux (6.1 MB verified)
- Instagram via yt-dlp + facebookexternalhit UA (8.4 MB verified)
- Douyin via api.douyin.wtf public demo (3.6 MB verified)
- Rednote via XHS-Downloader (curl_cffi) (8.4 MB verified)
- Truth Agent: Twitter returned
verifiedverdict
v1.0.0 (2026-10-03) — initial release
- Multi-agent architecture (Orchestrator + Verifier + Truth + Tester)
- 6 platform extractors with fallback chains
- MCP server (stdio JSON-RPC 2.0)
- SQLite jobs table with resume / DLQ replay
- 30/30 unit tests pass
Metadata
Release files for agent-video-downloader 1.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_video_downloader-1.2.2.tar.gz | 50.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_video_downloader-1.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 118.5 kB
Release files / agent_video_downloader-1.2.2.tar.gz
| Download URL | agent_video_downloader-1.2.2.tar.gz |
|---|---|
| Size | 50.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
102d7c6128f5e958dfa9340572b13a2465fb08d7143a8ced95b5e95ce1b2ed5c
|
|
BLAKE2b-256 checksum How to use checksums |
3fb67aaa57dbf54a2e6ce5dd1307ff0e5d30e808a0fb1159293b8de79c138627
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / agent_video_downloader-1.2.2-py3-none-any.whl
| Download URL | agent_video_downloader-1.2.2-py3-none-any.whl |
|---|---|
| Size | 67.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2abed93ae7c6d20ceb38976057d112574ba523ee70a1da4570725e3732d08391
|
|
BLAKE2b-256 checksum How to use checksums |
0fd5481f24295d89569e0e2163528d2d6b82e77d2a6982fa28272ac29ce557d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|