Wizarr is an advanced user invitation and management system for Jellyfin, Plex, Emby etc.
This report summarizes scanner evidence for wizarrrr/wizarr, a Python project with 3,220 GitHub stars. SynthScan examined 86,557 lines of code across 451 source files, recording 1984 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 35.3 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1078 finding(s).
Are imports declared and package/API names verified? 78 finding(s).
Are wrappers, guards, and repeated structures necessary? 1620 finding(s).
Which changes need focused human review? 1984 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1984 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models.py | 284 | def update_standardized_metadata(self, details): | CODE |
| LOW | app/extensions.py | 250 | def _configure_sqlite_for_concurrency(app): | CODE |
| LOW | app/jinja_filters.py | 29 | def _zone_from_localtime_link(): | CODE |
| LOW | app/tasks/maintenance.py | 59 | def _get_expiry_check_interval(): | CODE |
| LOW | app/tasks/activity.py | 27 | def cleanup_old_activity_task(app: Flask, retention_days: int = 90): | CODE |
| LOW | app/tasks/activity.py | 82 | def monitor_health_check_task(app: Flask): | CODE |
| LOW | app/tasks/activity.py | 149 | def activity_monitoring_heartbeat_task(app: Flask): | CODE |
| LOW⚡ | app/tasks/activity.py | 195 | def recover_sessions_on_startup_task(app: Flask): | CODE |
| LOW⚡ | app/tasks/activity.py | 222 | def get_activity_cleanup_interval() -> int: | CODE |
| LOW⚡ | app/tasks/activity.py | 228 | def get_stale_session_cleanup_interval() -> int: | CODE |
| LOW⚡ | app/tasks/activity.py | 234 | def get_health_check_interval() -> int: | CODE |
| LOW⚡ | app/tasks/activity.py | 303 | def activity_tasks_registered(scheduler) -> bool: | CODE |
| LOW⚡ | app/tasks/activity.py | 308 | def unregister_activity_tasks(scheduler) -> None: | CODE |
| LOW | app/tasks/activity.py | 322 | def reconcile_activity_tracking_task(app: Flask) -> bool: | CODE |
| LOW | app/tasks/activity.py | 330 | def register_activity_tracking_reconcile_task(app: Flask, scheduler) -> None: | CODE |
| LOW | app/blueprints/wizard/routes.py | 257 | def _gather_steps_with_phases( | CODE |
| LOW | app/blueprints/wizard/routes.py | 450 | def _get_server_type_from_invitation(invitation: Invitation) -> str | None: | STRING |
| LOW | app/blueprints/admin/routes.py | 936 | 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 | 37 | 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/forms/connections.py | 41 | def validate_enable_watchlist_sync(self, field): | CODE |
| LOW | app/activity/tracking.py | 21 | def is_activity_tracking_enabled() -> bool: | CODE |
| LOW | app/activity/tracking.py | 35 | def set_activity_tracking_enabled(enabled: bool) -> None: | CODE |
| LOW | app/activity/tracking.py | 109 | def reconcile_activity_tracking( | CODE |
| LOW | app/activity/api/blueprint.py | 61 | def _activity_settings_template() -> str: | CODE |
| LOW | app/activity/api/blueprint.py | 89 | def _load_verified_media_servers() -> list: | CODE |
| LOW | app/activity/api/blueprint.py | 107 | def _render_activity_settings( | CODE |
| LOW | app/activity/api/blueprint.py | 144 | def _settings_action_response( | CODE |
| LOW | app/activity/api/blueprint.py | 177 | def _render_historical_jobs_partial(server_id: int | None): | CODE |
| LOW | app/activity/api/blueprint.py | 197 | def _delete_all_activity_data() -> int: | CODE |
| LOW | app/activity/api/blueprint.py | 671 | def import_historical_activity(): | CODE |
| LOW | app/activity/api/blueprint.py | 738 | 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 | 301 | function toggleHistoricalImportAvailability() { | CODE |
| LOW | app/activity/templates/activity/settings_tab.html | 322 | 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 | 479 | function revealFormWithoutAnimation() { | CODE |
| LOW | app/templates/tables/invite_card.html | 223 | function updateInviteCardSelection() { | CODE |
| LOW | app/services/ombi_client.py | 29 | def get_connection_for_server( | CODE |
| LOW | app/services/ombi_client.py | 38 | def invite_user_to_connections( | CODE |
| LOW | app/services/ombi_client.py | 91 | def has_plex_provisioning_connections(server_id: int) -> bool: | CODE |
| LOW | app/services/ombi_client.py | 101 | def provision_plex_user_on_connections(auth_token: str, server_id: int) -> list[dict]: | CODE |
| LOW | app/services/ombi_client.py | 176 | def delete_user_from_connections(internal_token: str) -> list[dict]: | CODE |
| LOW | app/services/cloudflare_access.py | 47 | def _reload_user_each_request(): | 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 |
| 732 more matches not shown… | ||||
| 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 | 597 | # ── convenience helpers ───────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 612 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 614 | # ─────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 1128 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/models.py | 1130 | # ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/extensions.py | 189 | # ── legacy single-admin token ─────────────────────────────────────────── | COMMENT |
| MEDIUM | app/extensions.py | 193 | # ── new multi-admin accounts ─────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/settings/routes.py | 344 | # ──────────────────────────────────────────────────────────────────────────── | STRING |
| MEDIUM | app/blueprints/settings/routes.py | 346 | # ──────────────────────────────────────────────────────────────────────────── | 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 | 62 | # ── Handle LDAP authentication ───────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/auth/routes.py | 79 | # ── 1) Multi-admin accounts (preferred) ──────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/auth/routes.py | 179 | # ── Logout ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/setup/routes.py | 48 | # ── Step 1: create admin account ─────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 86 | # ─── helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 145 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 152 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 205 | # ─── 1) DB-backed steps ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 247 | # ─── 2) Fallback to bundled markdown files ───────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 941 | # ─── combined wizard for multi-server invites ───────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 1106 | # ─── bundle-specific wizard route ────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/wizard/routes.py | 526 | # ─── routes ───────────────────────────────────────────────────── | STRING |
| MEDIUM | app/blueprints/wizard/routes.py | 1318 | # ─── bundle preview route (admin) ────────────────────────────── | STRING |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 318 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 320 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 324 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 326 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 331 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 333 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 419 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 421 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 430 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | app/blueprints/admin/routes.py | 432 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 239 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 241 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 269 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 271 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 587 | # ── GET → serve the enhanced modal with server information ──────── | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1166 | # ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1357 | # ---------------------- | COMMENT |
| MEDIUM | app/blueprints/admin/routes.py | 1362 | # ---------------------- | COMMENT |
| 153 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 | 112 | except Exception as e: | CODE |
| LOW | gunicorn.conf.py | 129 | except Exception as e: | CODE |
| LOW | gunicorn.conf.py | 166 | 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 | 83 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 99 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 120 | except Exception as exc: | CODE |
| LOW⚡ | app/__init__.py | 153 | 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 | 162 | except Exception as e: | CODE |
| LOW | app/extensions.py | 277 | except Exception: | CODE |
| LOW | app/jinja_filters.py | 47 | except Exception as exc: | CODE |
| LOW | app/jinja_filters.py | 65 | except Exception as exc: | CODE |
| LOW | app/jinja_filters.py | 78 | except Exception as exc: | CODE |
| LOW | app/jinja_filters.py | 85 | except Exception: | CODE |
| LOW | app/jinja_filters.py | 242 | 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 | 49 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 77 | except Exception as e: | CODE |
| LOW | app/tasks/activity.py | 144 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 183 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 190 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 217 | except Exception as e: | CODE |
| LOW⚡ | app/tasks/activity.py | 299 | except Exception as e: | CODE |
| LOW | app/blueprints/settings/routes.py | 60 | except Exception: | CODE |
| LOW | app/blueprints/settings/routes.py | 218 | except Exception as exc: | CODE |
| LOW | app/blueprints/settings/routes.py | 313 | 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 | 119 | except Exception as exc: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 136 | except Exception as exc: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 342 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 377 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 424 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 471 | except Exception as e: | CODE |
| LOW | app/blueprints/media_servers/routes.py | 519 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 212 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 325 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 716 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 732 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 743 | except Exception as e: | CODE |
| LOW | app/blueprints/wizard/routes.py | 768 | except Exception as e: | CODE |
| 444 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 |
| 16 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 | 1294 | # Create a dict to attach timestamps and sort users to match the pagination order | COMMENT |
| MEDIUM | app/blueprints/connections/routes.py | 178 | # 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 | 1366 | # Create the user on any request system that asked for it, while we | COMMENT |
| MEDIUM | app/services/media/plex.py | 1472 | # 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 | 47 | # Set environment to indicate Gunicorn context | COMMENT |
| LOW | app/models.py | 979 | # Check if critical fields are Unknown | COMMENT |
| LOW⚡ | app/__init__.py | 132 | # 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 | 121 | # Check if a MediaServer already exists | COMMENT |
| LOW | app/blueprints/settings/routes.py | 557 | # 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 | 83 | # Check if this account has passkeys registered - if so, require 2FA | COMMENT |
| LOW | app/blueprints/auth/routes.py | 147 | # Check if there are any passkeys registered for error page | COMMENT |
| LOW | app/blueprints/auth/routes.py | 162 | # Check if there are any passkeys registered for error page | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 76 | # Check if this is coming from an invitation process | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 727 | # Check if this is a multi-server invitation | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 823 | # Check if user is trying to advance past the final step | COMMENT |
| LOW | app/blueprints/wizard/routes.py | 1027 | # Check if we're on the last step and moving forward | COMMENT |
| LOW⚡ | app/blueprints/wizard/routes.py | 569 | # Check if this is a multi-server invitation | STRING |
| LOW | app/blueprints/wizard/routes.py | 638 | # Check if user is trying to advance beyond the final step | STRING |
| LOW | app/blueprints/connections/routes.py | 165 | # Check if it's just a CSRF error | 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 | 107 | # 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 | 268 | # 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 | 40 | # 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 | 439 | # 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 | 200 | # Check if there are other User records with the same username | COMMENT |
| LOW | app/services/media/service.py | 282 | # Check if user has other accounts | COMMENT |
| 17 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 | 42 | CODE | |
| LOW | app/__init__.py | 12 | CODE | |
| LOW | app/jinja_filters.py | 161 | CODE | |
| LOW | app/tasks/update_check.py | 16 | CODE | |
| LOW | app/tasks/maintenance.py | 9 | CODE | |
| LOW | app/tasks/activity.py | 82 | CODE | |
| LOW | app/tasks/activity.py | 149 | 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 | 65 | CODE | |
| LOW | app/blueprints/wizard/routes.py | 682 | CODE | |
| LOW | app/blueprints/admin/routes.py | 229 | CODE | |
| LOW | app/blueprints/admin/routes.py | 483 | CODE | |
| LOW | app/blueprints/admin/routes.py | 1092 | CODE | |
| LOW | app/blueprints/admin/routes.py | 1320 | CODE | |
| LOW | app/blueprints/public/routes.py | 134 | CODE | |
| LOW | app/blueprints/public/routes.py | 378 | CODE | |
| LOW | app/blueprints/public/routes.py | 518 | 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 | 295 | CODE | |
| LOW | app/activity/api/blueprint.py | 587 | CODE | |
| LOW | app/activity/monitoring/monitor.py | 101 | 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/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 | 185 | CODE | |
| LOW | app/services/wizard_widgets.py | 142 | CODE | |
| LOW | app/services/wizard_widgets.py | 190 | CODE | |
| LOW | app/services/notifications.py | 134 | CODE | |
| LOW | app/services/image_proxy.py | 401 | 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 | |
| LOW | app/services/invitation_flow/workflows.py | 121 | CODE | |
| 33 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 | 15 | CODE | |
| LOW | app/activity/__init__.py | 15 | CODE | |
| LOW | app/activity/__init__.py | 16 | CODE | |
| LOW | app/activity/tracking.py | 3 | 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 | 23 | CODE | |
| LOW | app/services/media/komga.py | 5 | 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 | 73 | # Step 6: Initialize wizard steps | COMMENT |
| LOW⚡ | app/__init__.py | 87 | # Step 7: Run wizard migrations | COMMENT |
| LOW⚡ | app/__init__.py | 103 | # Step 8: Scan libraries for all media servers | COMMENT |
| LOW⚡ | app/__init__.py | 128 | # Step 9: Initialize Plus features if enabled | COMMENT |
| LOW⚡ | app/__init__.py | 159 | # Step 10: Show scheduler status and complete startup | COMMENT |
| LOW | app/__init__.py | 53 | # Step 5: Setup context processors and filters | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 535 | // Step 1: Prepare form screen (hidden initially) | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 544 | // 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 | 190 | # Step 1: Create user without password | COMMENT |
| LOW⚡ | app/services/media/emby.py | 194 | # Step 2: Set password | COMMENT |
| LOW | app/services/media/drop.py | 188 | # Step 1: Create invitation | COMMENT |
| LOW | app/services/media/drop.py | 208 | # 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 | 297 | # Step 1: Migrate to the latest release version state | COMMENT |
| LOW⚡ | tests/test_migrations.py | 319 | # Step 2: Upgrade from release version to current HEAD | COMMENT |
| LOW⚡ | tests/test_migrations.py | 322 | # 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 | 73 | # Step 6: Initialize wizard steps | COMMENT |
| LOW⚡ | app/__init__.py | 87 | # Step 7: Run wizard migrations | COMMENT |
| LOW⚡ | app/__init__.py | 103 | # Step 8: Scan libraries for all media servers | COMMENT |
| LOW⚡ | app/__init__.py | 128 | # Step 9: Initialize Plus features if enabled | COMMENT |
| LOW⚡ | app/__init__.py | 159 | # Step 10: Show scheduler status and complete startup | COMMENT |
| LOW | app/__init__.py | 53 | # Step 5: Setup context processors and filters | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 535 | // Step 1: Prepare form screen (hidden initially) | COMMENT |
| LOW⚡ | app/templates/welcome-jellyfin.html | 544 | // 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 | 190 | # Step 1: Create user without password | COMMENT |
| LOW⚡ | app/services/media/emby.py | 194 | # Step 2: Set password | COMMENT |
| LOW | app/services/media/drop.py | 188 | # Step 1: Create invitation | COMMENT |
| LOW | app/services/media/drop.py | 208 | # 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 | 297 | # Step 1: Migrate to the latest release version state | COMMENT |
| LOW⚡ | tests/test_migrations.py | 319 | # Step 2: Upgrade from release version to current HEAD | COMMENT |
| LOW⚡ | tests/test_migrations.py | 322 | # Step 3: Verify the upgrade succeeded and all current tables exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/blueprints/public/routes.py | 587 | except ValueError: | CODE |
| HIGH | app/utils/session_cache.py | 106 | except FileNotFoundError: | CODE |
| HIGH | tests/conftest.py | 170 | except Exception: | CODE |
| HIGH | tests/e2e/test_ldap_admin_login_e2e.py | 48 | except Exception: | CODE |
| HIGH | tests/e2e/test_ldap_admin_login_e2e.py | 164 | except Exception: | CODE |
| HIGH | tests/e2e/test_ldap_admin_login_e2e.py | 216 | except Exception: | CODE |
| 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 | 68 | __all__ = ["ActivityService", "ActivitySession", "ActivitySnapshot", "init_app"] | CODE |
| LOW | app/activity/tracking.py | 35 | def set_activity_tracking_enabled(enabled: bool) -> None: | 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 | 13 | 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 | 538 | def update_user(self, info: dict, form: dict) -> None: | CODE |
| LOW | app/services/media/emby.py | 222 | def _set_specific_folders(self, user_id: str, names: list[str]) -> None: | CODE |
| LOW⚡ | app/services/media/komga.py | 380 | def _set_library_access(self, user_id: str, library_ids: list[str]) -> None: | CODE |
| LOW | app/services/media/jellyfin.py | 81 | def set_policy(self, user_id: str, policy: dict) -> None: | CODE |
| LOW | app/services/media/jellyfin.py | 480 | 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 |
| LOW | tests/test_cloudflare_access_auth.py | 38 | "email": "admin@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/jinja_filters.py | 182 | # If we can't parse it, just return the original truncated string | COMMENT |
| MEDIUM | app/blueprints/media_servers/routes.py | 322 | """Return comprehensive statistics for a specific media server.""" | STRING |
| MEDIUM | app/templates/user-plex-login.html | 294 | // Populate each row with posters - ensure seamless repetition | COMMENT |
| MEDIUM | app/services/media/client_base.py | 474 | """Return comprehensive server statistics including library counts, user activity, etc. | STRING |
| MEDIUM | app/services/media/audiobookshelf.py | 999 | # 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/blueprints/admin/routes.py | 241 | # ------------------------------------------------------------------ | COMMENT |
| LOW | app/blueprints/admin/routes.py | 1241 | # fall back to the association table and treat any row with | COMMENT |
| LOW | app/static/js/plex-oauth.js | 1 | // Shared state for the Plex OAuth sign-in flow. | COMMENT |
| LOW | app/templates/plex-oauth-callback.html | 61 | stop("{{ _('Nothing to finish') }}", | COMMENT |
| LOW | app/services/invites.py | 101 | COMMENT | |
| 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 |