Wizarr is an advanced user invitation and management system for Jellyfin, Plex, Emby etc.
This report presents the forensic synthetic code analysis of wizarrrr/wizarr, a Python project with 3,086 GitHub stars. SynthScan v2.0 examined 79,386 lines of code across 418 source files, recording 1720 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 34.0 places this repository in the Strong 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 1720 distinct pattern matches across 17 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 |
|---|---|---|---|---|
| MEDIUM | docker-entrypoint.sh | 6 | # ───────── 1) Create or reuse the chosen UID/GID ────────── | COMMENT |
| MEDIUM⚡ | docker-entrypoint.sh | 61 | # ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker-entrypoint.sh | 63 | # ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker-entrypoint.sh | 68 | # ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker-entrypoint.sh | 70 | # ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 25 | # ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 48 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 50 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 130 | # ── NEW: link invitation to an explicit wizard bundle ──────────── | COMMENT |
| MEDIUM | app/models.py | 314 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 316 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 340 | # ── helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 581 | # ── convenience helpers ───────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 596 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 598 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 1103 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 1105 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/extensions.py | 179 | # ── legacy single-admin token ─────────────────────────────────────────── | COMMENT |
| MEDIUM | app/extensions.py | 183 | # ── new multi-admin accounts ─────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/settings/routes.py | 356 | # ──────────────────────────────────────────────────────────────────────────── | STRING |
| MEDIUM | app/blueprints/settings/routes.py | 358 | # ──────────────────────────────────────────────────────────────────────────── | STRING |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 108 | # ─── Bundles view ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 429 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 433 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 444 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 446 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 466 | # ─── bundle CRUD ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 645 | # ─── add steps modal & handler ─────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard_admin/routes.py | 703 | # ─── Export/Import functionality ───────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/auth/routes.py | 45 | # ── Handle LDAP authentication ───────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/auth/routes.py | 62 | # ── 1) Multi-admin accounts (preferred) ──────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/auth/routes.py | 162 | # ── Logout ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/setup/routes.py | 54 | # ── Step 1: create admin account ─────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 85 | # ─── helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 144 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 151 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 204 | # ─── 1) DB-backed steps ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 246 | # ─── 2) Fallback to bundled markdown files ───────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 940 | # ─── combined wizard for multi-server invites ───────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 1105 | # ─── bundle-specific wizard route ────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 525 | # ─── routes ───────────────────────────────────────────────────── | STRING |
| MEDIUM | app/blueprints/wizard/routes.py | 1317 | # ─── bundle preview route (admin) ────────────────────────────── | STRING |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 291 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 293 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 297 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 299 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 304 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 306 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 392 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 394 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 403 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 405 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 237 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 239 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 250 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 252 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 537 | # ── GET → serve the enhanced modal with server information ──────── | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1153 | # ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1310 | # ---------------------- | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1315 | # ---------------------- | COMMENT |
| 140 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models.py | 284 | def update_standardized_metadata(self, details): | CODE |
| LOW | app/extensions.py | 240 | def _configure_sqlite_for_concurrency(app): | CODE |
| LOW | app/tasks/maintenance.py | 59 | def _get_expiry_check_interval(): | CODE |
| LOW | app/tasks/activity.py | 19 | def cleanup_old_activity_task(app: Flask, retention_days: int = 90): | CODE |
| LOW | app/tasks/activity.py | 74 | def monitor_health_check_task(app: Flask): | CODE |
| LOW | app/tasks/activity.py | 141 | def activity_monitoring_heartbeat_task(app: Flask): | CODE |
| LOW⚡ | app/tasks/activity.py | 181 | def recover_sessions_on_startup_task(app: Flask): | CODE |
| LOW⚡ | app/tasks/activity.py | 208 | def get_activity_cleanup_interval() -> int: | CODE |
| LOW⚡ | app/tasks/activity.py | 214 | def get_stale_session_cleanup_interval() -> int: | CODE |
| LOW⚡ | app/tasks/activity.py | 220 | def get_health_check_interval() -> int: | CODE |
| LOW | app/blueprints/wizard/routes.py | 256 | def _gather_steps_with_phases( | CODE |
| LOW | app/blueprints/wizard/routes.py | 449 | def _get_server_type_from_invitation(invitation: Invitation) -> str | None: | STRING |
| LOW | app/blueprints/admin/routes.py | 923 | def remove_user_from_server_endpoint(user_id: int, server_id: int): | CODE |
| LOW | app/blueprints/media_common/routes.py | 124 | def register_media_blueprints(app): | CODE |
| LOW | app/blueprints/public/routes.py | 38 | def _apply_safe_media_user_policy( | CODE |
| LOW⚡ | app/blueprints/api/api_routes.py | 170 | def _calculate_invitation_status(invitation): | CODE |
| LOW | app/blueprints/api/api_routes.py | 109 | def require_api_key_or_session(f): | CODE |
| LOW | app/activity/api/blueprint.py | 57 | def _activity_settings_template() -> str: | CODE |
| LOW | app/activity/api/blueprint.py | 80 | def _load_verified_media_servers() -> list: | CODE |
| LOW | app/activity/api/blueprint.py | 98 | def _render_activity_settings( | CODE |
| LOW | app/activity/api/blueprint.py | 135 | def _settings_action_response( | CODE |
| LOW | app/activity/api/blueprint.py | 168 | def _render_historical_jobs_partial(server_id: int | None): | CODE |
| LOW | app/activity/api/blueprint.py | 188 | def _delete_all_activity_data() -> int: | CODE |
| LOW | app/activity/api/blueprint.py | 652 | def import_historical_activity(): | CODE |
| LOW | app/activity/api/blueprint.py | 719 | def clear_historical_activity(): | CODE |
| LOW | app/activity/api/helpers.py | 33 | def activity_settings_template() -> str: | CODE |
| LOW | app/activity/api/helpers.py | 56 | def load_verified_media_servers() -> list: | CODE |
| LOW | app/activity/api/helpers.py | 138 | def render_historical_jobs_partial(server_id: int | None): | CODE |
| LOW | app/activity/templates/activity/history_tab.html | 226 | function scheduleActivitySummaryPolling() { | CODE |
| LOW | app/activity/templates/activity/dashboard.html | 229 | function scheduleActivitySummaryPolling() { | CODE |
| LOW | app/activity/templates/activity/settings_tab.html | 246 | function toggleHistoricalImportAvailability() { | CODE |
| LOW | app/activity/templates/activity/settings_tab.html | 267 | function setHistoricalImportLoading(isLoading) { | CODE |
| LOW | app/activity/monitoring/session_manager.py | 754 | def _extract_session_data_from_plex( | CODE |
| LOW | app/activity/monitoring/session_manager.py | 827 | def _get_session_from_current_activity( | CODE |
| LOW | app/activity/monitoring/collectors/audiobookshelf.py | 106 | def _handle_no_active_sessions(self): | CODE |
| LOW | app/activity/monitoring/collectors/audiobookshelf.py | 120 | def _extract_session_data_from_polling( | CODE |
| LOW | app/templates/welcome-jellyfin.html | 487 | function revealFormWithoutAnimation() { | CODE |
| LOW | app/templates/tables/invite_card.html | 224 | function updateInviteCardSelection() { | CODE |
| LOW | app/services/ombi_client.py | 27 | def get_connection_for_server( | CODE |
| LOW | app/services/ombi_client.py | 36 | def invite_user_to_connections( | CODE |
| LOW | app/services/ombi_client.py | 112 | def delete_user_from_connections(internal_token: str) -> list[dict]: | CODE |
| LOW | app/services/wizard_export_import.py | 121 | def export_steps_by_server_type(self, server_type: str) -> WizardExportDTO: | CODE |
| LOW | app/services/wizard_export_import.py | 634 | def get_server_types_with_steps(self) -> list[str]: | CODE |
| LOW | app/services/server_name_resolver.py | 10 | def resolve_invitation_server_name(servers: list[MediaServer]) -> str: | CODE |
| LOW | app/services/wizard_reset.py | 39 | def get_default_steps_for_server( | CODE |
| LOW | app/services/user_details.py | 154 | def _extract_libraries_from_cached_data( | CODE |
| LOW | app/services/user_details.py | 171 | def _extract_libraries_from_details( | CODE |
| LOW | app/services/servers.py | 71 | def check_jellyfin_or_emby_internal(url: str, token: str) -> tuple[bool, str]: | CODE |
| LOW | app/services/invitation_manager.py | 18 | def ensure_invitation_identity( | CODE |
| LOW | app/services/invitation_manager.py | 244 | def scan_with_saved_credentials(server_type: str) -> tuple[bool, dict]: | CODE |
| LOW | app/services/wizard_migration.py | 13 | def update_wizard_external_url_references() -> tuple[bool, str]: | CODE |
| LOW | app/services/expiry.py | 46 | def get_server_specific_expiry( | CODE |
| LOW | app/services/expiry.py | 69 | def set_server_specific_expiry( | CODE |
| LOW | app/services/expiry.py | 148 | def get_server_disable_capabilities() -> dict[str, bool]: | CODE |
| LOW | app/services/expiry.py | 167 | def disable_or_delete_user_if_expired() -> list[int]: | CODE |
| LOW | app/services/expiry.py | 280 | def cleanup_expired_user_by_email(email: str) -> None: | CODE |
| LOW | app/services/expiry.py | 317 | def get_expiring_this_week_users() -> list[dict]: | CODE |
| LOW | app/services/library_scanner.py | 21 | def scan_all_server_libraries(show_logs: bool = True) -> tuple[int, list[str]]: | CODE |
| LOW | app/services/wizard_widgets.py | 337 | def process_widget_placeholders( | STRING |
| LOW | app/services/wizard_seed.py | 68 | def import_default_wizard_steps() -> None: | CODE |
| 516 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | recovery_tool.py | 151 | except Exception as e: | CODE |
| LOW | recovery_tool.py | 206 | except Exception as e: | CODE |
| LOW | recovery_tool.py | 247 | except Exception as e: | CODE |
| LOW | recovery_tool.py | 290 | except Exception as e: | CODE |
| LOW | gunicorn.conf.py | 108 | except Exception as e: | CODE |
| LOW | gunicorn.conf.py | 125 | except Exception as e: | CODE |
| LOW | gunicorn.conf.py | 162 | except Exception as e: | CODE |
| MEDIUM⚡ | dev.py | 48 | print(f"Error running command: {' '.join(command)}") | CODE |
| MEDIUM⚡ | dev.py | 49 | print(f"Error code: {process.returncode}") | CODE |
| LOW⚡ | dev.py | 56 | except Exception as e: | CODE |
| MEDIUM⚡ | dev.py | 57 | print(f"Error running command: {' '.join(command)}") | CODE |
| MEDIUM⚡ | dev.py | 58 | print(f"Error: {e}") | CODE |
| LOW⚡ | app/__init__.py | 65 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 98 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 114 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 135 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 168 | except Exception as exc: | CODE |
| LOW | app/extensions.py | 120 | except Exception: | CODE |
| LOW | app/extensions.py | 134 | except Exception as e: | CODE |
| LOW | app/extensions.py | 158 | except Exception as e: | CODE |
| LOW | app/extensions.py | 267 | except Exception: | CODE |
| LOW⚡ | app/jinja_filters.py | 42 | except Exception as exc: | CODE |
| LOW⚡ | app/jinja_filters.py | 50 | except Exception as exc: | CODE |
| LOW⚡ | app/jinja_filters.py | 56 | except Exception: | CODE |
| LOW | app/jinja_filters.py | 189 | except Exception: | CODE |
| LOW | app/tasks/update_check.py | 124 | except Exception as notify_error: | CODE |
| LOW | app/tasks/update_check.py | 142 | except Exception as e: | CODE |
| LOW | app/tasks/update_check.py | 149 | except Exception as e: | CODE |
| LOW | app/tasks/maintenance.py | 55 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 41 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 69 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 136 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 169 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 176 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 203 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 285 | except Exception as e: | CODE |
| LOW | app/blueprints/settings/routes.py | 66 | except Exception: | CODE |
| LOW | app/blueprints/settings/routes.py | 233 | except Exception as exc: | CODE |
| LOW | app/blueprints/settings/routes.py | 325 | except Exception as exc: | STRING |
| LOW | app/blueprints/api_keys/routes.py | 79 | except Exception: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 738 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 781 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 842 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 876 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 897 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard_admin/routes.py | 914 | except Exception as e: | CODE |
| LOW | app/blueprints/auth/ldap_auth.py | 100 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 139 | except Exception as exc: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 156 | except Exception as exc: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 403 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 438 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 485 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 532 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 580 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 211 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 324 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 715 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 731 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 742 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 767 | except Exception as e: | CODE |
| 433 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/services/companions/audiobookrequest.py | 0 | test the connection to ombi. args: connection: connection object with url and api key returns: dict with 'status' and 'm | STRING |
| HIGH | app/services/companions/base.py | 0 | test the connection to ombi. args: connection: connection object with url and api key returns: dict with 'status' and 'm | STRING |
| HIGH | app/services/companions/ombi.py | 0 | test the connection to ombi. args: connection: connection object with url and api key returns: dict with 'status' and 'm | STRING |
| HIGH | app/services/media/navidrome.py | 0 | disable a user account on drop. args: user_id: the user's drop id (unused - drop doesn't support enable/disable) returns | STRING |
| HIGH | app/services/media/plex.py | 0 | disable a user account on drop. args: user_id: the user's drop id (unused - drop doesn't support enable/disable) returns | STRING |
| HIGH | app/services/media/komga.py | 0 | disable a user account on drop. args: user_id: the user's drop id (unused - drop doesn't support enable/disable) returns | STRING |
| HIGH | app/services/media/drop.py | 0 | disable a user account on drop. args: user_id: the user's drop id (unused - drop doesn't support enable/disable) returns | STRING |
| HIGH | app/services/media/navidrome.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/plex.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/kavita.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/komga.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/romm.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/drop.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | get user info in legacy format for backward compatibility. | STRING |
| HIGH | app/services/media/navidrome.py | 0 | get detailed user information in standardized format. | STRING |
| HIGH | app/services/media/kavita.py | 0 | get detailed user information in standardized format. | STRING |
| HIGH | app/services/media/komga.py | 0 | get detailed user information in standardized format. | STRING |
| HIGH | app/services/media/romm.py | 0 | get detailed user information in standardized format. | STRING |
| HIGH | app/services/media/drop.py | 0 | get detailed user information in standardized format. | STRING |
| HIGH | app/services/media/navidrome.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/kavita.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/komga.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/romm.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/drop.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/plex.py | 0 | get lightweight user count from database without triggering plex.tv sync. | STRING |
| HIGH | app/services/media/navidrome.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/plex.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/komga.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/romm.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/drop.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | get lightweight server information without triggering user sync. | STRING |
| HIGH | app/services/media/navidrome.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/plex.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/kavita.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/komga.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/romm.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/drop.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | get lightweight statistics without triggering user synchronization. | STRING |
| HIGH | app/services/media/client_base.py | 0 | scan available libraries on this jellyfin server. args: url: optional server url override token: optional api token over | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | scan available libraries on this jellyfin server. args: url: optional server url override token: optional api token over | STRING |
| HIGH | app/services/media/kavita.py | 0 | scan available libraries on this jellyfin server. args: url: optional server url override token: optional api token over | STRING |
| HIGH | app/services/media/komga.py | 0 | scan available libraries on this jellyfin server. args: url: optional server url override token: optional api token over | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | scan available libraries on this jellyfin server. args: url: optional server url override token: optional api token over | STRING |
| HIGH | app/services/media/plex.py | 0 | extract library access: (library_names | none, has_full_access). | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | extract library access: (library_names | none, has_full_access). | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | extract library access: (library_names | none, has_full_access). | STRING |
| HIGH | app/services/media/plex.py | 0 | get detailed user information from database (no api calls). | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | get detailed user information from database (no api calls). | STRING |
| HIGH | app/services/media/jellyfin.py | 0 | get detailed user information from database (no api calls). | STRING |
| HIGH | app/services/media/audiobookshelf.py | 0 | return essential romm server statistics for the dashboard. only collects data actually used by the ui: - server version | STRING |
| HIGH | app/services/media/emby.py | 0 | return essential romm server statistics for the dashboard. only collects data actually used by the ui: - server version | STRING |
| HIGH | app/services/media/komga.py | 0 | return essential romm server statistics for the dashboard. only collects data actually used by the ui: - server version | STRING |
| HIGH | app/services/media/romm.py | 0 | return essential romm server statistics for the dashboard. only collects data actually used by the ui: - server version | STRING |
| HIGH | tests/test_wizard_presets_service.py | 0 | return a clean database session inside an app context. | STRING |
| HIGH | tests/test_wizard_drag_drop.py | 0 | return a clean database session inside an app context. | STRING |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/blueprints/wizard_admin/routes.py | 265 | # Create the step | COMMENT |
| MEDIUM | app/blueprints/audiobookshelf/routes.py | 3 | # Create the audiobookshelf blueprint using the common factory | COMMENT |
| MEDIUM | app/blueprints/kavita/routes.py | 3 | # Create the kavita blueprint using the common factory | COMMENT |
| MEDIUM | app/blueprints/jellyfin/routes.py | 3 | # Create the jellyfin blueprint using the common factory | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1247 | # Create a dict to attach timestamps and sort users to match the pagination order | COMMENT |
| MEDIUM | app/blueprints/connections/routes.py | 173 | # Create a temporary connection object for testing | COMMENT |
| MEDIUM | app/blueprints/komga/routes.py | 3 | # Create the komga blueprint using the common factory | COMMENT |
| MEDIUM | app/blueprints/emby/routes.py | 3 | # Create the emby blueprint using the common factory | COMMENT |
| MEDIUM | app/blueprints/api/api_routes.py | 51 | # Create the Blueprint for the API | COMMENT |
| MEDIUM | app/blueprints/api/api_routes.py | 744 | # Create a form-like object that create_invite expects | COMMENT |
| MEDIUM | app/activity/monitoring/session_manager.py | 671 | # Create a synthetic stop transition | COMMENT |
| MEDIUM | app/services/wizard_export_import.py | 547 | # Create the wizard step with server_type "custom" | COMMENT |
| MEDIUM | app/services/ldap/invitation_ldap.py | 38 | # Create the LDAP user | COMMENT |
| MEDIUM | app/services/invitation_flow/results.py | 106 | # Create a copy without the template_name key | COMMENT |
| MEDIUM | app/services/media/plex.py | 1400 | # Create a PlexServer instance with Flask app context | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 18 | # Create a test server | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 28 | # Create a user with an expiry date 3 days from now | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 58 | # Create a test server | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 68 | # Create a user with a timezone-aware expiry date 5 days from now | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 95 | # Create a test server | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 105 | # Create a user that expired 1 day ago | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 129 | # Create a test server | COMMENT |
| MEDIUM⚡ | tests/test_expiry_datetime_fix.py | 139 | # Create a user that expires in 10 days | COMMENT |
| MEDIUM | tests/test_api_restx.py | 34 | # Create a test admin account | COMMENT |
| MEDIUM | tests/test_api_restx.py | 491 | # Create an inactive API key | COMMENT |
| MEDIUM | tests/test_api_comprehensive_deprecated.py | 28 | # Create a test admin account | COMMENT |
| MEDIUM | tests/test_wizard_drag_drop.py | 216 | # Create a custom order: [2, 0, 1] | COMMENT |
| MEDIUM | tests/test_wizard_step_filtering.py | 275 | # Create a DB step | COMMENT |
| MEDIUM | tests/test_invite_code_manager.py | 57 | # Create a valid invitation | COMMENT |
| MEDIUM | tests/test_invitation_comprehensive.py | 36 | # Create a valid invitation | COMMENT |
| MEDIUM⚡ | tests/test_session_cache.py | 22 | # Create a 0-byte file (the exact scenario from #1180) | COMMENT |
| MEDIUM⚡ | tests/test_session_cache.py | 39 | # Create a valid cache file (4-byte header + pickled data) | COMMENT |
| MEDIUM | tests/test_wizard_export_import.py | 91 | # Create a bundle with steps | COMMENT |
| MEDIUM | tests/test_wizard_export_import.py | 307 | # Create an existing step with pre_invite category | COMMENT |
| MEDIUM | tests/test_identity_linking_fix.py | 165 | # Create an identity for the first user (simulating what would happen in practice) | COMMENT |
| MEDIUM | tests/test_invitation_server_defaulting.py | 27 | # Create a test admin account | COMMENT |
| MEDIUM⚡ | tests/test_wizard_admin_forms.py | 158 | # Create a post_invite step | COMMENT |
| MEDIUM | tests/test_wizard_admin_forms.py | 197 | # Create a pre_invite step | COMMENT |
| MEDIUM | tests/test_wizard_admin_forms.py | 236 | # Create a pre_invite step | COMMENT |
| MEDIUM | tests/test_wizard_admin_forms.py | 443 | # Create a simple step with post_invite category | COMMENT |
| MEDIUM | tests/test_api_server_names.py | 27 | # Create a test admin account | COMMENT |
| MEDIUM | tests/test_api_server_names.py | 115 | # Create a server | COMMENT |
| MEDIUM | tests/test_api_server_names.py | 153 | # Create a server | COMMENT |
| MEDIUM | tests/test_invitation_server_name.py | 11 | # Create a test admin account if it doesn't exist | COMMENT |
| MEDIUM | tests/test_invitation_server_name.py | 69 | # Create an invitation without server association | COMMENT |
| MEDIUM | tests/test_invitation_server_name.py | 78 | # Create a default server that should be used as fallback | COMMENT |
| MEDIUM | .github/workflows/create-release.yml | 46 | # Create the release (explicitly published, not draft) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | recovery_tool.py | 220 | # Check if username already exists | COMMENT |
| LOW | gunicorn.conf.py | 43 | # Set environment to indicate Gunicorn context | COMMENT |
| LOW | app/models.py | 954 | # Check if critical fields are Unknown | COMMENT |
| LOW⚡ | app/__init__.py | 147 | # Check if plus features should be enabled | COMMENT |
| LOW | app/middleware.py | 20 | # Check if an admin user exists | COMMENT |
| LOW | app/tasks/ldap_sync.py | 56 | # Check if LDAP is enabled | COMMENT |
| LOW | app/tasks/ldap_sync.py | 78 | # Check if user already exists | COMMENT |
| LOW | app/tasks/update_check.py | 73 | # Check if update is available and log/notify it | COMMENT |
| LOW | app/tasks/update_check.py | 88 | # Check if we've already notified about this version | COMMENT |
| LOW | app/tasks/maintenance.py | 39 | # Check if we're actually in WAL mode first | COMMENT |
| LOW | app/blueprints/settings/routes.py | 136 | # Check if a MediaServer already exists | COMMENT |
| LOW | app/blueprints/settings/routes.py | 569 | # Check if user already exists | COMMENT |
| LOW | app/blueprints/api_keys/routes.py | 39 | # Check if name already exists | COMMENT |
| LOW | app/blueprints/wizard_admin/routes.py | 353 | # Check if this is a custom step (from bundle context) | COMMENT |
| LOW | app/blueprints/auth/routes.py | 66 | # Check if this account has passkeys registered - if so, require 2FA | COMMENT |
| LOW | app/blueprints/auth/routes.py | 130 | # Check if there are any passkeys registered for error page | COMMENT |
| LOW | app/blueprints/auth/routes.py | 145 | # Check if there are any passkeys registered for error page | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 75 | # Check if this is coming from an invitation process | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 726 | # Check if this is a multi-server invitation | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 822 | # Check if user is trying to advance past the final step | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 1026 | # Check if we're on the last step and moving forward | COMMENT |
| LOW⚡ | app/blueprints/wizard/routes.py | 568 | # Check if this is a multi-server invitation | STRING |
| LOW | app/blueprints/wizard/routes.py | 637 | # Check if user is trying to advance beyond the final step | STRING |
| LOW | app/blueprints/connections/routes.py | 160 | # Check if it's just a CSRF error | COMMENT |
| LOW | app/blueprints/public/routes.py | 301 | # Check if client has get_movie_posters method | COMMENT |
| LOW | app/blueprints/webauthn/routes.py | 97 | # Check if it's an IP address (IPv4 or IPv6) using Python's built-in validation | COMMENT |
| LOW | app/blueprints/webauthn/routes.py | 268 | # Check if this is a 2FA authentication | COMMENT |
| LOW | app/blueprints/webauthn/routes.py | 347 | # Check if this is 2FA authentication | COMMENT |
| LOW⚡ | app/blueprints/api/api_routes.py | 177 | # Check if invitation has expired | COMMENT |
| LOW | app/blueprints/api/api_routes.py | 114 | # Check if user is authenticated via session (Flask-Login) | COMMENT |
| LOW | app/blueprints/api/api_routes.py | 874 | # Check if library already exists to avoid duplicates | COMMENT |
| LOW | app/blueprints/api/api_routes.py | 1029 | # Check if trying to delete the currently used key | COMMENT |
| LOW | app/activity/monitoring/monitor.py | 108 | # Check if the media_server table exists before querying | COMMENT |
| LOW | app/activity/monitoring/session_manager.py | 144 | # Check if this is truly a new session or a duplicate alert BEFORE updating | COMMENT |
| LOW | app/activity/monitoring/session_manager.py | 192 | # Check if another thread just started this session | COMMENT |
| LOW | app/activity/monitoring/collectors/audiobookshelf.py | 74 | # Check if this is a new session | COMMENT |
| LOW | app/activity/monitoring/collectors/emby.py | 73 | # Check if this is a new session or has changes | COMMENT |
| LOW | app/activity/monitoring/collectors/polling.py | 59 | # Check if this is a new session | COMMENT |
| LOW | app/activity/monitoring/collectors/jellyfin.py | 72 | # Check if this is a new session or has changes | COMMENT |
| LOW | app/scripts/migrate_media_server.py | 17 | # Check if an admin user exists | COMMENT |
| LOW | app/services/invite_code_manager.py | 72 | # Check if invitation is expired | COMMENT |
| LOW | app/services/invite_code_manager.py | 82 | # Check if invitation is fully used (limited invitations only) | COMMENT |
| LOW | app/services/invites.py | 226 | # Check if *all* servers are now used (only for limited invitations) | COMMENT |
| LOW | app/services/wizard_export_import.py | 408 | # Check if step already exists at this position | COMMENT |
| LOW | app/services/wizard_export_import.py | 502 | # Check if bundle already exists | COMMENT |
| LOW | app/services/server_name_resolver.py | 80 | # Check if we're using the global setting | COMMENT |
| LOW | app/services/invitation_manager.py | 44 | # Check if we already have a user with this invitation code AND email | COMMENT |
| LOW | app/services/invitation_manager.py | 50 | # Check if there are any users with the same code but different emails | COMMENT |
| LOW | app/services/wizard_migration.py | 24 | # Check if WizardStep table exists (might not exist during initial setup) | COMMENT |
| LOW | app/services/library_scanner.py | 38 | # Check if the library table exists (in case migrations haven't run yet) | COMMENT |
| LOW | app/services/notifications.py | 144 | # Check if agent is subscribed to this event type | COMMENT |
| LOW | app/services/activity/ingestion.py | 54 | # Check if it's a database lock error | COMMENT |
| LOW | app/services/ldap/client.py | 185 | # Check if user already exists | COMMENT |
| LOW | app/services/ldap/user_sync.py | 75 | # Check if user already exists in Wizarr | COMMENT |
| LOW | app/services/historical/__init__.py | 203 | # Check if session already exists | COMMENT |
| LOW | app/services/invitation_flow/strategies.py | 78 | # Check if we have OAuth token from session or form | COMMENT |
| LOW | app/services/invitation_flow/strategies.py | 112 | # Check if we have Plex OAuth token | COMMENT |
| LOW | app/services/invitation_flow/workflows.py | 453 | # Check if we have OAuth token | COMMENT |
| LOW | app/services/invitation_flow/manager.py | 100 | # Check if pre-wizard is complete (only if in request context) | COMMENT |
| LOW | app/services/media/service.py | 160 | # Check if there are other User records with the same username | COMMENT |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | recovery_tool.py | 65 | CODE | |
| LOW | recovery_tool.py | 251 | CODE | |
| LOW | gunicorn.conf.py | 38 | CODE | |
| LOW | app/__init__.py | 12 | CODE | |
| LOW | app/jinja_filters.py | 103 | CODE | |
| LOW | app/tasks/update_check.py | 16 | CODE | |
| LOW | app/tasks/maintenance.py | 9 | CODE | |
| LOW | app/tasks/activity.py | 74 | CODE | |
| LOW | app/tasks/activity.py | 141 | CODE | |
| LOW | app/blueprints/api_keys/routes.py | 33 | CODE | |
| LOW | app/blueprints/wizard_admin/routes.py | 541 | CODE | |
| LOW | app/blueprints/media_servers/routes.py | 85 | CODE | |
| LOW | app/blueprints/wizard/routes.py | 681 | CODE | |
| LOW | app/blueprints/admin/routes.py | 227 | CODE | |
| LOW | app/blueprints/admin/routes.py | 756 | CODE | |
| LOW | app/blueprints/admin/routes.py | 1079 | CODE | |
| LOW | app/blueprints/admin/routes.py | 1273 | CODE | |
| LOW | app/blueprints/public/routes.py | 114 | CODE | |
| LOW | app/blueprints/public/routes.py | 337 | CODE | |
| LOW | app/blueprints/api/api_routes.py | 201 | CODE | |
| LOW | app/blueprints/api/api_routes.py | 325 | CODE | |
| LOW | app/blueprints/api/api_routes.py | 563 | CODE | |
| LOW | app/blueprints/api/api_routes.py | 625 | CODE | |
| LOW | app/blueprints/api/api_routes.py | 854 | CODE | |
| LOW | app/blueprints/notifications/routes.py | 34 | CODE | |
| LOW | app/blueprints/notifications/routes.py | 127 | CODE | |
| LOW | app/activity/api/blueprint.py | 286 | CODE | |
| LOW | app/activity/api/blueprint.py | 578 | CODE | |
| LOW | app/activity/monitoring/monitor.py | 102 | CODE | |
| LOW | app/activity/monitoring/session_manager.py | 77 | CODE | |
| LOW | app/activity/monitoring/session_manager.py | 134 | CODE | |
| LOW | app/activity/monitoring/session_manager.py | 538 | CODE | |
| LOW | app/activity/monitoring/collectors/audiobookshelf.py | 164 | CODE | |
| LOW | app/activity/monitoring/collectors/emby.py | 22 | CODE | |
| LOW | app/activity/monitoring/collectors/emby.py | 54 | CODE | |
| LOW | app/activity/monitoring/collectors/polling.py | 38 | CODE | |
| LOW | app/activity/monitoring/collectors/jellyfin.py | 21 | CODE | |
| LOW | app/activity/monitoring/collectors/jellyfin.py | 53 | CODE | |
| LOW | app/utils/session_cache.py | 127 | CODE | |
| LOW | app/scripts/cleanup_unknown_activity.py | 26 | CODE | |
| LOW | app/scripts/migrate_libraries.py | 23 | CODE | |
| LOW | app/services/invites.py | 68 | CODE | |
| LOW | app/services/wizard_export_import.py | 355 | CODE | |
| LOW | app/services/servers.py | 23 | CODE | |
| LOW | app/services/invitation_manager.py | 91 | CODE | |
| LOW | app/services/expiry.py | 167 | CODE | |
| LOW | app/services/library_scanner.py | 21 | CODE | |
| LOW | app/services/wizard_widgets.py | 156 | CODE | |
| LOW | app/services/wizard_widgets.py | 204 | CODE | |
| LOW | app/services/notifications.py | 134 | CODE | |
| LOW | app/services/image_proxy.py | 234 | CODE | |
| LOW | app/services/activity/ingestion.py | 32 | CODE | |
| LOW | app/services/activity/maintenance.py | 87 | CODE | |
| LOW | app/services/activity/maintenance.py | 146 | CODE | |
| LOW | app/services/activity/analytics.py | 132 | CODE | |
| LOW | app/services/historical/utils.py | 48 | CODE | |
| LOW | …rvices/historical/importers/audiobookshelf_importer.py | 20 | CODE | |
| LOW | app/services/historical/importers/jellyfin_importer.py | 25 | CODE | |
| LOW | app/services/historical/importers/plex_importer.py | 21 | CODE | |
| LOW | app/services/historical/importers/plex_importer.py | 286 | CODE | |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/blueprints/api_keys/__init__.py | 1 | CODE | |
| LOW | app/blueprints/wizard_admin/routes.py | 1 | CODE | |
| LOW | app/blueprints/media_common/__init__.py | 3 | CODE | |
| LOW | app/blueprints/api/__init__.py | 1 | CODE | |
| LOW | app/blueprints/api/__init__.py | 2 | CODE | |
| LOW | app/activity/__init__.py | 8 | CODE | |
| LOW | app/activity/__init__.py | 16 | CODE | |
| LOW | app/activity/__init__.py | 16 | CODE | |
| LOW | app/activity/__init__.py | 17 | CODE | |
| LOW | app/activity/monitoring/collectors/__init__.py | 11 | CODE | |
| LOW | app/activity/monitoring/collectors/__init__.py | 12 | CODE | |
| LOW | app/activity/monitoring/collectors/__init__.py | 13 | CODE | |
| LOW | app/activity/monitoring/collectors/__init__.py | 14 | CODE | |
| LOW | app/scripts/cleanup_unknown_activity.py | 15 | CODE | |
| LOW | app/services/wizard_export_import.py | 3 | CODE | |
| LOW | app/services/wizard_seed.py | 1 | CODE | |
| LOW | app/services/activity/ingestion.py | 8 | CODE | |
| LOW | app/services/activity/identity_resolution.py | 5 | CODE | |
| LOW | app/services/activity/maintenance.py | 7 | CODE | |
| LOW | app/services/activity/__init__.py | 8 | CODE | |
| LOW | app/services/activity/queries.py | 9 | CODE | |
| LOW | app/services/activity/analytics.py | 7 | CODE | |
| LOW | app/services/ldap/invitation_ldap.py | 9 | CODE | |
| LOW | app/services/historical/importers/__init__.py | 3 | CODE | |
| LOW | app/services/historical/importers/__init__.py | 6 | CODE | |
| LOW | app/services/historical/importers/__init__.py | 9 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 8 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 9 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 9 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 9 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 10 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 11 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 11 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 11 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 11 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 17 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 17 | CODE | |
| LOW | app/services/invitation_flow/__init__.py | 17 | CODE | |
| LOW | app/services/media/navidrome.py | 1 | CODE | |
| LOW | app/services/media/__init__.py | 9 | CODE | |
| LOW | app/services/media/__init__.py | 10 | CODE | |
| LOW | app/services/media/__init__.py | 11 | CODE | |
| LOW | app/services/media/__init__.py | 12 | CODE | |
| LOW | app/services/media/__init__.py | 13 | CODE | |
| LOW | app/services/media/__init__.py | 14 | CODE | |
| LOW | app/services/media/__init__.py | 15 | CODE | |
| LOW | app/services/media/__init__.py | 16 | CODE | |
| LOW | app/services/media/__init__.py | 19 | CODE | |
| LOW | app/services/media/client_base.py | 11 | CODE | |
| LOW | app/services/media/audiobookshelf.py | 1 | CODE | |
| LOW | app/services/media/kavita.py | 24 | CODE | |
| LOW | app/services/media/komga.py | 6 | CODE | |
| LOW | app/services/media/romm.py | 1 | CODE | |
| LOW | tests/test_wizard_require_interaction.py | 1 | CODE | |
| LOW | tests/test_wizard_reset.py | 7 | CODE | |
| LOW | tests/test_wizard_seed.py | 8 | CODE | |
| LOW | scripts/migration_doctor.py | 18 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/__init__.py | 24 | # Step 1: Configure logging | COMMENT |
| LOW⚡ | app/__init__.py | 29 | # Step 2: Create Flask application | COMMENT |
| LOW⚡ | app/__init__.py | 35 | # Step 3: Initialize extensions | COMMENT |
| LOW⚡ | app/__init__.py | 40 | # Step 4: Register blueprints | COMMENT |
| LOW⚡ | app/__init__.py | 68 | # Step 5: Setup context processors and filters | COMMENT |
| LOW⚡ | app/__init__.py | 88 | # Step 6: Initialize wizard steps | COMMENT |
| LOW⚡ | app/__init__.py | 102 | # Step 7: Run wizard migrations | COMMENT |
| LOW⚡ | app/__init__.py | 118 | # Step 8: Scan libraries for all media servers | COMMENT |
| LOW⚡ | app/__init__.py | 143 | # Step 9: Initialize Plus features if enabled | COMMENT |
| LOW⚡ | app/__init__.py | 174 | # Step 10: Show scheduler status and complete startup | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 544 | // Step 1: Prepare form screen (hidden initially) | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 553 | // Step 2: Create timeline animation with Anime.js | COMMENT |
| LOW | app/services/servers.py | 194 | # Step 1: Use API key to get JWT token | COMMENT |
| LOW | app/services/servers.py | 208 | # Step 2: Use JWT token to test library access | COMMENT |
| LOW⚡ | app/services/media/emby.py | 174 | # Step 1: Create user without password | COMMENT |
| LOW⚡ | app/services/media/emby.py | 178 | # Step 2: Set password | COMMENT |
| LOW | app/services/media/drop.py | 178 | # Step 1: Create invitation | COMMENT |
| LOW | app/services/media/drop.py | 198 | # Step 2: Consume invitation to create user | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 89 | # Step 1: Access invitation link /j/<code> | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 101 | # Step 2: View pre-wizard steps | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 106 | # Step 3: Complete pre-wizard (navigate to last step) | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 111 | # Step 4: Access join page (should now be allowed) | COMMENT |
| LOW | tests/test_migrations.py | 235 | # Step 1: Migrate to the latest release version state | COMMENT |
| LOW⚡ | tests/test_migrations.py | 257 | # Step 2: Upgrade from release version to current HEAD | COMMENT |
| LOW⚡ | tests/test_migrations.py | 260 | # Step 3: Verify the upgrade succeeded and all current tables exist | COMMENT |
| LOW⚡ | tests/test_wizard_start_redirect.py | 122 | # NOTE: The following tests for invite code redirect are commented out | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/__init__.py | 24 | # Step 1: Configure logging | COMMENT |
| LOW⚡ | app/__init__.py | 29 | # Step 2: Create Flask application | COMMENT |
| LOW⚡ | app/__init__.py | 35 | # Step 3: Initialize extensions | COMMENT |
| LOW⚡ | app/__init__.py | 40 | # Step 4: Register blueprints | COMMENT |
| LOW⚡ | app/__init__.py | 68 | # Step 5: Setup context processors and filters | COMMENT |
| LOW⚡ | app/__init__.py | 88 | # Step 6: Initialize wizard steps | COMMENT |
| LOW⚡ | app/__init__.py | 102 | # Step 7: Run wizard migrations | COMMENT |
| LOW⚡ | app/__init__.py | 118 | # Step 8: Scan libraries for all media servers | COMMENT |
| LOW⚡ | app/__init__.py | 143 | # Step 9: Initialize Plus features if enabled | COMMENT |
| LOW⚡ | app/__init__.py | 174 | # Step 10: Show scheduler status and complete startup | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 544 | // Step 1: Prepare form screen (hidden initially) | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 553 | // Step 2: Create timeline animation with Anime.js | COMMENT |
| LOW | app/services/servers.py | 194 | # Step 1: Use API key to get JWT token | COMMENT |
| LOW | app/services/servers.py | 208 | # Step 2: Use JWT token to test library access | COMMENT |
| LOW⚡ | app/services/media/emby.py | 174 | # Step 1: Create user without password | COMMENT |
| LOW⚡ | app/services/media/emby.py | 178 | # Step 2: Set password | COMMENT |
| LOW | app/services/media/drop.py | 178 | # Step 1: Create invitation | COMMENT |
| LOW | app/services/media/drop.py | 198 | # Step 2: Consume invitation to create user | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 89 | # Step 1: Access invitation link /j/<code> | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 101 | # Step 2: View pre-wizard steps | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 106 | # Step 3: Complete pre-wizard (navigate to last step) | COMMENT |
| LOW⚡ | tests/test_invitation_flow_integration.py | 111 | # Step 4: Access join page (should now be allowed) | COMMENT |
| LOW | tests/test_migrations.py | 235 | # Step 1: Migrate to the latest release version state | COMMENT |
| LOW⚡ | tests/test_migrations.py | 257 | # Step 2: Upgrade from release version to current HEAD | COMMENT |
| LOW⚡ | tests/test_migrations.py | 260 | # Step 3: Verify the upgrade succeeded and all current tables exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/tasks/ldap_sync.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/blueprints/api_keys/__init__.py | 3 | __all__ = ["api_keys_bp"] | CODE |
| LOW | app/blueprints/media_common/__init__.py | 5 | __all__ = ["register_media_blueprints"] | CODE |
| LOW | app/blueprints/api/__init__.py | 4 | __all__ = ["api_bp", "status_bp"] | CODE |
| LOW | app/activity/__init__.py | 76 | __all__ = ["ActivityService", "ActivitySession", "ActivitySnapshot", "init_app"] | CODE |
| LOW | app/activity/monitoring/collectors/__init__.py | 16 | __all__ = [ | CODE |
| LOW | app/services/ombi_client.py | 8 | __all__ = [ | CODE |
| LOW | app/services/wizard_presets.py | 9 | __all__ = ["WizardPreset", "create_step_from_preset", "get_available_presets"] | CODE |
| LOW | app/services/wizard_migration.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/services/library_scanner.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/services/notifications.py | 11 | __all__ = ["notify"] | CODE |
| LOW | app/services/activity/ingestion.py | 490 | __all__ = ["ActivityIngestionService"] | CODE |
| LOW | app/services/activity/maintenance.py | 255 | __all__ = ["ActivityMaintenanceService"] | CODE |
| LOW | app/services/activity/__init__.py | 78 | __all__ = ["ActivityService"] | CODE |
| LOW | app/services/activity/analytics.py | 486 | __all__ = ["ActivityAnalyticsService"] | CODE |
| LOW | app/services/ldap/client.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/services/ldap/user_sync.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/services/ldap/invitation_ldap.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | app/services/historical/__init__.py | 239 | def _update_job(job_id: int, **fields) -> None: | CODE |
| LOW | app/services/historical/__init__.py | 442 | __all__ = ["HistoricalDataService"] | CODE |
| LOW | app/services/historical/importers/__init__.py | 11 | __all__ = [ | CODE |
| LOW | app/services/invitation_flow/__init__.py | 19 | __all__ = [ | CODE |
| LOW | app/services/companions/__init__.py | 14 | __all__ = [ | CODE |
| LOW | app/services/media/plex.py | 513 | def update_user(self, info: dict, form: dict) -> None: | CODE |
| LOW | app/services/media/emby.py | 200 | def _set_specific_folders(self, user_id: str, names: list[str]) -> None: | CODE |
| LOW⚡ | app/services/media/komga.py | 371 | def _set_library_access(self, user_id: str, library_ids: list[str]) -> None: | CODE |
| LOW | app/services/media/jellyfin.py | 78 | def set_policy(self, user_id: str, policy: dict) -> None: | CODE |
| LOW | app/services/media/jellyfin.py | 473 | def _set_specific_folders(self, user_id: str, names: list[str]) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/forms/ldap.py | 14 | render_kw={"placeholder": "ldap://ldap.example.com:389"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 25 | render_kw={"placeholder": "cn=wizarr,ou=people,dc=example,dc=com"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 35 | render_kw={"placeholder": "ou=people,dc=example,dc=com"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 41 | render_kw={"placeholder": "(uid={username})"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 47 | render_kw={"placeholder": "uid"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 53 | render_kw={"placeholder": "mail"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 60 | render_kw={"placeholder": "inetOrgPerson"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 67 | render_kw={"placeholder": "ou=groups,dc=example,dc=com"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 73 | render_kw={"placeholder": "groupOfUniqueNames"}, | CODE |
| LOW⚡ | app/forms/ldap.py | 79 | render_kw={"placeholder": "uniqueMember"}, | CODE |
| LOW | app/forms/api_keys.py | 15 | render_kw={"placeholder": "Enter a descriptive name for this API key"}, | CODE |
| LOW | tests/test_ldap_admin_auth.py | 55 | "mail": "admin@example.com", | CODE |
| LOW | tests/test_ldap_admin_auth.py | 73 | assert admin.email == "admin@example.com" | CODE |
| LOW | tests/test_ldap_admin_auth.py | 117 | "mail": "user@example.com", | CODE |
| LOW | tests/test_invitation_form_errors.py | 50 | "email": "user@example.com", | CODE |
| LOW | tests/test_join_form_validation.py | 9 | "email": "user@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/jinja_filters.py | 124 | # If we can't parse it, just return the original truncated string | COMMENT |
| MEDIUM | app/blueprints/media_servers/routes.py | 383 | """Return comprehensive statistics for a specific media server.""" | STRING |
| MEDIUM | app/templates/user-plex-login.html | 289 | // Populate each row with posters - ensure seamless repetition | COMMENT |
| MEDIUM | app/services/media/client_base.py | 424 | """Return comprehensive server statistics including library counts, user activity, etc. | STRING |
| MEDIUM | app/services/media/audiobookshelf.py | 992 | # Try to leverage the preview/thumbnail endpoint if the server | COMMENT |
| MEDIUM | tests/test_server_name_resolver.py | 155 | """Test comprehensive display name info function.""" | STRING |
| MEDIUM | .github/workflows/auto-release.yml | 81 | # Group commits by type with comprehensive detection | COMMENT |
| MEDIUM | .github/actions/calver-automation/action.sh | 136 | # Group commits by type with more comprehensive detection | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/blueprints/api/models.py | 146 | description="Days until invitation expires (1, 7, 30, or null)", | CODE |
| HIGH | tests/e2e/test_invitation_e2e.py | 560 | "document.activeElement.name || document.activeElement.getAttribute('name')" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/services/wizard_presets.py | 85 | Create wizard step content from a preset template. Args: preset_id: ID of the preset to use **kwarg | STRING |
| HIGH | app/services/media/plex_custom.py | 11 | Accept a Plex server invitation using the v2 shared_servers API. This replaces the broken acceptInvite() method in | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/test_ldap_client.py | 49 | from ldap3.core.exceptions import LDAPBindError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/services/wizard_seed.py | 81 | # ─── Guard: table might not exist (first run before migrations) ───────── | COMMENT |
| LOW | tests/test_wizard_start_redirect.py | 121 | COMMENT |