Repository Analysis

yutto-dev/yutto

:ice_cube: 一个可爱且任性的 B 站视频下载器

15.9 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of yutto-dev/yutto, a Python project with 1,970 GitHub stars. SynthScan v2.0 examined 35,599 lines of code across 256 source files, recording 533 pattern matches distributed across 9 syntactic categories. The overall adjusted score of 15.9 places this repository in the Moderate AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

15.9
Adjusted Score
15.9
Raw Score
100%
Time Factor
2026-08-09
Last Push
2.0K
Stars
Python
Language
35.6K
Lines of Code
256
Files
533
Pattern Hits
2026-08-09
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 1MEDIUM 1LOW 531

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 533 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers314 hits · 344 pts
SeverityFileLineSnippetContext
LOWtests/test_auth.py14def test_parse_auth_inline_handles_case_and_spaces():CODE
LOWtests/test_auth.py18def test_parse_auth_inline_requires_sessdata():CODE
LOWtests/test_auth.py22def test_format_auth_inline_omits_empty_bili_jct():CODE
LOWtests/test_auth.py26def test_resolve_auth_prefers_inline_auth(tmp_path: Path):CODE
LOWtests/test_auth.py39def test_resolve_auth_rejects_invalid_auth_file(tmp_path: Path):CODE
LOWtests/test_auth.py53def test_save_and_load_auth_round_trip(tmp_path: Path):CODE
LOWtests/test_auth.py61def test_save_auth_clears_stale_bili_jct(tmp_path: Path):CODE
LOWtests/test_auth.py71def test_load_auth_returns_none_for_invalid_file(tmp_path: Path):CODE
LOWtests/test_auth.py78def test_load_auth_rejects_invalid_profile(tmp_path: Path):CODE
LOWtests/test_auth.py83def test_remove_auth_removes_target_profile_only(tmp_path: Path):CODE
LOWtests/test_auth.py94def test_remove_auth_deletes_empty_auth_file(tmp_path: Path):CODE
LOWtests/test_auth.py103def test_remove_auth_returns_false_when_profile_missing(tmp_path: Path):CODE
LOWtests/test_auth.py109def test_remove_auth_rejects_invalid_existing_auth_file(tmp_path: Path):CODE
LOWtests/test_login.py18async def test_validate_saved_auth_uses_yutto_session_with_auth_cookies(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py53async def test_run_login_reuses_one_verified_yutto_session(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py132async def test_poll_qr_login_reports_status_changes_and_returns_redirect(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py178async def test_poll_qr_login_rejects_invalid_intervals():CODE
LOWtests/test_login.py190async def test_complete_login_falls_back_to_redirect_query(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py211def test_get_cookie_value_probes_bilibili_domains_in_priority_order():CODE
LOWtests/test_login.py226def test_run_auth_is_the_single_sync_cli_boundary(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py249async def test_run_auth_status_reports_vip_login(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py255 async def fake_fetch_authenticated_user_info(CODE
LOWtests/test_login.py289async def test_run_auth_status_exits_when_auth_missing(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py316async def test_run_auth_status_exits_on_invalid_auth_file(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py343async def test_run_auth_status_exits_when_not_logged_in(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py349 async def fake_fetch_authenticated_user_info(CODE
LOWtests/test_login.py379async def test_run_auth_status_exits_when_status_check_fails(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py385 async def fake_fetch_authenticated_user_info(CODE
LOWtests/test_login.py414def test_run_auth_logout_removes_auth(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py435def test_run_auth_logout_is_idempotent(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py452def test_run_auth_logout_exits_on_invalid_auth_file(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_login.py471def test_run_auth_logout_rejects_inline_auth(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py63def test_download_parser_accepts_auth_file(tmp_path: Path):CODE
LOWtests/test_cli.py71def test_download_parser_rejects_auth_config(tmp_path: Path):CODE
LOWtests/test_cli.py80def test_download_parser_accepts_ffmpeg_path():CODE
LOWtests/test_cli.py90def test_download_configures_ffmpeg_path_at_command_boundary(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py145def test_login_parser_accepts_auth_file(tmp_path: Path):CODE
LOWtests/test_cli.py153def test_login_parser_rejects_auth_config(tmp_path: Path):CODE
LOWtests/test_cli.py162def test_auth_status_parser_accepts_auth_file(tmp_path: Path):CODE
LOWtests/test_cli.py170def test_auth_logout_parser_accepts_auth_file(tmp_path: Path):CODE
LOWtests/test_cli.py178def test_root_parser_accepts_auth_login(tmp_path: Path):CODE
LOWtests/test_cli.py188def test_root_parser_accepts_auth_status(tmp_path: Path):CODE
LOWtests/test_cli.py198def test_root_parser_accepts_auth_logout(tmp_path: Path):CODE
LOWtests/test_cli.py208def test_root_parser_rejects_removed_top_level_login():CODE
LOWtests/test_cli.py215def test_progress_renderer_respects_no_progress(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py117def test_download_validation_rejects_non_positive_num_workers(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py130def test_download_jobs_default_to_one_and_reject_non_positive_values(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py240def test_progress_bar_renders_committed_buffered_and_remaining_segments(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py293def test_progress_renderer_turns_only_buffered_segment_red(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py329def test_progress_renderer_tracks_multiple_items_and_removes_completed_rows(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_cli.py348def test_progress_labels_are_truncated_by_terminal_width():CODE
LOWtests/test_cli.py353def test_run_download_scopes_report_renderer_and_cleans_up_on_cancel(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_server/test_command.py22def test_serve_is_an_explicit_subcommand():CODE
LOWtests/test_server/test_command.py31def test_serve_jobs_configures_download_runtime_workers():CODE
LOWtests/test_server/test_command.py43def test_serve_accepts_ffmpeg_path():CODE
LOWtests/test_server/test_command.py48def test_serve_configures_ffmpeg_path_at_command_boundary(monkeypatch: pytest.MonkeyPatch):CODE
LOWtests/test_server/test_command.py65def test_serve_argument_error_is_rendered_without_traceback(CODE
LOWtests/test_server/test_command.py104def test_environment_token_takes_precedence(tmp_path):CODE
LOWtests/test_server/test_command.py115def test_missing_token_file_is_created_with_a_generated_token(tmp_path):CODE
LOWtests/test_server/test_command.py127def test_empty_token_file_is_rejected(tmp_path):CODE
254 more matches not shown…
Unused Imports197 hits · 196 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py1CODE
LOWtests/test_auth.py1CODE
LOWtests/test_login.py1CODE
LOWtests/test_e2e.py1CODE
LOWtests/test_cli.py1CODE
LOWtests/test_server/test_command.py1CODE
LOWtests/test_server/test_command.py5CODE
LOWtests/test_server/test_command.py17CODE
LOWtests/test_server/test_service.py1CODE
LOWtests/test_server/test_websocket.py1CODE
LOWtests/test_server/__init__.py1CODE
LOWtests/test_server/test_rpc.py1CODE
LOWtests/test_utils/test_filter.py1CODE
LOWtests/test_utils/test_asynclib.py1CODE
LOWtests/test_utils/test_status_bar.py1CODE
LOWtests/test_utils/test_data_access.py1CODE
LOWtests/test_utils/test_fetcher.py1CODE
LOWtests/test_utils/test_ffmpeg.py1CODE
LOWtests/test_utils/test_ffmpeg.py23CODE
LOWtests/test_runtime/test_tasks.py1CODE
LOWtests/test_core/test_result.py1CODE
LOWtests/test_core/test_request.py1CODE
LOWtests/test_core/test_task_service.py1CODE
LOWtests/test_core/test_execution.py1CODE
LOWtests/test_core/test_application.py1CODE
LOWtests/test_core/test_native_session.py1CODE
LOWtests/test_api/test_user_info.py1CODE
LOWtests/test_api/test_cheese.py1CODE
LOWtests/test_api/test_space.py1CODE
LOWtests/test_api/test_bangumi.py1CODE
LOWtests/test_api/test_bangumi.py5CODE
LOWtests/test_api/test_collection.py1CODE
LOWtests/test_api/test_ugc_video.py1CODE
LOWtests/test_api/test_danmaku.py1CODE
LOWtests/test_processor/test_resolve.py1CODE
LOWtests/test_processor/test_selector.py1CODE
LOWtests/test_processor/test_download_result.py1CODE
LOWtests/test_processor/test_download_result.py6CODE
LOWtests/test_processor/test_download_result.py25CODE
LOWtests/test_processor/test_download_result.py25CODE
LOWtests/test_processor/test_path_leases.py1CODE
LOWtests/test_processor/test_audio_save_codec.py1CODE
LOWtests/test_processor/test_download_planner.py1CODE
LOWtests/test_processor/test_structured_errors.py1CODE
LOWtests/test_processor/test_batch_resolve.py1CODE
LOWtests/test_processor/test_downloader.py1CODE
LOWtests/test_processor/test_manager_semantics.py1CODE
LOWtests/test_processor/test_path_resolver.py1CODE
LOWtests/test_processor/test_download_lifecycle.py1CODE
LOWtests/helpers/http_range_server.py1CODE
LOWscripts/get-version.py1CODE
LOWscripts/generate-schema.py1CODE
LOWpackages/biliass/src/biliass/__init__.py1CODE
LOWpackages/biliass/src/biliass/__init__.py3CODE
LOWpackages/biliass/src/biliass/__init__.py3CODE
LOWpackages/biliass/src/biliass/__init__.py8CODE
LOWpackages/biliass/src/biliass/__init__.py8CODE
LOWpackages/biliass/src/biliass/__version__.py1CODE
LOWpackages/biliass/src/biliass/biliass.py1CODE
LOWpackages/biliass/src/biliass/__main__.py1CODE
137 more matches not shown…
Deep Nesting10 hits · 10 pts
SeverityFileLineSnippetContext
LOWtests/test_server/test_websocket.py474CODE
LOWtests/test_server/test_websocket.py544CODE
LOWtests/test_server/test_websocket.py579CODE
LOWtests/test_server/test_websocket.py614CODE
LOWpackages/biliass/src/biliass/biliass.py18CODE
LOWsrc/yutto/input_parser.py65CODE
LOWsrc/yutto/login.py179CODE
LOWsrc/yutto/runtime/tasks.py529CODE
LOWsrc/yutto/downloader/executor.py27CODE
LOWsrc/yutto/utils/danmaku.py78CODE
Excessive Try-Catch Wrapping7 hits · 7 pts
SeverityFileLineSnippetContext
LOWsrc/yutto/login.py105 except Exception as e:CODE
LOWsrc/yutto/login.py174 except Exception as e:CODE
LOWsrc/yutto/login.py303 except Exception as e:CODE
LOWsrc/yutto/runtime/tasks.py557 except Exception as error:CODE
LOWsrc/yutto/server/rpc.py129 except Exception:CODE
LOWsrc/yutto/utils/asynclib.py50 except Exception as error:CODE
LOWsrc/yutto/utils/console/formatter.py55 except Exception:CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHtests/test_server/test_rpc.py58 response = await dispatcher.dispatch('{"jsonrpc":"2.0","method":"record","params":{"value":"request"},"id":null}')CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMskills/bilibili-video-download/SKILL.md157## Input validation and security guardrailsCOMMENT
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOWdocs/guide/cli/batch.md41# 如果我们只想下载第 3 话,只需要这样COMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpackages/biliass/src/biliass/biliass.py18CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWsrc/yutto/_native.py23__all__ = [CODE