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.
Files changed (79) hide show
  1. bbdown-0.0.1/LICENSE +23 -0
  2. bbdown-0.0.1/NOTICE +8 -0
  3. bbdown-0.0.1/PKG-INFO +145 -0
  4. bbdown-0.0.1/README.md +118 -0
  5. bbdown-0.0.1/pyproject.toml +122 -0
  6. bbdown-0.0.1/src/bbdown/__init__.py +5 -0
  7. bbdown-0.0.1/src/bbdown/__main__.py +5 -0
  8. bbdown-0.0.1/src/bbdown/_version.py +3 -0
  9. bbdown-0.0.1/src/bbdown/app_api.py +270 -0
  10. bbdown-0.0.1/src/bbdown/archives.py +52 -0
  11. bbdown-0.0.1/src/bbdown/bv.py +47 -0
  12. bbdown-0.0.1/src/bbdown/cli.py +181 -0
  13. bbdown-0.0.1/src/bbdown/config.py +63 -0
  14. bbdown-0.0.1/src/bbdown/credentials.py +80 -0
  15. bbdown-0.0.1/src/bbdown/danmaku.py +198 -0
  16. bbdown-0.0.1/src/bbdown/doctor.py +132 -0
  17. bbdown-0.0.1/src/bbdown/downloader.py +334 -0
  18. bbdown-0.0.1/src/bbdown/external.py +215 -0
  19. bbdown-0.0.1/src/bbdown/fetchers/__init__.py +29 -0
  20. bbdown-0.0.1/src/bbdown/fetchers/bangumi.py +112 -0
  21. bbdown-0.0.1/src/bbdown/fetchers/base.py +27 -0
  22. bbdown-0.0.1/src/bbdown/fetchers/cheese.py +65 -0
  23. bbdown-0.0.1/src/bbdown/fetchers/factory.py +56 -0
  24. bbdown-0.0.1/src/bbdown/fetchers/favorites.py +125 -0
  25. bbdown-0.0.1/src/bbdown/fetchers/intl_bangumi.py +140 -0
  26. bbdown-0.0.1/src/bbdown/fetchers/media_list.py +151 -0
  27. bbdown-0.0.1/src/bbdown/fetchers/normal.py +173 -0
  28. bbdown-0.0.1/src/bbdown/fetchers/space.py +85 -0
  29. bbdown-0.0.1/src/bbdown/filenames.py +264 -0
  30. bbdown-0.0.1/src/bbdown/http.py +269 -0
  31. bbdown-0.0.1/src/bbdown/input.py +213 -0
  32. bbdown-0.0.1/src/bbdown/jsonutil.py +96 -0
  33. bbdown-0.0.1/src/bbdown/login.py +232 -0
  34. bbdown-0.0.1/src/bbdown/media_semantics.py +264 -0
  35. bbdown-0.0.1/src/bbdown/models.py +66 -0
  36. bbdown-0.0.1/src/bbdown/muxer.py +376 -0
  37. bbdown-0.0.1/src/bbdown/options.py +260 -0
  38. bbdown-0.0.1/src/bbdown/paths.py +51 -0
  39. bbdown-0.0.1/src/bbdown/playurl.py +218 -0
  40. bbdown-0.0.1/src/bbdown/proto/__init__.py +1 -0
  41. bbdown-0.0.1/src/bbdown/proto/device.proto +19 -0
  42. bbdown-0.0.1/src/bbdown/proto/device_pb2.py +37 -0
  43. bbdown-0.0.1/src/bbdown/proto/device_pb2.pyi +37 -0
  44. bbdown-0.0.1/src/bbdown/proto/dmviewreply.proto +104 -0
  45. bbdown-0.0.1/src/bbdown/proto/dmviewreply_pb2.py +55 -0
  46. bbdown-0.0.1/src/bbdown/proto/dmviewreply_pb2.pyi +189 -0
  47. bbdown-0.0.1/src/bbdown/proto/dmviewreq.proto +10 -0
  48. bbdown-0.0.1/src/bbdown/proto/dmviewreq_pb2.py +37 -0
  49. bbdown-0.0.1/src/bbdown/proto/dmviewreq_pb2.pyi +19 -0
  50. bbdown-0.0.1/src/bbdown/proto/fawkesreq.proto +8 -0
  51. bbdown-0.0.1/src/bbdown/proto/fawkesreq_pb2.py +37 -0
  52. bbdown-0.0.1/src/bbdown/proto/fawkesreq_pb2.pyi +15 -0
  53. bbdown-0.0.1/src/bbdown/proto/locale.proto +12 -0
  54. bbdown-0.0.1/src/bbdown/proto/locale_pb2.py +39 -0
  55. bbdown-0.0.1/src/bbdown/proto/locale_pb2.pyi +23 -0
  56. bbdown-0.0.1/src/bbdown/proto/metadata.proto +12 -0
  57. bbdown-0.0.1/src/bbdown/proto/metadata_pb2.py +37 -0
  58. bbdown-0.0.1/src/bbdown/proto/metadata_pb2.pyi +23 -0
  59. bbdown-0.0.1/src/bbdown/proto/network.proto +25 -0
  60. bbdown-0.0.1/src/bbdown/proto/network_pb2.py +41 -0
  61. bbdown-0.0.1/src/bbdown/proto/network_pb2.pyi +46 -0
  62. bbdown-0.0.1/src/bbdown/proto/playviewreply.proto +163 -0
  63. bbdown-0.0.1/src/bbdown/proto/playviewreply_pb2.py +73 -0
  64. bbdown-0.0.1/src/bbdown/proto/playviewreply_pb2.pyi +273 -0
  65. bbdown-0.0.1/src/bbdown/proto/playviewreq.proto +25 -0
  66. bbdown-0.0.1/src/bbdown/proto/playviewreq_pb2.py +39 -0
  67. bbdown-0.0.1/src/bbdown/proto/playviewreq_pb2.pyi +48 -0
  68. bbdown-0.0.1/src/bbdown/proto/restriction.proto +14 -0
  69. bbdown-0.0.1/src/bbdown/proto/restriction_pb2.py +39 -0
  70. bbdown-0.0.1/src/bbdown/proto/restriction_pb2.pyi +26 -0
  71. bbdown-0.0.1/src/bbdown/py.typed +1 -0
  72. bbdown-0.0.1/src/bbdown/selection.py +135 -0
  73. bbdown-0.0.1/src/bbdown/server.py +477 -0
  74. bbdown-0.0.1/src/bbdown/stream_parser.py +377 -0
  75. bbdown-0.0.1/src/bbdown/subtitle_languages.py +162 -0
  76. bbdown-0.0.1/src/bbdown/subtitles.py +277 -0
  77. bbdown-0.0.1/src/bbdown/tracks.py +121 -0
  78. bbdown-0.0.1/src/bbdown/wbi.py +84 -0
  79. 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
@@ -0,0 +1,8 @@
1
+ BBDown Python implementation
2
+
3
+ This distribution includes software derived from BBDown:
4
+ Copyright (c) 2020 nilaoda, licensed under the MIT License.
5
+
6
+ The original source baseline used for compatibility is recorded in
7
+ origin.lock.json.
8
+
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
+ ]
@@ -0,0 +1,5 @@
1
+ """BBDown Python 包。"""
2
+
3
+ from bbdown._version import __version__
4
+
5
+ __all__ = ["__version__"]
@@ -0,0 +1,5 @@
1
+ """支持通过 ``python -m bbdown`` 启动命令行。"""
2
+
3
+ from bbdown.cli import main
4
+
5
+ raise SystemExit(main())
@@ -0,0 +1,3 @@
1
+ """项目版本的单一源码。"""
2
+
3
+ __version__ = "0.0.1"