bbdown 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bbdown-0.0.1/LICENSE +23 -0
- bbdown-0.0.1/NOTICE +8 -0
- bbdown-0.0.1/PKG-INFO +145 -0
- bbdown-0.0.1/README.md +118 -0
- bbdown-0.0.1/pyproject.toml +122 -0
- bbdown-0.0.1/src/bbdown/__init__.py +5 -0
- bbdown-0.0.1/src/bbdown/__main__.py +5 -0
- bbdown-0.0.1/src/bbdown/_version.py +3 -0
- bbdown-0.0.1/src/bbdown/app_api.py +270 -0
- bbdown-0.0.1/src/bbdown/archives.py +52 -0
- bbdown-0.0.1/src/bbdown/bv.py +47 -0
- bbdown-0.0.1/src/bbdown/cli.py +181 -0
- bbdown-0.0.1/src/bbdown/config.py +63 -0
- bbdown-0.0.1/src/bbdown/credentials.py +80 -0
- bbdown-0.0.1/src/bbdown/danmaku.py +198 -0
- bbdown-0.0.1/src/bbdown/doctor.py +132 -0
- bbdown-0.0.1/src/bbdown/downloader.py +334 -0
- bbdown-0.0.1/src/bbdown/external.py +215 -0
- bbdown-0.0.1/src/bbdown/fetchers/__init__.py +29 -0
- bbdown-0.0.1/src/bbdown/fetchers/bangumi.py +112 -0
- bbdown-0.0.1/src/bbdown/fetchers/base.py +27 -0
- bbdown-0.0.1/src/bbdown/fetchers/cheese.py +65 -0
- bbdown-0.0.1/src/bbdown/fetchers/factory.py +56 -0
- bbdown-0.0.1/src/bbdown/fetchers/favorites.py +125 -0
- bbdown-0.0.1/src/bbdown/fetchers/intl_bangumi.py +140 -0
- bbdown-0.0.1/src/bbdown/fetchers/media_list.py +151 -0
- bbdown-0.0.1/src/bbdown/fetchers/normal.py +173 -0
- bbdown-0.0.1/src/bbdown/fetchers/space.py +85 -0
- bbdown-0.0.1/src/bbdown/filenames.py +264 -0
- bbdown-0.0.1/src/bbdown/http.py +269 -0
- bbdown-0.0.1/src/bbdown/input.py +213 -0
- bbdown-0.0.1/src/bbdown/jsonutil.py +96 -0
- bbdown-0.0.1/src/bbdown/login.py +232 -0
- bbdown-0.0.1/src/bbdown/media_semantics.py +264 -0
- bbdown-0.0.1/src/bbdown/models.py +66 -0
- bbdown-0.0.1/src/bbdown/muxer.py +376 -0
- bbdown-0.0.1/src/bbdown/options.py +260 -0
- bbdown-0.0.1/src/bbdown/paths.py +51 -0
- bbdown-0.0.1/src/bbdown/playurl.py +218 -0
- bbdown-0.0.1/src/bbdown/proto/__init__.py +1 -0
- bbdown-0.0.1/src/bbdown/proto/device.proto +19 -0
- bbdown-0.0.1/src/bbdown/proto/device_pb2.py +37 -0
- bbdown-0.0.1/src/bbdown/proto/device_pb2.pyi +37 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreply.proto +104 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreply_pb2.py +55 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreply_pb2.pyi +189 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreq.proto +10 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreq_pb2.py +37 -0
- bbdown-0.0.1/src/bbdown/proto/dmviewreq_pb2.pyi +19 -0
- bbdown-0.0.1/src/bbdown/proto/fawkesreq.proto +8 -0
- bbdown-0.0.1/src/bbdown/proto/fawkesreq_pb2.py +37 -0
- bbdown-0.0.1/src/bbdown/proto/fawkesreq_pb2.pyi +15 -0
- bbdown-0.0.1/src/bbdown/proto/locale.proto +12 -0
- bbdown-0.0.1/src/bbdown/proto/locale_pb2.py +39 -0
- bbdown-0.0.1/src/bbdown/proto/locale_pb2.pyi +23 -0
- bbdown-0.0.1/src/bbdown/proto/metadata.proto +12 -0
- bbdown-0.0.1/src/bbdown/proto/metadata_pb2.py +37 -0
- bbdown-0.0.1/src/bbdown/proto/metadata_pb2.pyi +23 -0
- bbdown-0.0.1/src/bbdown/proto/network.proto +25 -0
- bbdown-0.0.1/src/bbdown/proto/network_pb2.py +41 -0
- bbdown-0.0.1/src/bbdown/proto/network_pb2.pyi +46 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreply.proto +163 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreply_pb2.py +73 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreply_pb2.pyi +273 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreq.proto +25 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreq_pb2.py +39 -0
- bbdown-0.0.1/src/bbdown/proto/playviewreq_pb2.pyi +48 -0
- bbdown-0.0.1/src/bbdown/proto/restriction.proto +14 -0
- bbdown-0.0.1/src/bbdown/proto/restriction_pb2.py +39 -0
- bbdown-0.0.1/src/bbdown/proto/restriction_pb2.pyi +26 -0
- bbdown-0.0.1/src/bbdown/py.typed +1 -0
- bbdown-0.0.1/src/bbdown/selection.py +135 -0
- bbdown-0.0.1/src/bbdown/server.py +477 -0
- bbdown-0.0.1/src/bbdown/stream_parser.py +377 -0
- bbdown-0.0.1/src/bbdown/subtitle_languages.py +162 -0
- bbdown-0.0.1/src/bbdown/subtitles.py +277 -0
- bbdown-0.0.1/src/bbdown/tracks.py +121 -0
- bbdown-0.0.1/src/bbdown/wbi.py +84 -0
- bbdown-0.0.1/src/bbdown/workflow.py +1297 -0
bbdown-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 nilaoda
|
|
4
|
+
Copyright (c) 2026 LittleGraper
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
23
|
+
|
bbdown-0.0.1/NOTICE
ADDED
bbdown-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bbdown
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: BBDown 是一个免费且便捷高效的哔哩哔哩下载与解析工具。
|
|
5
|
+
Author: LittleGraper
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
License-File: NOTICE
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Operating System :: MacOS
|
|
12
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Typing :: Typed
|
|
19
|
+
Requires-Dist: defusedxml>=0.7.1
|
|
20
|
+
Requires-Dist: httpx>=0.28.1
|
|
21
|
+
Requires-Dist: protobuf>=7.35.1,<8
|
|
22
|
+
Requires-Dist: qrcode[png]>=8.2
|
|
23
|
+
Requires-Dist: starlette>=0.48.0
|
|
24
|
+
Requires-Dist: uvicorn>=0.35.0
|
|
25
|
+
Requires-Python: >=3.12
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# BBDown
|
|
29
|
+
|
|
30
|
+
BBDown 是一个使用 Python 重新实现的哔哩哔哩下载与解析命令行工具。
|
|
31
|
+
|
|
32
|
+
`0.0.1` 已按固定原版基线完成 CLI、配置、元数据、WEB/TV/APP/INTL 播放地址、
|
|
33
|
+
字幕、弹幕、下载、混流、二维码登录和 `serve` HTTP API 的功能等价验证。
|
|
34
|
+
具体自动化与线上证据见 [等价性证据矩阵](docs/equivalence-matrix.md)。
|
|
35
|
+
|
|
36
|
+
## 安装
|
|
37
|
+
|
|
38
|
+
要求 CPython 3.12 或更高版本,推荐使用 uv:
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
uv tool install bbdown
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
安装后可以使用任一等价命令:
|
|
45
|
+
|
|
46
|
+
```powershell
|
|
47
|
+
BBDown --version
|
|
48
|
+
bbdown --help
|
|
49
|
+
bbd doctor
|
|
50
|
+
BBDown login
|
|
51
|
+
BBDown logintv
|
|
52
|
+
BBDown serve --listen http://127.0.0.1:23333
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## HTTP 服务
|
|
56
|
+
|
|
57
|
+
`BBDown serve` 默认监听 `http://0.0.0.0:23333`,保留原版任务提交、查询、清理和完成回调
|
|
58
|
+
接口。默认开放访问以保持兼容;暴露到不可信网络时,应使用 `--token` 或
|
|
59
|
+
`BBDOWN_SERVER_TOKEN` 启用 Bearer 认证,并用可重复的 `--cors-origin` 限制浏览器来源。
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
$env:BBDOWN_SERVER_TOKEN = "<从安全存储读取的值>"
|
|
63
|
+
BBDown serve --cors-origin https://console.example
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
完整路由和 JSON 字段见 [HTTP API 文档](docs/http-api.md)。
|
|
67
|
+
|
|
68
|
+
## 外部工具
|
|
69
|
+
|
|
70
|
+
音视频下载与封装兼容 FFmpeg、MP4Box 和 aria2c。项目不会自动下载这些程序;可以通过
|
|
71
|
+
`--ffmpeg-path`、`--mp4box-path`、`--aria2c-path` 指定位置,或运行 `BBDown doctor`
|
|
72
|
+
检查 PATH。DASH/FLV 音视频、封面、字幕、弹幕与混流已经接入 CLI。
|
|
73
|
+
|
|
74
|
+
## 开发
|
|
75
|
+
|
|
76
|
+
```powershell
|
|
77
|
+
uv sync --all-groups
|
|
78
|
+
uv run ruff format --check .
|
|
79
|
+
uv run ruff check .
|
|
80
|
+
uv run basedpyright
|
|
81
|
+
uv run interrogate src
|
|
82
|
+
uv run pytest
|
|
83
|
+
uv run mutmut run # 仅支持具有 fork 的 POSIX 环境
|
|
84
|
+
uv build
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
完整文档通过 `uv run mkdocs serve` 本地预览。
|
|
88
|
+
|
|
89
|
+
### 原版差分测试
|
|
90
|
+
|
|
91
|
+
原版固定在 `origin.lock.json` 记录的提交。Windows/PowerShell 下可准备本地 oracle:
|
|
92
|
+
|
|
93
|
+
```powershell
|
|
94
|
+
.\scripts\setup-origin-oracle.ps1
|
|
95
|
+
$env:DOTNET_ROOT = "<脚本输出的目录>"
|
|
96
|
+
$env:BBDOWN_DOTNET = "<脚本输出的路径>"
|
|
97
|
+
$env:BBDOWN_ORIGIN_DLL = "<脚本输出的路径>"
|
|
98
|
+
uv run pytest tests/oracle -m oracle --no-cov
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 在线烟测
|
|
102
|
+
|
|
103
|
+
`Monthly live smoke` 每月及手动下载匿名、会员样本的单个分 P,并同时启用 360P 优先及音视频
|
|
104
|
+
最小码率选择。匿名任务用固定原版和 Python 版各下载一次,再执行 ffprobe 语义差分;样本可通过
|
|
105
|
+
仓库变量 `BBDOWN_SMOKE_INPUT` 覆盖。会员烟测必须配置仓库变量 `BBDOWN_MEMBER_SMOKE_INPUT` 和
|
|
106
|
+
Secret `BBDOWN_MEMBER_COOKIE`。Cookie 只会写入运行器的临时私有凭据文件,不作为命令行参数或
|
|
107
|
+
日志输出,产物只保留在临时运行器中。预留的 TV/APP 认证 Secret 名称分别为
|
|
108
|
+
`BBDOWN_TV_TOKEN` 和 `BBDOWN_APP_TOKEN`。月度烟测会分别通过 WEB、TV、APP 三种认证路径下载
|
|
109
|
+
低清晰度样本;三类凭据只能由仓库所有者写入受保护的 GitHub Secrets,工作流和测试不提供
|
|
110
|
+
默认值,也不回显其内容。
|
|
111
|
+
|
|
112
|
+
全部在线烟测任务运行在带有 `self-hosted`、`linux`、`x64`、`bbdown-live-smoke` 标签的专用
|
|
113
|
+
GitHub Actions Runner 上,以使用已验证可访问 Bilibili 的网络。该主机必须预装 `git`、
|
|
114
|
+
`ffmpeg` 和 `ffprobe`;工作流会校验这些工具,但不会通过 `sudo` 修改持久化宿主机。
|
|
115
|
+
Python、uv 和固定的 .NET SDK 由已固定提交哈希的官方 Actions 在任务目录中配置。认证任务
|
|
116
|
+
无论成功与否都会显式清理临时凭据和下载产物。
|
|
117
|
+
|
|
118
|
+
Bilibili 当前会对旧的 `/x/web-interface/view` 返回 HTTP 412,因此 Python 客户端仅在该状态下
|
|
119
|
+
回退到响应结构等价的 `/x/web-interface/wbi/view`。线上差分构建仍固定检出原版提交,随后仅对
|
|
120
|
+
临时 oracle 的同一元数据 URL 应用可审计的一行兼容补丁,避免把已失效的上游入口误判为实现差异。
|
|
121
|
+
|
|
122
|
+
### 性能回退门禁
|
|
123
|
+
|
|
124
|
+
固定的 BV 往返、轨道排序、字幕转换和弹幕渲染工作负载不访问网络,也不与 Native AOT 比速度:
|
|
125
|
+
|
|
126
|
+
```powershell
|
|
127
|
+
uv run python scripts/performance_gate.py
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
CI 使用宽松的绝对预算阻止数量级回退;较慢的本地诊断环境可用
|
|
131
|
+
`--budget-multiplier 2` 临时放宽,但 CI 始终使用默认预算。
|
|
132
|
+
|
|
133
|
+
### 媒体产物差分
|
|
134
|
+
|
|
135
|
+
安装 FFmpeg/ffprobe 后,可以比较原版与 Python 版产物的轨道类型及数量、编码、画面尺寸、音频
|
|
136
|
+
布局、时长、语言、字幕、封面 disposition、章节和关键元数据。容器索引、码率及编码器版本不参与
|
|
137
|
+
比较,默认允许 0.25 秒封装时长误差:
|
|
138
|
+
|
|
139
|
+
```powershell
|
|
140
|
+
uv run python scripts/compare_media.py origin.mp4 python.mp4
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 许可证
|
|
144
|
+
|
|
145
|
+
本项目采用 MIT License,归属信息见 [LICENSE](LICENSE) 与 [NOTICE](NOTICE)。
|
bbdown-0.0.1/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# BBDown
|
|
2
|
+
|
|
3
|
+
BBDown 是一个使用 Python 重新实现的哔哩哔哩下载与解析命令行工具。
|
|
4
|
+
|
|
5
|
+
`0.0.1` 已按固定原版基线完成 CLI、配置、元数据、WEB/TV/APP/INTL 播放地址、
|
|
6
|
+
字幕、弹幕、下载、混流、二维码登录和 `serve` HTTP API 的功能等价验证。
|
|
7
|
+
具体自动化与线上证据见 [等价性证据矩阵](docs/equivalence-matrix.md)。
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
要求 CPython 3.12 或更高版本,推荐使用 uv:
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
uv tool install bbdown
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
安装后可以使用任一等价命令:
|
|
18
|
+
|
|
19
|
+
```powershell
|
|
20
|
+
BBDown --version
|
|
21
|
+
bbdown --help
|
|
22
|
+
bbd doctor
|
|
23
|
+
BBDown login
|
|
24
|
+
BBDown logintv
|
|
25
|
+
BBDown serve --listen http://127.0.0.1:23333
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## HTTP 服务
|
|
29
|
+
|
|
30
|
+
`BBDown serve` 默认监听 `http://0.0.0.0:23333`,保留原版任务提交、查询、清理和完成回调
|
|
31
|
+
接口。默认开放访问以保持兼容;暴露到不可信网络时,应使用 `--token` 或
|
|
32
|
+
`BBDOWN_SERVER_TOKEN` 启用 Bearer 认证,并用可重复的 `--cors-origin` 限制浏览器来源。
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
$env:BBDOWN_SERVER_TOKEN = "<从安全存储读取的值>"
|
|
36
|
+
BBDown serve --cors-origin https://console.example
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
完整路由和 JSON 字段见 [HTTP API 文档](docs/http-api.md)。
|
|
40
|
+
|
|
41
|
+
## 外部工具
|
|
42
|
+
|
|
43
|
+
音视频下载与封装兼容 FFmpeg、MP4Box 和 aria2c。项目不会自动下载这些程序;可以通过
|
|
44
|
+
`--ffmpeg-path`、`--mp4box-path`、`--aria2c-path` 指定位置,或运行 `BBDown doctor`
|
|
45
|
+
检查 PATH。DASH/FLV 音视频、封面、字幕、弹幕与混流已经接入 CLI。
|
|
46
|
+
|
|
47
|
+
## 开发
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
uv sync --all-groups
|
|
51
|
+
uv run ruff format --check .
|
|
52
|
+
uv run ruff check .
|
|
53
|
+
uv run basedpyright
|
|
54
|
+
uv run interrogate src
|
|
55
|
+
uv run pytest
|
|
56
|
+
uv run mutmut run # 仅支持具有 fork 的 POSIX 环境
|
|
57
|
+
uv build
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
完整文档通过 `uv run mkdocs serve` 本地预览。
|
|
61
|
+
|
|
62
|
+
### 原版差分测试
|
|
63
|
+
|
|
64
|
+
原版固定在 `origin.lock.json` 记录的提交。Windows/PowerShell 下可准备本地 oracle:
|
|
65
|
+
|
|
66
|
+
```powershell
|
|
67
|
+
.\scripts\setup-origin-oracle.ps1
|
|
68
|
+
$env:DOTNET_ROOT = "<脚本输出的目录>"
|
|
69
|
+
$env:BBDOWN_DOTNET = "<脚本输出的路径>"
|
|
70
|
+
$env:BBDOWN_ORIGIN_DLL = "<脚本输出的路径>"
|
|
71
|
+
uv run pytest tests/oracle -m oracle --no-cov
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 在线烟测
|
|
75
|
+
|
|
76
|
+
`Monthly live smoke` 每月及手动下载匿名、会员样本的单个分 P,并同时启用 360P 优先及音视频
|
|
77
|
+
最小码率选择。匿名任务用固定原版和 Python 版各下载一次,再执行 ffprobe 语义差分;样本可通过
|
|
78
|
+
仓库变量 `BBDOWN_SMOKE_INPUT` 覆盖。会员烟测必须配置仓库变量 `BBDOWN_MEMBER_SMOKE_INPUT` 和
|
|
79
|
+
Secret `BBDOWN_MEMBER_COOKIE`。Cookie 只会写入运行器的临时私有凭据文件,不作为命令行参数或
|
|
80
|
+
日志输出,产物只保留在临时运行器中。预留的 TV/APP 认证 Secret 名称分别为
|
|
81
|
+
`BBDOWN_TV_TOKEN` 和 `BBDOWN_APP_TOKEN`。月度烟测会分别通过 WEB、TV、APP 三种认证路径下载
|
|
82
|
+
低清晰度样本;三类凭据只能由仓库所有者写入受保护的 GitHub Secrets,工作流和测试不提供
|
|
83
|
+
默认值,也不回显其内容。
|
|
84
|
+
|
|
85
|
+
全部在线烟测任务运行在带有 `self-hosted`、`linux`、`x64`、`bbdown-live-smoke` 标签的专用
|
|
86
|
+
GitHub Actions Runner 上,以使用已验证可访问 Bilibili 的网络。该主机必须预装 `git`、
|
|
87
|
+
`ffmpeg` 和 `ffprobe`;工作流会校验这些工具,但不会通过 `sudo` 修改持久化宿主机。
|
|
88
|
+
Python、uv 和固定的 .NET SDK 由已固定提交哈希的官方 Actions 在任务目录中配置。认证任务
|
|
89
|
+
无论成功与否都会显式清理临时凭据和下载产物。
|
|
90
|
+
|
|
91
|
+
Bilibili 当前会对旧的 `/x/web-interface/view` 返回 HTTP 412,因此 Python 客户端仅在该状态下
|
|
92
|
+
回退到响应结构等价的 `/x/web-interface/wbi/view`。线上差分构建仍固定检出原版提交,随后仅对
|
|
93
|
+
临时 oracle 的同一元数据 URL 应用可审计的一行兼容补丁,避免把已失效的上游入口误判为实现差异。
|
|
94
|
+
|
|
95
|
+
### 性能回退门禁
|
|
96
|
+
|
|
97
|
+
固定的 BV 往返、轨道排序、字幕转换和弹幕渲染工作负载不访问网络,也不与 Native AOT 比速度:
|
|
98
|
+
|
|
99
|
+
```powershell
|
|
100
|
+
uv run python scripts/performance_gate.py
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
CI 使用宽松的绝对预算阻止数量级回退;较慢的本地诊断环境可用
|
|
104
|
+
`--budget-multiplier 2` 临时放宽,但 CI 始终使用默认预算。
|
|
105
|
+
|
|
106
|
+
### 媒体产物差分
|
|
107
|
+
|
|
108
|
+
安装 FFmpeg/ffprobe 后,可以比较原版与 Python 版产物的轨道类型及数量、编码、画面尺寸、音频
|
|
109
|
+
布局、时长、语言、字幕、封面 disposition、章节和关键元数据。容器索引、码率及编码器版本不参与
|
|
110
|
+
比较,默认允许 0.25 秒封装时长误差:
|
|
111
|
+
|
|
112
|
+
```powershell
|
|
113
|
+
uv run python scripts/compare_media.py origin.mp4 python.mp4
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 许可证
|
|
117
|
+
|
|
118
|
+
本项目采用 MIT License,归属信息见 [LICENSE](LICENSE) 与 [NOTICE](NOTICE)。
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "bbdown"
|
|
3
|
+
version = "0.0.1"
|
|
4
|
+
description = "BBDown 是一个免费且便捷高效的哔哩哔哩下载与解析工具。"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
license-files = ["LICENSE", "NOTICE"]
|
|
9
|
+
authors = [{ name = "LittleGraper" }]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 5 - Production/Stable",
|
|
12
|
+
"Environment :: Console",
|
|
13
|
+
"Operating System :: MacOS",
|
|
14
|
+
"Operating System :: Microsoft :: Windows",
|
|
15
|
+
"Operating System :: POSIX :: Linux",
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Programming Language :: Python :: 3.14",
|
|
20
|
+
"Typing :: Typed",
|
|
21
|
+
]
|
|
22
|
+
dependencies = [
|
|
23
|
+
"defusedxml>=0.7.1",
|
|
24
|
+
"httpx>=0.28.1",
|
|
25
|
+
"protobuf>=7.35.1,<8",
|
|
26
|
+
"qrcode[png]>=8.2",
|
|
27
|
+
"starlette>=0.48.0",
|
|
28
|
+
"uvicorn>=0.35.0",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.scripts]
|
|
32
|
+
BBDown = "bbdown.cli:main"
|
|
33
|
+
bbdown = "bbdown.cli:main"
|
|
34
|
+
bbd = "bbdown.cli:main"
|
|
35
|
+
|
|
36
|
+
[dependency-groups]
|
|
37
|
+
dev = [
|
|
38
|
+
"basedpyright>=1.31.4",
|
|
39
|
+
"hypothesis>=6.138.0",
|
|
40
|
+
"grpcio-tools==1.83.1",
|
|
41
|
+
"interrogate>=1.7.0",
|
|
42
|
+
"mkdocs>=1.6.1",
|
|
43
|
+
"mkdocs-material>=9.6.18",
|
|
44
|
+
"pytest>=8.4.2",
|
|
45
|
+
"pytest-cov>=6.2.1",
|
|
46
|
+
"pytest-asyncio>=1.1.0",
|
|
47
|
+
"ruff>=0.12.12",
|
|
48
|
+
]
|
|
49
|
+
mutation = ["mutmut>=3.4.0"]
|
|
50
|
+
|
|
51
|
+
[build-system]
|
|
52
|
+
requires = ["uv_build>=0.11.21,<0.12.0"]
|
|
53
|
+
build-backend = "uv_build"
|
|
54
|
+
|
|
55
|
+
[tool.ruff]
|
|
56
|
+
target-version = "py312"
|
|
57
|
+
line-length = 100
|
|
58
|
+
extend-exclude = ["src/bbdown/proto"]
|
|
59
|
+
|
|
60
|
+
[tool.ruff.lint]
|
|
61
|
+
select = ["A", "ANN", "ARG", "B", "C4", "D", "E", "F", "I", "N", "PERF", "PL", "RUF", "S", "SIM", "UP"]
|
|
62
|
+
ignore = ["D203", "D213", "D400", "D415", "RUF001", "RUF002"]
|
|
63
|
+
|
|
64
|
+
[tool.ruff.lint.per-file-ignores]
|
|
65
|
+
"tests/**" = ["ANN", "D", "S101"]
|
|
66
|
+
|
|
67
|
+
[tool.basedpyright]
|
|
68
|
+
include = ["src", "tests"]
|
|
69
|
+
ignore = ["src/bbdown/proto"]
|
|
70
|
+
pythonVersion = "3.12"
|
|
71
|
+
typeCheckingMode = "strict"
|
|
72
|
+
reportAny = false
|
|
73
|
+
reportExplicitAny = false
|
|
74
|
+
reportMissingTypeStubs = false
|
|
75
|
+
|
|
76
|
+
[tool.pytest.ini_options]
|
|
77
|
+
addopts = "-p no:cacheprovider --strict-config --strict-markers --cov=bbdown --cov-branch --cov-report=term-missing --cov-fail-under=100"
|
|
78
|
+
testpaths = ["tests"]
|
|
79
|
+
markers = ["oracle: differential tests requiring the pinned original BBDown build"]
|
|
80
|
+
asyncio_mode = "auto"
|
|
81
|
+
|
|
82
|
+
[tool.coverage.run]
|
|
83
|
+
branch = true
|
|
84
|
+
source = ["bbdown"]
|
|
85
|
+
omit = ["src/bbdown/proto/*_pb2.py"]
|
|
86
|
+
|
|
87
|
+
[tool.coverage.report]
|
|
88
|
+
fail_under = 100
|
|
89
|
+
show_missing = true
|
|
90
|
+
skip_covered = true
|
|
91
|
+
|
|
92
|
+
[tool.interrogate]
|
|
93
|
+
fail-under = 100
|
|
94
|
+
exclude = ["tests", "src/bbdown/proto"]
|
|
95
|
+
ignore-init-method = false
|
|
96
|
+
ignore-init-module = false
|
|
97
|
+
ignore-magic = false
|
|
98
|
+
ignore-module = false
|
|
99
|
+
ignore-nested-functions = false
|
|
100
|
+
ignore-private = false
|
|
101
|
+
ignore-property-decorators = false
|
|
102
|
+
verbose = 1
|
|
103
|
+
|
|
104
|
+
[tool.mutmut]
|
|
105
|
+
source_paths = ["src"]
|
|
106
|
+
only_mutate = [
|
|
107
|
+
"src/bbdown/bv.py",
|
|
108
|
+
"src/bbdown/input.py",
|
|
109
|
+
"src/bbdown/selection.py",
|
|
110
|
+
"src/bbdown/filenames.py",
|
|
111
|
+
"src/bbdown/subtitles.py",
|
|
112
|
+
"src/bbdown/danmaku.py",
|
|
113
|
+
]
|
|
114
|
+
pytest_add_cli_args = ["-o", "addopts=-p no:cacheprovider --strict-config --strict-markers"]
|
|
115
|
+
pytest_add_cli_args_test_selection = [
|
|
116
|
+
"tests/test_bv.py",
|
|
117
|
+
"tests/test_input.py",
|
|
118
|
+
"tests/test_selection.py",
|
|
119
|
+
"tests/test_filenames.py",
|
|
120
|
+
"tests/test_subtitles.py",
|
|
121
|
+
"tests/test_danmaku.py",
|
|
122
|
+
]
|