AutoBangumi - 全自动追番工具
This report summarizes scanner evidence for EstrellaXD/Auto_Bangumi, a Python project with 8,284 GitHub stars. SynthScan examined 134,611 lines of code across 741 source files, recording 2416 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 27.6 (Elevated 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.
Can maintainers explain intent, assumptions, and trade-offs? 1473 finding(s).
Are imports declared and package/API names verified? 241 finding(s).
Are wrappers, guards, and repeated structures necessary? 2109 finding(s).
Which changes need focused human review? 2416 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 2416 distinct pattern matches across 18 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 |
|---|---|---|---|---|
| MEDIUM | backend/src/test/test_searcher.py | 13 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_searcher.py | 15 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_searcher.py | 110 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_searcher.py | 112 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_searcher.py | 187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_searcher.py | 189 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 15 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 17 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_api_bangumi.py | 58 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_api_bangumi.py | 60 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 83 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 85 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 112 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 156 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_bangumi.py | 204 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 155 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 313 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 315 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 369 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_mcp_resources.py | 371 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_mcp_resources.py | 17 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_mcp_resources.py | 19 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_mcp_resources.py | 60 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_mcp_resources.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_loops.py | 29 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_loops.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_loops.py | 75 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_loops.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_loops.py | 142 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_loops.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_loops.py | 253 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_loops.py | 255 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_health.py | 11 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_health.py | 13 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_api_health.py | 30 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/test_api_health.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/conftest.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/src/test/conftest.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 101 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 103 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 122 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 159 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 195 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 197 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 226 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 265 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/conftest.py | 267 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_events.py | 15 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/src/test/test_api_events.py | 17 | # --------------------------------------------------------------------------- | COMMENT |
| 416 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/src/test/test_e2e_workflow_contract.py | 37 | def test_pr_workflow_runs_for_every_pull_request() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 49 | def test_pr_workflow_expands_to_four_stable_fifteen_minute_checks() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 66 | def test_pr_jobs_use_unique_stack_and_work_directory_names() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 85 | def test_pr_commands_match_the_repository_entry_points() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 110 | def test_pr_dependencies_and_generated_outputs_are_cached() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 138 | def test_pr_browser_runs_have_zero_retries_and_fourteen_day_artifacts() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 160 | def test_nightly_is_non_pr_non_blocking_and_repeats_fresh_stacks() -> None: | CODE |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 196 | def test_readme_documents_local_operation_and_maintenance() -> None: | CODE |
| LOW⚡ | backend/src/test/test_searcher.py | 51 | def test_unsupported_site_raises(self): | CODE |
| LOW⚡ | backend/src/test/test_searcher.py | 56 | def test_keyword_sanitization(self): | CODE |
| LOW⚡ | backend/src/test/test_searcher.py | 63 | def test_multiple_keywords_joined(self): | CODE |
| LOW | backend/src/test/test_searcher.py | 82 | def test_uses_providers_declared_parser(self): | CODE |
| LOW | backend/src/test/test_searcher.py | 94 | def test_mikan_site_uses_declared_parser_not_hardcoded(self): | CODE |
| LOW | backend/src/test/test_searcher.py | 168 | def test_supports_movie_without_season_fields(self): | CODE |
| LOW | backend/src/test/test_searcher.py | 202 | def test_reset_cache_clears_poster_cache(self): | CODE |
| LOW | backend/src/test/test_searcher.py | 214 | async def test_poster_cache_evicts_oldest_when_full(self, monkeypatch): | CODE |
| LOW | backend/src/test/test_searcher.py | 236 | async def test_search_result_uses_configured_tmdb_language(self, monkeypatch): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 34 | def test_compose_files_are_isolated_and_use_random_loopback_ports(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 59 | def test_support_service_images_are_pinned_and_dependency_free(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 72 | def test_qbittorrent_fixture_has_fixed_credentials_and_disables_peer_discovery(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 89 | def test_build_context_stages_dist_and_version_without_touching_source(tmp_path): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 128 | def test_build_inputs_ignore_tracked_files_deleted_in_the_worktree( | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 145 | def test_build_command_uses_only_the_temporary_context(tmp_path): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 160 | def test_stack_builds_unique_compose_commands_and_environment(tmp_path): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 211 | def test_stack_parses_dynamic_compose_ports(output, expected): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 216 | def test_qb_runtime_contract_checks_credentials_and_deterministic_preferences(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 280 | def test_run_with_stack_always_stops_after_command_failure(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 307 | def test_run_with_stack_stops_after_start_failure(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 329 | def test_partial_compose_start_collects_before_teardown(tmp_path, monkeypatch): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 360 | def test_run_with_stack_handles_sigterm_and_restores_handlers(monkeypatch): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 410 | def test_artifact_redaction_removes_credentials_and_tokens(): | CODE |
| LOW | backend/src/test/test_e2e_stack_contract.py | 429 | def test_static_audit_reports_fixed_ports_floating_images_and_blind_waits(tmp_path): | CODE |
| LOW⚡ | backend/src/test/test_api_bangumi.py | 65 | def test_get_all_unauthorized(self, unauthed_client): | CODE |
| LOW⚡ | backend/src/test/test_api_bangumi.py | 71 | def test_get_by_id_unauthorized(self, unauthed_client): | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 39 | def test_span_is_half_open_and_validated() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 50 | def test_resolution_is_independent_of_input_order() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 83 | def test_movie_rejects_ambiguous_number_as_title_without_masking_it() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 113 | def test_overlapping_shadowed_field_reports_conflict_without_extra_mask() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 139 | def test_partially_overlapping_same_field_does_not_mask_loser_only_text() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 156 | def test_different_fields_on_overlapping_exclusive_spans_are_rejected() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 179 | def test_shared_overlay_allows_explicit_transparent_overlap() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 204 | def test_shadowed_candidate_can_keep_its_span_in_title() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 227 | def test_shadowed_candidate_excludes_marker_but_keeps_dependent_span() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 250 | def test_repeatable_claims_are_case_insensitively_deduplicated() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 273 | def test_duplicate_candidate_ids_are_rejected() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 285 | def test_equal_priority_conflicting_claims_emit_stable_warning() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 302 | def test_specificity_resolves_same_priority_without_ambiguity_warning() -> None: | CODE |
| LOW | backend/src/test/test_tokenizer_resolver.py | 321 | def test_fully_shadowed_low_priority_tie_does_not_warn() -> None: | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 74 | async def test_resource_uris_present(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 80 | async def test_resource_templates_is_list(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 83 | async def test_anime_id_template_present(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 144 | async def test_official_title_value(self, sample): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 150 | async def test_none_optional_poster(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 321 | async def test_valid_id_returns_bangumi_dict(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 331 | async def test_not_found_id_returns_error(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 341 | async def test_non_numeric_id_returns_error(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 348 | async def test_negative_id_is_passed_to_manager(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 358 | async def test_result_has_required_fields(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 377 | async def test_unknown_uri_returns_json_error(self): | CODE |
| LOW⚡ | backend/src/test/test_mcp_resources.py | 382 | async def test_unknown_uri_mentions_uri_in_error(self): | CODE |
| 1345 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/scripts/benchmark_tokenizer.py | 9 | CODE | |
| LOW | backend/src/test/test_e2e_workflow_contract.py | 3 | CODE | |
| LOW | backend/src/test/test_searcher.py | 10 | CODE | |
| LOW | backend/src/test/test_searcher.py | 118 | CODE | |
| LOW | backend/src/test/test_e2e_stack_contract.py | 3 | CODE | |
| LOW | backend/src/test/test_tokenizer_resolver.py | 1 | CODE | |
| LOW | backend/src/test/test_release_parser.py | 8 | CODE | |
| LOW | backend/src/test/test_api_passkey.py | 3 | CODE | |
| LOW | backend/src/test/test_api_passkey.py | 12 | CODE | |
| LOW | backend/src/test/test_release_parser_golden.py | 8 | CODE | |
| LOW | backend/src/test/test_release_parser_properties.py | 8 | CODE | |
| LOW | backend/src/test/test_tokenizer_benchmark.py | 8 | CODE | |
| LOW | backend/src/test/test_e2e_fixture_generation.py | 3 | CODE | |
| LOW | backend/src/test/__init__.py | 1 | CODE | |
| LOW | backend/src/test/test_migration.py | 8 | CODE | |
| LOW | backend/src/test/test_migration.py | 10 | CODE | |
| LOW | backend/src/test/test_tokenizer_trace.py | 1 | CODE | |
| LOW | backend/src/test/test_config.py | 5 | CODE | |
| LOW | backend/src/test/test_config.py | 12 | CODE | |
| LOW | backend/src/test/test_config.py | 12 | CODE | |
| LOW | backend/src/test/test_config.py | 709 | CODE | |
| LOW | backend/src/test/test_config.py | 719 | CODE | |
| LOW | backend/src/test/test_mcp_security.py | 5 | CODE | |
| LOW | backend/src/test/test_path_parser.py | 3 | CODE | |
| LOW | backend/src/test/test_movie_parser.py | 1 | CODE | |
| LOW | backend/src/test/test_download_client.py | 3 | CODE | |
| LOW | backend/src/test/test_download_client.py | 13 | CODE | |
| LOW | backend/src/test/test_download_client.py | 13 | CODE | |
| LOW | backend/src/test/test_download_client.py | 14 | CODE | |
| LOW | backend/src/test/test_api_search.py | 3 | CODE | |
| LOW | backend/src/test/test_api_search.py | 3 | CODE | |
| LOW | backend/src/test/test_api_rss.py | 11 | CODE | |
| LOW | backend/src/test/test_api_rss.py | 11 | CODE | |
| LOW | backend/src/test/test_api_rss.py | 11 | CODE | |
| LOW | backend/src/test/test_api_rss.py | 11 | CODE | |
| LOW | backend/src/test/test_rss_analyser_typed_identity.py | 1 | CODE | |
| LOW | backend/src/test/e2e/runtime/conftest.py | 3 | CODE | |
| LOW | …rc/test/e2e/runtime/test_packaged_image_persistence.py | 3 | CODE | |
| LOW | backend/src/test/e2e/downloader/conftest.py | 3 | CODE | |
| LOW | …nd/src/test/e2e/downloader/test_release_image_smoke.py | 3 | CODE | |
| LOW | …kend/src/test/e2e/downloader/test_qb_image_contract.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/worker.py | 8 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/__init__.py | 3 | CODE | |
| LOW | backend/src/test/e2e/support/runtime.py | 10 | CODE | |
| LOW | backend/src/module/searcher/provider.py | 6 | CODE | |
| LOW | backend/src/module/searcher/__init__.py | 1 | CODE | |
| LOW | backend/src/module/searcher/__init__.py | 2 | CODE | |
| LOW | backend/src/module/database/combine.py | 15 | CODE | |
| LOW | backend/src/module/database/combine.py | 15 | CODE | |
| LOW | backend/src/module/database/combine.py | 15 | CODE | |
| LOW | backend/src/module/database/bangumi.py | 13 | CODE | |
| LOW | backend/src/module/core/__init__.py | 1 | CODE | |
| LOW | backend/src/module/core/__init__.py | 2 | CODE | |
| LOW | backend/src/module/core/__init__.py | 3 | CODE | |
| 165 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plugins/codex-chatgpt/ab_llm_codex/adapter.py | 52 | except Exception: | CODE |
| LOW | backend/src/boot_overlay.py | 51 | except Exception: | CODE |
| LOW | backend/src/boot_overlay.py | 110 | except Exception: | CODE |
| LOW | backend/src/boot_overlay.py | 260 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 300 | except Exception as exc: # noqa: BLE001 - 验签失败必须拒绝 | CODE |
| LOW | backend/src/boot_overlay.py | 313 | except Exception: # noqa: BLE001 | CODE |
| LOW | backend/src/boot_overlay.py | 394 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 405 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 415 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 429 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 434 | except Exception as exc: | CODE |
| LOW | backend/src/boot_overlay.py | 446 | except Exception as exc: # 绝不阻断启动 | CODE |
| MEDIUM | backend/src/boot_overlay.py | 443 | def main() -> int: | CODE |
| LOW | backend/src/test/e2e/support/runtime.py | 73 | except Exception as exc: # readiness probes intentionally tolerate races | CODE |
| LOW | backend/src/test/e2e/support/runtime.py | 275 | except Exception: | CODE |
| LOW | backend/src/module/searcher/searcher.py | 65 | except Exception as e: | CODE |
| LOW | backend/src/module/database/user.py | 171 | except Exception as e: | CODE |
| LOW | backend/src/module/database/rss.py | 138 | except Exception as e: | CODE |
| LOW | backend/src/module/database/rss.py | 152 | except Exception as e: | CODE |
| MEDIUM | backend/src/module/database/rss.py | 143 | def delete_all(self): | CODE |
| LOW | backend/src/module/database/combine.py | 123 | except Exception: | CODE |
| LOW | backend/src/module/database/migrations.py | 849 | except Exception as e: | CODE |
| LOW | backend/src/module/core/loops.py | 33 | except Exception: | CODE |
| LOW | backend/src/module/core/context.py | 276 | except Exception: | CODE |
| LOW | backend/src/module/core/context.py | 340 | except Exception as e: | CODE |
| LOW | backend/src/module/core/context.py | 372 | except Exception as e: | CODE |
| LOW | backend/src/module/core/context.py | 378 | except Exception as e: | CODE |
| LOW | backend/src/module/core/offset_scanner.py | 41 | except Exception as e: | CODE |
| LOW | backend/src/module/core/scheduler.py | 71 | except Exception as e: | CODE |
| LOW | backend/src/module/update/signing.py | 49 | except Exception as exc: # noqa: BLE001 - 验签失败必须拒绝,不得放行 | CODE |
| LOW | backend/src/module/update/updater.py | 311 | except Exception as exc: # 网络错误优雅降级 | CODE |
| LOW | backend/src/module/update/updater.py | 599 | except Exception as exc: # noqa: BLE001 - 任何失败都要优雅返回 | CODE |
| LOW | backend/src/module/update/updater.py | 737 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | backend/src/module/update/cross_version.py | 71 | except Exception as e: | CODE |
| LOW | backend/src/module/security/auth_strategy.py | 65 | except Exception: | CODE |
| LOW | backend/src/module/security/webauthn.py | 190 | except Exception as e: | CODE |
| LOW | backend/src/module/security/webauthn.py | 286 | except Exception as e: | CODE |
| LOW | backend/src/module/security/webauthn.py | 315 | except Exception as e: | CODE |
| LOW | backend/src/module/security/webauthn.py | 339 | except Exception as e: | CODE |
| LOW | backend/src/module/security/webauthn.py | 354 | except Exception: | CODE |
| LOW | backend/src/module/security/api.py | 198 | except Exception as e: | CODE |
| LOW | backend/src/module/checker/checker.py | 86 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/manager.py | 50 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/manager.py | 85 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/manager.py | 129 | except Exception: | CODE |
| LOW | backend/src/module/notification/manager.py | 162 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/manager.py | 185 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/webhook.py | 99 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/telegram.py | 73 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/pushover.py | 68 | except Exception: | CODE |
| LOW | backend/src/module/notification/providers/pushover.py | 71 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/discord.py | 68 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/gotify.py | 63 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/bark.py | 56 | except Exception as e: | CODE |
| LOW | …ckend/src/module/notification/providers/server_chan.py | 57 | except Exception as e: | CODE |
| LOW | backend/src/module/notification/providers/wecom.py | 57 | except Exception as e: | CODE |
| LOW | backend/src/module/network/request_url.py | 181 | except Exception as e: | CODE |
| LOW | backend/src/module/network/request_url.py | 216 | except Exception as e: | CODE |
| LOW | backend/src/module/network/site/mikan.py | 19 | except Exception as e: | CODE |
| LOW | backend/src/module/rss/engine.py | 161 | except Exception as e: | CODE |
| 45 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/src/main.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/test/e2e/support/__init__.py | 13 | __all__ = [ | CODE |
| LOW | backend/src/module/searcher/searcher.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/user.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/rss.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/aria2.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/aria2.py | 108 | async def set_category(self, gid: str, category: str) -> None: | CODE |
| LOW | backend/src/module/database/aria2.py | 160 | async def set_renamed_path(self, gid: str, old_path: str, new_path: str) -> None: | CODE |
| LOW | backend/src/module/database/aria2.py | 177 | async def set_rename_intent(self, gid: str, intent: Aria2RenameIntent) -> None: | CODE |
| LOW | backend/src/module/database/combine.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/bangumi.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/bangumi.py | 60 | def _set_aliases_list(bangumi: Bangumi, aliases: list[str]) -> None: | CODE |
| LOW | backend/src/module/database/torrent.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/passkey.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/llm_credential.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/inbox.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/migrations.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/database/migrations.py | 810 | def set_schema_version(conn: Connection, version: int) -> None: | CODE |
| LOW | backend/src/module/database/movie.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/core/__init__.py | 5 | __all__ = ["AppContext", "OffsetScanner", "PeriodicTask", "Scheduler"] | CODE |
| LOW | backend/src/module/core/loops.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/core/loops.py | 86 | async def update_check_tick(notifier: NotificationManager) -> None: | CODE |
| LOW | backend/src/module/core/context.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/core/offset_scanner.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/core/scheduler.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/signing.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/auth.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/startup.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/updater.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/updater.py | 204 | def _set_progress(self, **kwargs) -> None: | CODE |
| LOW | backend/src/module/update/version_check.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/update/cross_version.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/security/ip_allowlist.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/security/webauthn.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/security/api.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/checker/checker.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/__init__.py | 17 | __all__ = [ | CODE |
| LOW | backend/src/module/notification/inbox.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/manager.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/webhook.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/telegram.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/pushover.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/discord.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/__init__.py | 30 | __all__ = [ | CODE |
| LOW | backend/src/module/notification/providers/gotify.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/bark.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ckend/src/module/notification/providers/server_chan.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/notification/providers/wecom.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/network/request_contents.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/network/request_url.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/network/site/mikan.py | 3 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/rss/engine.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/rss/analyser.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/downloader/download_client.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/downloader/__init__.py | 11 | __all__ = [ | CODE |
| LOW | backend/src/module/downloader/path.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/src/module/downloader/base.py | 134 | async def set_category(self, _hash, category) -> None: ... | CODE |
| LOW | …ckend/src/module/downloader/client/aria2_downloader.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ckend/src/module/downloader/client/aria2_downloader.py | 850 | async def set_category(self, _hash, category) -> None: | CODE |
| LOW | backend/src/module/downloader/client/mock_downloader.py | 18 | logger = logging.getLogger(__name__) | CODE |
| 44 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/src/test/test_auth_persistence.py | 365 | except asyncio.TimeoutError: | CODE |
| HIGH | backend/src/module/core/context.py | 338 | except asyncio.CancelledError: | CODE |
| HIGH | backend/src/module/core/scheduler.py | 77 | except asyncio.CancelledError: | CODE |
| HIGH | backend/src/module/core/scheduler.py | 96 | except asyncio.CancelledError: | CODE |
| HIGH | backend/src/module/update/updater.py | 494 | except FileNotFoundError: | CODE |
| HIGH | backend/src/module/update/updater.py | 614 | except (OSError, ValueError): | CODE |
| HIGH | backend/src/module/notification/providers/pushover.py | 68 | except Exception: | CODE |
| HIGH | backend/src/module/rss/analyser.py | 52 | except (ValueError, TypeError): | CODE |
| HIGH | …ckend/src/module/downloader/client/aria2_downloader.py | 168 | except ValueError: | CODE |
| HIGH | backend/src/module/manager/renamer.py | 498 | except ValueError: | CODE |
| HIGH | e2e/mock-upstream/server.py | 609 | except KeyboardInterrupt: | CODE |
| HIGH | e2e/port-proxy/server.py | 119 | except KeyboardInterrupt: | CODE |
| HIGH | e2e/fake-qb/server.py | 434 | except KeyboardInterrupt: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | backend/src/test/test_issue_bugs.py | 374 | # Simulates the corrupted state: [null] stored in DB | COMMENT |
| HIGH⚡ | backend/src/test/test_issue_bugs.py | 447 | # Insert corrupted bangumi (title_raw=None, aliases=[null]) | COMMENT |
| HIGH⚡ | backend/src/test/test_issue_bugs.py | 375 | bangumi.title_aliases = "[null]" | CODE |
| HIGH⚡ | backend/src/test/test_issue_bugs.py | 379 | bangumi.title_aliases = '[null, "valid_alias", null, "another"]' | CODE |
| HIGH⚡ | backend/src/test/test_issue_bugs.py | 450 | bangumi.title_aliases = "[null]" | CODE |
| HIGH | backend/src/test/test_issue_bugs.py | 427 | bangumi.title_aliases = "[null]" | CODE |
| HIGH | backend/src/module/parser/analyser/providers/schema.py | 70 | "title_en (string or null), title_zh (string or null), " | STRING |
| HIGH | backend/src/module/parser/analyser/providers/schema.py | 71 | "title_jp (string or null), season (integer), season_raw (string), " | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plugins/codex-chatgpt/ab_llm_codex/adapter.py | 184 | CODE | |
| LOW | backend/src/boot_overlay.py | 330 | CODE | |
| LOW | backend/src/test/test_release_parser_properties.py | 107 | CODE | |
| LOW | backend/src/test/test_download_session_reuse.py | 201 | CODE | |
| LOW | backend/src/module/searcher/searcher.py | 78 | CODE | |
| LOW | backend/src/module/database/migrations.py | 819 | CODE | |
| LOW | backend/src/module/update/updater.py | 252 | CODE | |
| LOW | backend/src/module/update/updater.py | 605 | CODE | |
| LOW | backend/src/module/update/version_check.py | 10 | CODE | |
| LOW | backend/src/module/update/cross_version.py | 54 | CODE | |
| LOW | backend/src/module/notification/providers/pushover.py | 49 | CODE | |
| LOW | backend/src/module/network/request_contents.py | 15 | CODE | |
| LOW | backend/src/module/network/request_url.py | 53 | CODE | |
| LOW | backend/src/module/rss/engine.py | 285 | CODE | |
| LOW | backend/src/module/rss/analyser.py | 16 | CODE | |
| LOW | backend/src/module/rss/analyser.py | 58 | CODE | |
| LOW | backend/src/module/rss/analyser.py | 108 | CODE | |
| LOW | …ckend/src/module/downloader/client/aria2_downloader.py | 372 | CODE | |
| LOW | …ckend/src/module/downloader/client/aria2_downloader.py | 708 | CODE | |
| LOW | backend/src/module/downloader/client/qb_downloader.py | 23 | CODE | |
| LOW | backend/src/module/downloader/client/qb_downloader.py | 148 | CODE | |
| LOW | backend/src/module/downloader/client/qb_downloader.py | 416 | CODE | |
| LOW | backend/src/module/mcp/tools.py | 216 | CODE | |
| LOW | backend/src/module/mcp/resources.py | 56 | CODE | |
| LOW | backend/src/module/parser/title_parser.py | 392 | CODE | |
| LOW | backend/src/module/parser/analyser/torrent_parser.py | 142 | CODE | |
| LOW | backend/src/module/parser/analyser/tmdb_parser.py | 178 | CODE | |
| LOW | backend/src/module/parser/analyser/tmdb_parser.py | 275 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/parser.py | 490 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/parser.py | 707 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/parser.py | 1059 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/parser.py | 1630 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/classic.py | 258 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 114 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 356 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 444 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 749 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 1326 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 1534 | CODE | |
| LOW | backend/src/module/manager/renamer.py | 1734 | CODE | |
| LOW | backend/src/module/api/config.py | 27 | CODE | |
| LOW | backend/src/module/api/config.py | 123 | CODE | |
| LOW | backend/src/module/api/log.py | 17 | CODE | |
| LOW | backend/src/module/api/events.py | 90 | CODE | |
| LOW | backend/src/module/conf/config.py | 20 | CODE | |
| LOW | backend/src/module/conf/config.py | 161 | CODE | |
| LOW | e2e/port-proxy/server.py | 62 | CODE | |
| LOW | e2e/scripts/audit_sources.py | 34 | CODE | |
| LOW | e2e/scripts/stack.py | 335 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | backend/src/test/test_update.py | 1085 | app.state.ctx.notifier.send_event.assert_awaited_once() | CODE |
| CRITICAL | backend/src/module/parser/analyser/providers/builtin.py | 55 | resp = await self._openai_client.beta.chat.completions.parse( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/src/module/security/webauthn.py | 144 | 验证注册响应并创建 Passkey 对象 Args: username: 用户名 credential: 来自前端的 credential 响应 | STRING |
| HIGH | backend/src/module/security/webauthn.py | 253 | 验证认证响应 Args: username: 用户名 credential: 来自前端的 credential 响应 passkey | STRING |
| HIGH | backend/src/module/security/webauthn.py | 293 | 验证可发现凭证的认证响应(无需用户名) Args: credential: 来自前端的 credential 响应 passkey: 通过 credenti | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/src/test/test_api_bangumi.py | 0 | a stand-in database whose repos can be configured with asyncmocks. | STRING |
| HIGH | backend/src/test/test_api_rss.py | 0 | a stand-in database whose repos can be configured with asyncmocks. | STRING |
| HIGH | backend/src/test/test_api_bangumi_torrents.py | 0 | a stand-in database whose repos can be configured with asyncmocks. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/scripts/pip-lock-version.sh | 14 | # Create a temporary requirements file using pip freeze | COMMENT |
| MEDIUM | backend/src/test/test_database.py | 414 | # Create a semantically similar bangumi (same anime, group changed naming) | COMMENT |
| MEDIUM | backend/src/test/test_rss_engine_new.py | 280 | # Create a mock client | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/scripts/pip-lock-version.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | backend/src/module/network/request_url.py | 281 | self._client = await get_shared_client() | COMMENT |
| LOW | backend/src/module/downloader/download_client.py | 41 | ) | COMMENT |
| LOW | backend/src/module/downloader/client/qb_downloader.py | 461 | return AddResult.ADDED | COMMENT |
| LOW | backend/src/module/manager/renamer.py | 121 | # Season comes from the folder name which already includes the offset | COMMENT |
| LOW | scripts/dev.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/PULL_REQUEST_TEMPLATE/pull_request_template.md | 1 | ## New | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | backend/src/test/test_database_llm_credential.py | 13 | account_label="user@example.com", | CODE |
| LOW⚡ | backend/src/test/test_database_llm_credential.py | 21 | assert loaded.account_label == "user@example.com" | CODE |
| LOW | webui/src/components/basic/ab-select.vue | 59 | :placeholder="placeholder" | CODE |
| LOW | webui/src/components/basic/ab-input.vue | 77 | :placeholder="placeholder" | CODE |
| LOW | webui/src/i18n/zh-CN.json | 670 | "placeholder": "输入关键字搜索", | CODE |
| LOW | webui/src/i18n/en.json | 670 | "placeholder": "Type to search", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | backend/src/test/test_migration.py | 476 | # Set version to current - second run should skip | COMMENT |
| LOW | backend/src/module/parser/analyser/offset_detector.py | 59 | # Check if this season has virtual season breakpoints (detected from air date gaps) | COMMENT |
| LOW | backend/src/module/api/setup.py | 240 | # Check if host is reachable and is qBittorrent | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/src/test/test_mcp_tools.py | 303 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/src/module/update/updater.py | 168 | CODE | |
| LOW | backend/src/module/parser/analyser/tokenizer/parser.py | 207 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/scripts/pip-lock-version.sh | 4 | # Usage: | COMMENT |