Bili23-Downloader: fourteen content types, eight pinned dependencies, one Qt app
Open source, free, cross-platform Bilibili video downloader with multi-threaded acceleration, audio/video separation, danmaku metadata extraction, custom naming and categorization.
At a glance
- What is it?
- Bili23-Downloader is a GPL-3.0 desktop application for saving Bilibili video, audio, danmaku and subtitle data locally, built on PySide6 with every dependency pinned to an exact version. Its scope is wider than its name suggests, covering fourteen listed kinds of content from uploader spaces to watch-later lists, and it states its own limits plainly in a usage agreement that rules out commercial use and any paywall bypass.
- Who is it for?
- Bili23-Downloader suits a person archiving content they can already reach with their own account, who wants the video files, the danmaku and the subtitles in local formats a media centre can index. It does not suit a batch pipeline, since the project itself rules out bulk scraping and anything violating the platform's terms, and it does not suit you if you need an unattended headless tool, because this is a graphical application built on Qt.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 21 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- ScottSloan/Bili23-Downloader9,147 ★ · +1,498
| Repository | 2026-09-22 | 2026-11-14 |
|---|---|---|
| ScottSloan/Bili23-Downloader | 7.6k | 9.1k |
1,498 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
A Qt application with seven dependencies, every one pinned exactly
The manifest names the project `bili23-downloader`, version 2.20.0, licensed GPL-3.0, and requires Python 3.11 or newer. The runtime dependency list is short and every entry is pinned to an exact version rather than a range: `PySide6==6.10.3`, `PySide6-Fluent-Widgets==1.11.3`, `orjson==3.12.0`, `qrcode==8.2`, `protobuf==7.36.2`, `httpx==0.28.1`, `psutil==7.2.2` and `verhub-sdk==0.2.10`.
That list describes the application. PySide6 is Qt for Python and it is why this is a desktop program with windows that remember their position and size, a light and dark theme, and native scaling on high resolution displays, all credited to the Fluent Design language. orjson is there for fast JSON on large API responses, protobuf for the danmaku format, httpx for the network, psutil for process and system information, and qrcode for the login flow.
`requirements.txt` repeats the same eight pins, so a source build has one dependency set to satisfy.
Thirteen content types is the actual scope of the parser
The feature table lists the content types the parser handles, and the count is the project's real reach: uploaded videos, anime series, films, courses, member-store (会员购) courses, interactive video, music in the au and am formats, an uploader's space, favourites, the weekly must-watch list, subscribed collections, followed series, watch later, and viewing history.
That list explains the rest of the design. Batch parsing exists because a space or a favourites folder holds many links, and keyword search is offered for spaces, favourites, history and watch later, with the option to filter only the current page or search everything. After parsing, download items can be ticked automatically by preset conditions, which is what makes a folder of two hundred videos manageable.
It also explains the naming and classification engine. Separate naming templates and multi-level directory storage patterns can be set for each type, so an anime episode and a course lecture do not land in the same folder shape. A parser covering this many content types is a different maintenance commitment from a single-video downloader, and it is the reason the project ships a naming rule engine at all.
Danmaku in three formats, subtitles in five, and ass can go inside mkv
Danmaku are stored as `xml`, `ass` or `json`, and subtitles as `srt`, `lrc`, `txt`, `ass` or `json`. Both support custom styling, and subtitle language can be chosen rather than taken from whatever the platform defaults to.
The option worth knowing is embedding. Danmaku and subtitles in the `ass` format can be placed inside the `mkv` container, which means one file instead of a video and a sidecar that a player might not load.
Covers are handled separately. The original image is saved without re-encoding in `jpg`, `png`, `avif` or `webp`, and can be embedded into the final video file with the option to delete the standalone image afterwards. Chapter information can also be written into the video.
Together with the container choice, `mp4` or `mkv`, that is three separate decisions about how one download is shaped, and each is set before the transfer rather than after it.
NFO files are the point: Kodi, Jellyfin and Emby are named in the docs
The metadata row says the application scrapes and generates local media metadata in the formats media centres expect, naming Kodi, Jellyfin and Emby.
That is a different goal from downloading a file. A video in a folder is a file; an NFO file beside it is a library entry with a title, an actor, artwork and a plot that a media centre will index on next scan.
It pairs with the rest of the feature set rather than replacing it. The quality and codec pickers, with 8K, 4K, HDR, Dolby Vision, Hi-Res lossless audio, Dolby Atmos, and AVC, HEVC or AV1, decide what gets encoded into the file. The preview before download shows the media that will be fetched. The duplicate detection keeps a download history and prompts before saving the same content again.
So the design targets a local library that stays tidy over years, not a one-off grab.
Three proxy modes, a clipboard watcher, and login by QR code
Networking is configurable in three modes: no proxy, system proxy, and manual settings. A CDN node can be chosen by geography to improve speed, and the User-Agent and Host headers can be overridden.
A clipboard watcher recognises a Bilibili link as soon as it is copied and, once confirmed, moves into the parse and download flow. That is the feature that makes the application feel immediate rather than a form you fill in.
Login is handled three ways: QR code scan, SMS verification, and cookie login. All three operate on the account the user already has, which is the line the usage agreement draws: the software works only through the lawful access permissions of your own account and does not bypass any paywall or platform intellectual property protection.
The interface ships in Simplified Chinese, Traditional Chinese and English.
The usage agreement rules out commercial use and disclaims everything
The project states its own terms, and they are worth reading before installing. It is for personal study and research, and downloads are limited to personal non-commercial use. Any commercial purpose, public dissemination or distribution is prohibited.
It also says the software operates only on the lawful access permissions of the user's own account, does not bypass any paywall or platform intellectual property protection, and must not be used for bulk scraping or for anything that violates the target platform's terms of service.
Then the disclaimer: the user bears all risk from using the project, including account bans and copyright disputes, and the developers accept no liability for any direct or indirect legal dispute or damage arising from use or inability to use the software.
For a reader, the practical reading is that this is an archiving tool for content you can already reach, and that the project is not asking to be a bulk downloader. The wbi signing, some interfaces and the buvid3 parameter generation are credited to the community's bilibili-API-collect reference, which is where the protocol knowledge comes from.
Warnings are errors, generated files are excluded, and the launcher is a fork
The tooling is unusually strict for a hobby project. pytest is configured with `-ra --strict-markers --strict-config`, and `filterwarnings` starts with `error`, so a warning fails the suite. One exemption exists, an import-time deprecation warning from qfluentwidgets, and the manifest comments say a new exemption has to state its reason.
Test collection is not only `test_*.py`. `smoke_*.py` is collected too, with a comment explaining why: a comment in `src/main.py` refers to `test/smoke_startup.py` by name, and renaming the file would make that comment a lie.
ruff targets Python 3.11 to match `requires-python`, allows lines of 160 characters, and excludes two generated files, `src/res/resources_rc.py` from pyside6-rcc and `src/util/misc/dm_pb2.py` from protoc. The lint rule set is described as unambiguous breaking errors only, currently zero across the project and enforced in CI.
One dependency has a separate lineage. The Windows launcher in `launcher/` is forked from skywind3000's PyStand under MIT, with application source inlining and integrity verification added on top.
Editorial conclusion
Bili23-Downloader suits a person archiving content they can already reach with their own account, who wants the video files, the danmaku and the subtitles in local formats a media centre can index. It does not suit a batch pipeline, since the project itself rules out bulk scraping and anything violating the platform's terms, and it does not suit you if you need an unattended headless tool, because this is a graphical application built on Qt. Verify three things before you install it: that your Python clears the declared floor of 3.11 if you build from source, which stream quality and codec you actually need, since 8K, HDR, Dolby Vision and AV1 are all selectable, and which release you take, because the latest release is v2.21.0, shipped on 2026-10-22, while pyproject.toml still declares version 2.20.0.
Frequently asked questions
How do I install Bili23-Downloader?
The README gives two download routes: the GitHub Releases page, described as the better option when GitHub access is stable, and the official site releases page at bili23.scott-sloan.cn, recommended for users in mainland China because it is usually faster and more stable. Building from source needs Python 3.11 or newer and the pinned dependencies PySide6, PySide6-Fluent-Widgets, orjson, qrcode, protobuf, httpx, psutil and verhub-sdk.
What kinds of Bilibili content can Bili23-Downloader save?
The documented list covers uploaded videos, anime series, films, courses, member-store (会员购) courses, interactive video, music in the au and am formats, an uploader's space, favourites, the weekly must-watch list, subscribed collections, followed series, watch later and viewing history. Spaces, favourites, history and watch later also support keyword search, and several links can be parsed at once.
Is downloading Bilibili videos with Bili23-Downloader allowed?
The project's own terms say it is for personal study and research, that downloads are limited to personal non-commercial use, and that commercial use, public dissemination or distribution is prohibited. It states the software works only through your own account's lawful access, does not bypass paywalls or platform intellectual property protection, and must not be used for bulk scraping or anything violating the platform's terms, with users bearing all risk including account bans and copyright disputes.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/scottsloan-bili23-downloader)Star history chart for your README
[](https://hysenlabs.com/projects/scottsloan-bili23-downloader)Was this useful?