This report presents the forensic synthetic code analysis of calibrain/shelfmark, a Python project with 3,620 GitHub stars. SynthScan v2.0 examined 158,451 lines of code across 533 source files, recording 3008 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 23.3 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 3008 distinct pattern matches across 16 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | 87 | def test_download_uses_source_url_for_hashed_task_id( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 126 | def test_download_rejects_source_url_host_mismatch( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 161 | def test_download_allows_configured_source_url_host( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 202 | def test_download_existing_complete(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 248 | def test_download_existing_in_progress(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 293 | def test_download_cancellation(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 319 | def test_download_no_magnet_link(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 352 | def test_download_no_client_configured( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 383 | def test_download_client_add_failure(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 415 | def test_download_existing_no_path(self, mock_get_client, mock_extract_magnet): | CODE |
| LOW | tests/audiobookbay/test_handler.py | 462 | def test_category_selection_qbittorrent_audiobook( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 506 | def test_category_selection_transmission_general( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 550 | def test_category_selection_non_audiobook( | CODE |
| LOW | tests/audiobookbay/test_handler.py | 590 | def test_cancel_returns_false(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 17 | def test_parse_size_kilobytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 24 | def test_parse_size_megabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 31 | def test_parse_size_gigabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 37 | def test_parse_size_terabytes(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 42 | def test_parse_size_case_insensitive(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 53 | def test_parse_size_empty_string(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 57 | def test_parse_size_invalid_format(self): | CODE |
| LOW⚡ | tests/audiobookbay/test_utils.py | 63 | 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_always_uses_legacy_category_query( | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 350 | def test_extract_magnet_link_success(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 369 | def test_extract_magnet_link_reuses_bootstrap_session(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 388 | def test_extract_magnet_link_fallback(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 403 | def test_extract_magnet_link_no_info_hash(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 425 | def test_extract_magnet_link_request_exception(self, mock_html_get): | CODE |
| LOW | tests/audiobookbay/test_scraper.py | 436 | 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 |
| LOW⚡ | tests/audiobookbay/test_source.py | 86 | def test_generate_source_id_different_urls(self): | CODE |
| LOW | tests/audiobookbay/test_source.py | 23 | def test_map_language_english(self): | CODE |
| LOW | tests/audiobookbay/test_source.py | 29 | def test_map_language_spanish(self): | CODE |
| LOW | tests/audiobookbay/test_source.py | 112 | def test_is_available_enabled(self, monkeypatch): | CODE |
| LOW | tests/audiobookbay/test_source.py | 129 | def test_is_available_disabled(self, monkeypatch): | CODE |
| LOW | tests/audiobookbay/test_source.py | 144 | def test_search_non_audiobook_content_type(self): | CODE |
| LOW | tests/audiobookbay/test_source.py | 165 | def test_search_query_generation_manual(self, mock_search): | CODE |
| LOW | tests/audiobookbay/test_source.py | 192 | def test_search_query_generation_from_variants(self, mock_search): | CODE |
| LOW | tests/audiobookbay/test_source.py | 220 | def test_search_query_generation_from_title_only(self, mock_search): | CODE |
| LOW | tests/audiobookbay/test_source.py | 269 | def test_search_relevance_filtering(self, mock_search): | CODE |
| LOW | tests/audiobookbay/test_source.py | 310 | def test_search_result_mapping(self, mock_search): | CODE |
| 2192 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 |
| 136 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_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 | 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 |
| HIGH | shelfmark/download/clients/rtorrent.py | 0 | remove a torrent from qbittorrent. args: download_id: torrent info_hash delete_files: whether to also delete files retur | STRING |
| HIGH | shelfmark/download/clients/transmission.py | 0 | remove a torrent from qbittorrent. args: download_id: torrent info_hash delete_files: whether to also delete files retur | STRING |
| HIGH | shelfmark/download/clients/qbittorrent.py | 0 | remove a torrent from qbittorrent. args: download_id: torrent info_hash delete_files: whether to also delete files retur | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/audiobookbay/test_scraper_contract.py | 15 | CODE | |
| LOW | tests/core/test_download_api_guardrails.py | 3 | CODE | |
| LOW | tests/core/test_request_routes_api.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_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_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_cover_proxy_api.py | 3 | CODE | |
| LOW | tests/core/test_activity_routes_api.py | 3 | CODE | |
| LOW | tests/core/test_notifications_settings_api.py | 3 | CODE | |
| LOW | tests/core/test_activity_view_state_service.py | 3 | 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 | 160 | CODE | |
| LOW | tests/config/test_download_settings.py | 320 | CODE | |
| LOW | tests/config/test_entrypoint_permissions.py | 1 | CODE | |
| LOW | tests/config/test_environment.py | 363 | CODE | |
| LOW | tests/config/test_environment.py | 379 | CODE | |
| LOW | tests/config/test_environment.py | 395 | 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_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 | |
| LOW | tests/e2e/platform/suite/conftest.py | 15 | CODE | |
| LOW | tests/e2e/platform/suite/test_cluster_full_pipeline.py | 19 | CODE | |
| LOW | tests/e2e/platform/suite/test_cluster_bypasser_tor.py | 10 | CODE | |
| LOW | tests/e2e/platform/suite/test_cluster_bypasser.py | 20 | CODE | |
| LOW | tests/e2e/platform/suite/test_config_matrix.py | 13 | CODE | |
| LOW | tests/e2e/platform/suite/test_cluster_search_aa.py | 13 | CODE | |
| LOW | …s/e2e/platform/suite/test_cluster_health_entrypoint.py | 15 | CODE | |
| LOW | …2e/platform/suite/test_cluster_download_permissions.py | 16 | CODE | |
| LOW | scripts/generate_env_docs.py | 351 | CODE | |
| LOW | scripts/generate_env_docs.py | 352 | CODE | |
| LOW | scripts/generate_env_docs.py | 353 | CODE | |
| LOW | scripts/generate_env_docs.py | 354 | CODE | |
| LOW | scripts/generate_env_docs.py | 355 | CODE | |
| LOW | scripts/generate_env_docs.py | 356 | CODE | |
| LOW | scripts/generate_env_docs.py | 357 | CODE | |
| LOW | shelfmark/core/request_validation.py | 3 | CODE | |
| 98 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 | 304 | def download(self, task, cancel_flag, progress_callback, status_callback): | CODE |
| MEDIUM | docs/dev/release-sources-plugin-guide.md | 847 | def download(self, task, cancel_flag, progress_callback, status_callback): | CODE |
| LOW⚡ | docs/dev/release-sources-plugin-guide.md | 1032 | 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 | 345 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 604 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 837 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 852 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1079 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1264 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1268 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1342 | except Exception: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1349 | except Exception as e: | CODE |
| LOW | docs/dev/release-sources-plugin-guide.md | 1402 | 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 |
| LOW | shelfmark/core/admin_routes.py | 420 | 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/requests_service.py | 593 | except Exception: | CODE |
| LOW⚡ | shelfmark/core/settings_registry.py | 1179 | except Exception as e: | CODE |
| LOW | shelfmark/core/settings_registry.py | 450 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 509 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 515 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 818 | except Exception: | CODE |
| LOW | shelfmark/core/settings_registry.py | 1312 | except Exception as e: | CODE |
| LOW | shelfmark/config/security_handlers.py | 145 | except Exception as exc: | CODE |
| LOW | shelfmark/config/migrations.py | 130 | except Exception: | CODE |
| LOW | shelfmark/config/migrations.py | 148 | except Exception: | CODE |
| LOW | shelfmark/config/settings.py | 345 | except Exception as e: | CODE |
| LOW | shelfmark/config/settings.py | 371 | except Exception as e: | CODE |
| LOW | shelfmark/config/booklore_settings.py | 136 | except Exception: | CODE |
| 47 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 | 662 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 70 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 101 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 132 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 162 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 218 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 290 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 357 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 404 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 449 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 517 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 746 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 790 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 835 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 878 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1231 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1286 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1342 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1405 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1468 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1573 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1624 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1692 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 1930 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2525 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2577 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2720 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2776 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2931 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2962 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 2990 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3018 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3049 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3077 | CODE | |
| LOW | tests/core/test_request_routes_api.py | 3125 | CODE | |
| LOW | tests/core/test_processing_integration.py | 925 | 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 | shelfmark/core/queue.py | 95 | CODE | |
| LOW | shelfmark/core/queue.py | 192 | CODE | |
| LOW | shelfmark/core/queue.py | 263 | CODE | |
| LOW | shelfmark/core/queue.py | 334 | CODE | |
| LOW | shelfmark/core/admin_settings_routes.py | 36 | CODE | |
| LOW | shelfmark/core/admin_settings_routes.py | 155 | CODE | |
| LOW | shelfmark/core/admin_settings_routes.py | 281 | CODE | |
| LOW | shelfmark/core/naming.py | 141 | CODE | |
| LOW | shelfmark/core/onboarding.py | 571 | CODE | |
| 53 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | shelfmark/download/fs.py | 181 | Write data to a file with atomic collision detection. If the destination already exists, retries with counter suffi | STRING |
| HIGH | shelfmark/download/fs.py | 401 | Move a file with collision detection. Uses os.rename() for same-filesystem moves (atomic, triggers inotify events), | STRING |
| HIGH | shelfmark/download/fs.py | 554 | Create a hardlink with atomic collision detection. Args: source_path: Source file to link from dest | STRING |
| HIGH | shelfmark/download/fs.py | 606 | 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 | 286 | Add a download to the client. Args: url: Download URL (magnet link, .torrent URL, or NZB URL) | STRING |
| HIGH | shelfmark/download/clients/rtorrent.py | 151 | Add torrent by URL (magnet or .torrent). Args: url: Magnet link or .torrent URL name: D | STRING |
| HIGH | shelfmark/download/clients/sabnzbd.py | 160 | Make an API call to SABnzbd. Args: mode: API mode (e.g., "version", "addurl", "queue", "history") | STRING |
| HIGH | shelfmark/download/clients/sabnzbd.py | 338 | 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 | 443 | Add torrent by URL (magnet or .torrent). Args: url: Magnet link or .torrent URL name: D | STRING |
| HIGH | shelfmark/release_sources/direct_download.py | 543 | 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 | 203 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 228 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 253 | "name": "John Doe", | CODE |
| LOW | tests/core/test_oidc_routes.py | 282 | "email": "admin@example.com", | CODE |
| LOW | tests/config/test_download_settings.py | 191 | assert bound_fields[0]["placeholder"] == "{Author}/{Series/}{Title} ({Year})" | CODE |
| LOW | shelfmark/core/settings_registry.py | 1033 | result["placeholder"] = field.placeholder | CODE |
| LOW | shelfmark/core/settings_registry.py | 1037 | result["placeholder"] = field.placeholder | CODE |
| LOW | shelfmark/core/settings_registry.py | 1056 | 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 | 201 | "placeholder": "https://auth.example.com/.well-known/openid-configuration", | CODE |
| LOW | shelfmark/config/security.py | 211 | "placeholder": "shelfmark", | CODE |
| LOW | shelfmark/config/security.py | 239 | "placeholder": "groups", | CODE |
| LOW | shelfmark/config/security.py | 249 | "placeholder": "shelfmark-admins", | CODE |
| LOW | shelfmark/config/security.py | 277 | "placeholder": "Sign in with OIDC", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 159 | "placeholder": "Select source...", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 167 | "placeholder": "Select content type...", | CODE |
| LOW⚡ | shelfmark/config/users_settings.py | 176 | "placeholder": "Select mode...", | CODE |
| LOW | shelfmark/config/settings.py | 1194 | placeholder="user@example.com", | CODE |
| LOW | shelfmark/metadata_providers/__init__.py | 141 | "placeholder": getattr(search_field, "placeholder", ""), | 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 | shelfmark/main.py | 820 | # Check if user has a valid session | COMMENT |
| LOW | shelfmark/main.py | 1653 | # Check if caching is enabled | COMMENT |
| LOW | shelfmark/main.py | 2074 | # Check if account is locked due to failed login attempts | COMMENT |
| LOW | shelfmark/main.py | 2163 | # Check if user exists and password is correct | COMMENT |
| LOW | shelfmark/main.py | 2167 | # Check if user has admin role (ROLE_ADMIN = 1, bit flag) | COMMENT |
| LOW | shelfmark/main.py | 2264 | # 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 | 221 | # Check if username already exists | COMMENT |
| LOW | shelfmark/core/cache.py | 148 | # Check if metadata caching is enabled | COMMENT |
| LOW | shelfmark/core/utils.py | 248 | # Check if content-type routing is enabled (new or legacy setting) | COMMENT |
| LOW | shelfmark/core/utils.py | 301 | # Check if cover caching is enabled | COMMENT |
| LOW⚡ | shelfmark/core/settings_registry.py | 1174 | # Check if callback accepts current_values parameter | COMMENT |
| LOW | shelfmark/core/settings_registry.py | 472 | # Check if config directory exists and is writable | COMMENT |
| LOW | shelfmark/download/network.py | 507 | # Check if hostname is already an IP address, no need to resolve | COMMENT |
| LOW | shelfmark/download/network.py | 512 | # Check if hostname is a private IP address, and skip DoH if it is | COMMENT |
| LOW | shelfmark/download/network.py | 1166 | # Check if it looks like IP addresses | COMMENT |
| LOW | shelfmark/download/clients/torrent_utils.py | 226 | # Check if response is actually a magnet link (text response) | COMMENT |
| LOW | shelfmark/download/clients/base_handler.py | 788 | # 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/direct_download.py | 1372 | # Check if we've hit the failure threshold | COMMENT |
| LOW | shelfmark/release_sources/audiobookbay/scraper.py | 218 | # Check if we were redirected to the homepage (search was rejected/blocked) | 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 |
|---|---|---|---|---|
| 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 | 830 | # 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 | 570 | # Create the directory structure | COMMENT |
| MEDIUM | shelfmark/download/orchestrator.py | 274 | # Create a source-agnostic download task from release data | 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_activity_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_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 | 148 | def update_status(self, book_id: str, status: QueueStatus) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 174 | def update_download_path(self, task_id: str, download_path: str) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 180 | def update_progress(self, task_id: str, progress: float) -> None: | CODE |
| LOW⚡ | shelfmark/core/queue.py | 186 | 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 | 364 | def update_user(self, user_id: int, **kwargs: object) -> None: | CODE |
| LOW | shelfmark/core/user_db.py | 451 | def set_user_settings(self, user_id: int, settings: dict[str, Any]) -> None: | CODE |
| LOW | shelfmark/download/orchestrator.py | 748 | def update_download_progress(book_id: str, progress: float) -> None: | CODE |
| LOW | shelfmark/download/orchestrator.py | 791 | def update_download_status(book_id: str, status: str, message: str | None = None) -> None: | CODE |
| LOW | shelfmark/download/network.py | 249 | def _set_runtime_dns_state(servers: list[str], doh_server: str) -> None: | CODE |
| LOW | shelfmark/download/network.py | 491 | def _set_cached(self, hostname: str, record_type: str, ips: list[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 | 57 | __all__ = [ | CODE |
| LOW | shelfmark/api/websocket.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | shelfmark/api/websocket.py | 64 | def set_queue_status_fn(self, fn: Callable) -> None: | CODE |
| LOW⚡ | shelfmark/api/websocket.py | 78 | def _set_sid_room_locked(self, sid: str, room: str | None) -> None: | CODE |
| LOW | shelfmark/release_sources/prowlarr/handler.py | 59 | __all__ = [ | CODE |
| 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 |
| 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 | 22 | # This comprehensive list is used to identify file extensions in results. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.test-clients.yml | 4 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_activity_routes_api.py | 44 | CODE | |
| LOW | shelfmark/core/external_user_linking.py | 188 | CODE |