Music Assistant is a free, opensource Media library manager that connects to your streaming services and a wide range of connected speakers. The server is the beating heart, the core of Music Assistant and must run on an always-on device like a Raspberry Pi, a NAS or an Intel NUC or alike.
This report presents the forensic synthetic code analysis of music-assistant/server, a Python project with 2,873 GitHub stars. SynthScan v2.0 examined 450,041 lines of code across 1586 source files, recording 9613 pattern matches distributed across 24 syntactic categories. The overall adjusted score of 30.4 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).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
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 9613 distinct pattern matches across 24 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 22 | def isolate_models_global_cache() -> Generator[None]: | CODE |
| LOW⚡ | tests/test_library_sync.py | 821 | async def test_set_provider_mappings_upsert_preserves_null_in_library( | CODE |
| LOW | tests/test_library_sync.py | 91 | async def test_add_item_to_library_sets_in_library_true() -> None: | CODE |
| LOW | tests/test_library_sync.py | 125 | async def test_add_item_to_library_sets_in_library_even_when_sync_back_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 159 | async def test_add_item_to_library_sets_in_library_even_when_edit_not_supported() -> None: | CODE |
| LOW | tests/test_library_sync.py | 191 | async def test_add_album_imports_tracks_when_enabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 230 | async def test_add_album_does_not_import_tracks_when_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 262 | async def test_add_album_only_imports_tracks_for_added_instance() -> None: | CODE |
| LOW | tests/test_library_sync.py | 313 | async def test_refresh_item_preserves_in_library_state() -> None: | CODE |
| LOW | tests/test_library_sync.py | 357 | async def test_refresh_item_preserves_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 399 | async def test_refresh_item_respects_provider_set_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 443 | async def test_refresh_item_non_library_item_skips_update() -> None: | CODE |
| LOW | tests/test_library_sync.py | 477 | async def test_sync_library_marks_removed_item_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 528 | async def test_sync_library_deletions_disabled_keeps_item() -> None: | CODE |
| LOW | tests/test_library_sync.py | 572 | async def test_sync_library_deletion_unmarks_favorite_when_no_other_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 602 | async def test_sync_library_deletion_keeps_favorite_when_other_provider_has_it() -> None: | CODE |
| LOW | tests/test_library_sync.py | 643 | async def test_sync_library_always_stores_cache_regardless_of_deletion_setting() -> None: | CODE |
| LOW | tests/test_library_sync.py | 675 | def _create_controller_for_filter_tests() -> Mock: | CODE |
| LOW | tests/test_library_sync.py | 684 | async def test_apply_filters_in_library_only_without_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 711 | async def test_apply_filters_in_library_only_with_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 739 | async def test_apply_filters_no_in_library_filter_by_default() -> None: | CODE |
| LOW | tests/test_library_sync.py | 763 | async def test_apply_filters_provider_filter_without_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 805 | async def test_set_provider_mappings_overwrite_deletes_and_reinserts( | CODE |
| LOW | tests/test_library_sync.py | 842 | async def test_set_provider_mappings_upsert_writes_explicit_in_library( | CODE |
| LOW | tests/test_library_sync.py | 865 | async def test_library_items_default_filters_in_library_only() -> None: | CODE |
| LOW | tests/test_library_sync.py | 879 | async def test_library_items_defaults_to_summary() -> None: | CODE |
| LOW | tests/test_library_sync.py | 892 | def test_ensure_provider_filter_keeps_plugin_provider_mappings() -> None: | CODE |
| LOW | tests/test_library_sync.py | 913 | def test_ensure_provider_filter_rejects_unallowed_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 933 | def test_ensure_provider_filter_allows_explicit_non_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 952 | def test_ensure_provider_filter_does_not_auto_allow_other_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 975 | def test_select_provider_id_prefers_allowed_music_over_plugin() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1012 | def test_select_provider_id_falls_back_to_plugin_when_no_allowed_music() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1049 | async def test_get_library_item_does_not_filter_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1069 | async def test_update_item_in_library_skips_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1110 | def _create_event_capture_controller( | CODE |
| LOW | tests/test_library_sync.py | 1129 | async def test_add_and_update_item_emit_events_outside_sync() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1149 | async def test_provider_sync_suppresses_per_item_events() -> None: | CODE |
| LOW | tests/test_generate_release_notes.py | 117 | def test_linear_release_filters_prs_merged_before_previous_tag( | CODE |
| LOW | tests/test_generate_release_notes.py | 142 | def test_minor_release_with_diverged_previous_tag( | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 49 | async def test_update_playlist_metadata_processes_dynamic_playlists() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 83 | async def test_refresh_playlist_metadata_batch_query_excludes_dynamic_playlists() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 173 | async def test_sync_overwrites_name_for_noneditable_dynamic_playlist() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 188 | async def test_sync_overwrites_images_for_noneditable_dynamic_playlist() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 203 | async def test_sync_does_not_overwrite_editable_playlist_on_name_change() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 218 | async def test_sync_does_not_overwrite_noneditable_static_playlist_on_name_change() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 239 | async def test_sync_skips_update_when_noneditable_playlist_unchanged() -> None: | CODE |
| LOW | tests/common.py | 69 | def suppress_auto_loaded_providers() -> Iterator[None]: | CODE |
| LOW | tests/common.py | 89 | async def _create_builtin_provider_config_hermetic( | CODE |
| LOW | tests/test_webserver_auth.py | 98 | async def test_auth_manager_initialization(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 110 | async def test_has_users_initially_empty(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 165 | async def test_create_user_with_builtin_provider(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 185 | async def test_authenticate_with_password(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 245 | async def test_authenticate_with_token(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 434 | async def test_cannot_disable_own_account(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 464 | async def test_link_user_to_provider(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 494 | async def test_homeassistant_system_user(auth_manager: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_webserver_auth.py | 513 | async def test_homeassistant_system_user_token_stable_across_restarts( | CODE |
| LOW | tests/test_webserver_auth.py | 537 | async def test_homeassistant_system_user_token_reissued_when_invalid( | CODE |
| LOW | tests/test_webserver_auth.py | 557 | async def test_homeassistant_system_user_token_rotated_before_absolute_max( | CODE |
| LOW | tests/test_webserver_auth.py | 597 | async def test_homeassistant_system_user_token_cleans_up_expired_rows( | CODE |
| 5814 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/providers/sendspin/test_bridge_manager.py | 0 | return whether the bridge is registered with sendspin. | STRING |
| HIGH | …sic_assistant/providers/local_audio/sendspin_bridge.py | 0 | return whether the bridge is registered with sendspin. | STRING |
| HIGH | music_assistant/providers/chromecast/sendspin_bridge.py | 0 | return whether the bridge is registered with sendspin. | STRING |
| HIGH | music_assistant/providers/airplay/sendspin_bridge.py | 0 | return whether the bridge is registered with sendspin. | STRING |
| HIGH | music_assistant/providers/sendspin/bridge_manager.py | 0 | return whether the bridge is registered with sendspin. | STRING |
| HIGH | tests/controllers/music/test_artist_play_credit.py | 0 | create a single library provider mapping with a unique provider item id. | STRING |
| HIGH | …s/controllers/music/test_playback_speed_persistence.py | 0 | create a single library provider mapping with a unique provider item id. | STRING |
| HIGH | …ntrollers/player_queues/test_artist_track_selection.py | 0 | create a single library provider mapping with a unique provider item id. | STRING |
| HIGH | tests/controllers/music/test_music_migrations.py | 0 | create table if not exists {db_table_playlog}( [id] integer primary key autoincrement, [item_id] text not null, [provide | STRING |
| HIGH | music_assistant/controllers/music/migrations.py | 0 | create table if not exists {db_table_playlog}( [id] integer primary key autoincrement, [item_id] text not null, [provide | STRING |
| HIGH | music_assistant/controllers/music/database.py | 0 | create table if not exists {db_table_playlog}( [id] integer primary key autoincrement, [item_id] text not null, [provide | STRING |
| HIGH | tests/controllers/players/test_player_controller.py | 0 | return appropriate defaults for player config values. | STRING |
| HIGH | tests/controllers/players/test_protocol_linking.py | 0 | return appropriate defaults for player config values. | STRING |
| HIGH | tests/controllers/players/test_player_grouping.py | 0 | return appropriate defaults for player config values. | STRING |
| HIGH | music_assistant/providers/neteasecloudmusic/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/sonic_similarity/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/fastmcp_server/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/sonic_analysis/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/mpd/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/pandora/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/internet_archive/__init__.py | 0 | initialize provider instance with given configuration. | STRING |
| HIGH | music_assistant/providers/wiim/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/ambient_sounds/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/hass_players/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/local_audio/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/fully_kiosk/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/ytmusic/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/nts/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/vban_receiver/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | …c_assistant/providers/_demo_music_provider/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/bandcamp/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/sync_group/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/audiobookshelf/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/apple_music/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/theaudiodb/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/yandex_smarthome/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/bose_soundtouch/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/somafm/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/lrclib/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/airplay_receiver/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/wikipedia/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/zvuk_music/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/rain_mood/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/jellyfin/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/test/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/hass/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | …_assistant/providers/listenbrainz_scrobble/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/pocketcasts/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/phishin/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/party/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/genius_lyrics/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/musiccast/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/radioparadise/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/alexa/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/yousee/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | …ssistant/providers/filesystem_google_drive/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/tunein/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/fanarttv/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/motherearthradio/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| HIGH | music_assistant/providers/spotify/__init__.py | 0 | initialize provider(instance) with given configuration. | STRING |
| 427 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/apple_music/test_api_client.py | 76 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 78 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 145 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 178 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_notifier.py | 109 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_notifier.py | 111 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 67 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 135 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_handlers.py | 168 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_handlers.py | 170 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 230 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 243 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 245 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 378 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 380 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 125 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 230 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 232 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 252 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 254 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 410 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 412 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 513 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 515 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 154 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 156 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 195 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 197 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 289 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 291 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 752 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_direct.py | 754 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 93 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 152 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 154 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 235 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 377 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 379 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 456 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_auto_skill.py | 458 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 44 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 285 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 287 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 312 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 351 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 353 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 413 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_auto_skill.py | 415 | # --------------------------------------------------------------------------- | COMMENT |
| 580 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library_sync.py | 3 | CODE | |
| LOW | tests/test_generate_release_notes.py | 3 | CODE | |
| LOW | tests/test_dynamic_playlist_framework.py | 3 | CODE | |
| LOW | tests/test_cross_type_features.py | 3 | CODE | |
| LOW | tests/test_websocket_client.py | 3 | CODE | |
| LOW | tests/core/test_diagnostics.py | 3 | CODE | |
| LOW | tests/core/test_provider_unload.py | 3 | CODE | |
| LOW | tests/core/test_audio_analysis_failures.py | 3 | CODE | |
| LOW | tests/core/test_ci_test_scope.py | 3 | CODE | |
| LOW | tests/integration/test_library_summary_items.py | 12 | CODE | |
| LOW | tests/integration/test_background_scan_streaming.py | 3 | CODE | |
| LOW | tests/integration/test_dynamic_mode_e2e.py | 11 | CODE | |
| LOW | tests/integration/test_dynamic_mode_e2e.py | 23 | CODE | |
| LOW | tests/integration/test_dynamic_mode_e2e.py | 29 | CODE | |
| LOW | tests/integration/test_dynamic_mode_e2e.py | 29 | CODE | |
| LOW | tests/integration/conftest.py | 10 | CODE | |
| LOW | tests/integration/conftest.py | 23 | CODE | |
| LOW | tests/integration/test_demo_group_e2e.py | 9 | CODE | |
| LOW | tests/integration/test_no_change_resync.py | 10 | CODE | |
| LOW | tests/integration/test_smart_shuffle_e2e.py | 10 | CODE | |
| LOW | tests/integration/test_smart_shuffle_e2e.py | 26 | CODE | |
| LOW | tests/integration/test_smart_shuffle_e2e.py | 31 | CODE | |
| LOW | tests/integration/test_smart_shuffle_e2e.py | 31 | CODE | |
| LOW | tests/integration/test_radio_playlist_e2e.py | 9 | CODE | |
| LOW | tests/integration/test_radio_playlist_e2e.py | 18 | CODE | |
| LOW | tests/integration/test_radio_playlist_e2e.py | 21 | CODE | |
| LOW | tests/integration/test_managed_pool_e2e.py | 10 | CODE | |
| LOW | tests/integration/test_managed_pool_e2e.py | 27 | CODE | |
| LOW | tests/integration/test_managed_pool_e2e.py | 33 | CODE | |
| LOW | tests/integration/test_managed_pool_e2e.py | 33 | CODE | |
| LOW | tests/providers/neteasecloudmusic/test_image_urls.py | 3 | CODE | |
| LOW | tests/providers/sync_group/test_sync_group.py | 3 | CODE | |
| LOW | tests/providers/smart_fades/test_dbn_postprocessor.py | 3 | CODE | |
| LOW | tests/providers/smart_fades/test_provider.py | 3 | CODE | |
| LOW | tests/providers/smart_fades/test_helpers.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_basic.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_notifier.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_handlers.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_direct.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_auto_skill.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_auto_skill_ui.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_config_actions.py | 10 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_schema.py | 3 | CODE | |
| LOW | …ts/providers/yandex_smarthome/test_auto_skill_state.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_cloud.py | 3 | CODE | |
| LOW | tests/providers/yandex_smarthome/test_device.py | 3 | CODE | |
| LOW | tests/providers/bose_soundtouch/test_client.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_api_client.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_provider_browse.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_library.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_parsers.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_stream_details.py | 3 | CODE | |
| LOW | tests/providers/zvuk_music/test_stream_details.py | 5 | CODE | |
| LOW | tests/providers/zvuk_music/test_lyrics.py | 3 | CODE | |
| LOW | tests/providers/playlist_metadata/test_provider.py | 3 | CODE | |
| LOW | tests/providers/hass/test_provider.py | 3 | CODE | |
| LOW | tests/providers/party/test_party_plugin.py | 3 | CODE | |
| LOW | …sts/providers/filesystem_google_drive/test_provider.py | 3 | CODE | |
| LOW | tests/providers/spotify/test_setup.py | 3 | CODE | |
| LOW | tests/providers/spotify/test_auth.py | 11 | CODE | |
| 918 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/test_library_sync.py | 817 | mock_controller.mass.music.database.delete.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 818 | mock_controller.mass.music.database.upsert_many.assert_called_once() | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sound_effects.py | 78 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sound_effects.py | 150 | provider.mass.music.tracks.get_library_item_by_prov_id.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sound_effects.py | 175 | provider.mass.music.tracks.get_library_item_by_prov_id.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 95 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 102 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 109 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 126 | provider.mass.music.tracks.add_item_to_library.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 149 | provider.mass.music.tracks.add_item_to_library.assert_called_once() | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 162 | provider.mass.music.playlists.add_item_to_library.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 180 | provider.mass.music.playlists.add_item_to_library.assert_called_once() | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 203 | provider.mass.music.audiobooks.add_item_to_library.assert_called_once() | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 227 | provider.mass.music.podcasts.add_item_to_library.assert_called_once() | CODE |
| CRITICAL | tests/providers/plex/test_provider_methods.py | 802 | provider.mass.music.database.get_rows_from_query.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/plex/test_provider_methods.py | 830 | provider.mass.music.database.get_rows_from_query.assert_not_awaited() | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 94 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 111 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 161 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/tidal/test_streaming.py | 592 | provider_mock.mass.music.tracks.update_provider_mapping.assert_awaited_once() | CODE |
| CRITICAL⚡ | tests/providers/tidal/test_streaming.py | 593 | provider_mock.mass.music.tracks.update_provider_mapping.assert_awaited_with( | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 522 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 542 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 566 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL | …/controllers/streams/test_audio_analysis_controller.py | 616 | provider.mass.streams.audio_analysis.get_audio_analysis_version.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/controllers/player_queues/test_autoplay.py | 128 | queues.mass.music.tracks.library_items.assert_awaited_once() | CODE |
| CRITICAL | tests/controllers/metadata/test_enrichment.py | 62 | enrichment.mass.music.albums.update_item_in_library.assert_awaited_once() | CODE |
| CRITICAL | …rollers/metadata/test_playlist_metadata_integration.py | 225 | enrichment.mass.music.playlists.update_item_in_library.assert_called_once() | CODE |
| CRITICAL | music_assistant/providers/apple_music/api_client.py | 218 | locale = self.provider.mass.metadata.locale.replace("_", "-") | CODE |
| CRITICAL⚡ | music_assistant/providers/msx_bridge/http_server.py | 593 | self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL⚡ | music_assistant/providers/msx_bridge/http_server.py | 812 | albums = await self.provider.mass.music.artists.albums(item_id, "library") | CODE |
| CRITICAL⚡ | music_assistant/providers/msx_bridge/http_server.py | 839 | t async for t in self.provider.mass.music.playlists.tracks(item_id, "library") | CODE |
| CRITICAL⚡ | music_assistant/providers/msx_bridge/http_server.py | 880 | await self.provider.mass.music.albums.tracks(item_id, provider_name) | CODE |
| CRITICAL⚡ | music_assistant/providers/msx_bridge/http_server.py | 903 | t async for t in self.provider.mass.music.playlists.tracks(item_id, "library") | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 464 | self.provider.mass.music.albums.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 495 | self.provider.mass.music.artists.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 524 | self.provider.mass.music.playlists.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 553 | self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 776 | await self.provider.mass.music.albums.tracks(item_id, provider) | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 925 | tracks = await self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 943 | tracks = await self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1807 | albums = await self.provider.mass.music.albums.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1829 | tracks = await self.provider.mass.music.albums.tracks(item_id, "library") | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1840 | artists = await self.provider.mass.music.artists.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1861 | albums = await self.provider.mass.music.artists.albums(item_id, "library") | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1881 | playlists = await self.provider.mass.music.playlists.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1902 | tracks = [t async for t in self.provider.mass.music.playlists.tracks(item_id, "library")] | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1913 | tracks = await self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL | music_assistant/providers/msx_bridge/http_server.py | 1967 | tracks = await self.provider.mass.music.tracks.library_items( | CODE |
| CRITICAL | …ic_assistant/providers/snapcast/snapweb/snapcontrol.js | 562 | let serverVersion = snapcontrol.server.server.snapserver.version.split('.'); | CODE |
| CRITICAL | music_assistant/providers/chromecast/sendspin_bridge.py | 544 | self.cast_player.cc.socket_client.receiver_controller.launch_app( | CODE |
| CRITICAL | music_assistant/providers/sendspin/playback.py | 1234 | self.player.mass.streams.audio.get_player_filter_params( | CODE |
| CRITICAL | …t/providers/samsung_wam/features/state_sync/handler.py | 171 | group_children = self.player.prov.groups.states.get(self.player.player_id, set()) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_diagnostics.py | 164 | except Exception: | CODE |
| LOW | tests/providers/nicovideo/test_converters.py | 127 | except Exception as e: | CODE |
| LOW | tests/providers/nicovideo/test_converters.py | 149 | except Exception as e: | CODE |
| LOW | music_assistant/mass.py | 756 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 823 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 875 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 1193 | except Exception as exc: | CODE |
| LOW | music_assistant/providers/wiim/provider.py | 171 | except Exception: | CODE |
| LOW | music_assistant/providers/wiim/provider.py | 187 | except Exception: | CODE |
| LOW | music_assistant/providers/wiim/player.py | 120 | except Exception: | CODE |
| LOW | music_assistant/providers/hass_players/helpers.py | 86 | except Exception as exc: | CODE |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 806 | except Exception as err: | CODE |
| LOW | music_assistant/providers/ytmusic/__init__.py | 782 | except Exception as err: | CODE |
| LOW | music_assistant/providers/vban_receiver/provider.py | 161 | except Exception as err: | CODE |
| LOW | music_assistant/providers/sync_group/player.py | 1111 | except Exception as err: | CODE |
| LOW | music_assistant/providers/apple_music/library.py | 363 | except Exception as err: | CODE |
| LOW | music_assistant/providers/apple_music/__init__.py | 153 | except Exception as error: | STRING |
| LOW | music_assistant/providers/yandex_smarthome/cloud.py | 69 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/cloud.py | 134 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/cloud.py | 143 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/device.py | 465 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/notifier.py | 177 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/notifier.py | 205 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/notifier.py | 228 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/notifier.py | 259 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/handlers.py | 69 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/handlers.py | 97 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/__init__.py | 157 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/__init__.py | 172 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/__init__.py | 233 | except Exception as exc: # defensive — never crash the config form | CODE |
| LOW | music_assistant/providers/yandex_smarthome/__init__.py | 293 | except Exception: # noqa: S110 | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 698 | except Exception as exc: | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 974 | except Exception: | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 1096 | except Exception as exc: | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 1298 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/plugin.py | 288 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/direct.py | 175 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 227 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 239 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 255 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 267 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 276 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/direct.py | 289 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 356 | except Exception: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/provider.py | 73 | except Exception: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 106 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 164 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 212 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 226 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 304 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 453 | except Exception as err: | CODE |
| LOW | music_assistant/providers/zvuk_music/provider.py | 568 | except Exception as err: | CODE |
| LOW | music_assistant/providers/jellyfin/__init__.py | 165 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 431 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 455 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 471 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 479 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 495 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 631 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 671 | except Exception as err: | CODE |
| 547 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library_sync.py | 477 | CODE | |
| LOW | tests/test_library_sync.py | 528 | CODE | |
| LOW | tests/integration/test_library_summary_items.py | 159 | CODE | |
| LOW | tests/providers/fastmcp_server/test_origin.py | 321 | CODE | |
| LOW | tests/providers/fastmcp_server/test_config_security.py | 49 | CODE | |
| LOW | tests/providers/fastmcp_server/test_config_security.py | 76 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2188 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2531 | CODE | |
| LOW | tests/providers/music_quiz/test_models.py | 330 | CODE | |
| LOW | music_assistant/providers/wiim/player.py | 260 | CODE | |
| LOW | music_assistant/providers/wiim/player.py | 363 | CODE | |
| LOW | music_assistant/providers/hass_players/provider.py | 97 | CODE | |
| LOW | music_assistant/providers/hass_players/player.py | 401 | CODE | |
| LOW | music_assistant/providers/local_audio/provider.py | 25 | CODE | |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 642 | CODE | |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 747 | CODE | |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 876 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 235 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 431 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 530 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 551 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 635 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 687 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 845 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 691 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 325 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 330 | CODE | |
| LOW | music_assistant/providers/vban_receiver/provider.py | 197 | CODE | |
| LOW | music_assistant/providers/bandcamp/converters.py | 54 | CODE | |
| LOW | music_assistant/providers/sync_group/player.py | 111 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 259 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 435 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 525 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1184 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1797 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 231 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 302 | CODE | |
| LOW | music_assistant/providers/apple_music/helpers/browse.py | 70 | CODE | |
| LOW | music_assistant/providers/smart_fades/helpers.py | 123 | CODE | |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 186 | CODE | |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 216 | CODE | |
| LOW | music_assistant/providers/yandex_smarthome/__init__.py | 248 | CODE | |
| LOW | music_assistant/providers/bose_soundtouch/player.py | 258 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 61 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 114 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 170 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 276 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 313 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 573 | CODE | |
| LOW | music_assistant/providers/zvuk_music/parsers.py | 132 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 1110 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 193 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 503 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 1157 | CODE | |
| LOW | music_assistant/providers/test/__init__.py | 160 | CODE | |
| LOW | music_assistant/providers/hass/__init__.py | 419 | CODE | |
| LOW | music_assistant/providers/hass/__init__.py | 562 | CODE | |
| LOW | music_assistant/providers/bbc_sounds/__init__.py | 510 | CODE | |
| LOW | music_assistant/providers/bbc_sounds/__init__.py | 663 | CODE | |
| LOW | music_assistant/providers/bbc_sounds/__init__.py | 683 | CODE | |
| 230 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/providers/musicbrainz/test_recommendations.py | 81 | def _set_library(provider_mock: Mock, artists: list[Artist]) -> None: | CODE |
| LOW | tests/providers/fastmcp_server/test_e2e_hotswap.py | 62 | def _set_config_values(cfg: MagicMock, **overrides: Any) -> None: | CODE |
| LOW | tests/providers/snapcast/conftest.py | 22 | def set_callback(self, cb: Any) -> None: | CODE |
| LOW⚡ | tests/providers/yandex_ynison/test_ynison_client.py | 451 | def _setup_ws(self, client: YnisonClient) -> None: | CODE |
| LOW⚡ | tests/providers/yandex_ynison/test_ynison_client.py | 748 | def _setup_ws(self, client: YnisonClient) -> None: | CODE |
| LOW⚡ | tests/providers/yandex_ynison/test_ynison_client.py | 1393 | async def set_stop(*_args: Any, **_kwargs: Any) -> None: | CODE |
| LOW | tests/providers/airplay/test_player.py | 157 | def _set_discovery_info(player: AirPlayPlayer, *, raop: bool, airplay: bool) -> None: | CODE |
| LOW⚡ | tests/controllers/music/test_genres.py | 1569 | async def _set_track_genres(mass: MusicAssistant, track_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 136 | async def _set_podcast_genres(mass: MusicAssistant, podcast_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 1580 | async def _set_album_genres(mass: MusicAssistant, album_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 464 | def _set_play_media_override(mock_mass: MagicMock, value: bool) -> None: | CODE |
| LOW | tests/helpers/test_scrobbler.py | 31 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_scrobbler.py | 195 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_throttle_retry.py | 38 | def set_side_effects(self, effects: Sequence[Exception | str]) -> None: | CODE |
| LOW | music_assistant/mass.py | 1214 | async def _update_available_providers_cache(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1238 | async def _setup_storage(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1245 | def _set_state(self, new_state: CoreState) -> None: | CODE |
| LOW | music_assistant/__main__.py | 269 | def _set_stop() -> None: | CODE |
| LOW⚡ | music_assistant/providers/wiim/player.py | 363 | def _update_ma_state_from_sdk_cache(self) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/provider.py | 157 | def update_player_from_state_msg(entity_id: str, state: CompressedState) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 365 | def update_from_compressed_state(self, state: CompressedState) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 376 | def _update_hass_features(self, hass_supported_features: MediaPlayerEntityFeature) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 401 | def _update_attributes(self, attributes: dict[str, Any]) -> None: | CODE |
| LOW | music_assistant/providers/sync_group/player.py | 908 | def _update_attributes(self) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1984 | async def _set_playlog_from_user(self, user: User) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1997 | async def _set_playlog_from_user_sync(self, progresses: list[MediaProgress]) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 2061 | async def _update_playlog_book(self, progress: MediaProgress) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 2083 | async def _update_playlog_episode(self, progress: MediaProgress) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 2104 | async def _update_book_narrators(self, library_id: str) -> None: | CODE |
| LOW | music_assistant/providers/apple_music/library.py | 218 | async def set_favorite(self, prov_item_id: str, media_type: MediaType, favorite: bool) -> None: | CODE |
| LOW⚡ | music_assistant/providers/apple_music/provider.py | 211 | async def set_favorite(self, prov_item_id: str, media_type: MediaType, favorite: bool) -> None: | CODE |
| LOW | music_assistant/providers/apple_music/__init__.py | 40 | __all__ = ["AppleMusicProvider", "get_config_entries", "setup"] | CODE |
| LOW | …ic_assistant/providers/apple_music/helpers/__init__.py | 6 | __all__ = [ | CODE |
| LOW | …_assistant/providers/yandex_smarthome/auto_skill_ui.py | 55 | __all__ = [ | CODE |
| LOW | …sistant/providers/yandex_smarthome/auto_skill_state.py | 19 | __all__ = [ | CODE |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 317 | async def update_draft(self, csrf: str, skill_id: str, payload: Mapping[str, Any]) -> None: | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 64 | __all__ = [ | CODE |
| LOW | music_assistant/providers/yandex_smarthome/_compat.py | 32 | __all__ = ["SecretStr"] | CODE |
| LOW | music_assistant/providers/bose_soundtouch/client.py | 102 | async def set_volume(self, level: int) -> None: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/client.py | 137 | async def set_zone(self, master_id: str, members: list[tuple[str, str]]) -> None: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/player.py | 247 | def update_ip_address(self, ip_address: str) -> None: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/player.py | 378 | def _update_state_from_now_playing(self, now_playing: SoundTouchNowPlaying) -> None: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 514 | async def _setup_pipes_and_config(self) -> None: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 634 | def _setup_shairport_daemon(self) -> None: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 749 | def _update_source_metadata(self, metadata: dict[str, Any]) -> None: | CODE |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 773 | def _update_cover_art(self, metadata: dict[str, Any]) -> None: | CODE |
| LOW | music_assistant/providers/hass/__init__.py | 675 | def _update_control_from_state_msg(self, entity_id: str, state: CompressedState) -> None: | CODE |
| LOW | …_assistant/providers/listenbrainz_scrobble/__init__.py | 136 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | music_assistant/providers/musiccast/player.py | 163 | async def set_static_attributes(self) -> None: | CODE |
| LOW | music_assistant/providers/musiccast/player.py | 250 | async def set_dynamic_attributes(self, update_state: bool = True) -> None: | CODE |
| LOW⚡ | music_assistant/providers/musiccast/player.py | 695 | async def _set_player_unavailable(self) -> None: | CODE |
| LOW | music_assistant/providers/musiccast/player.py | 718 | async def _set_player_available(self) -> None: | CODE |
| LOW | music_assistant/providers/musiccast/player.py | 861 | async def set_option(self, option_key: str, option_value: PlayerOptionValueType) -> None: | CODE |
| LOW | music_assistant/providers/spotify/provider.py | 1055 | async def _setup_librespot_auth(self, access_token: str) -> None: | CODE |
| LOW⚡ | music_assistant/providers/spotify/provider.py | 1240 | async def _set_playlist_requires_global_token(self, prov_playlist_id: str) -> None: | CODE |
| LOW | music_assistant/providers/deezer/gw_client.py | 54 | async def _set_cookie(self) -> None: | CODE |
| LOW | music_assistant/providers/deezer/gw_client.py | 62 | async def _update_user_data(self) -> None: | CODE |
| LOW | music_assistant/providers/deezer/__init__.py | 21 | __all__ = ["DeezerProvider"] | CODE |
| LOW | music_assistant/providers/dlna/player.py | 104 | def set_available(self, available: bool) -> None: | CODE |
| LOW | music_assistant/providers/dlna/player.py | 128 | def set_static_attributes(self) -> None: | CODE |
| 193 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/vban_receiver/provider.py | 265 | # Check if the stream_id has changed underneath us while waiting | COMMENT |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 118 | # Check if we have a complete line before any XML | COMMENT |
| LOW | music_assistant/providers/airplay_receiver/__init__.py | 590 | # Check if process started successfully | COMMENT |
| LOW | …stant/providers/airplay_receiver/bin/build_binaries.sh | 85 | # Check if Homebrew is installed | COMMENT |
| LOW | music_assistant/providers/zvuk_music/__init__.py | 72 | # Check if user is authenticated | COMMENT |
| LOW | music_assistant/providers/party/__init__.py | 621 | # Check if guest access is enabled | COMMENT |
| LOW | music_assistant/providers/party/__init__.py | 914 | # Check if guest access and skip are enabled | COMMENT |
| LOW | music_assistant/providers/spotify/provider.py | 123 | # Check if user has a custom client ID with valid dev token | COMMENT |
| LOW | music_assistant/providers/spotify/__init__.py | 99 | # Check if audiobooks are supported by existing provider instance | COMMENT |
| LOW | music_assistant/providers/audible/__init__.py | 265 | # Check if we have signing auth (preferred, stable - not affected by API changes) | COMMENT |
| LOW | music_assistant/providers/msx_bridge/http_server.py | 1231 | # Check if we need to create a new shared stream (leader creates it) | COMMENT |
| LOW | music_assistant/providers/bluesound/provider.py | 78 | # Check if the IP address has changed | COMMENT |
| LOW | …_assistant/providers/nicovideo/provider_mixins/core.py | 56 | # Check if login credentials are provided | COMMENT |
| LOW | music_assistant/providers/nicovideo/services/video.py | 156 | # Check if this is already a media playlist (has #EXTINF) | COMMENT |
| LOW | …providers/sonic_analysis/vendored_clap/clap_wrapper.py | 57 | # Check if version is supported | COMMENT |
| LOW | music_assistant/providers/yandex_music/provider.py | 2384 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/yandex_music/__init__.py | 305 | # Check if user is authenticated | COMMENT |
| LOW | music_assistant/providers/yandex_music/api_client.py | 1237 | # Check if it's LRC format (synced lyrics have timestamps like [00:12.34]) | COMMENT |
| LOW | music_assistant/providers/universal_player/provider.py | 89 | # Check if player already exists | COMMENT |
| LOW | music_assistant/providers/universal_player/provider.py | 207 | # Check if universal player already exists | COMMENT |
| LOW | music_assistant/providers/universal_player/provider.py | 534 | # Check if this separate universal player already exists | COMMENT |
| LOW | music_assistant/providers/soundcloud/__init__.py | 396 | # Check if we have a valid response with tracks collection | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 1267 | # Check if manual player switching is allowed | COMMENT |
| LOW | music_assistant/providers/airplay/provider.py | 202 | # Check if this is a local address (loopback or matches our server's IP) | COMMENT |
| LOW | music_assistant/providers/pandora/provider.py | 375 | # Check if already cached in session | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 198 | # Check if we have enough results across all types | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 315 | # Check if this is audiobook content using improved detection | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 324 | # Check if this is podcast content | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 583 | # Check if this is the same as album artist to avoid duplicates (case-insensitive) | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1108 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1125 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1546 | # Check if album rating meets the configured threshold for favorites | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1693 | # Check if track rating meets the configured threshold for favorites | COMMENT |
| LOW⚡ | music_assistant/providers/plex_connect/gdm.py | 179 | # Check if this is a discovery request (M-SEARCH) not our own HELLO | COMMENT |
| LOW | music_assistant/providers/webdav/provider.py | 252 | # Check if this is an audio file with embedded image | COMMENT |
| LOW | music_assistant/providers/webdav/helpers.py | 124 | # Check if it's a directory | COMMENT |
| LOW | music_assistant/providers/kion_music/provider.py | 1710 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/kion_music/__init__.py | 78 | # Check if user is authenticated | COMMENT |
| LOW | music_assistant/providers/kion_music/api_client.py | 571 | # Check if it's LRC format (synced lyrics have timestamps like [00:12.34]) | COMMENT |
| LOW | music_assistant/providers/sendspin/provider.py | 563 | # Check if client still exists (may have disconnected while waiting) | COMMENT |
| LOW | music_assistant/providers/podcastfeed/__init__.py | 208 | # Check if we got actual image content | COMMENT |
| LOW | music_assistant/providers/tidal/tidal_page_parser.py | 128 | # Check if item appears to be a mix | COMMENT |
| LOW | music_assistant/providers/tidal/auth_manager.py | 127 | # Check if token is expired | COMMENT |
| LOW | music_assistant/models/player.py | 1421 | # Check if the protocol player is actually available | COMMENT |
| LOW | music_assistant/models/player.py | 2777 | # Check if member_id is a provider instance ID | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 353 | # Check if the search query is a streaming provider public shareable URL | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 383 | # Check if any existing mapping's item_id has been modified for non-streaming providers | COMMENT |
| LOW | music_assistant/controllers/music/media/genres.py | 1991 | # Check if a non-excluded genre in this taxonomy exists with this name as its own | COMMENT |
| LOW | music_assistant/controllers/music/media/genres.py | 2041 | # Check if this name was deliberately excluded in this taxonomy before creating | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 2965 | # Check if parent config still exists | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3153 | # Check if new source is external (not MA-managed) | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3212 | # Check if it's a known queue ID | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3791 | # Check if player has mute lock (set when individually muted in a group) | COMMENT |
| LOW⚡ | music_assistant/controllers/players/protocol_linking.py | 562 | # Check if this universal player should now be merged with another | COMMENT |
| LOW⚡ | music_assistant/controllers/players/protocol_linking.py | 578 | # Check if universal player has generic device info (from restore) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 195 | # Check if this universal player should now be merged with another | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 236 | # Check if linking actually succeeded (may be refused for | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 252 | # Check if this universal player should now be merged with another | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 401 | # Check if this protocol player has a cached parent (was previously linked) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 460 | # Check if there's an existing universal player we should join | COMMENT |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/controllers/music/test_music_migrations.py | 294 | 1: ("smart_fades", '{"spectral_centroid": [1.5, null, 2.5, null], "bpm": 120}'), | CODE |
| HIGH | tests/controllers/music/test_music_migrations.py | 297 | 3: ("other_domain", '{"spectral_centroid": [null], "bpm": 100}'), | CODE |
| HIGH | music_assistant/providers/yousee/media.py | 247 | tracks(first: $first, after: null, orderBy: POPULARITY) { | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 175 | info: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 176 | sessionToken: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 177 | selectedClientId: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 187 | if (cachedTokens && typeof cachedTokens === "object") state.tokens = cachedTokens; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 202 | let data = null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 302 | state.sessionToken = null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 310 | showMsg((data && data.error) || ("HTTP " + res.status), "bad"); | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 320 | if (navigator.clipboard && navigator.clipboard.writeText) { | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 334 | if (!c || !state.lastSnippet) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 336 | try { parsed = JSON.parse(state.lastSnippet); } catch (_) { return null; } | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 337 | const inner = (parsed.mcpServers && parsed.mcpServers.ma) || null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 337 | const inner = (parsed.mcpServers && parsed.mcpServers.ma) || null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 338 | if (!inner) return null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 411 | showMsg((data && data.error) || "Sign-in failed.", "bad"); | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 422 | showMsg("Signed in as " + (data.user && data.user.username || "user") + ".", "good"); | CODE |
| HIGH | music_assistant/providers/sendspin/playback.py | 568 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/providers/sendspin/playback.py | 1348 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/controllers/streams/audio_analysis.py | 425 | # non-finite floats serialize to JSON null, which corrupts the stored row; | COMMENT |
| HIGH | music_assistant/controllers/webserver/api_docs.py | 1012 | # Filter out None/null types (None, NoneType, null all mean JSON null) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_webserver_auth.py | 150 | # Create a user first | COMMENT |
| MEDIUM | tests/test_remote_access.py | 264 | # Create a session first | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 20 | # Create a mock SearchResultTrack | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 39 | # Create a mock SearchResultAlbum | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 58 | # Create a mock SearchResultArtist | COMMENT |
| MEDIUM | tests/providers/apple_music/test_library.py | 483 | # Create an ItemMapping instead of a Track | COMMENT |
| MEDIUM | tests/providers/msx_bridge/test_player.py | 422 | # Create a member whose play_media calls back into leader's propagation | COMMENT |
| MEDIUM | tests/providers/smart_playlist/test_smart_playlist.py | 1738 | # Create a library track without genres | COMMENT |
| MEDIUM | tests/providers/yandex_ynison/test_ynison_client.py | 527 | # Create a real task that we can cancel | COMMENT |
| MEDIUM | tests/providers/tidal/test_api_client.py | 45 | # Create a mock that acts as an async context manager | COMMENT |
| MEDIUM | tests/providers/tidal/test_streaming.py | 636 | # Create a mapping that triggers the update path | COMMENT |
| MEDIUM | tests/controllers/players/test_protocol_linking.py | 39 | # Create a mock manifest | COMMENT |
| MEDIUM | tests/helpers/test_throttle_retry.py | 329 | # Create a date 60 seconds in the future | COMMENT |
| MEDIUM | music_assistant/providers/vban_receiver/vban.py | 44 | # Create a socket and set the options | COMMENT |
| MEDIUM | …c_assistant/providers/_demo_music_provider/__init__.py | 452 | # Create a new playlist on the provider. | COMMENT |
| MEDIUM | music_assistant/providers/airplay_receiver/metadata.py | 71 | # Create an asyncio.Event to signal when data is available | COMMENT |
| MEDIUM | music_assistant/providers/party/__init__.py | 817 | # Create a QueueItem from the media item | COMMENT |
| MEDIUM | music_assistant/providers/spotify/parsers.py | 292 | # Create a minimal podcast reference if none available | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 772 | # Create a full Artist object so MA doesn't try to resolve it. | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 800 | # Create a full Album object so MA doesn't try to resolve it. | COMMENT |
| MEDIUM | …istant/providers/nicovideo/provider_mixins/playlist.py | 120 | # Create a new mylist using niconico.py | COMMENT |
| MEDIUM | …assistant/providers/digitally_incorporated/__init__.py | 784 | # Create a mapping of filter ID to genre name | COMMENT |
| MEDIUM | music_assistant/providers/snapcast/socket_server.py | 77 | # Create the socket server | COMMENT |
| MEDIUM | music_assistant/providers/universal_player/provider.py | 133 | # Create the player instance | COMMENT |
| MEDIUM | music_assistant/providers/plex/__init__.py | 1248 | # Create a recommendation folder for each hub | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 40 | # This method is optional and should be implemented if you need to handle | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 243 | # This method is mandatory and should be implemented. | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 283 | # This method is optional and should be implemented if you want to support | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 295 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 306 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 314 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 326 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | music_assistant/controllers/webserver/auth.py | 1052 | # Create a long-lived token (only long-lived tokens can be created via this command) | COMMENT |
| MEDIUM | music_assistant/controllers/webserver/api_docs.py | 196 | # Create a schema reference for this type | COMMENT |
| MEDIUM | music_assistant/controllers/webserver/api_docs.py | 289 | # Create a detailed enum definition with descriptions | COMMENT |
| MEDIUM | …istant/controllers/webserver/helpers/auth_providers.py | 438 | # Create the user | COMMENT |
| MEDIUM | music_assistant/controllers/metadata/radio.py | 468 | # Create a minimal Album object to pass the MusicBrainz release group ID | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 427 | # (that path is only for the seamless handoff). Instead, dissolve+reform | COMMENT |
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 311 | """When the new leader IS in the live session, seamless protocol-level handoff is used.""" | STRING |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 91 | # 0.1 Hz swell = 3 full cycles per 30s loop, keeping the loop seamless | COMMENT |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 216 | """Build the ffmpeg filter graph that renders the preset as a seamless loop.""" | STRING |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 218 | # seamless loop: generate CROSSFADE_DURATION extra seconds, trim that amount | COMMENT |
| MEDIUM | …sic_assistant/providers/local_audio/sendspin_bridge.py | 975 | # child (is_remap=False) — this is more robust than matching | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 350 | # Note that (local) file based providers will simply return all artist tracks here. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/constants.py | 45 | # group can do a seamless leader handoff; otherwise it must dissolve and | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1159 | # protocol so the session continuation is seamless. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1178 | # A seamless handoff requires the new leader to already be a | COMMENT |
| MEDIUM | music_assistant/providers/phishin/provider.py | 100 | # Replace with comprehensive song_slug results | COMMENT |
| MEDIUM⚡ | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 33 | */var R3=J,ao=N3;function Ve(t){for(var r="https://reactjs.org/docs/error-decoder.html?invariant="+t,s=1;s<arguments.le | COMMENT |
| MEDIUM⚡ | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 33 | */var R3=J,ao=N3;function Ve(t){for(var r="https://reactjs.org/docs/error-decoder.html?invariant="+t,s=1;s<arguments.le | COMMENT |
| MEDIUM⚡ | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 40 | `+d.stack}return{value:t,source:r,stack:p,digest:null}}function b2(t,r,s){return{value:t,source:null,stack:s??null,diges | CODE |
| MEDIUM⚡ | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 40 | `+d.stack}return{value:t,source:r,stack:p,digest:null}}function b2(t,r,s){return{value:t,source:null,stack:s??null,diges | CODE |
| MEDIUM | music_assistant/providers/opensubsonic/parsers.py | 44 | # the list of episodes in a channel, to facilitate, we will use both the episode id and the | COMMENT |
| MEDIUM | music_assistant/providers/squeezelite/provider.py | 112 | # If any ports are occupied, raise a comprehensive error message | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 58 | # used in conjunction with the needs_poll property. | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 122 | # In this demo implementation we just set the power state to ON | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 129 | # In this demo implementation we just set the power state to OFF | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 143 | # In this demo implementation we just set the volume level | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 176 | # In this demo implementation we just set the playback state to PLAYING | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 193 | # In this demo implementation we just set the playback state to IDLE | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 209 | # In this demo implementation we just set the playback state to PAUSED | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 253 | # the queue controller will simply call this play_media method for | COMMENT |
| LOW | music_assistant/providers/sonos/provider.py | 199 | # we just return the previous, current and next item in the queue. | COMMENT |
| LOW | music_assistant/providers/filesystem_local/__init__.py | 327 | # for audiobooks and podcasts we just return all library items | COMMENT |
| LOW | music_assistant/models/provider.py | 171 | # default implementation - simply use the instance number/index | COMMENT |
| LOW | music_assistant/models/music_provider.py | 1573 | # just return False here to trigger that logic | COMMENT |
| LOW⚡ | music_assistant/models/player.py | 964 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 946 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 2615 | # Scenario 1: Player is a protocol player - just return the (expanded) result | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 2796 | # simply return the first item because search is already sorted by best match | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 695 | # simply sort by quality and just add the first available version | COMMENT |
| LOW | music_assistant/controllers/music/media/base.py | 816 | # simply return the fallback item | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 1489 | # else: any other media item, just add it to the favorites directly | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 688 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 943 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/webserver/api_docs.py | 982 | # Remove the ellipsis and just use the type | COMMENT |
| LOW | …ssistant/controllers/player_queues/playback_tracker.py | 359 | # so we just return the queue index and the elapsed time | COMMENT |
| LOW | music_assistant/helpers/api.py | 346 | # we can just use the bound type for documentation purposes | COMMENT |
| LOW | music_assistant/helpers/audio.py | 755 | # simply return the preference | COMMENT |
| MEDIUM | scripts/perf/perf_server.py | 191 | # skip the harness' own frames - they are measurement scaffolding | COMMENT |
| LOW | .github/workflows/release.yml | 307 | # Stable release - just use the version | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/fastmcp_server/conftest.py | 1 | """ | COMMENT |
| LOW | tests/controllers/streams/test_audio_sources.py | 381 | """Queue preload must not claim the source and block a later handoff.""" | COMMENT |
| LOW | music_assistant/constants.py | 861 | COMMENT | |
| LOW | music_assistant/providers/local_audio/constants.py | 41 | # y = a * e^(b*x) gives constant dB-per-slider-step ("audio taper" / | COMMENT |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 141 | COMMENT | |
| LOW | …sic_assistant/providers/local_audio/sendspin_bridge.py | 301 | # Remap sink: apply the restored volume/mute to PA sink hardware | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 121 | """ | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 221 | # It allows retrieving the library/favorite artists from your provider. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 261 | # It allows retrieving the library/favorite albums from your provider. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 281 | # You are free to implement caching in your provider, as long as you return all items | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 301 | # the 'sync_library' method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 321 | # If you need more fine grained control over the sync process, you can override | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 341 | # to easily apply caching to this method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 361 | # Get full details of a single Album. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 381 | # NOTE: Because this is often static data, it is advised to apply caching here | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 401 | # Mandatory only if you reported ARTIST_ALBUMS in the supported_features. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 481 | Returns a boolean with the fully_played status | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 101 | else: | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 801 | COMMENT | |
| LOW | music_assistant/providers/msx_bridge/static/input.js | 1 | /******************************************************************************/ | COMMENT |
| LOW | music_assistant/providers/amplipi/constants.py | 61 | "bluetooth": "Bluetooth", | COMMENT |
| LOW | music_assistant/providers/siriusxm/__init__.py | 241 | """Get streamdetails for a track/radio.""" | COMMENT |
| LOW | …_assistant/providers/fastmcp_server/connect/_revoke.py | 41 | # loaded (frontend / chardet / torch are not installed), so fall back to | COMMENT |
| LOW | …t/providers/fastmcp_server/debug/inspect_serializer.py | 41 | # — walking them drags every other provider, queue, player, cache and | COMMENT |
| LOW | …sic_assistant/providers/sonic_analysis/clap_prompts.py | 101 | # Calibration provenance | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 81 | BROWSE_INITIAL_TRACKS: Final[int] = 15 | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 101 | # Per-kind request budgets (requests per second). Tuned by endpoint cost: | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 121 | # this value. Sized one below Yandex's observed datacenter-IP captcha | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 181 | # a specific preset (diversity/moodEnergy/language) on top of the base My Wave station. | COMMENT |
| LOW | music_assistant/providers/yandex_music/api_client.py | 141 | ] = OrderedDict() | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 41 | _PALETTE_DIM_FACTOR = 0.45 | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 101 | color_gradient_spread: float | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 181 | COMMENT | |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 201 | # Transient scaling, beat animation fraction, pulse peak and color gradient | COMMENT |
| LOW | …sic_assistant/providers/snapcast/snapweb/snapstream.js | 381 | // rate = 1.0 - Math.min(rate, 0.0005); | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 261 | self._in_use_by_queue: str | None = None | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 421 | # updates _active_session_id but not _in_use_by_queue) is treated as a | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/__init__.py | 81 | selected = ym_instances[0][0] if len(ym_instances) == 1 else YM_INSTANCE_OWN | COMMENT |
| LOW | …sic_assistant/providers/yandex_ynison/ynison_client.py | 721 | COMMENT | |
| LOW | music_assistant/providers/ariacast_receiver/__init__.py | 101 | self._default_player_id = str(config.get_value(CONF_MASS_PLAYER_ID)) | COMMENT |
| LOW | music_assistant/providers/ariacast_receiver/__init__.py | 321 | player_id: str, | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 141 | In most cases its not needed to override any of the builtin methods and you only | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 181 | # this is an optional method that you can implement if | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 241 | # Return a StreamDetails with stream_type=CUSTOM when audio comes from | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 281 | # by streamdetails.audio_format. Release any per-stream resources in a | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 321 | raise NotImplementedError | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 341 | # Plugins MUST store stream_session_id so the matching | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 361 | # OPTIONAL — fires in the queue-item stream handler's finally block, so | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 401 | """Retrieve a list of recommendation folders from this plugin.""" | COMMENT |
| LOW | …_assistant/providers/_demo_plugin_provider/__init__.py | 441 | # Implement when surfacing playlists. Tracks SHOULD carry | COMMENT |
| LOW | …_assistant/providers/_demo_player_provider/provider.py | 121 | # the player has become unavailable | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 221 | # this method should send a next track command to the given player. | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 241 | """Play media command.""" | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 281 | """Handle enqueuing of the next (queue) item on the player.""" | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 301 | # will take care of setting the volume level for the announcement and resuming etc. | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 341 | # refresh affected members so their derived synced_to / can_group_with recompute | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 361 | # | COMMENT |
| LOW | music_assistant/providers/spotify_connect/__init__.py | 201 | # from queue preload, where claiming would block a later cross-queue | COMMENT |
| LOW | music_assistant/models/player.py | 361 | self._extra_attributes: dict[str, Any] = {} | COMMENT |
| LOW | music_assistant/controllers/music/constants.py | 21 | # max time to wait for a single provider's search results before | COMMENT |
| 13 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/controllers/music/test_genres.py | 2375 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2378 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2352 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 3946 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 3993 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 4002 | # Step 3: Sendspin registers next - should match Universal Player by MAC | COMMENT |
| LOW | music_assistant/providers/hass_players/provider.py | 115 | # if the player is an ESPHome player, we need to check if it is a V2 player | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 160 | # Step 1: CSRF token extraction | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 214 | # Step 2: list existing skills (for duplicate-name detection) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 235 | # Step 3: create the skill app | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 270 | # Step 4: upload logo | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 314 | # Step 5: update draft settings | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 323 | # Step 6: create OAuth app (account-linking) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 370 | # Step 7: bind OAuth app to the skill | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 380 | # Step 8: publish (send for moderation) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_ynison/ynison_client.py | 246 | # Step 1: Get redirect ticket | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_ynison/ynison_client.py | 249 | # Step 2: Connect to state service | COMMENT |
| LOW | music_assistant/providers/airplay/pairing.py | 724 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 746 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 776 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 225 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 232 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 236 | # Step 3: Need more artists - split on extra splitters to reach expected_count | COMMENT |
| LOW | music_assistant/helpers/resources/api_docs.html | 462 | <span class="comment"># Step 1: Authenticate (REQUIRED as first command)</span> | CODE |
| LOW | music_assistant/helpers/resources/api_docs.html | 480 | <span class="comment"># Step 2: Send commands (message_id is REQUIRED)</span> | CODE |
| LOW⚡ | .github/workflows/dependency-security.yml | 58 | # Step 1: Verify requirements_all.txt is in sync | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 84 | # Step 2: Run pip-audit for known vulnerabilities | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 103 | # Step 2: Detect new or changed dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 151 | # Step 3: Check manifest.json changes | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 199 | # Step 4: Run package safety check on new dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 258 | # Step 5: Persist analysis results for the reporting workflow. | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 277 | # Step 6: Hand off report fragments and results to the reporting workflow | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/controllers/music/test_genres.py | 2375 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2378 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2352 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 3946 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 3993 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 4002 | # Step 3: Sendspin registers next - should match Universal Player by MAC | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 160 | # Step 1: CSRF token extraction | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 214 | # Step 2: list existing skills (for duplicate-name detection) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 235 | # Step 3: create the skill app | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 270 | # Step 4: upload logo | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 314 | # Step 5: update draft settings | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 323 | # Step 6: create OAuth app (account-linking) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 370 | # Step 7: bind OAuth app to the skill | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_smarthome/auto_skill.py | 380 | # Step 8: publish (send for moderation) | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_ynison/ynison_client.py | 246 | # Step 1: Get redirect ticket | COMMENT |
| LOW⚡ | …sic_assistant/providers/yandex_ynison/ynison_client.py | 249 | # Step 2: Connect to state service | COMMENT |
| LOW | music_assistant/providers/airplay/pairing.py | 724 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 746 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 776 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 225 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 232 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 236 | # Step 3: Need more artists - split on extra splitters to reach expected_count | COMMENT |
| LOW | music_assistant/helpers/resources/api_docs.html | 462 | <span class="comment"># Step 1: Authenticate (REQUIRED as first command)</span> | CODE |
| LOW | music_assistant/helpers/resources/api_docs.html | 480 | <span class="comment"># Step 2: Send commands (message_id is REQUIRED)</span> | CODE |
| LOW⚡ | .github/workflows/dependency-security.yml | 58 | # Step 1: Verify requirements_all.txt is in sync | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 84 | # Step 2: Run pip-audit for known vulnerabilities | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 103 | # Step 2: Detect new or changed dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 151 | # Step 3: Check manifest.json changes | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 199 | # Step 4: Run package safety check on new dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 258 | # Step 5: Persist analysis results for the reporting workflow. | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 277 | # Step 6: Hand off report fragments and results to the reporting workflow | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …c_assistant/providers/_demo_music_provider/__init__.py | 138 | # and a callback url that you can use to redirect the user back to the Music Assistant UI. | COMMENT |
| MEDIUM | …c_assistant/providers/_demo_music_provider/__init__.py | 511 | # for most providers this will be HTTP but you can also use CUSTOM | COMMENT |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 200 | # make sure to include the version in the album name | COMMENT |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 228 | # make sure to include the version in the album name | COMMENT |
| LOW | music_assistant/providers/spotify/__init__.py | 125 | label_text = "Authenticated to Spotify. Don't forget to save to complete setup." | CODE |
| LOW | music_assistant/providers/spotify/__init__.py | 131 | dev_label_text = "Developer session authenticated. Don't forget to save to complete setup." | CODE |
| LOW⚡ | music_assistant/providers/yandex_ynison/__init__.py | 131 | label_text = f"Authenticated to Yandex Music{who}. Don't forget to save to complete setup." | CODE |
| LOW | music_assistant/providers/lastfm_scrobble/__init__.py | 136 | self.logger.info("No session key available, don't forget to authenticate!") | CODE |
| LOW | music_assistant/providers/lastfm_scrobble/strings.json | 26 | "label": "Successfully logged in as {0}, don't forget to hit save to complete the setup" | CODE |
| MEDIUM | …_assistant/providers/_demo_plugin_provider/__init__.py | 161 | # you can use this for instance to trigger custom (non-mdns) discovery of plugins | COMMENT |
| MEDIUM | …_assistant/providers/_demo_player_provider/provider.py | 42 | # you can use this to do any async initialization of the provider, | COMMENT |
| MEDIUM | …_assistant/providers/_demo_player_provider/provider.py | 128 | # note that you can use this point to update the player connection info | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 184 | # make sure to finish any removal jobs | COMMENT |
| LOW | music_assistant/translations/en.json | 1379 | "provider.lastfm_scrobble.config_entries.save_reminder.label": "Successfully logged in as {0}, don't forget to hit sav | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/zvuk_music/test_parsers.py | 72 | CODE | |
| LOW | tests/providers/zvuk_music/test_parsers.py | 137 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 103 | CODE | |
| LOW | tests/providers/smart_playlist/test_smart_playlist.py | 363 | CODE | |
| LOW | tests/providers/airplay/dacp/conftest.py | 75 | CODE | |
| LOW | tests/providers/plex/test_provider_methods.py | 67 | CODE | |
| LOW | tests/controllers/music/test_library_listing_queries.py | 233 | CODE | |
| LOW | …c_assistant/providers/smart_fades/feature_extractor.py | 40 | CODE | |
| LOW | …c_assistant/providers/smart_fades/dbn_postprocessor.py | 29 | CODE | |
| LOW | …s/sonic_analysis/vendored_clap/models/pytorch_utils.py | 30 | CODE | |
| LOW | …providers/sonic_analysis/vendored_clap/models/htsat.py | 61 | CODE | |
| LOW | …providers/sonic_analysis/vendored_clap/models/htsat.py | 384 | CODE | |
| LOW | …providers/sonic_analysis/vendored_clap/models/htsat.py | 588 | CODE | |
| LOW | …providers/sonic_analysis/vendored_clap/models/htsat.py | 686 | CODE | |
| LOW | music_assistant/providers/music_quiz/__init__.py | 337 | CODE | |
| LOW | music_assistant/providers/squeezelite/player.py | 774 | CODE | |
| LOW | music_assistant/controllers/music/media/tracks.py | 235 | CODE | |
| LOW | music_assistant/controllers/music/media/podcasts.py | 77 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 151 | CODE | |
| LOW | music_assistant/controllers/music/media/artists.py | 131 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 363 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 1113 | CODE | |
| LOW | music_assistant/controllers/music/media/albums.py | 130 | CODE | |
| LOW | music_assistant/controllers/tasks/controller.py | 239 | CODE | |
| LOW | music_assistant/controllers/cache/helpers.py | 44 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …sic_assistant/providers/nicovideo/converters/stream.py | 57 | Convert StreamConversionData into StreamDetails. Args: conversion_data: Data containing vi | STRING |
| HIGH | music_assistant/providers/airplay/helpers.py | 165 | Find the correct raop/airplay binary belonging to the platform. Args: protocol: The streaming protocol | STRING |
| HIGH | music_assistant/providers/pandora/helpers.py | 57 | Get CSRF token from Pandora website. Attempts to retrieve CSRF token from Pandora cookies. Args: | STRING |
| HIGH | music_assistant/providers/internet_archive/provider.py | 740 | Get streamdetails for a track or audiobook. Delegates to the streaming handler for proper multi-file s | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/providers/smart_playlist/test_smart_playlist.py | 1837 | # AI-generated description tests | COMMENT |
| HIGH | music_assistant/providers/zvuk_music/constants.py | 32 | # These AI-generated playlists are identified by low fixed IDs, stable per account. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/msx_bridge/conftest.py | 21 | CODE | |
| MEDIUM | tests/providers/yandex_ynison/test_ynison_client.py | 1298 | CODE | |
| MEDIUM | tests/providers/airplay/test_protocol_crash.py | 55 | CODE | |
| MEDIUM | tests/providers/kion_music/test_streaming.py | 265 | CODE | |
| MEDIUM | tests/controllers/streams/test_audio_buffer.py | 234 | CODE | |
| MEDIUM | music_assistant/models/plugin.py | 118 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/smart_fades/test_provider.py | 20 | # Clip ends 0.2s after the last beat to avoid end-of-track hallucination. | COMMENT |
| MEDIUM | scripts/perf/perf_server.py | 191 | # skip the harness' own frames - they are measurement scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/providers/yandex_music/test_api_client.py | 1556 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW | tests/providers/yandex_music/test_api_client.py | 48 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 21 | return KionMusicClient("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 35 | mock_cls.assert_called_once_with("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 129 | `&&(Q.value+=" ");const U=B.boxSizing,ee=Bu(B.paddingBottom)+Bu(B.paddingTop),q=Bu(B.borderBottomWidth)+Bu(B.borderTopWi | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/audible/test_audible.py | 34 | def helper(mass_mock: AsyncMock, audible_client_mock: AsyncMock) -> AudibleHelper: | CODE |
| LOW | music_assistant/providers/nicovideo/converters/base.py | 29 | def helper(self) -> NicovideoConverterHelper: | CODE |
| LOW | music_assistant/controllers/tasks/controller.py | 135 | def run_task(self, task_id: str) -> BackgroundTask: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/filesystem_local/__init__.py | 1171 | track.favorite = False # TODO: implement favorite status based on rating ? | CODE |