yt-dlp for Android · maintained
Standard yt-dlp gets blocked. curl-cffi doesn't.
Run yt-dlp on Android via an embedded Python 3.13 runtime (Chaquopy). The Pro build ships curl-cffi prebuilt for arm64, so browser TLS fingerprint compatibility just works — no manual wheel builds, no NDK setup.
// Chaquopy · Python 3.13 · yt-dlp latest · curl-cffi 0.15 · arm64-v8a · API 24+
// standard client
ERROR The extractor is attempting
impersonation, but no impersonate
target is available. BLOCKED
// with curl-cffi (Pro)
YtDlpCurl.impersonate("chrome")
OK TLS fingerprint matched DOWNLOADING
Why Pro
Platforms fingerprint your TLS. curl-cffi answers back.
Modern platforms detect and block requests that don't look like a real browser. curl-cffi impersonates the exact TLS/JA3 fingerprint of Chrome, Safari and Edge — the same trick desktop yt-dlp uses, packaged for Android so you don't have to cross-compile curl-impersonate yourself.
Runtime · Chaquopy · Python 3.13
yt-dlp latest · bump one Gradle line
curl-cffi 0.15 · arm64-v8a
min API 24 · compileSdk 35
Drop-in .aar · no NDK, no pip on device
Free & Pro
Start free, go Pro for impersonation.
Launch offer — code JOKOBEE10 takes $10 off Pro at checkout.
Free MIT
$0 · GitHub / JitPack
- Full yt-dlp feature set
- Python 3.13 embedded (Chaquopy)
- Clean API · compat shim for youtubedl-android
curl-cffi
Pro bundled MIT
$24 · $62 team (5)
- curl-cffi prebuilt for arm64
- Chrome/Safari/Edge TLS impersonation
- Resolves "no impersonate target" error
- Private Maven access token · updates included
Drop-in
Same pattern as youtubedl-android.
Clean YtDlp / YtDlpRequest API, plus an optional compat shim (typealiases) so migrating from youtubedl-android is a coordinate swap, not a rewrite.
// Free — on Maven Central
implementation("dev.ffmpegkit-maintained:yt-dlp-android:2.0.2")
// optional — migrate from youtubedl-android with zero rewrites
implementation("dev.ffmpegkit-maintained:yt-dlp-android-compat:2.0.2")
// Pro — curl-cffi bundled, TLS impersonation
implementation("dev.ffmpegkit-maintained:yt-dlp-android-curl:2.0.2")
// same call, impersonate a browser
val req = YtDlpRequest(url).impersonate("chrome")
YtDlp.execute(req)
