bili-dl
Cross-platform Bilibili downloader — a thin, fast wrapper around
yt-dlp+ffmpeg.
Download Bilibili videos and audio at the best available quality (up to 1080p for non-premium accounts). Cross-platform, zero runtime dependencies, foobar2000-friendly audio output.
Features
- Cookie-safe — drop any
.txtcookie export next to the tool, and only the Bilibili-domain entries are extracted. Other-site cookies are never parsed, stored, or sent anywhere. - Cookie-verified — probes Bilibili's
navAPI to confirm your session is actually logged in before downloading. - foobar2000-friendly audio — every produced M4A goes through a zero-loss
ffmpeg -c copyremux (moov-first + ISOM container). No re-encode, no quality loss, instant playback in picky players. - Zero runtime deps — standard library only. If you have Python,
pipx install bili-dlis all you need. - Configurable — set defaults in a TOML config file (
mode,proxy, output dirs, etc.); CLI flags override per-invocation. - Batch download — download a list of URLs from a text file.
Install
bili-dl needs yt-dlp and ffmpeg on your PATH:
pip install -U yt-dlp # or: winget / brew / pipx
# ffmpeg:
winget install ffmpeg # Windows
brew install ffmpeg # macOS
sudo apt install ffmpeg # Debian/Ubuntu
Then:
pipx install bili-dl # recommended
bili-dl -V # verify
Quick start
Cookies (one-time)
Bilibili requires a login cookie. Use any browser extension that exports cookies in Netscape format (Cookie-Editor, Get cookies.txt, etc.):
-
Log in to bilibili.com
-
Export cookies — the file should look like:
# Netscape HTTP Cookie File .bilibili.com TRUE / FALSE 0 SESSDATA <session> .bilibili.com TRUE / FALSE 0 bili_jct <csrf> -
Save the exported
.txtfile in the cookie directory (any filename works):
| OS | Cookie directory |
|---|---|
| Windows | %APPDATA%\bili-dl |
| macOS | ~/Library/Application Support/bili-dl |
| Linux | ~/.config/bili-dl |
Run bili-dl once — it auto-detects any .txt file containing Bilibili
entries, extracts only those, and reuses them thereafter. Override with
--cookie-dir.
Download
bili-dl # interactive REPL
bili-dl https://www.bilibili.com/video/BV... # one-shot (video + audio)
bili-dl -a https://www.bilibili.com/video/BV... # audio only
bili-dl -v https://www.bilibili.com/video/BV... # video only
bili-dl --batch-file urls.txt # batch: download all URLs in file
| OS | Videos | Audio |
|---|---|---|
| Windows | ~/Videos/bilibili_videos |
~/Music/bilibili_audio |
| macOS | ~/Movies/bilibili_videos |
~/Music/bilibili_audio |
| Linux | ~/Downloads/bilibili_videos |
~/Downloads/bilibili_audio |
Override with --output-dir / --audio-dir.
Config file
Save defaults in config.toml (in the cookie directory shown above) so you
don't repeat CLI flags every time:
mode = "a" # "all" | "v" | "a"
proxy = "http://127.0.0.1:7890"
insecure = false
video_dir = "/path/to/videos"
audio_dir = "/path/to/audio"
cookie_dir = "/path/to/cookies"
All fields are optional — set only what you need. CLI flags always override
config file values. Override the config path with --config FILE.
Batch download
Create a text file with one URL per line (# for comments):
# my playlist
https://www.bilibili.com/video/BV1xx...
https://www.bilibili.com/video/BV2xx...
bili-dl --batch-file urls.txt
CLI reference
| Flag | Description |
|---|---|
--all |
video + audio, merged MP4 + extracted M4A (default) |
-v, --video |
video only (MP4) |
-a, --audio |
audio only (M4A, faststart ISOM) |
-k, --insecure |
skip TLS certificate verification |
--proxy URL |
proxy for yt-dlp (env: HTTPS_PROXY/HTTP_PROXY) |
--no-color |
disable colored output (also: NO_COLOR env var) |
--config FILE |
override config file path |
--batch-file FILE |
download URLs listed in a text file |
-V, --version |
show version |
-h, --help |
show help |
Privacy
- Only Bilibili-domain cookie lines are kept; all others are discarded in memory — never written to disk or sent anywhere.
- Network requests go only to
api.bilibili.com(login probe) and the URLs you provide (viayt-dlp). No telemetry, no analytics. cookies_bilibili.txtis created with a timestamped backup before any overwrite.
Limitations
- Single video only —
--no-playlistis always passed, so multi-P videos, collections, and favourites are not downloaded as a batch. Give each part's URL separately (or list them in a--batch-file). - Batch downloads are sequential — no concurrency. A long URL list takes proportionally longer; this keeps memory low and avoids hammering Bilibili.
- Re-downloading overwrites — no
--no-overwrites/--continueis passed to yt-dlp. Running the same URL twice re-downloads and replaces the file. - Windows CJK filenames — on a stock Windows console (cp936/GBK) titles containing rare characters or emoji may lose those characters in the saved filename. Common Chinese characters are unaffected. This is a deliberate trade-off for reliable path matching (see AGENTS.md §2.9); forcing UTF-8 would silently break downloads instead.
License
MIT. bili-dl is a wrapper; the actual downloading is done by
yt-dlp (Unlicense) and
ffmpeg (LGPL/GPL), which you must install separately.
Release files for bili-dl 0.2.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bili_dl-0.2.9.tar.gz | 55.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bili_dl-0.2.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 81.3 kB
Release files / bili_dl-0.2.9.tar.gz
| Download URL | bili_dl-0.2.9.tar.gz |
|---|---|
| Size | 55.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9fc56c35607e40a4fa8a901974c98a576f3a4cb09642d63efa0ceaf77e8264db
|
|
BLAKE2b-256 checksum How to use checksums |
ecef84d506b63f3fe80a26787eb884aa42d359c656eee3366e2190370879eb55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 28, 2026.
Transparency logRelease files / bili_dl-0.2.9-py3-none-any.whl
| Download URL | bili_dl-0.2.9-py3-none-any.whl |
|---|---|
| Size | 26.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a5f2c4a12d719763d14d6512351e3fdd3a183e70ce0184cc756672ce3b299a66
|
|
BLAKE2b-256 checksum How to use checksums |
5af572347ced2c348768548fb08ad74cd079435d0f4b87051bbe3ea84ecc95a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 28, 2026.
Transparency log