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+

logcat — YtDlpCurl
// 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.

app/build.gradle.kts
// 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)