Catalog PyPI
Back to packageRELEASE DETAILS

1.2.2

PyPI

agent-video-downloader

yt-dlp for agents: a cloud-CLI multi-agent video downloader for TikTok, Instagram, Douyin, Rednote, Reddit, X.com

agentsclidouyindownloaderinstagrammcpredditrednotetiktoktwittervideoxiaohongshu
Published4 Oct 2026
Direct dependencies28
Transitive dependenciesNot calculated

README

Version 1.2.2 documentation

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.

CI PyPI version PyPI downloads License: MIT Python 3.10+

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):

PlatformMethodSample download
TikTokTikWM mirror API2.0 MB / 10.5 s
Twitter/Xapi.fxtwitter.com → video.twimg.com156 MB / 74.8 s 4K
Redditrapidsave.com + v.redd.it CMAF/DASH + ffmpeg mux6.1 MB / 16.1 s
Instagramyt-dlp + facebookexternalhit/1.1 UA8.4 MB / 77.3 s
Douyinapi.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

CommandPurpose
avd agent-setupOne-command bootstrap — installs ffmpeg, deps, XHS-Downloader
avd agent-instructionsPrint 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 --smokeEnd-to-end self-test on one URL per platform
avd jobsList recent jobs
avd dlqList dead-letter queue entries
avd replay <dlq_id>Replay a failed job
avd mcpStart MCP server (stdio JSON-RPC 2.0)
avd supportedShow supported platforms
avd agentsShow agent versions

Install

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 by avd agent-setup on Debian/Ubuntu; manual on other systems)
  • git (for cloning XHS-Downloader on first Rednote download)

Configuration (env vars)

VarDefaultDescription
AVD_DOWNLOAD_DIR./downloadDefault download destination
AVD_LOG_LEVELINFODEBUG/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-Downloaderoverride 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 rules
  • TECHSTACK.md — every dependency, every version, why
  • PHASES.md — development phases with exit criteria
  • PLAN.md — concrete execution plan with task IDs
  • SKILLS.md — per-agent skill spec sheets

Deep technical references


License

MIT. See LICENSE.

Repo

Changelog

v1.2.0 (2026-10-03) — PyPI release

  • One-command install: pip install agent-video-downloader && avd agent-setup
  • New avd agent-setup command (auto-install ffmpeg, deps, XHS-Downloader)
  • New avd agent-instructions command (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 avd itself (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 verified verdict

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

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 28

Native requirements
28 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
httpx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
httpx<1.0,>=0.27runtime
aiofiles
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
aiofiles>=23.0runtime
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic<3.0,>=2.7runtime
pydantic-settings
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic-settings>=2.3runtime
tenacity
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tenacity<10.0,>=8.5runtime
pybreaker
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pybreaker<2.0,>=1.3runtime
rich
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
rich<14.0,>=13.0runtime
click
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
click<9.0,>=8.1runtime
python-magic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
python-magic>=0.4.27runtime
structlog
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
structlog>=24.0runtime
aiosqlite
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
aiosqlite>=0.20runtime
beautifulsoup4
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
beautifulsoup4>=4.12runtime
lxml
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
lxml>=5.2runtime
Levenshtein
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
Levenshtein>=0.25runtime
yt-dlp
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
yt-dlp>=2025.10.0runtime
feedparser
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
feedparser>=6.0runtime
playwright
Environment
{
  "extras": "",
  "marker": "extra == \"browser\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
playwright>=1.40; extra == "browser"runtime
uvicorn
Environment
{
  "extras": "",
  "marker": "extra == \"http\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
uvicorn>=0.30; extra == "http"runtime
fastapi
Environment
{
  "extras": "",
  "marker": "extra == \"http\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
fastapi>=0.110; extra == "http"runtime
mcp
Environment
{
  "extras": "",
  "marker": "extra == \"mcp\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mcp>=1.0; extra == "mcp"runtime
socksio
Environment
{
  "extras": "",
  "marker": "extra == \"socks\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
socksio>=1.0; extra == "socks"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest<10.0,>=8.0; extra == "dev"runtime
pytest-asyncio
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest-asyncio>=0.23; extra == "dev"runtime
pytest-cov
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest-cov>=5.0; extra == "dev"runtime
pytest-mock
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest-mock>=3.12; extra == "dev"runtime
respx
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
respx>=0.21; extra == "dev"runtime
hypothesis
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
hypothesis>=6.100; extra == "dev"runtime
freezegun
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
freezegun>=1.5; extra == "dev"runtime

Distribution files

2 collected
agent_video_downloader-1.2.2-py3-none-any.whl

bdist_wheel · 65.99 KB · Python py3

Source file
agent_video_downloader-1.2.2.tar.gz

sdist · 49.73 KB · Python source

Source file

Repository

PENDING
hamza140202/agent-video-downloader

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 08:54 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:9cfc578bf86b6a8f4b02271ba2b76a29cbab0da7422532849ec818b0b64fc4eb

Other collected versions

View all collected versions →