This report summarizes scanner evidence for calibrain/shelfmark, a Python project with 4,002 GitHub stars. SynthScan examined 193,130 lines of code across 677 source files, recording 4112 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 25.4 (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? 3444 finding(s).
Are imports declared and package/API names verified? 244 finding(s).
Are wrappers, guards, and repeated structures necessary? 3666 finding(s).
Which changes need focused human review? 4112 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 4112 distinct pattern matches across 17 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 | tests/conftest.py | 33 | def _clear_torrent_fetch_cache(): | CODE |
| LOW | tests/audiobookbay/test_scraper_contract.py | 58 | def test_info_hash_is_normalized_to_canonical_btih() -> None: | STRING |
| LOW⚡ | tests/audiobookbay/test_scraper_contract.py | 71 | def test_magnet_fallback_when_info_hash_cell_is_junk() -> None: | CODE |
| LOW⚡ | tests/audiobookbay/test_scraper_contract.py | 80 | def test_missing_info_hash_returns_none_not_crash() -> None: | CODE |
| LOW⚡ | tests/audiobookbay/test_scraper_contract.py | 89 | def test_search_layout_drift_degrades_to_empty() -> None: | CODE |
| LOW | tests/audiobookbay/test_handler.py | 93 | def test_download_uses_source_url_for_hashed_task_id( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 132 | def test_download_rejects_source_url_host_mismatch( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 167 | def test_download_allows_configured_source_url_host( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 208 | def test_download_existing_complete(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 255 | def test_retry_imports_finished_torrent_while_site_is_down( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 325 | def test_failed_scrape_caches_no_magnet(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 353 | def test_download_existing_in_progress(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 398 | def test_download_cancellation(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 424 | def test_download_no_magnet_link(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 457 | def test_download_no_client_configured( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 488 | def test_download_client_add_failure(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 520 | def test_download_existing_no_path(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 567 | def test_category_selection_qbittorrent_audiobook( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 611 | def test_category_selection_transmission_general( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 655 | def test_category_selection_non_audiobook( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 695 | def test_cancel_returns_false(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 11 | def test_curly_apostrophe_becomes_ascii(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 15 | def test_all_single_quote_variants(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 20 | def test_all_double_quote_variants(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 30 | def test_ellipsis_expands_to_three_dots(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 34 | def test_ascii_query_is_unchanged(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 38 | def test_ascii_dash_runs_are_not_collapsed(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 42 | def test_other_punctuation_is_preserved(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 62 | def test_parse_size_kilobytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 69 | def test_parse_size_megabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 76 | def test_parse_size_gigabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 82 | def test_parse_size_terabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 87 | def test_parse_size_case_insensitive(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 98 | def test_parse_size_empty_string(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 102 | def test_parse_size_invalid_format(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 108 | def test_parse_size_with_whitespace(self): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 99 | def test_search_audiobookbay_success(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 126 | def test_search_audiobookbay_pagination(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 145 | def test_search_audiobookbay_page_one_uses_root_search_endpoint( | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 165 | def test_search_audiobookbay_bootstraps_and_reuses_session( | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 188 | def test_search_audiobookbay_empty(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 216 | def test_search_audiobookbay_redirect_to_homepage(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 230 | def test_search_audiobookbay_request_exception(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 244 | def test_search_audiobookbay_relative_link(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 270 | def test_search_audiobookbay_protocol_relative_links(self, mock_config_get, mock_html_get): | STRING |
| LOW | tests/audiobookbay/test_scraper.py | 300 | def test_search_audiobookbay_exact_phrase_query(self, mock_config_get, mock_html_get): | STRING |
| LOW | tests/audiobookbay/test_scraper.py | 322 | def test_search_audiobookbay_normalizes_curly_apostrophe(self, mock_config_get, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 339 | def test_search_audiobookbay_percent_encodes_reserved_characters( | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 360 | def test_search_audiobookbay_always_uses_legacy_category_query( | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 388 | def test_extract_magnet_link_success(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 407 | def test_extract_magnet_link_reuses_bootstrap_session(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 426 | def test_extract_magnet_link_fallback(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 441 | def test_extract_magnet_link_no_info_hash(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 463 | def test_extract_magnet_link_request_exception(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 474 | def test_extract_magnet_link_cleans_info_hash(self, mock_html_get): | CODE |
| LOW⚡ | tests/audiobookbay/test_source.py | 44 | def test_map_language_unknown(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_source.py | 54 | def test_map_language_with_whitespace(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_source.py | 63 | def test_parse_bitrate_to_kbps(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_source.py | 68 | def test_parse_bitrate_to_kbps_invalid(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_source.py | 78 | def test_generate_source_id_consistent(self): | CODE |
| 3179 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | wireguard.sh | 250 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 252 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 525 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 528 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 638 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 640 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 848 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | wireguard.sh | 850 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 31 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 33 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 78 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 80 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 123 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 125 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 152 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 154 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 206 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 208 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 271 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 273 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 313 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 315 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 349 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 351 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 387 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 389 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 470 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_integration_failures.py | 472 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 172 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 174 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 411 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 413 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 500 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 502 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 574 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 576 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 677 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 679 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 760 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 762 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 895 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/prowlarr/test_failure_scenarios.py | 897 | # ============================================================================= | COMMENT |
| MEDIUM | tests/prowlarr/test_failure_scenarios.py | 26 | # ============================================================================= | COMMENT |
| MEDIUM | tests/prowlarr/test_failure_scenarios.py | 28 | # ============================================================================= | COMMENT |
| MEDIUM | tests/prowlarr/test_failure_scenarios.py | 304 | # ============================================================================= | COMMENT |
| MEDIUM | tests/prowlarr/test_failure_scenarios.py | 306 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 803 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 805 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 859 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 861 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 908 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 910 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1080 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1082 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1162 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1533 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1535 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1588 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/core/test_requests_service.py | 1590 | # --------------------------------------------------------------------------- | COMMENT |
| 143 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/audiobookbay/test_handler.py | 0 | records progress and status updates during download. | STRING |
| HIGH | tests/prowlarr/test_handler.py | 0 | records progress and status updates during download. | STRING |
| HIGH | tests/prowlarr/test_failure_scenarios.py | 0 | records progress and status updates during download. | STRING |
| HIGH | tests/prowlarr/test_integration_handler.py | 0 | records progress and status updates during download. | STRING |
| HIGH | tests/prowlarr/test_deluge_client.py | 0 | create a config.get function that returns values from a dict. | STRING |
| HIGH | tests/prowlarr/test_rtorrent_client.py | 0 | create a config.get function that returns values from a dict. | STRING |
| HIGH | tests/prowlarr/test_transmission_client.py | 0 | create a config.get function that returns values from a dict. | STRING |
| HIGH | tests/prowlarr/test_client_settings_ssl_verify.py | 0 | create a config.get function that returns values from a dict. | STRING |
| HIGH | tests/prowlarr/test_qbittorrent_settings.py | 0 | create a config.get function that returns values from a dict. | STRING |
| HIGH | tests/prowlarr/test_rtorrent_client.py | 0 | test is_configured returns true when properly configured. | STRING |
| HIGH | tests/prowlarr/test_transmission_client.py | 0 | test is_configured returns true when properly configured. | STRING |
| HIGH | tests/prowlarr/test_sabnzbd_client.py | 0 | test is_configured returns true when properly configured. | STRING |
| HIGH | tests/prowlarr/test_qbittorrent_client.py | 0 | test is_configured returns true when properly configured. | STRING |
| HIGH | tests/prowlarr/test_nzbget_client.py | 0 | test is_configured returns true when properly configured. | STRING |
| HIGH | tests/prowlarr/test_rtorrent_client.py | 0 | test is_configured returns false when different client selected. | STRING |
| HIGH | tests/prowlarr/test_transmission_client.py | 0 | test is_configured returns false when different client selected. | STRING |
| HIGH | tests/prowlarr/test_sabnzbd_client.py | 0 | test is_configured returns false when different client selected. | STRING |
| HIGH | tests/prowlarr/test_qbittorrent_client.py | 0 | test is_configured returns false when different client selected. | STRING |
| HIGH | tests/prowlarr/test_nzbget_client.py | 0 | test is_configured returns false when different client selected. | STRING |
| HIGH | tests/core/test_download_api_guardrails.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_request_routes_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_config_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_activity_terminal_snapshots.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_auth_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_cover_proxy_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_activity_routes_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_notifications_settings_api.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_api_key_env.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/core/test_releases_api_direct_provider.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/e2e/test_auth_endpoints.py | 0 | import `shelfmark.main` with background thread startup disabled. | STRING |
| HIGH | tests/download/test_http_challenge_503.py | 0 | minimal stand-in for requests.response covering what html_get_page touches. | STRING |
| HIGH | tests/download/test_ddg_check_probe_handoff.py | 0 | minimal stand-in for requests.response covering what html_get_page touches. | STRING |
| HIGH | tests/download/test_http_cookie_challenge.py | 0 | minimal stand-in for requests.response covering what html_get_page touches. | STRING |
| HIGH | shelfmark/bypass/internal_bypasser.py | 0 | return a positive integer config value or the provided default. | STRING |
| HIGH | shelfmark/release_sources/audiobookbay/source.py | 0 | return a positive integer config value or the provided default. | STRING |
| HIGH | shelfmark/release_sources/libgen/source.py | 0 | return a positive integer config value or the provided default. | STRING |
| HIGH | shelfmark/download/clients/realdebrid.py | 0 | return the local directory containing downloaded files. | STRING |
| HIGH | shelfmark/download/clients/debridlink.py | 0 | return the local directory containing downloaded files. | STRING |
| HIGH | shelfmark/download/clients/alldebrid.py | 0 | return the local directory containing downloaded files. | STRING |
| HIGH | shelfmark/download/clients/rtorrent.py | 0 | add torrent by url (magnet or .torrent). args: url: magnet link or .torrent url name: display name for the torrent categ | STRING |
| HIGH | shelfmark/download/clients/transmission.py | 0 | add torrent by url (magnet or .torrent). args: url: magnet link or .torrent url name: display name for the torrent categ | STRING |
| HIGH | shelfmark/download/clients/qbittorrent.py | 0 | add torrent by url (magnet or .torrent). args: url: magnet link or .torrent url name: display name for the torrent categ | STRING |
| HIGH | shelfmark/download/clients/rtorrent.py | 0 | get torrent status by hash. args: download_id: torrent info_hash returns: current download status. | STRING |
| HIGH | shelfmark/download/clients/transmission.py | 0 | get torrent status by hash. args: download_id: torrent info_hash returns: current download status. | STRING |
| HIGH | shelfmark/download/clients/qbittorrent.py | 0 | get torrent status by hash. args: download_id: torrent info_hash returns: current download status. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/audiobookbay/test_scraper_contract.py | 15 | CODE | |
| LOW | tests/prowlarr/test_blackhole_client.py | 3 | CODE | |
| LOW | tests/core/test_download_api_guardrails.py | 3 | CODE | |
| LOW | tests/core/test_library_provider_calibre.py | 3 | CODE | |
| LOW | tests/core/test_stats.py | 3 | CODE | |
| LOW | tests/core/test_release_search.py | 3 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3 | CODE | |
| LOW | tests/core/test_viewer_redaction.py | 3 | CODE | |
| LOW | tests/core/test_config_api.py | 3 | CODE | |
| LOW | tests/core/test_activity_terminal_snapshots.py | 3 | CODE | |
| LOW | tests/core/test_metadata_search_library.py | 3 | CODE | |
| LOW | tests/core/test_auth_api.py | 3 | CODE | |
| LOW | tests/core/test_config_user_overrides.py | 3 | CODE | |
| LOW | tests/core/test_config_user_overrides.py | 12 | CODE | |
| LOW | tests/core/test_config_user_overrides.py | 87 | CODE | |
| LOW | tests/core/test_config_user_overrides.py | 150 | CODE | |
| LOW | tests/core/test_onboarding.py | 1 | CODE | |
| LOW | tests/core/test_download_history_service.py | 3 | CODE | |
| LOW | tests/core/test_builtin_admin_sync.py | 3 | CODE | |
| LOW | tests/core/test_library_index.py | 3 | CODE | |
| LOW | tests/core/test_cover_proxy_api.py | 3 | CODE | |
| LOW | tests/core/test_activity_routes_api.py | 3 | CODE | |
| LOW | tests/core/test_releases_api_budget.py | 10 | CODE | |
| LOW | tests/core/test_release_inspect_routes.py | 3 | CODE | |
| LOW | tests/core/test_notifications_settings_api.py | 3 | CODE | |
| LOW | tests/core/test_api_key_env.py | 3 | CODE | |
| LOW | tests/core/test_activity_view_state_service.py | 3 | CODE | |
| LOW | tests/core/test_startup_reconcile.py | 7 | CODE | |
| LOW | tests/core/test_releases_api_direct_provider.py | 3 | CODE | |
| LOW | tests/config/test_mirror_settings_migration.py | 5 | CODE | |
| LOW | tests/config/test_mirror_settings_migration.py | 117 | CODE | |
| LOW | tests/config/test_tor_script_rules.py | 1 | CODE | |
| LOW | tests/config/test_dns_settings_live_apply.py | 2 | CODE | |
| LOW | tests/config/test_users_settings.py | 3 | CODE | |
| LOW | tests/config/test_docker_volumes.py | 3 | CODE | |
| LOW | tests/config/test_mirror_settings_live_apply.py | 3 | CODE | |
| LOW | tests/config/test_mirror_settings_live_apply.py | 32 | CODE | |
| LOW | tests/config/test_download_settings.py | 186 | CODE | |
| LOW | tests/config/test_download_settings.py | 346 | CODE | |
| LOW | tests/config/test_entrypoint_permissions.py | 1 | CODE | |
| LOW | tests/config/test_environment.py | 373 | CODE | |
| LOW | tests/config/test_environment.py | 390 | CODE | |
| LOW | tests/config/test_environment.py | 406 | CODE | |
| LOW | tests/download/test_ssl_verify.py | 315 | CODE | |
| LOW | tests/download/test_ssl_verify.py | 341 | CODE | |
| LOW | tests/download/test_ssl_verify.py | 276 | CODE | |
| LOW | tests/download/test_orchestrator_lifecycle.py | 1 | CODE | |
| LOW | tests/download/test_orchestrator_retry.py | 1 | CODE | |
| LOW | tests/download/test_archive_extraction.py | 1 | CODE | |
| LOW | tests/download/test_torrent_queue_stall.py | 3 | CODE | |
| LOW | tests/download/test_postprocess_scan_archives.py | 1 | CODE | |
| LOW | tests/download/test_fs_delete_denied.py | 8 | CODE | |
| LOW | tests/download/test_torrent_removal.py | 3 | CODE | |
| LOW | tests/download/test_postprocess_scan_blocking_io.py | 1 | CODE | |
| LOW | tests/download/test_doh_resolver_mock.py | 11 | CODE | |
| LOW | tests/download/test_fs_run_blocking_io.py | 1 | CODE | |
| LOW | tests/download/test_webseed_torrent_generator.py | 10 | CODE | |
| LOW | tests/e2e/test_proxy_auth_middleware.py | 3 | CODE | |
| LOW | tests/e2e/test_auth_endpoints.py | 7 | CODE | |
| LOW | tests/e2e/platform/suite/test_cluster_clients.py | 14 | CODE | |
| 137 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/prowlarr/test_integration_failures.py | 91 | except Exception: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_failures.py | 104 | except Exception: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_failures.py | 118 | except Exception: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_failures.py | 264 | except Exception: | CODE |
| LOW | tests/prowlarr/test_integration_failures.py | 240 | except Exception as e: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_clients.py | 190 | except Exception: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_clients.py | 207 | except Exception: | CODE |
| LOW⚡ | tests/prowlarr/test_integration_clients.py | 221 | except Exception: | CODE |
| LOW | tests/prowlarr/test_integration_clients.py | 236 | except Exception: | CODE |
| LOW | tests/prowlarr/test_integration_clients.py | 252 | except Exception: | CODE |
| LOW | tests/prowlarr/test_integration_clients.py | 267 | except Exception: | CODE |
| LOW | tests/prowlarr/test_integration_handler.py | 49 | except Exception: | CODE |
| LOW | tests/prowlarr/test_cache.py | 112 | except Exception as e: | CODE |
| MEDIUM | tests/prowlarr/test_cache.py | 105 | def cache_operations(): | CODE |
| MEDIUM | docs/dev/release-sources-plugin-guide.md | 325 | def download(self, task, cancel_flag, progress_callback, status_callback): | CODE |
| MEDIUM | docs/dev/release-sources-plugin-guide.md | 868 | def download(self, task, cancel_flag, progress_callback, status_callback): | CODE |
| LOW⚡ | docs/dev/release-sources-plugin-guide.md | 1053 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 226 | except Exception: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 366 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 625 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 858 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 873 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1100 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1285 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1289 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1363 | except Exception: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1370 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1423 | except Exception: | CODE |
| LOW | docs/dev/plugin-settings.md | 175 | except Exception as e: | CODE |
| LOW | docs/dev/plugin-settings.md | 368 | except Exception as e: | CODE |
| LOW | docs/dev/plugin-settings.md | 477 | except Exception as e: | CODE |
| LOW | scripts/bypasser_permission_lab.sh | 102 | except Exception as e: | CODE |
| LOW | scripts/bypasser_permission_lab.sh | 113 | except Exception as e: | CODE |
| LOW | scripts/generate_env_docs.py | 100 | except Exception: | CODE |
| LOW | scripts/test_clients.py | 137 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 164 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 202 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 266 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 324 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 426 | except Exception as e: | CODE |
| LOW | scripts/test_clients.py | 518 | except Exception as e: | CODE |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 254 | print(f"Error: Invalid JSON in {source}: {e}") | STRING |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 258 | print(f"Error: JSON in {source} must be an array of book objects") | STRING |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 265 | print(f"Error: Each book object must have 'title' and 'author' keys: {item}") | STRING |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 292 | print(f"Error: File not found: {args.file}") | STRING |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 295 | print(f"Error reading file: {e}") | STRING |
| MEDIUM⚡ | skills/shelfmark/download_books.py | 302 | print("Error: No books specified. Use positional JSON args or --file <path>") | STRING |
| LOW | shelfmark/core/admin_routes.py | 457 | except Exception: | CODE |
| LOW | shelfmark/core/onboarding.py | 64 | except Exception: | CODE |
| LOW | shelfmark/core/onboarding.py | 739 | except Exception as e: | CODE |
| LOW | shelfmark/core/oidc_routes.py | 247 | except Exception: | CODE |
| LOW | shelfmark/core/oidc_routes.py | 313 | except Exception: | CODE |
| LOW | shelfmark/core/oidc_routes.py | 367 | except Exception: | CODE |
| LOW | shelfmark/core/library_index.py | 78 | except Exception as exc: # noqa: BLE001 - any failure must fail open | CODE |
| LOW | shelfmark/core/library_index.py | 189 | except Exception as exc: # noqa: BLE001 - surface any error to the user | CODE |
| LOW | shelfmark/core/requests_service.py | 593 | except Exception: | CODE |
| LOW⚡ | shelfmark/core/settings_registry.py | 1183 | except Exception as e: | CODE |
| LOW | shelfmark/core/settings_registry.py | 451 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 510 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 516 | except Exception: | CODE |
| 71 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/prowlarr/test_integration_clients.py | 174 | CODE | |
| LOW | tests/core/test_download_api_guardrails.py | 663 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 70 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 133 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 164 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 194 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 250 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 322 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 389 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 436 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 481 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 549 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 826 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 870 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 915 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 958 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1311 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1366 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1422 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1485 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1548 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1653 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1704 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1772 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2010 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2605 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2657 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2800 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2856 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3011 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3042 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3070 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3098 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3129 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3157 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3205 | CODE | |
| LOW | tests/core/test_processing_integration.py | 1013 | CODE | |
| LOW | tests/config/test_security.py | 43 | CODE | |
| LOW | tests/config/test_security.py | 83 | CODE | |
| LOW | tests/config/test_security.py | 121 | CODE | |
| LOW | tests/config/test_security.py | 142 | CODE | |
| LOW | tests/config/test_security.py | 176 | CODE | |
| LOW | tests/config/test_security.py | 210 | CODE | |
| LOW | tests/config/test_security.py | 234 | CODE | |
| LOW | tests/config/test_security.py | 282 | CODE | |
| LOW | tests/e2e/test_download_flow.py | 103 | CODE | |
| LOW | tests/e2e/test_auth_flow.py | 88 | CODE | |
| LOW | tests/e2e/test_prowlarr_flow.py | 170 | CODE | |
| LOW | tests/e2e/platform/suite/conftest.py | 92 | CODE | |
| LOW | scripts/test_clients.py | 142 | CODE | |
| LOW | scripts/test_clients.py | 329 | CODE | |
| LOW | skills/shelfmark/download_books.py | 28 | CODE | |
| LOW | skills/shelfmark/download_books.py | 129 | CODE | |
| LOW | skills/shelfmark/download_books.py | 249 | CODE | |
| LOW | shelfmark/core/queue.py | 95 | CODE | |
| LOW | shelfmark/core/queue.py | 200 | CODE | |
| LOW | shelfmark/core/queue.py | 275 | CODE | |
| LOW | shelfmark/core/queue.py | 346 | CODE | |
| LOW | shelfmark/core/admin_settings_routes.py | 39 | CODE | |
| LOW | shelfmark/core/admin_settings_routes.py | 154 | CODE | |
| 54 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/prowlarr/test_integration_failures.py | 104 | except Exception: | CODE |
| HIGH | tests/prowlarr/test_integration_failures.py | 118 | except Exception: | CODE |
| HIGH | tests/prowlarr/test_integration_failures.py | 264 | except Exception: | CODE |
| HIGH | tests/prowlarr/test_integration_clients.py | 221 | except Exception: | CODE |
| HIGH | tests/prowlarr/test_integration_clients.py | 236 | except Exception: | CODE |
| HIGH | tests/prowlarr/test_integration_clients.py | 267 | except Exception: | CODE |
| HIGH | tests/config/test_tor_script_rules.py | 210 | except subprocess.TimeoutExpired: | CODE |
| HIGH | tests/download/test_orchestrator_lifecycle.py | 195 | except _StopCoordinator: | CODE |
| HIGH | tests/e2e/platform/suite/conftest.py | 59 | except requests.RequestException: | CODE |
| HIGH | skills/shelfmark/download_books.py | 101 | except: | CODE |
| HIGH | shelfmark/core/settings_registry.py | 1202 | except ImportError: | CODE |
| HIGH | shelfmark/core/settings_registry.py | 1226 | except ImportError: | CODE |
| HIGH | shelfmark/core/settings_registry.py | 1243 | except ImportError: | CODE |
| HIGH | shelfmark/download/fs.py | 478 | except OSError: | CODE |
| HIGH | shelfmark/download/network.py | 117 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | shelfmark/download/fs.py | 233 | Write data to a file with atomic collision detection. If the destination already exists, retries with counter suffi | STRING |
| HIGH | shelfmark/download/fs.py | 508 | Move a file with collision detection. Uses os.rename() for same-filesystem moves (atomic, triggers inotify events), | STRING |
| HIGH | shelfmark/download/fs.py | 682 | Create a hardlink with atomic collision detection. Args: source_path: Source file to link from dest | STRING |
| HIGH | shelfmark/download/fs.py | 734 | Copy a file with atomic collision detection. Uses a temp file in the destination directory and publishes it via ren | STRING |
| HIGH | shelfmark/download/clients/nzbget.py | 74 | Make a JSON-RPC call to NZBGet. Args: method: RPC method name params: Method parameters | STRING |
| HIGH | shelfmark/download/clients/nzbget.py | 137 | Add NZB by URL. Fetches the NZB content from the URL (e.g., Prowlarr proxy) and sends it base64-encoded | STRING |
| HIGH | shelfmark/download/clients/__init__.py | 288 | Add a download to the client. Args: url: Download URL (magnet link, .torrent URL, or NZB URL) | STRING |
| HIGH | shelfmark/download/clients/rtorrent.py | 154 | Add torrent by URL (magnet or .torrent). Args: url: Magnet link or .torrent URL name: D | STRING |
| HIGH | shelfmark/download/clients/sabnzbd.py | 194 | Make an API call to SABnzbd. Args: mode: API mode (e.g., "version", "addurl", "queue", "history") | STRING |
| HIGH | shelfmark/download/clients/sabnzbd.py | 405 | Add NZB by URL. Args: url: NZB URL (can be Prowlarr proxy URL) name: Display name for t | STRING |
| HIGH | shelfmark/download/clients/transmission.py | 217 | Add torrent by URL (magnet or .torrent). Args: url: Magnet link or .torrent URL name: D | STRING |
| HIGH | shelfmark/download/clients/qbittorrent.py | 456 | Add torrent by URL (magnet or .torrent). Args: url: Magnet link or .torrent URL name: D | STRING |
| HIGH | …fmark/release_sources/direct_download/annas_archive.py | 711 | Search for books matching the query. Args: query: Search term (ISBN, title, author, etc.) filters: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/core/test_requests_service.py | 1628 | "author": "Jane Doe", | CODE |
| LOW | tests/core/test_requests_service.py | 43 | "author": "Jane Doe", | CODE |
| LOW | tests/core/test_requests_service.py | 198 | "author": "Jane Doe", | CODE |
| LOW | tests/core/test_requests_service.py | 842 | "author": "Jane Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 76 | id_token = {"email": "user@example.com"} | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 128 | "name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 134 | assert info["display_name"] == "John Doe" | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 143 | "name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 177 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 192 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 204 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 217 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 235 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 251 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_oidc_auth.py | 272 | "display_name": "John Doe", | CODE |
| LOW⚡ | tests/core/test_user_db.py | 507 | display_name="John Doe", | CODE |
| LOW⚡ | tests/core/test_user_db.py | 512 | assert user["display_name"] == "John Doe" | CODE |
| LOW⚡ | tests/core/test_cwa_user_sync.py | 23 | email="admin@example.com", | CODE |
| LOW⚡ | tests/core/test_cwa_user_sync.py | 31 | cwa_email="admin@example.com", | CODE |
| LOW⚡ | tests/core/test_oidc_routes.py | 253 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 278 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 303 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 332 | "email": "admin@example.com", | CODE |
| LOW | tests/config/test_download_settings.py | 217 | assert bound_fields[0]["placeholder"] == "{Author}/{Series/}{Title} ({Year})" | CODE |
| LOW | shelfmark/core/settings_registry.py | 1037 | result["placeholder"] = field.placeholder | CODE |
| LOW | shelfmark/core/settings_registry.py | 1041 | result["placeholder"] = field.placeholder | CODE |
| LOW | shelfmark/core/settings_registry.py | 1060 | result["placeholder"] = field.placeholder | CODE |
| LOW | shelfmark/config/notifications_settings.py | 291 | "placeholder": "Select events...", | CODE |
| LOW | shelfmark/config/notifications_settings.py | 297 | "placeholder": "e.g. ntfys://ntfy.sh/shelfmark", | CODE |
| LOW | shelfmark/config/notifications_settings.py | 326 | "placeholder": "Select events...", | CODE |
| LOW | shelfmark/config/notifications_settings.py | 332 | "placeholder": "e.g. ntfys://ntfy.sh/username-topic", | CODE |
| LOW | shelfmark/config/security.py | 210 | "placeholder": "https://auth.example.com/.well-known/openid-configuration", | CODE |
| LOW | shelfmark/config/security.py | 220 | "placeholder": "shelfmark", | CODE |
| LOW | shelfmark/config/security.py | 248 | "placeholder": "groups", | CODE |
| LOW | shelfmark/config/security.py | 258 | "placeholder": "shelfmark-admins", | CODE |
| LOW | shelfmark/config/security.py | 286 | "placeholder": "Sign in with OIDC", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 171 | "placeholder": "Select source...", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 179 | "placeholder": "Select content type...", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 188 | "placeholder": "Select mode...", | CODE |
| LOW | shelfmark/config/settings.py | 1323 | placeholder="user@example.com", | CODE |
| LOW | shelfmark/metadata_providers/__init__.py | 141 | "placeholder": getattr(search_field, "placeholder", ""), | CODE |
| LOW⚡ | shelfmark/release_sources/newznab/settings.py | 104 | "placeholder": "NZBGeek", | CODE |
| LOW⚡ | shelfmark/release_sources/newznab/settings.py | 110 | "placeholder": "https://api.nzbgeek.info", | CODE |
| LOW⚡ | shelfmark/release_sources/newznab/settings.py | 116 | "placeholder": "Optional", | CODE |
| LOW | src/frontend/src/components/settings/users/UserCard.tsx | 369 | const emailField = createTextField('email', 'Email', form.email, 'user@example.com'); | CODE |
| LOW | src/frontend/src/components/settings/users/UserCard.tsx | 482 | const emailField = createTextField('email', 'Email', user.email || '', 'user@example.com'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tor.sh | 31 | # Check if EXT_BYPASSER_URL is defined | COMMENT |
| LOW | tor.sh | 279 | # Check if outgoing IP is using Tor | COMMENT |
| LOW | genDebug.sh | 65 | # Check if IPv6 is enabled | COMMENT |
| LOW | genDebug.sh | 126 | # Check if running in Docker | COMMENT |
| LOW | tests/e2e/test_download_flow.py | 346 | # Check if it errored | COMMENT |
| LOW | skills/shelfmark/download_books.py | 90 | # Check if any matching book is already in the download queue | COMMENT |
| LOW | skills/shelfmark/download_books.py | 96 | # Check if the current download matches our search | COMMENT |
| LOW | shelfmark/main.py | 973 | # Check if user has a valid session | COMMENT |
| LOW | shelfmark/main.py | 1888 | # Check if caching is enabled | COMMENT |
| LOW | shelfmark/main.py | 2319 | # Check if account is locked due to failed login attempts | COMMENT |
| LOW | shelfmark/main.py | 2408 | # Check if user exists and password is correct | COMMENT |
| LOW | shelfmark/main.py | 2412 | # Check if user has admin role (ROLE_ADMIN = 1, bit flag) | COMMENT |
| LOW | shelfmark/main.py | 2509 | # Check if user has a valid session | COMMENT |
| LOW | shelfmark/core/queue.py | 104 | # Check if task was cancelled while in queue | COMMENT |
| LOW | shelfmark/core/admin_routes.py | 242 | # Check if username already exists | COMMENT |
| LOW | shelfmark/core/cache.py | 148 | # Check if metadata caching is enabled | COMMENT |
| LOW | shelfmark/core/utils.py | 268 | # Check if content-type routing is enabled (new or legacy setting) | COMMENT |
| LOW | shelfmark/core/utils.py | 321 | # Check if cover caching is enabled | COMMENT |
| LOW⚡ | shelfmark/core/settings_registry.py | 1178 | # Check if callback accepts current_values parameter | COMMENT |
| LOW | shelfmark/core/settings_registry.py | 473 | # Check if config directory exists and is writable | COMMENT |
| LOW | shelfmark/download/network.py | 674 | # Check if hostname is already an IP address, no need to resolve | COMMENT |
| LOW | shelfmark/download/network.py | 679 | # Check if hostname is a private IP address, and skip DoH if it is | COMMENT |
| LOW | shelfmark/download/network.py | 1333 | # Check if it looks like IP addresses | COMMENT |
| LOW | shelfmark/download/clients/torrent_utils.py | 304 | # Check if response is actually a magnet link (text response) | COMMENT |
| LOW | shelfmark/download/clients/base_handler.py | 839 | # Check if this download already exists in the client | COMMENT |
| LOW | shelfmark/metadata_providers/__init__.py | 554 | # Check if the provider is enabled | COMMENT |
| LOW | shelfmark/release_sources/audiobookbay/scraper.py | 238 | # Check if we were redirected to the homepage (search was rejected/blocked) | COMMENT |
| LOW | …fmark/release_sources/direct_download/annas_archive.py | 1554 | # Check if we've hit the failure threshold | COMMENT |
| LOW | shelfmark/release_sources/irc/client.py | 297 | # Check if user has an elevated prefix | COMMENT |
| LOW | shelfmark/release_sources/irc/client.py | 325 | # Check if we have a complete line in buffer | COMMENT |
| LOW | shelfmark/release_sources/irc/connection_manager.py | 133 | # Check if we need to join a different channel | COMMENT |
| LOW | shelfmark/release_sources/irc/connection_manager.py | 142 | # Check if another thread is already connecting | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_request_routes_api.py | 29 | def _set_session(client, *, user_id: str, db_user_id: int | None, is_admin: bool) -> None: | CODE |
| LOW | tests/core/test_config_api.py | 27 | def _set_session(client, *, user_id: str, db_user_id: int, is_admin: bool) -> None: | CODE |
| LOW | tests/core/test_queue.py | 71 | def update_status_yielding_to_the_worker(task_id: str, status: QueueStatus) -> None: | CODE |
| LOW | tests/core/test_activity_routes_api.py | 33 | def _set_session(client, *, user_id: str, db_user_id: int | None, is_admin: bool) -> None: | CODE |
| LOW | tests/core/test_notifications_settings_api.py | 32 | def _set_session(client, *, user_id: str, db_user_id: int, is_admin: bool) -> None: | CODE |
| LOW | tests/config/test_security.py | 18 | def _set_config_dir(monkeypatch, config_dir: Path) -> None: | CODE |
| LOW | shelfmark/core/queue.py | 127 | def _update_status(self, book_id: str, status: QueueStatus) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 174 | def update_status(self, book_id: str, status: QueueStatus) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 182 | def update_download_path(self, task_id: str, download_path: str) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 188 | def update_progress(self, task_id: str, progress: float) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 194 | def update_status_message(self, task_id: str, message: str) -> None: | CODE |
| LOW | shelfmark/core/admin_routes.py | 52 | __all__ = [ | CODE |
| LOW | shelfmark/core/__init__.py | 7 | __all__ = [ | CODE |
| LOW | shelfmark/core/user_db.py | 380 | def update_user(self, user_id: int, **kwargs: object) -> None: | CODE |
| LOW | shelfmark/core/user_db.py | 487 | def set_user_settings(self, user_id: int, settings: dict[str, Any]) -> None: | CODE |
| LOW | shelfmark/download/orchestrator.py | 872 | def update_download_progress(book_id: str, progress: float) -> None: | CODE |
| LOW | shelfmark/download/orchestrator.py | 918 | def update_download_status(book_id: str, status: str, message: str | None = None) -> None: | CODE |
| LOW | shelfmark/download/orchestrator.py | 1064 | def set_activity_grace(book_id: str, seconds: float) -> None: | CODE |
| LOW | shelfmark/download/network.py | 251 | def _set_runtime_dns_state(servers: list[str], doh_server: str) -> None: | CODE |
| LOW | shelfmark/download/network.py | 658 | def _set_cached(self, hostname: str, record_type: str, ips: list[str]) -> None: | CODE |
| LOW | shelfmark/download/clients/torbox.py | 614 | def _set_error(state: _DownloadState, message: str) -> None: | CODE |
| LOW⚡ | shelfmark/download/clients/transmission.py | 85 | def _set_transmission_protocol_if_supported(client: object, protocol: str) -> None: | CODE |
| LOW⚡ | shelfmark/download/clients/settings.py | 95 | def _set_transmission_protocol_if_supported(client: object, protocol: str) -> None: | CODE |
| LOW | shelfmark/download/postprocess/__init__.py | 13 | __all__ = ["post_process_download"] | CODE |
| LOW | shelfmark/download/postprocess/pipeline.py | 58 | __all__ = [ | CODE |
| LOW | shelfmark/api/websocket.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | shelfmark/api/websocket.py | 66 | def set_queue_status_fn(self, fn: Callable) -> None: | CODE |
| LOW⚡ | shelfmark/api/websocket.py | 80 | def _set_sid_room_locked(self, sid: str, room: str | None) -> None: | CODE |
| LOW | shelfmark/release_sources/prowlarr/handler.py | 66 | __all__ = [ | CODE |
| LOW | shelfmark/release_sources/direct_download/__init__.py | 11 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | genDebug.sh | 190 | # Create the zip file directly from LOG_DIR | COMMENT |
| MEDIUM | tests/conftest.py | 20 | # Create the directories that will be used | COMMENT |
| MEDIUM | tests/conftest.py | 90 | # Create a mock config module | COMMENT |
| MEDIUM | tests/prowlarr/test_handler.py | 902 | # Create a test file | COMMENT |
| MEDIUM | tests/prowlarr/test_bencode.py | 166 | # Create a minimal valid v1 torrent structure (has 'pieces' key) | COMMENT |
| MEDIUM | tests/prowlarr/test_remote_path_mappings.py | 401 | # Create a local file that represents the mounted path | COMMENT |
| MEDIUM | tests/prowlarr/test_remote_path_mappings.py | 481 | # Create a local file that represents the mounted path | COMMENT |
| MEDIUM⚡ | tests/core/test_oidc_auth.py | 265 | # Create a local user with the same username | COMMENT |
| MEDIUM⚡ | tests/core/test_naming.py | 625 | # Create the directory structure | COMMENT |
| MEDIUM | shelfmark/download/orchestrator.py | 304 | # Create a source-agnostic download task from release data | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.test-clients.yml | 1 | # Test stack for download client development | COMMENT |
| LOW | wireguard.sh | 1 | #!/bin/bash | COMMENT |
| LOW | wireguard.sh | 21 | # lookups use a defined resolver instead of the container's | COMMENT |
| LOW | wireguard.sh | 41 | # loopback, the tunnel device and the LAN allowlist. Set true | COMMENT |
| LOW | wireguard.sh | 221 | PATH="${SYSCTL_SHIM_DIR}:${PATH}" wg-quick "$@" | COMMENT |
| LOW | wireguard.sh | 241 | COMMENT | |
| LOW | wireguard.sh | 261 | # the config file: after wg-quick is up these are always concrete resolved | COMMENT |
| LOW | wireguard.sh | 301 | fi | COMMENT |
| LOW | wireguard.sh | 321 | # re-runnable after a bounce. | COMMENT |
| LOW | wireguard.sh | 421 | # closed at all times: during the (app-traffic-free) build window, and if any | COMMENT |
| LOW | wireguard.sh | 521 | ip6tables -A OUTPUT -j DROP | COMMENT |
| LOW | wireguard.sh | 541 | DNS_TO_USE="$(echo "$DNS_TO_USE" | tr ',' ' ' | xargs || true)" | COMMENT |
| LOW | wireguard.sh | 581 | echo "[*] Enforcing resolver(s): $DNS_TO_USE" | COMMENT |
| LOW | wireguard.sh | 701 | COMMENT | |
| LOW | wireguard.sh | 721 | # | COMMENT |
| LOW | compose/docker-compose.wireguard.yml | 1 | # Routes all traffic through a WireGuard tunnel - requires root startup. | COMMENT |
| LOW | tests/e2e/platform/docker-compose.e2e.yml | 1 | # Shelfmark e2e Docker testing platform | COMMENT |
| LOW | .github/dependabot.yml | 61 | # pre-release heuristic to catch PEP 440 tags like 3.15.0a2 / 3.5.0b3, but | COMMENT |
| LOW | shelfmark/main.py | 3201 | COMMENT | |
| LOW | shelfmark/core/utils.py | 121 | # searchable AND downloadable at once. These used to be four hand-maintained copies that | COMMENT |
| LOW | shelfmark/config/env.py | 201 | COMMENT | |
| LOW | shelfmark/config/env.py | 221 | # Deliberately env-only and off by default: this is a knob for reproducing the question | COMMENT |
| LOW | shelfmark/bypass/internal_bypasser.py | 61 | _BYPASS_EMOJI_MATCH_MIN = 3 | COMMENT |
| LOW | shelfmark/bypass/internal_bypasser.py | 641 | # works, so a separate method ahead of it could only ever repeat the half that had | COMMENT |
| LOW | shelfmark/bypass/cookie_store.py | 41 | # Anna's Archive's own pass for its ?check=1 hop. Without it the hop 302s back | COMMENT |
| LOW | shelfmark/download/http.py | 561 | proxies=get_proxies(current_url), | COMMENT |
| LOW | shelfmark/download/http.py | 701 | if issued: | COMMENT |
| LOW | shelfmark/download/http.py | 781 | # Before switching to bypasser, check if cookies have become available | COMMENT |
| LOW | shelfmark/download/network.py | 281 | COMMENT | |
| LOW | …fmark/release_sources/direct_download/annas_archive.py | 661 | # has nothing of AA's about it. A genuine interstitial has no AA markers. | COMMENT |
| LOW | src/frontend/src/services/api.ts | 161 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/prowlarr/test_rtorrent_client.py | 38 | client._rpc.d.custom1.set.assert_called_once_with("ABC123", "imported") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | shelfmark/release_sources/irc/parser.py | 45 | # This comprehensive list is used to identify file extensions in results. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/prowlarr/test_qbittorrent_client.py | 20 | CODE | |
| LOW | tests/core/test_activity_routes_api.py | 48 | CODE | |
| LOW | shelfmark/core/external_user_linking.py | 230 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.test-clients.yml | 4 | # Usage: | COMMENT |