自动直播录制、投稿、twitch、ytb频道搬运工具。命令行投稿(B站)和视频下载工具,提供多种登录方式,支持多p。边录边传0落盘
This report summarizes scanner evidence for biliup/biliup, a Rust project with 5,575 GitHub stars. SynthScan examined 235,857 lines of code across 686 source files, recording 209 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 0.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 193 finding(s).
Are imports declared and package/API names verified? 12 finding(s).
Are wrappers, guards, and repeated structures necessary? 36 finding(s).
Which changes need focused human review? 209 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 209 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/biliup-cli/src/tools.rs | 1 | //! External programs: where ffmpeg is, and how child processes are started. | COMMENT |
| LOW | crates/biliup-cli/src/entry.rs | 281 | /// Serve on this already-bound socket instead of binding `bind`:`port`, so | COMMENT |
| LOW | crates/biliup-cli/src/cli.rs | 21 | #[command(author, version, about)] | COMMENT |
| LOW | crates/biliup-cli/src/cli.rs | 41 | COMMENT | |
| LOW | crates/biliup-cli/src/cli.rs | 61 | #[arg(short, long, value_name = "FILE")] | COMMENT |
| LOW | crates/biliup-cli/src/cli.rs | 81 | submit: Option<SubmitOption>, | COMMENT |
| LOW | crates/biliup-cli/src/cli.rs | 181 | /// 使用 biliup 1.0.7 风格配置文件启动录制 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 21 | /// 全局配置结构体 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 41 | /// Noto Sans CJK SC 与 Noto Emoji。填目录本身或它下面的 `fonts/` 都可以。 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 101 | #[serde(default = "default_lines")] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 121 | #[builder(default = default_event_loop_interval())] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 141 | /// 的时间轴上);0 = 不合并。投稿不受影响:断流后重新开始的录制仍单独投稿。 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 161 | /// `None` 视同 `relay`。 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 181 | #[serde(default, skip_serializing_if = "Option::is_none")] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 201 | pub douyu_rate: Option<u32>, | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 221 | /// 斗鱼互动游戏运行时跳过录制 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 241 | /// 虎牙是否保留 imgplus 流名 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 261 | /// 双屏直播录制方式 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 281 | pub kila_protocol: Option<String>, | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 301 | pub bili_force_source: Option<bool>, | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 321 | #[serde(default)] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 341 | #[serde(default)] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 361 | #[serde(default)] | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 541 | /// B站Cookie文件路径 | COMMENT |
| LOW | crates/biliup-cli/src/server/config.rs | 561 | /// YouTube Cookie文件路径 | COMMENT |
| LOW | crates/biliup-cli/src/server/app.rs | 61 | let session_layer = SessionManagerLayer::new(session_store) | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/runner.rs | 1 | //! 按场次的自动切片任务:排队、调度、抽音频、转写,接着生成候选(见 [`super::analyze`])。 | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/files.rs | 1 | //! 一场的分析数据:`<auto_clip 目录>/<场次 id>/` 下的文件,不进 SQLite(连接池只有 2 个连接, | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/danmaku.rs | 1 | //! 弹幕密度与高峰:从分段的弹幕 XML 算出 10 秒一桶的条数、前后 10 分钟的滑动中位数基线, | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/audio.rs | 1 | //! 抽音频、静音检测与切块。 | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/settings.rs | 41 | #[builder(default)] | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/settings.rs | 61 | pub asr_language: Option<String>, | COMMENT |
| LOW | crates/biliup-cli/src/server/auto_clip/jobs.rs | 1 | //! `auto_clip_jobs` 的读写:按场次排队的自动切片任务。 | COMMENT |
| LOW | crates/biliup-cli/src/server/core/monitor.rs | 481 | /// 删除指定ID的工作器 | COMMENT |
| LOW | crates/biliup-cli/src/server/core/monitor.rs | 721 | /// 房间Actor | COMMENT |
| LOW | crates/biliup-cli/src/server/core/slots.rs | 1 | //! 容量可在运行时调整的并发槽位。 | COMMENT |
| LOW | crates/biliup-cli/src/server/core/downloader.rs | 61 | COMMENT | |
| LOW | crates/biliup-cli/src/server/core/downloader.rs | 121 | /// 定义支持的各种下载器类型 | COMMENT |
| LOW | crates/biliup-cli/src/server/core/downloader.rs | 301 | SegmentCompleted, | COMMENT |
| LOW | crates/biliup-cli/src/server/core/downloader.rs | 381 | COMMENT | |
| LOW | crates/biliup-cli/src/server/core/downloader.rs | 401 | // let downloader = FfmpegDownloader::new( | COMMENT |
| LOW | …up-cli/src/server/core/downloader/ffmpeg_downloader.rs | 21 | process_handle: Arc<RwLock<Option<tokio::process::Child>>>, | COMMENT |
| LOW | crates/biliup-cli/src/server/core/downloader/mesio.rs | 381 | duration_secs, | COMMENT |
| LOW | …liup-cli/src/server/core/downloader/mesio/index_tap.rs | 1 | //! mesio 的关键帧索引旁路。 | COMMENT |
| LOW | crates/biliup-cli/src/server/common/timerange.rs | 1 | //! 录制时间范围(`time_range`)的解析与判定。 | COMMENT |
| LOW | crates/biliup-cli/src/server/common/upload.rs | 721 | studio: &Studio, | COMMENT |
| LOW | crates/biliup-cli/src/server/common/recording_policy.rs | 1 | //! 录制准入策略:集中回答「现在该不该录这个主播」。 | COMMENT |
| LOW | crates/biliup-cli/src/server/common/system_stats.rs | 1 | //! 控制台首页的系统状态:CPU、内存、录制目录所在磁盘、网速。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/recorder.rs | 1 | //! 录制侧:把下载器的「开段 / 关段」事件按顺序写进 `stream_sessions` / `segments`。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/mod.rs | 1 | //! 切片工作台的录制侧底座:场次(`stream_sessions`)、分段(`segments`)与关键帧索引。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/markers.rs | 1 | //! 标记(`markers`):看直播时按一下「标记」记下的场次时刻,之后在工作台里从这里剪。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/retention.rs | 1 | //! 分段文件的生命周期:被引用就推迟删除、定时清理、磁盘水位兜底。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/live.rs | 1 | //! 正在录的场次:DVR 回看跟随正在写的分段时,靠这里拿到两种通知,不轮询。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/clips/plan.rs | 1 | //! 场次时间上的入点、出点 → 要读的分段字节区间。 | COMMENT |
| LOW | …biliup-cli/src/server/workbench/clips/publish/queue.rs | 1 | //! 切片发布队列:一次只发一个稿件,不占录播自动上传的 UActor。 | COMMENT |
| LOW | …s/biliup-cli/src/server/workbench/clips/publish/mod.rs | 61 | pub desc: Option<String>, | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/index/cache.rs | 1 | //! 索引缓存文件:文件头之后是只追加的记录流,落盘不经临时文件、不 rename。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/index/mod.rs | 1 | //! 分段文件的关键帧索引:把「段内时间」对应到「文件字节偏移」。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/index/live.rs | 1 | //! 录制时边写边建关键帧索引。 | COMMENT |
| LOW | crates/biliup-cli/src/server/workbench/dvr/mod.rs | 1 | //! DVR 回看:从场次时间轴上任一点起,把已经录下的分段(含正在写的那一段)接成一条可播放的流。 | COMMENT |
| 92 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/stream-gears/tests/test_package.py | 37 | def test_native_module_is_a_submodule(): | CODE |
| LOW | crates/stream-gears/tests/test_package.py | 44 | def test_all_matches_native_module(): | CODE |
| LOW | crates/stream-gears/tests/test_package.py | 68 | def test_api_package_has_no_server_or_resources(): | CODE |
| LOW | crates/stream-gears/tests/test_package.py | 78 | def test_upload_text_signature_is_accepted(): | CODE |
| LOW | crates/stream-gears/tests/test_package.py | 137 | def test_stubs_accept_valid_usage(tmp_path): | STRING |
| LOW | crates/stream-gears/tests/test_package.py | 142 | def test_stubs_reject_invalid_usage(tmp_path): | STRING |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 134 | def test_download_empty_response(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 139 | def test_download_truncated_flv(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 143 | def test_download_malformed_flv_tag(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 153 | def test_download_plain_function_rejects_bad_segment(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 158 | def test_callback_accepts_lambda(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 165 | def test_callback_accepts_bound_method(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 171 | def test_callback_must_be_callable(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 176 | def test_callback_exception_is_reraised(server, tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 186 | def test_py_segment_fields_are_readable(): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 264 | def test_login_by_cookies_missing_file(tmp_path): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 272 | def test_login_file_defaults_to_cookies_json(name): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 277 | def test_login_by_qrcode_file_is_optional(): | CODE |
| LOW⚡ | crates/stream-gears/tests/test_errors.py | 282 | def test_login_by_sms_failure_does_not_write_file(tmp_path, closed_port): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 82 | def assert_stream_gears_error(call): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 105 | def test_stream_gears_error_hierarchy(): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 111 | def test_login_proxy_defaults_to_none(name): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 123 | def test_download_closed_port(tmp_path, closed_port): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 205 | def test_segment_accepts_dict_and_object(server, tmp_path, segment): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 216 | def test_upload_invalid_extra_fields(tmp_path, extra_fields): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 222 | def test_upload_valid_extra_fields_reach_login(tmp_path, extra_fields): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 246 | def test_login_invalid_json_raises_value_error(name): | CODE |
| LOW | crates/stream-gears/tests/test_errors.py | 252 | def test_login_by_sms_failure_raises(tmp_path, closed_port): | CODE |
| LOW | crates/stream-gears/examples/download.py | 35 | def download_with_signal_handling(url): | CODE |
| LOW | app/lib/douyu-auth.ts | 146 | export function douyuManualRefreshMessage(previous: DouyuAuthStatus, next: DouyuAuthStatus): string { | CODE |
| LOW | app/lib/auto-clip-poll.ts | 5 | export function sessionJobRefreshInterval(job: { state?: string } | null | undefined): number { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/stream-gears/tests/test_package.py | 10 | CODE | |
| LOW | crates/stream-gears/tests/test_smoke.py | 7 | CODE | |
| LOW | crates/stream-gears/tests/test_smoke.py | 8 | CODE | |
| LOW | crates/stream-gears/tests/test_smoke.py | 9 | CODE | |
| LOW | crates/stream-gears/tests/test_smoke.py | 10 | CODE | |
| LOW | crates/stream-gears/tests/test_smoke.py | 11 | CODE | |
| LOW | crates/stream-gears/stream_gears/__init__.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/content/docs/getting-started/quick-start.md | 36 | ### Step 1: Create a new directory | COMMENT |
| LOW | docs/content/docs/getting-started/quick-start.md | 43 | ### Step 2: Install biliup | COMMENT |
| LOW | docs/content/docs/getting-started/quick-start.md | 57 | ### Step 3: Configuration | COMMENT |
| LOW | docs/content/docs/getting-started/quick-start.md | 89 | ### Step 4: Run the project | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/biliup-cli/src/server/fleet/ha/sync.rs | 689 | assert!(debug.contains("42") && !debug.contains("placeholder")); | CODE |
| LOW | …iliup-cli/src/server/infrastructure/connection_pool.rs | 560 | ('https://live.bilibili.com/1', 'placeholder', '{\"file_size\":null}')", | CODE |
| LOW | …iliup-cli/src/server/infrastructure/connection_pool.rs | 802 | ('https://live.bilibili.com/1', 'placeholder', '{\"downloader\":\"sync-downloader\",\"file_size\":null,\"bi | CODE |
| LOW | …iliup-cli/src/server/infrastructure/connection_pool.rs | 1123 | ('https://live.bilibili.com/1', 'placeholder', '{\"file_size\":null}')", | CODE |
| LOW | docs/content/blog/placeholder-text.md | 3 | description = "Lorem Ipsum Dolor Si Amet" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/danmaku-factory/tests/differential.py | 16 | CODE | |
| LOW | crates/stream-gears/biliup/plugins/bili_webup.py | 403 | CODE | |
| LOW | crates/stream-gears/biliup/plugins/bili_webup.py | 656 | CODE | |
| LOW | crates/stream-gears/biliup/plugins/bili_webup.py | 661 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/stream-gears/examples/download.py | 30 | except Exception as e: | CODE |
| LOW | crates/stream-gears/biliup/plugins/bili_webup.py | 349 | except Exception as error: | CODE |
| MEDIUM | crates/stream-gears/biliup/plugins/bili_webup.py | 269 | def load(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/ci.yml | 1 | # This file is autogenerated by maturin v1.9.1 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/stream-gears/biliup/plugins/bili_webup.py | 44 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/stream-gears/stream_gears/__init__.py | 10 | __all__ = [ | CODE |