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 summarizes scanner evidence for music-assistant/server, a Python project with 3,160 GitHub stars. SynthScan examined 858,894 lines of code across 2659 source files, recording 22432 pattern matches distributed across 25 syntactic categories. The legacy adjusted pattern signal is 31.1 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 17869 finding(s).
Are imports declared and package/API names verified? 2049 finding(s).
Are wrappers, guards, and repeated structures necessary? 19664 finding(s).
Which changes need focused human review? 22432 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 22432 distinct pattern matches across 25 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 58 | def pytest_report_to_serializable() -> Generator[None, object, object]: | CODE |
| LOW | tests/conftest.py | 71 | def isolate_models_global_cache() -> Generator[None]: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 84 | async def test_cleanup_drops_shortcuts(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 108 | async def test_cleanup_rewrites_shortcuts(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 131 | async def test_cleanup_no_change_skips_write(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 146 | async def test_cleanup_empty_shortcuts_skipped(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 161 | async def test_cleanup_multiple_users(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 179 | async def test_cleanup_preserves_other_preferences(auth: AuthenticationManager) -> None: | CODE |
| LOW | tests/test_shortcut_cleanup.py | 226 | async def test_stale_provider_shortcut_follows_library_item( | CODE |
| LOW | tests/test_shortcut_cleanup.py | 239 | async def test_stale_provider_shortcut_dropped_when_not_in_library( | CODE |
| LOW | tests/test_shortcut_cleanup.py | 252 | async def test_live_provider_shortcuts_are_kept( | CODE |
| LOW | tests/test_shortcut_cleanup.py | 274 | async def test_empty_provider_config_keeps_shortcuts( | CODE |
| LOW | tests/test_shortcut_cleanup.py | 288 | async def test_malformed_shortcut_is_dropped_without_raising( | CODE |
| LOW | tests/test_shortcut_cleanup.py | 303 | async def test_sweep_failure_never_aborts_startup( | CODE |
| LOW⚡ | tests/test_library_sync.py | 864 | async def test_set_provider_mappings_overwrite_keeps_existing_when_empty( | CODE |
| LOW⚡ | tests/test_library_sync.py | 879 | async def test_set_provider_mappings_no_mappings_is_noop(mock_controller: Mock) -> None: | CODE |
| LOW⚡ | tests/test_library_sync.py | 892 | async def test_set_provider_mappings_upsert_preserves_null_in_library( | CODE |
| LOW | tests/test_library_sync.py | 117 | async def test_add_item_to_library_sets_in_library_true() -> None: | CODE |
| LOW | tests/test_library_sync.py | 151 | async def test_add_item_to_library_sets_in_library_even_when_sync_back_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 185 | async def test_add_item_to_library_sets_in_library_even_when_edit_not_supported() -> None: | CODE |
| LOW | tests/test_library_sync.py | 217 | async def test_add_album_imports_tracks_when_enabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 256 | async def test_add_album_does_not_import_tracks_when_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 288 | async def test_add_album_only_imports_tracks_for_added_instance() -> None: | CODE |
| LOW | tests/test_library_sync.py | 339 | async def test_refresh_item_preserves_in_library_state() -> None: | CODE |
| LOW | tests/test_library_sync.py | 383 | async def test_refresh_item_preserves_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 425 | async def test_refresh_item_respects_provider_set_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 469 | async def test_refresh_item_non_library_item_skips_update() -> None: | CODE |
| LOW | tests/test_library_sync.py | 503 | async def test_sync_library_marks_removed_item_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 554 | async def test_sync_library_deletions_disabled_keeps_item() -> None: | CODE |
| LOW | tests/test_library_sync.py | 598 | async def test_sync_library_deletion_unmarks_favorite_when_no_other_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 628 | async def test_sync_library_deletion_keeps_favorite_when_other_provider_has_it() -> None: | CODE |
| LOW | tests/test_library_sync.py | 669 | async def test_sync_library_always_stores_cache_regardless_of_deletion_setting() -> None: | CODE |
| LOW | tests/test_library_sync.py | 701 | def _create_controller_for_filter_tests() -> Mock: | CODE |
| LOW | tests/test_library_sync.py | 711 | async def test_apply_filters_in_library_only_without_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 743 | async def test_apply_filters_in_library_only_with_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 776 | async def test_apply_filters_no_in_library_filter_by_default() -> None: | CODE |
| LOW | tests/test_library_sync.py | 800 | async def test_apply_filters_provider_filter_without_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 848 | async def test_set_provider_mappings_overwrite_deletes_and_reinserts( | CODE |
| LOW | tests/test_library_sync.py | 913 | async def test_set_provider_mappings_upsert_writes_explicit_in_library( | CODE |
| LOW | tests/test_library_sync.py | 936 | async def test_library_items_default_filters_in_library_only() -> None: | CODE |
| LOW | tests/test_library_sync.py | 952 | async def test_library_items_defaults_to_summary() -> None: | CODE |
| LOW | tests/test_library_sync.py | 983 | def test_ensure_provider_filter_keeps_plugin_provider_mappings() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1005 | def test_ensure_provider_filter_rejects_unallowed_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1026 | def test_ensure_provider_filter_allows_explicit_non_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1046 | def test_ensure_provider_filter_auto_allows_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1078 | def test_select_provider_id_prefers_allowed_music_over_plugin() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1116 | def test_select_provider_id_falls_back_to_plugin_when_no_allowed_music() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1154 | def test_select_provider_id_refuses_an_item_only_on_hidden_sources() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1184 | def test_select_provider_id_keeps_an_allowed_mapping_next_to_a_hidden_one() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1233 | async def test_select_provider_id_prefers_highest_priority_mapping(reverse: bool) -> None: | CODE |
| LOW | tests/test_library_sync.py | 1267 | def test_select_provider_id_breaks_priority_ties_deterministically(reverse: bool) -> None: | CODE |
| LOW | tests/test_library_sync.py | 1299 | async def test_get_library_item_does_not_filter_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1319 | async def test_update_item_in_library_skips_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1360 | def _create_event_capture_controller( | CODE |
| LOW | tests/test_library_sync.py | 1379 | async def test_add_and_update_item_emit_events_outside_sync() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1399 | async def test_provider_sync_suppresses_per_item_events() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1439 | async def test_concurrent_add_rechecks_match_inside_lock() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1479 | def test_select_provider_id_never_substitutes_another_account_of_the_same_service() -> None: | CODE |
| LOW | tests/test_generate_release_notes.py | 131 | def test_linear_release_filters_prs_merged_before_previous_tag( | CODE |
| LOW | tests/test_generate_release_notes.py | 156 | def test_pr_number_only_taken_from_commit_title_not_body( | CODE |
| 17057 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_dynamic_playlist_framework.py | 0 | create a bare metadatacontroller without running __init__. | STRING |
| HIGH | tests/controllers/metadata/test_album_reconciliation.py | 0 | create a bare metadatacontroller without running __init__. | STRING |
| HIGH | tests/controllers/metadata/test_metadata_radio.py | 0 | create a bare metadatacontroller without running __init__. | STRING |
| HIGH | tests/core/test_provider_unload.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | tests/controllers/players/test_player_controller.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/wiim/linkplay_player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/wiim/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/fully_kiosk/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/sync_group/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/bose_soundtouch/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/dlna/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | …sic_assistant/providers/roku_media_assistant/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/chromecast/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/sonos_s1/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/airplay/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/raumfeld/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/sendspin/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | …ic_assistant/providers/_demo_player_provider/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/universal_group/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/providers/sonos/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | music_assistant/models/player.py | 0 | handle logic when the player is unloaded from the player controller. | STRING |
| HIGH | tests/providers/neteasecloudmusic/test_setup_flow.py | 0 | build a real setupsession backed by a mock mass for driving run_setup directly. | STRING |
| HIGH | tests/providers/audible/test_setup_flow.py | 0 | build a real setupsession backed by a mock mass for driving run_setup directly. | STRING |
| HIGH | tests/providers/iheartradio/test_setup_flow.py | 0 | build a real setupsession backed by a mock mass for driving run_setup directly. | STRING |
| HIGH | tests/providers/pandora/test_setup_flow.py | 0 | build a real setupsession backed by a mock mass for driving run_setup directly. | STRING |
| HIGH | tests/providers/yandex_music/test_setup_flow.py | 0 | build a real setupsession backed by a mock mass for driving run_setup directly. | STRING |
| HIGH | tests/providers/neteasecloudmusic/test_setup_flow.py | 0 | return the flow steps pushed through mass.signal_event, in order. | STRING |
| HIGH | tests/providers/yandex_music/test_setup_flow.py | 0 | return the flow steps pushed through mass.signal_event, in order. | STRING |
| HIGH | tests/providers/yandex_ynison/test_setup_flow.py | 0 | return the flow steps pushed through mass.signal_event, in order. | STRING |
| HIGH | tests/providers/airplay/test_setup_flow.py | 0 | return the flow steps pushed through mass.signal_event, in order. | STRING |
| HIGH | tests/providers/neteasecloudmusic/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/audible/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/iheartradio/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/yandex_music/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/yandex_ynison/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/yandex_station/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/pandora/test_setup_flow.py | 0 | wait until the predicate returns truthy (or fail the test). | STRING |
| HIGH | tests/providers/ytmusic/test_similar_artists.py | 0 | return a youtubemusicprovider instance with mocked dependencies. | STRING |
| HIGH | tests/providers/ytmusic/test_album_tracks.py | 0 | return a youtubemusicprovider instance with mocked dependencies. | STRING |
| HIGH | tests/providers/ytmusic/test_ytmusic.py | 0 | return a youtubemusicprovider instance with mocked dependencies. | STRING |
| HIGH | tests/providers/ytmusic/test_recommendations.py | 0 | return a youtubemusicprovider instance with mocked dependencies. | STRING |
| HIGH | tests/providers/ytmusic/test_ytmusic.py | 0 | build a fake async context manager mimicking aiohttp's session.get(). | STRING |
| HIGH | tests/providers/lrclib/test_lrclib.py | 0 | build a fake async context manager mimicking aiohttp's session.get(). | STRING |
| HIGH | tests/providers/filesystem_onedrive/test_provider.py | 0 | build a fake async context manager mimicking aiohttp's session.get(). | STRING |
| HIGH | tests/providers/audiobookshelf/test_recommendations.py | 0 | back @use_cache with a dict store; return the background store tasks. | STRING |
| HIGH | tests/providers/bbc_sounds/test_recommendations.py | 0 | back @use_cache with a dict store; return the background store tasks. | STRING |
| HIGH | tests/providers/soundcloud/test_recommendations.py | 0 | back @use_cache with a dict store; return the background store tasks. | STRING |
| HIGH | tests/providers/apple_music/test_recommendations.py | 0 | an item_id not present in the payload yields an empty uniquelist. | STRING |
| HIGH | tests/providers/bbc_sounds/test_recommendations.py | 0 | an item_id not present in the payload yields an empty uniquelist. | STRING |
| HIGH | tests/models/test_recommendation_payload.py | 0 | an item_id not present in the payload yields an empty uniquelist. | STRING |
| HIGH | tests/providers/vrt_max/test_auth.py | 0 | minimal stand-in for an aiohttp response used as an async context manager. | STRING |
| HIGH | tests/providers/listenbrainz_scrobble/test_hook.py | 0 | minimal stand-in for an aiohttp response used as an async context manager. | STRING |
| HIGH | tests/providers/vrt_max/test_playback.py | 0 | minimal stand-in for an aiohttp response used as an async context manager. | STRING |
| HIGH | tests/providers/hass/test_provider.py | 0 | provide the slice of the cache controller that @use_cache relies on. | STRING |
| HIGH | tests/providers/hass/test_device_correlation.py | 0 | provide the slice of the cache controller that @use_cache relies on. | STRING |
| HIGH | tests/providers/hass/test_control_entity_search.py | 0 | provide the slice of the cache controller that @use_cache relies on. | STRING |
| HIGH | tests/providers/hass/test_provider.py | 0 | return the (data, is_fresh, found) triplet for the given key. | STRING |
| HIGH | tests/providers/hass/test_device_correlation.py | 0 | return the (data, is_fresh, found) triplet for the given key. | STRING |
| HIGH | tests/providers/hass/test_control_entity_search.py | 0 | return the (data, is_fresh, found) triplet for the given key. | STRING |
| HIGH | tests/providers/listenbrainz_scrobble/test_hook.py | 0 | build a playback progress report for a played track. | STRING |
| 594 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 199 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 201 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 271 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 487 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 489 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 509 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 511 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 566 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 568 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 592 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 594 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 733 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 735 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 912 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 914 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 960 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 962 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 1537 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 1539 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 298 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 300 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1193 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1195 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1565 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1567 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 181 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 267 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 81 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 83 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 148 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 150 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 306 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 308 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 346 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 348 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_notifier.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_notifier.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_handlers.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_handlers.py | 194 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 73 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 159 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 161 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 252 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 254 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 267 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 402 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/yandex_smarthome/test_handlers.py | 404 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 134 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 241 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 243 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 263 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 265 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 421 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 423 | # --------------------------------------------------------------------------- | COMMENT |
| 662 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_shortcut_cleanup.py | 3 | CODE | |
| LOW | tests/test_library_sync.py | 3 | CODE | |
| LOW | tests/test_generate_release_notes.py | 3 | CODE | |
| LOW | tests/test_numba_cache_isolation.py | 3 | CODE | |
| LOW | tests/test_provider_manifests.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_provider_post_load.py | 3 | CODE | |
| LOW | tests/core/test_provider_load_retry.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_podcast_genre_resync.py | 3 | CODE | |
| LOW | tests/integration/test_podcast_genre_resync.py | 16 | 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_dynamic_radio_e2e.py | 11 | CODE | |
| LOW | tests/integration/test_album_play_credit_e2e.py | 9 | CODE | |
| LOW | tests/integration/test_album_play_credit_e2e.py | 17 | CODE | |
| LOW | tests/integration/test_album_play_credit_e2e.py | 22 | CODE | |
| LOW | tests/integration/test_album_play_credit_e2e.py | 22 | 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_setup_flow.py | 3 | CODE | |
| LOW | tests/providers/neteasecloudmusic/conftest.py | 3 | CODE | |
| LOW | tests/providers/neteasecloudmusic/test_scrobble.py | 3 | CODE | |
| LOW | …sts/providers/neteasecloudmusic/test_library_tracks.py | 3 | CODE | |
| LOW | …s/neteasecloudmusic/test_library_listing_validation.py | 3 | CODE | |
| LOW | tests/providers/neteasecloudmusic/test_image_urls.py | 3 | CODE | |
| LOW | …ts/providers/neteasecloudmusic/test_recommendations.py | 3 | CODE | |
| LOW | tests/providers/wiim/test_grouping.py | 3 | CODE | |
| LOW | tests/providers/wiim/test_linkplay.py | 3 | CODE | |
| LOW | tests/providers/wiim/test_linkplay_external_source.py | 3 | CODE | |
| LOW | tests/providers/openai_tts/test_openai_tts.py | 3 | CODE | |
| LOW | …sts/providers/hass_players/test_native_import_guard.py | 3 | CODE | |
| LOW | tests/providers/hass_players/test_external_playback.py | 3 | CODE | |
| LOW | tests/providers/local_audio/test_retired.py | 3 | CODE | |
| LOW | tests/providers/mammamiradio/test_mammamiradio.py | 3 | CODE | |
| LOW | tests/providers/fully_kiosk/test_setup_flow.py | 3 | CODE | |
| LOW | tests/providers/fully_kiosk/test_dashboard.py | 3 | CODE | |
| LOW | tests/providers/ytmusic/test_similar_artists.py | 3 | CODE | |
| 1812 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/test_library_sync.py | 860 | mock_controller.mass.music.database.delete.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 861 | mock_controller.mass.music.database.upsert_many.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 874 | mock_controller.mass.music.database.delete.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 875 | mock_controller.mass.music.database.upsert_many.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 887 | mock_controller.mass.music.database.delete.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 888 | mock_controller.mass.music.database.upsert_many.assert_not_called() | CODE |
| CRITICAL | tests/providers/msx_bridge/test_party_qr_cover.py | 475 | assert mass_mock.http_session.get.call_args.kwargs.get("allow_redirects") is False | CODE |
| CRITICAL | tests/providers/radio_playlist/test_radio_playlist.py | 187 | prov.mass.music.artists.top_tracks.assert_awaited_once_with("art1", "test") | CODE |
| CRITICAL | tests/providers/radio_playlist/test_radio_playlist.py | 205 | prov.mass.music.artists.tracks.assert_awaited_once_with("art1", "test") | CODE |
| CRITICAL⚡ | tests/providers/airplay/test_announce.py | 261 | player.mass.streams.announcement_renderer.release.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/airplay/test_announce.py | 221 | leader.mass.streams.announcement_renderer.release.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/airplay/test_announce.py | 806 | player.mass.streams.announcement_renderer.release.assert_awaited_once() | CODE |
| CRITICAL⚡ | tests/providers/airplay/test_stream.py | 227 | player.provider.mass.streams.get_publish_ip.assert_called_once_with("192.168.1.50") | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2048 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2083 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2094 | pinned_player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2111 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2186 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/plex/test_provider_methods.py | 404 | music_provider.mass.streams.audio_analysis.set_track_loudness.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/plex/test_provider_methods.py | 423 | music_provider.mass.streams.audio_analysis.set_track_loudness.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/opensubsonic/test_provider.py | 119 | provider.mass.streams.audio_analysis.set_track_loudness.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/opensubsonic/test_provider.py | 139 | provider.mass.streams.audio_analysis.set_track_loudness.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/sendspin/test_playback_processing.py | 56 | player.mass.streams.audio_processing.update_output.assert_called_once_with( | CODE |
| CRITICAL | tests/providers/loudness_analysis/test_provider.py | 487 | provider.mass.streams.audio_analysis.get_audio_analysis.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 95 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 112 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 162 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 426 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 468 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 505 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 540 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 562 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 596 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 622 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 645 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 666 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_called() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 729 | prov_any.mass.music.tracks.get_provider_item.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 783 | prov_any.mass.music.tracks.get_provider_item.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 839 | prov_any.mass.music.tracks.get_provider_item.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1156 | prov_any.mass.music.tracks.get_provider_item.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1185 | prov_any.mass.music.tracks.get_provider_item.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1263 | prov_any.mass.music.tracks.get_provider_item.assert_awaited_once() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1300 | prov_any.mass.music.tracks.get_provider_item.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1349 | prov_any.mass.music.tracks.get_provider_item.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 1378 | prov_any.mass.music.tracks.get_provider_item.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/builtin/test_import_matching.py | 2247 | prov_any.mass.music.tracks.enrich_provider_mappings.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/builtin/test_recently_played.py | 52 | provider.mass.music.tracks.get_library_items_by_query.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/builtin/test_recently_played.py | 106 | provider.mass.music.tracks.get_library_items_by_query.assert_not_awaited() | CODE |
| CRITICAL | tests/providers/filesystem_local/test_nfo_resolution.py | 627 | provider.mass.music.artists.get_library_item_by_external_id.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | …providers/filesystem_local/test_metadata_file_cache.py | 646 | provider.mass.music.artists.get_library_artist_tracks.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | …providers/filesystem_local/test_metadata_file_cache.py | 690 | provider.mass.music.artists.get_library_artist_albums.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | …providers/filesystem_local/test_metadata_file_cache.py | 693 | provider.mass.music.albums.get_library_album_tracks.assert_awaited_once_with( | CODE |
| CRITICAL | …providers/filesystem_local/test_parse_playlist_line.py | 154 | fs_provider.mass.music.tracks.get_library_item_by_prov_id.assert_awaited_once() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem_local/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_local/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_local/test_sound_effects.py | 175 | provider.mass.music.tracks.get_library_item_by_prov_id.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem_local/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_local/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_local/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_local/test_sync_config.py | 126 | provider.mass.music.tracks.add_item_to_library.assert_not_called() # type: ignore[attr-defined] | CODE |
| 62 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_diagnostics.py | 173 | except Exception: | CODE |
| LOW | tests/providers/nicovideo/test_converters.py | 128 | except Exception as e: | CODE |
| LOW | tests/providers/nicovideo/test_converters.py | 150 | except Exception as e: | CODE |
| LOW | tests/controllers/config/test_setup_flows.py | 614 | except Exception as err: | CODE |
| LOW | tests/controllers/streams/test_get_media_stream.py | 278 | except Exception as err: | CODE |
| MEDIUM | music_assistant/mass.py | 1537 | def _on_provider_loaded() -> None: | CODE |
| LOW | music_assistant/mass.py | 211 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 371 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 428 | except Exception: | CODE |
| LOW | music_assistant/mass.py | 989 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1006 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1032 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1102 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1194 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 1513 | except Exception: | CODE |
| LOW | music_assistant/mass.py | 1519 | except Exception as unload_err: | CODE |
| LOW | music_assistant/mass.py | 1540 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 1606 | except Exception as exc: | CODE |
| LOW | music_assistant/providers/wiim/provider.py | 139 | except Exception: | CODE |
| LOW | music_assistant/providers/wiim/provider.py | 160 | except Exception: | CODE |
| LOW | music_assistant/providers/wiim/player.py | 211 | except Exception: | CODE |
| LOW | music_assistant/providers/openai_tts/__init__.py | 110 | except Exception: | CODE |
| LOW | music_assistant/providers/hass_players/helpers.py | 139 | except Exception as exc: | CODE |
| LOW | music_assistant/providers/ytmusic/__init__.py | 956 | except Exception as err: | CODE |
| LOW | music_assistant/providers/vban_receiver/provider.py | 213 | except Exception as err: | CODE |
| LOW | music_assistant/providers/bandcamp/__init__.py | 849 | except Exception as error: | CODE |
| LOW | music_assistant/providers/sync_group/player.py | 1355 | except Exception as err: | CODE |
| LOW | music_assistant/providers/apple_music/library.py | 388 | except Exception as err: | CODE |
| LOW | music_assistant/providers/smart_fades/provider.py | 597 | except Exception as err: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/cloud.py | 69 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/cloud.py | 142 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/cloud.py | 151 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/device.py | 564 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/playlists.py | 44 | except Exception as exc: | CODE |
| LOW | …sistant/providers/yandex_smarthome/ma_authenticator.py | 74 | except Exception as exc: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/notifier.py | 206 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/notifier.py | 305 | except Exception as exc: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/notifier.py | 337 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/notifier.py | 368 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/handlers.py | 73 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/handlers.py | 103 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/plugin.py | 93 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/plugin.py | 418 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/plugin.py | 431 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/direct.py | 179 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 234 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 246 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 265 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 277 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 289 | except Exception: | CODE |
| LOW⚡ | music_assistant/providers/yandex_smarthome/direct.py | 302 | except Exception: | CODE |
| LOW | music_assistant/providers/yandex_smarthome/direct.py | 369 | except Exception: | CODE |
| LOW | …sic_assistant/providers/yandex_smarthome/setup_flow.py | 518 | except Exception as err: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/player.py | 410 | except Exception: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 83 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 190 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 238 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 252 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/provider.py | 332 | except Exception as err: | CODE |
| LOW | music_assistant/providers/airplay_receiver/provider.py | 897 | except Exception as err: | CODE |
| 660 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_shortcut_cleanup.py | 66 | async def _set_shortcuts(auth: AuthenticationManager, user_id: str, uris: list[str]) -> None: | CODE |
| LOW | tests/providers/sync_group/test_sync_group.py | 1940 | async def _set_members(**_kwargs: object) -> None: | CODE |
| LOW | tests/providers/bose_soundtouch/test_config.py | 72 | def _update_config_value(self, key: str, value: Any, immediate: bool = False) -> None: | CODE |
| LOW | tests/providers/vrt_max/conftest.py | 63 | def _set_credentials(provider: VrtMaxProvider) -> None: | CODE |
| LOW | tests/providers/musicbrainz/test_recommendations.py | 87 | def _set_library(provider_mock: Mock, artists: list[Artist]) -> None: | CODE |
| LOW | tests/providers/heos/test_player.py | 221 | async def _set_device_state(player: HeosPlayer, state: HeosPlayState) -> None: | CODE |
| LOW | tests/providers/fastmcp_server/test_e2e_hotswap.py | 36 | def _set_config_values(config: MagicMock, **overrides: Any) -> None: | CODE |
| LOW | …ders/fastmcp_server/test_request_policy_enforcement.py | 309 | async def update_metadata(uri: str) -> None: | CODE |
| LOW | tests/providers/itunes_podcasts/test_recommendations.py | 43 | def _set_library(mass: Mock, podcasts: list[Podcast]) -> None: | CODE |
| LOW | tests/providers/snapcast/conftest.py | 34 | def set_callback(self, cb: Any) -> None: | CODE |
| LOW | tests/providers/soundcloud/test_setup.py | 18 | def _setup_values(provider: SoundcloudMusicProvider, **values: str) -> None: | CODE |
| LOW⚡ | tests/providers/sonos_s1/test_player.py | 191 | def _set_transport_state(sonos_player: SonosPlayer, state: str) -> None: | CODE |
| LOW⚡ | tests/providers/sonos_s1/test_player.py | 196 | def _set_track_info(sonos_player: SonosPlayer, uri: str, position: str = "") -> 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_sendspin_bridge.py | 299 | def _settle_anchor(bridge: SendspinAirPlayBridge) -> None: | CODE |
| LOW | tests/providers/sendspin/test_setup_flow.py | 265 | async def set_trusted_unpaired(self, client_id: str, enabled: bool) -> None: | CODE |
| LOW | tests/providers/sendspin/test_bridge_manager.py | 533 | def set_raw(player_id: str, key: str, value: Any) -> None: | CODE |
| LOW | tests/providers/sendspin_source/test_provider.py | 449 | async def _settle() -> None: | CODE |
| LOW | tests/providers/nugs/test_stream_url.py | 56 | def _set_quality(provider: NugsProvider, quality: str) -> None: | CODE |
| LOW | tests/providers/sonos/test_provider.py | 120 | async def _setup_player(*_args: object) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 124 | def _set_runtime_mass(runtime: AIRadioRuntimeMixin, mass: Any) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 1572 | async def _set_shuffle(_queue_id: str, _shuffle_enabled: bool) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 2240 | async def _set_shuffle(queue_id: str, shuffle_enabled: bool) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 2405 | def _set_flow_mode_required(queue_id: str, owner: str, required: bool) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_queue_dj.py | 90 | def update_items(self, queue_id: str, queue_items: list[Any]) -> None: | CODE |
| LOW | …sts/providers/spotify_connect/test_backend_contract.py | 142 | async def set_volume(self, volume: int) -> None: | CODE |
| LOW | …sts/providers/spotify_connect/test_backend_contract.py | 159 | async def set_shuffle(self, enabled: bool) -> None: | CODE |
| LOW | …sts/providers/spotify_connect/test_backend_contract.py | 163 | async def set_repeat(self, repeat: RepeatMode) -> None: | CODE |
| LOW | tests/providers/spotify_connect/test_soloist_backend.py | 97 | async def set_volume(self, volume_pct: float) -> None: | CODE |
| LOW | tests/models/test_player_icons.py | 209 | def _set_up_config_player(mass: MusicAssistant) -> None: | CODE |
| LOW⚡ | tests/controllers/music/test_genres.py | 1693 | async def _set_track_genres(mass: MusicAssistant, track_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 130 | async def _set_podcast_genres(mass: MusicAssistant, podcast_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 1704 | async def _set_album_genres(mass: MusicAssistant, album_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/config/test_setup_flows.py | 1727 | def _set_player_conf(flow_mass: MusicAssistant, player: MockPlayer) -> None: | CODE |
| LOW | tests/controllers/config/test_save_scheduling.py | 61 | def _set_without_delay(controller: ConfigController, key: str, value: Any) -> None: | CODE |
| LOW | tests/controllers/config/test_remove_player_config.py | 86 | def set_protocol_parent_id(self, parent_id: str | None) -> None: | CODE |
| LOW | …ts/controllers/config/test_filesystem_consolidation.py | 2037 | async def _update_then_kill(mass: MusicAssistant, instance_ids: list[str]) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 1374 | def _set_play_media_override(mock_mass: MagicMock, value: bool) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 3570 | def _set_limits(mock_mass: MagicMock, min_volume: int, max_volume: int) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 6572 | async def _set_members(**kwargs: list[str]) -> None: | CODE |
| LOW | …/controllers/players/test_active_protocol_lifecycle.py | 263 | async def _set_members(**kwargs: object) -> None: | CODE |
| LOW | tests/controllers/players/test_protocol_linking.py | 2966 | def _update_state_on_set_members(player: MockPlayer) -> None: | CODE |
| LOW | tests/controllers/players/test_live_source_selection.py | 123 | async def _settle() -> None: | CODE |
| LOW⚡ | tests/controllers/players/test_live_source_dispatch.py | 276 | async def set_shuffle(self, shuffle_enabled: bool) -> None: | CODE |
| LOW⚡ | tests/controllers/players/test_live_source_dispatch.py | 279 | async def set_repeat(self, repeat_mode: RepeatMode) -> None: | CODE |
| LOW | tests/controllers/storage/conftest.py | 114 | def set_locations(storage: StorageController, *locations: StorageLocation) -> None: | CODE |
| LOW | …ts/controllers/player_queues/test_play_media_access.py | 101 | def _set_sources(ctrl: Any) -> None: | CODE |
| LOW | tests/helpers/test_scrobbler.py | 36 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_scrobbler.py | 220 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_throttle_retry.py | 52 | def set_side_effects(self, effects: Sequence[Exception | str]) -> None: | CODE |
| LOW | music_assistant/mass.py | 1627 | async def _update_available_providers_cache(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1651 | async def _setup_storage(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1658 | def _set_state(self, new_state: CoreState) -> None: | CODE |
| LOW | music_assistant/__main__.py | 275 | def _set_stop() -> None: | CODE |
| LOW⚡ | music_assistant/providers/wiim/player.py | 435 | def _update_ma_state_from_sdk_cache(self) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/provider.py | 210 | def update_player_from_state_msg(entity_id: str, state: CompressedState) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 372 | def update_from_compressed_state(self, state: CompressedState) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 384 | def _update_hass_features(self, hass_supported_features: MediaPlayerEntityFeature) -> None: | CODE |
| 326 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library_sync.py | 503 | CODE | |
| LOW | tests/test_library_sync.py | 554 | CODE | |
| LOW | tests/integration/test_library_summary_items.py | 163 | CODE | |
| LOW | …ts/providers/filesystem_yandex_disk/test_setup_flow.py | 166 | CODE | |
| LOW | …ts/providers/filesystem_yandex_disk/test_setup_flow.py | 335 | CODE | |
| LOW | tests/providers/musicbrainz/test_provider.py | 827 | CODE | |
| LOW | tests/providers/iheartradio/conftest.py | 114 | CODE | |
| LOW | tests/providers/fastmcp_server/test_origin.py | 339 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2310 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2629 | CODE | |
| LOW | tests/providers/music_quiz/test_models.py | 331 | CODE | |
| LOW | tests/providers/sendspin/test_setup_flow.py | 242 | CODE | |
| LOW | tests/providers/sendspin/test_pin_session.py | 215 | CODE | |
| LOW | tests/providers/feiniu_music/test_http_session.py | 62 | CODE | |
| LOW | tests/providers/feiniu_music/test_http_session.py | 278 | CODE | |
| LOW | tests/providers/feiniu_music/test_http_session.py | 75 | CODE | |
| LOW | tests/providers/feiniu_music/test_api_lifecycle.py | 262 | CODE | |
| LOW | tests/controllers/music/test_album_track_identity.py | 404 | CODE | |
| LOW | tests/controllers/players/test_player_grouping.py | 732 | CODE | |
| LOW | music_assistant/providers/wiim/grouping.py | 536 | CODE | |
| LOW | music_assistant/providers/wiim/player.py | 435 | CODE | |
| LOW | music_assistant/providers/openai_tts/__init__.py | 310 | CODE | |
| LOW | music_assistant/providers/openai_tts/__init__.py | 313 | CODE | |
| LOW | music_assistant/providers/hass_players/provider.py | 150 | CODE | |
| LOW | music_assistant/providers/hass_players/player.py | 409 | CODE | |
| LOW | music_assistant/providers/mammamiradio/__init__.py | 200 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 245 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 484 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 656 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 677 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 781 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 860 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 864 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 371 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 378 | CODE | |
| LOW | music_assistant/providers/vban_receiver/provider.py | 249 | CODE | |
| LOW | music_assistant/providers/teddycloud/provider.py | 78 | CODE | |
| LOW | music_assistant/providers/bandcamp/converters.py | 58 | CODE | |
| LOW | music_assistant/providers/sync_group/player.py | 136 | CODE | |
| LOW | music_assistant/providers/sync_group/player.py | 569 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 424 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 488 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1079 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1566 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 253 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 327 | 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 | 173 | CODE | |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 203 | CODE | |
| LOW | …nt/providers/bose_soundtouch/client/client/__init__.py | 183 | CODE | |
| LOW | …nt/providers/bose_soundtouch/client/client/__init__.py | 234 | CODE | |
| LOW | …nt/providers/bose_soundtouch/client/client/__init__.py | 304 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 140 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 196 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 302 | CODE | |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 339 | CODE | |
| LOW | music_assistant/providers/zvuk_music/parsers.py | 132 | CODE | |
| LOW | music_assistant/providers/vrt_max/parsers.py | 68 | CODE | |
| LOW | music_assistant/providers/vrt_max/parsers.py | 89 | CODE | |
| 226 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/providers/mammamiradio/test_mammamiradio.py | 1118 | """session_state stopped/empty_queue (now_playing null) renders the station name.""" | STRING |
| HIGH | tests/providers/spotify/test_playback_auth.py | 326 | ('{"username": null, "auth_data": "blob"}', "u1", False), | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 515 | queue.push(b"first") | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 516 | queue.push(b"second") | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 517 | queue.push('{"type": "stream/clear"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 525 | queue.push('{"type": "stream/start"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 526 | queue.push('{"type": "stream/clear"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 527 | queue.push(b"frame") | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 319 | 1: ("smart_fades", '{"spectral_centroid": [1.5, null, 2.5, null], "bpm": 120}'), | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 322 | 3: ("other_domain", '{"spectral_centroid": [null], "bpm": 100}'), | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 326 | 5: ("smart_fades", '{"spectral_centroid": null, "bpm": 90}'), | CODE |
| HIGH | tests/helpers/test_wake_on_lan.py | 44 | """Test an invalid (or null) MAC address raises instead of silently sending nothing.""" | STRING |
| HIGH⚡ | tests/helpers/test_json.py | 97 | ({"a": [1, 2], "b": {"c": None}}, '{"a":[1,2],"b":{"c":null}}'), | 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 | 178 | info: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 179 | sessionToken: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 180 | selectedClientId: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 188 | setupCallback: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 193 | if (cachedTokens && typeof cachedTokens === "object") state.tokens = cachedTokens; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 208 | let data = null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 245 | if (!c || !c.methods || !c.methods.length) return null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 335 | state.sessionToken = null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 343 | showMsg((data && data.error) || ("HTTP " + res.status), "bad"); | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 354 | if (!value || !value.startsWith("/")) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 357 | if (callback.origin !== window.location.origin) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 358 | if (!/\\/setup_flow\\/callback\\/[a-f0-9]+$/.test(callback.pathname)) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 361 | return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 366 | if (!state.setupCallback || state.setupCallbackSent) return; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 381 | if (navigator.clipboard && navigator.clipboard.writeText) { | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 454 | showMsg((data && data.error) || "Sign-in failed.", "bad"); | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 465 | showMsg("Signed in as " + (data.user && data.user.username || "user") + ".", "good"); | CODE |
| HIGH | music_assistant/providers/airplay/provider.py | 635 | # one resolves (first) is undefined, so match the full advertised address set | COMMENT |
| HIGH | music_assistant/providers/sendspin/playback.py | 597 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/providers/sendspin/playback.py | 1424 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/providers/milkdrop_visualizer/tap.py | 142 | A track without a palette yields every field as null, so a viewer drops the | STRING |
| HIGH | music_assistant/providers/milkdrop_visualizer/tap.py | 248 | queue.push(frame) | CODE |
| HIGH | music_assistant/providers/milkdrop_visualizer/relay.py | 10 | - text {"type":"color","payload":{field: [r,g,b]|null, ...}} - changed color@v1 fields | STRING |
| HIGH | music_assistant/controllers/streams/audio_analysis.py | 451 | # non-finite floats serialize to JSON null, which corrupts the stored row; | COMMENT |
| HIGH | music_assistant/controllers/webserver/api_docs.py | 1013 | # Filter out None/null types (None, NoneType, null all mean JSON null) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/vban_receiver/provider.py | 317 | # Check if the stream_id has changed underneath us while waiting | COMMENT |
| LOW | music_assistant/providers/airplay_receiver/metadata.py | 144 | # Check if we have a complete line before any XML | COMMENT |
| LOW | music_assistant/providers/airplay_receiver/provider.py | 589 | # Check if process started successfully | COMMENT |
| LOW | …stant/providers/airplay_receiver/bin/build_binaries.sh | 103 | # Check if Homebrew is installed | COMMENT |
| LOW | music_assistant/providers/party/__init__.py | 606 | # Check if guest access is enabled | COMMENT |
| LOW | music_assistant/providers/party/__init__.py | 879 | # Check if guest access and skip are enabled | COMMENT |
| LOW | music_assistant/providers/spotify/provider.py | 234 | # Check if user has a custom client ID with valid dev token | COMMENT |
| LOW | music_assistant/providers/audible/__init__.py | 95 | # Check if we have signing auth (preferred, stable - not affected by API changes) | COMMENT |
| LOW | music_assistant/providers/bluesound/provider.py | 83 | # Check if the IP address has changed | COMMENT |
| LOW | …_assistant/providers/nicovideo/provider_mixins/core.py | 64 | # 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 | 3280 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/yandex_music/api_client.py | 735 | # Check if it's LRC format (synced lyrics have timestamps like [00:12.34]) | COMMENT |
| LOW | music_assistant/providers/universal_player/provider.py | 112 | # Check if player already exists | COMMENT |
| LOW | music_assistant/providers/soundcloud/__init__.py | 480 | # Check if we have a valid response with tracks collection | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 645 | # Check if manual player switching is allowed | COMMENT |
| LOW | music_assistant/providers/yandex_station/provider.py | 252 | # Check if player already registered (cloud-discovered) — connect Glagol | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 229 | # Check if we have enough results across all types | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 346 | # Check if this is audiobook content using improved detection | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 355 | # Check if this is podcast content | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 614 | # Check if this is the same as album artist to avoid duplicates (case-insensitive) | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 871 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 907 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1523 | # Check if album rating meets the configured threshold for favorites | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1760 | # Check if track rating meets the configured threshold for favorites | COMMENT |
| LOW | music_assistant/providers/plex_connect/gdm.py | 202 | # Check if this is a discovery request (M-SEARCH) not our own HELLO | COMMENT |
| LOW | music_assistant/providers/webdav/provider.py | 287 | # Check if this is an audio file with embedded image | COMMENT |
| LOW | music_assistant/providers/webdav/helpers.py | 139 | # Check if it's a directory | COMMENT |
| LOW | music_assistant/providers/kion_music/provider.py | 2397 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/kion_music/api_client.py | 466 | # Check if it's LRC format (synced lyrics have timestamps like [00:12.34]) | COMMENT |
| LOW | music_assistant/providers/sendspin/provider.py | 1569 | # Check if client still exists (may have disconnected while waiting) | COMMENT |
| LOW | music_assistant/providers/podcastfeed/__init__.py | 214 | # Check if we got actual image content | COMMENT |
| LOW | music_assistant/providers/tidal/tidal_page_parser.py | 141 | # Check if item appears to be a mix | COMMENT |
| LOW | music_assistant/providers/tidal/auth_manager.py | 126 | # Check if token is expired | COMMENT |
| LOW | music_assistant/models/player.py | 1848 | # Check if the protocol player is actually available | COMMENT |
| LOW | music_assistant/models/player.py | 3565 | # Check if member_id is a provider instance ID | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 571 | # Check if the search query is a streaming provider public shareable URL | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 1417 | # Check if any existing mapping's item_id has been modified for non-streaming providers | COMMENT |
| LOW | music_assistant/controllers/music/media/genres.py | 2105 | # 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 | 2155 | # Check if this name was deliberately excluded in this taxonomy before creating | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3281 | # Check if parent config still exists | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3478 | # Check if new source is external (not MA-managed) | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3542 | # Check if it's a known queue ID | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 238 | # Check if this universal player should now be merged with another | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 279 | # Check if linking actually succeeded (may be refused for | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 294 | # Check if this universal player should now be merged with another | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 443 | # Check if this protocol player has a cached parent (was previously linked) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 502 | # Check if there's an existing universal player we should join | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 585 | # Check if linking actually succeeded (may be refused for duplicate domain) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 604 | # Check if this universal player should now be merged with another | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 621 | # Check if universal player has generic placeholder device info | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 867 | # Check if keeper already has an active link from this domain | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 991 | # Check if linking succeeded (may be refused for duplicate domain) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 1624 | # Check if this protocol has a parent_id pointing to this native player | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2303 | # Check if this member is in the parent's group via protocol | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2322 | # Check if child's protocol player is in parent's native group_members | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2389 | # Check if parent supports this protocol (including native protocol) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2396 | # Check if this protocol supports set_members | COMMENT |
| LOW | music_assistant/controllers/streams/audio.py | 3458 | # Check if this is a Shoutcast/ICY response that aiohttp can't parse | COMMENT |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/integration/test_library_summary_items.py | 221 | # wire format: provider mappings are carried in full and must match the | COMMENT |
| LOW | tests/providers/fastmcp_server/conftest.py | 1 | """ | COMMENT |
| LOW | tests/controllers/streams/test_audio_sources.py | 421 | ) -> None: | COMMENT |
| LOW | music_assistant/mass.py | 341 | await cast("CoreController", getattr(self, controller_name)).post_setup() | COMMENT |
| LOW | music_assistant/mass.py | 361 | # the access records that now live on the sources. Needs the users from the auth | COMMENT |
| LOW | music_assistant/constants.py | 901 | "Pragma": "no-cache", | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 241 | # in the supported_features and you did not override the default sync method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 281 | # in the supported_features and you did not override the default sync method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 301 | # NOTE: This is only called on each full sync of the library (at the specified interval). | 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 | # library based on the returned items in the (default) 'sync_library' method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 361 | # You can use the @use_cache decorator from music_assistant.controllers.cache | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 381 | """Get full album details by id.""" | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 401 | # Mandatory only if you reported LIBRARY_PLAYLISTS in the supported | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 421 | # Get all tracks for a given album. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 501 | COMMENT | |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 661 | # Return one RecommendationFolder per recommendation row, filling in only | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 681 | COMMENT | |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 701 | # If you use the RecommendationPayloadMixin (see get_recommendations), | COMMENT |
| LOW | …assistant/providers/_demo_music_provider/setup_flow.py | 41 | Drive the interactive setup flow for a new provider instance. | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 701 | await self.mass.players._handle_cmd_stop(leader.player_id) | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 1061 | ) | COMMENT |
| LOW | music_assistant/providers/yandex_smarthome/notifier.py | 81 | # Dedupe state-callback errors by fingerprint. Yandex's backend | COMMENT |
| LOW | music_assistant/providers/yandex_smarthome/constants.py | 21 | CONF_EXPOSED_PLAYLISTS = "exposed_playlists" | COMMENT |
| LOW | music_assistant/providers/yandex_smarthome/constants.py | 61 | # Direct mode uses a per-install auto-generated secret instead (see CONF_DIRECT_CLIENT_SECRET). | COMMENT |
| LOW | music_assistant/providers/vrt_max/constants.py | 201 | ) | COMMENT |
| LOW | music_assistant/providers/vrt_max/constants.py | 221 | "Accept": "application/json", | COMMENT |
| LOW | music_assistant/providers/hass/control_entities.py | 21 | COMMENT | |
| LOW | music_assistant/providers/spotify/constants.py | 41 | # The playback session registers under this name, so it shows up as a device in | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 101 | # absorbs the source-less gap at the next track boundary; at exactly 1.0x | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 121 | _JUMP_TIMEOUT_S: Final[float] = 5.0 | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 141 | # holds well under a second, so the reader must keep draining it whenever the | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 761 | self._transport = None | COMMENT |
| LOW | music_assistant/providers/msx_bridge/static/input.js | 1 | /******************************************************************************/ | COMMENT |
| LOW | music_assistant/providers/amplipi/constants.py | 41 | # no native pause for this type; pause is emulated via stop in the player. | COMMENT |
| LOW | music_assistant/providers/amplipi/constants.py | 81 | COMMENT | |
| LOW | …sic_assistant/providers/sonic_analysis/clap_prompts.py | 101 | # Calibration provenance | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 81 | # triggers (HTML body with smart-captcha markers), the corresponding | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 101 | # sync — kept low so it does not flood smart-captcha | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 121 | # Initial-sync jitter: during the first INITIAL_SYNC_WINDOW_S after a | COMMENT |
| LOW | music_assistant/providers/yandex_music/api_client.py | 141 | # Short-TTL cache for /get-file-info results, keyed by | 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/chromecast/constants.py | 41 | SENDSPIN_CAST_EXPERIMENTAL_NOTE = "sendspin_cast_experimental" | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 481 | The PCM format is frozen at session start to match what the outer | COMMENT |
| LOW | …sic_assistant/providers/yandex_ynison/ynison_client.py | 721 | COMMENT | |
| LOW | music_assistant/providers/yandex_station/player.py | 221 | # can't issue duplicate stop/play commands for the same track. | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 281 | # registered player regardless of which playback features it | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 761 | except Exception as exc: | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 801 | The debounce timestamp is updated on every attempt — successful or | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 881 | await self._pause_target(clear_session=True, clear_debounce=False) | COMMENT |
| LOW | music_assistant/providers/airplay/provider.py | 81 | COMMENT | |
| LOW | music_assistant/providers/airplay/constants.py | 61 | # that could not tell a password challenge apart from a flat refusal wrote the | COMMENT |
| LOW | music_assistant/providers/airplay/constants.py | 101 | COMMENT | |
| LOW | music_assistant/providers/airplay/constants.py | 121 | # first probe (~1078 ms after connect on a cold device), so this only has to | COMMENT |
| LOW | music_assistant/providers/airplay/constants.py | 141 | # the auto-route for the receivers that used to need a deepened queue: the | COMMENT |
| LOW | music_assistant/providers/airplay/constants.py | 161 | # reported. The binary derives the cut it took from the bytes it discarded, so a | COMMENT |
| 97 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_webserver_auth.py | 194 | # Create a user first | COMMENT |
| MEDIUM | tests/test_remote_access.py | 589 | # Create a session first | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 34 | # Create a mock SearchResultTrack | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 53 | # Create a mock SearchResultAlbum | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 116 | # Create a mock SearchResultArtist | COMMENT |
| MEDIUM | tests/providers/apple_music/test_library.py | 487 | # Create an ItemMapping instead of a Track | COMMENT |
| MEDIUM | tests/providers/smart_playlist/test_smart_playlist.py | 1997 | # 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 | 30 | # Create a mock that acts as an async context manager | COMMENT |
| MEDIUM | tests/controllers/players/test_protocol_linking.py | 55 | # Create a mock manifest | COMMENT |
| MEDIUM | tests/helpers/test_throttle_retry.py | 899 | # 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 | 473 | # Create a new playlist on the provider. | COMMENT |
| MEDIUM | music_assistant/providers/airplay_receiver/metadata.py | 105 | # Create an asyncio.Event to signal when data is available | COMMENT |
| MEDIUM | music_assistant/providers/party/__init__.py | 798 | # Create a QueueItem from the media item | COMMENT |
| MEDIUM | music_assistant/providers/spotify/parsers.py | 282 | # Create a minimal podcast reference if none available | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 788 | # Create a full Artist object so MA doesn't try to resolve it. | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 818 | # 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 | 768 | # 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 | 157 | # Create the player instance | COMMENT |
| MEDIUM | music_assistant/providers/plex/__init__.py | 2168 | # Create a recommendation folder for each hub | COMMENT |
| MEDIUM | music_assistant/providers/plex_connect/gdm.py | 84 | # Create the shared listen/reply socket and start the listener task | 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 | 239 | # This method is mandatory and should be implemented. | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 279 | # This method is optional and should be implemented if you want to support | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 291 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 307 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 315 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 327 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | music_assistant/controllers/config/providers.py | 797 | # Create the config with only the server-default entries (no provider options: those | COMMENT |
| MEDIUM | music_assistant/controllers/webserver/auth.py | 1355 | # 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 | 547 | # Create the user | COMMENT |
| MEDIUM | music_assistant/controllers/metadata/radio.py | 477 | # 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 | 739 | # (that path is only for the seamless handoff). Instead, dissolve+reform | COMMENT |
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 925 | # the remaining member never joined the session, so no seamless handoff | COMMENT |
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 628 | """When the new leader IS in the live session, seamless protocol-level handoff is used.""" | STRING |
| MEDIUM | tests/providers/yandex_station/test_provider_cascade.py | 35 | # ── Test harness ─────────────────────────────────────────────────── | COMMENT |
| LOW | tests/providers/airplay/test_control_player.py | 351 | # the level the user just set. | COMMENT |
| MEDIUM | tests/helpers/test_audio.py | 152 | # deliberately wide to stay robust on loaded CI runners. | COMMENT |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 97 | # 0.1 Hz swell = 3 full cycles per 30s loop, keeping the loop seamless | COMMENT |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 358 | """Build the ffmpeg filter graph that renders the preset as a seamless loop.""" | STRING |
| MEDIUM | music_assistant/providers/ambient_sounds/__init__.py | 360 | # seamless loop: generate CROSSFADE_DURATION extra seconds, trim that amount | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 371 | # Note that (local) file based providers will simply return all artist tracks here. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/constants.py | 65 | # group can do a seamless leader handoff; otherwise it must dissolve and | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1399 | # a seamless handoff must stay on the protocol carrying the stream. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1420 | # so the session continuation is seamless. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1442 | # A seamless handoff requires the new leader to already be a sync_client of | COMMENT |
| MEDIUM | music_assistant/providers/phishin/provider.py | 116 | # 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/airplay/provider.py | 651 | # Match by advertised name (robust even when the TXT record did not resolve). | COMMENT |
| LOW | music_assistant/providers/airplay/control_player.py | 1081 | # overwrite (or persist) the level the user just set on the stream. | COMMENT |
| MEDIUM | music_assistant/providers/opensubsonic/parsers.py | 48 | # 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 | 149 | # 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 | 118 | # In this demo implementation we just set the power state to ON | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 125 | # In this demo implementation we just set the power state to OFF | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 139 | # In this demo implementation we just set the volume level | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 172 | # In this demo implementation we just set the playback state to PLAYING | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 189 | # In this demo implementation we just set the playback state to IDLE | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 205 | # In this demo implementation we just set the playback state to PAUSED | COMMENT |
| LOW | …ic_assistant/providers/_demo_player_provider/player.py | 249 | # the queue controller will simply call this play_media method for | COMMENT |
| LOW | music_assistant/providers/filesystem_local/__init__.py | 441 | # for audiobooks and podcasts we just return all library items | COMMENT |
| LOW | music_assistant/models/provider.py | 229 | # default implementation - simply use the instance number/index | COMMENT |
| LOW | music_assistant/models/music_provider.py | 2060 | # just return False here to trigger that logic | COMMENT |
| LOW⚡ | music_assistant/models/player.py | 1361 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 1343 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 3393 | # Scenario 1: Player is a protocol player - just return the (expanded) result | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 3724 | # simply return the first item because search is already sorted by best match | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 1752 | # simply sort by quality and just add the first available version | COMMENT |
| LOW | music_assistant/controllers/music/media/base.py | 1314 | # simply return the fallback item | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 1592 | # else: any other media item, just add it to the favorites directly | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 956 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 1389 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/webserver/api_docs.py | 983 | # Remove the ellipsis and just use the type | COMMENT |
| LOW | …ssistant/controllers/player_queues/playback_tracker.py | 409 | # so we just return the queue index and the elapsed time | COMMENT |
| LOW | music_assistant/helpers/api.py | 148 | # we can just use the bound type for documentation purposes | COMMENT |
| LOW | music_assistant/helpers/audio.py | 960 | # simply return the preference | COMMENT |
| MEDIUM | scripts/perf/perf_server.py | 191 | # skip the harness' own frames - they are measurement scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_cross_type_features.py | 910 | except NotImplementedError: | CODE |
| HIGH | tests/providers/feiniu_music/test_api_lifecycle.py | 136 | except ConnectionResetError: | CODE |
| HIGH | music_assistant/providers/wiim/player.py | 404 | except ValueError: | CODE |
| HIGH | music_assistant/providers/ytmusic/__init__.py | 300 | except InvalidDataError: | CODE |
| HIGH | music_assistant/providers/playlist_metadata/__init__.py | 993 | except OSError: | CODE |
| HIGH | music_assistant/providers/hass/__init__.py | 1014 | except asyncio.CancelledError: | CODE |
| HIGH | music_assistant/providers/airplay/player.py | 876 | except ValueError: | CODE |
| HIGH | music_assistant/providers/plex_connect/__init__.py | 358 | except PlexTvAuthError: | CODE |
| HIGH | music_assistant/providers/sendspin/provider.py | 342 | except ValueError: | CODE |
| HIGH | music_assistant/providers/sendspin/security.py | 26 | except FileNotFoundError: | CODE |
| HIGH | music_assistant/providers/samsung_wam/player.py | 276 | except TimeoutError: | CODE |
| HIGH | music_assistant/controllers/config/controller.py | 326 | except FileNotFoundError: | CODE |
| HIGH | music_assistant/controllers/config/core.py | 209 | except asyncio.CancelledError: | CODE |
| HIGH | …sic_assistant/controllers/streams/smart_fades/fades.py | 71 | except BrokenPipeError: | CODE |
| HIGH | …stant/controllers/webserver/helpers/auth_middleware.py | 545 | except Exception: # noqa: S110 | CODE |
| HIGH | music_assistant/helpers/diagnostics.py | 196 | except Exception: # noqa: S110 - capturing diagnostics may never break logging itself | CODE |
| HIGH | music_assistant/helpers/images.py | 425 | except OSError: | CODE |
| HIGH | music_assistant/helpers/images.py | 643 | except FileNotFoundError: | CODE |
| HIGH | music_assistant/helpers/images.py | 765 | except OSError: | CODE |
| HIGH | scripts/check_python_version.py | 20 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/controllers/music/test_genres.py | 2499 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2502 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2476 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5318 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5365 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5374 | # Step 3: Sendspin registers next - should match Universal Player by MAC | COMMENT |
| LOW | music_assistant/providers/hass_players/provider.py | 168 | # if the player is an ESPHome player, we need to check if it is a V2 player | 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 | 459 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 481 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 510 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 269 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 276 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 280 | # 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: Detect new or changed dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 132 | # Step 3: Resolve what both branches install, so findings can be split into ones | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 154 | # Step 4: Run pip-audit for known vulnerabilities. The audit covers the whole | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 202 | # Step 5: Check manifest.json changes | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 250 | # Step 6: Run package safety check on new dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 309 | # Step 7: Persist analysis results for the reporting workflow. | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 328 | # Step 8: Hand off report fragments and results to the reporting workflow | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/controllers/music/test_genres.py | 2499 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2502 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2476 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5318 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5365 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5374 | # Step 3: Sendspin registers next - should match Universal Player by MAC | 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 | 459 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 481 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 510 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 269 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 276 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 280 | # 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: Detect new or changed dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 132 | # Step 3: Resolve what both branches install, so findings can be split into ones | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 154 | # Step 4: Run pip-audit for known vulnerabilities. The audit covers the whole | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 202 | # Step 5: Check manifest.json changes | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 250 | # Step 6: Run package safety check on new dependencies | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 309 | # Step 7: Persist analysis results for the reporting workflow. | COMMENT |
| LOW | .github/workflows/dependency-security.yml | 328 | # Step 8: Hand off report fragments and results to the reporting workflow | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/providers/smart_playlist/test_smart_playlist.py | 2096 | # AI-generated description tests | COMMENT |
| HIGH | music_assistant/providers/zvuk_music/constants.py | 26 | # These AI-generated playlists are identified by low fixed IDs, stable per account. | COMMENT |
| HIGH | …instructions/music-assistant-standards.instructions.md | 26 | - **Won't support** AI-generated technical diagnoses or bug reports filed at face value in the tracker; describe problem | CODE |
| HIGH | …instructions/music-assistant-standards.instructions.md | 26 | - **Won't support** AI-generated technical diagnoses or bug reports filed at face value in the tracker; describe problem | 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/msx_bridge/factories.py | 56 | CODE | |
| LOW | tests/providers/musicbrainz/test_provider.py | 863 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 117 | CODE | |
| LOW | tests/providers/chromecast/test_media_status_updates.py | 108 | CODE | |
| LOW | tests/providers/smart_playlist/test_smart_playlist.py | 378 | CODE | |
| LOW | tests/providers/airplay/test_dashboard.py | 31 | CODE | |
| LOW | tests/providers/airplay/dacp/conftest.py | 78 | CODE | |
| LOW | tests/providers/plex/test_provider_methods.py | 88 | CODE | |
| LOW | tests/providers/opensubsonic/test_provider.py | 46 | CODE | |
| LOW | tests/providers/builtin/test_sound_effects.py | 19 | CODE | |
| LOW | …sts/providers/spotify_connect/test_backend_contract.py | 179 | CODE | |
| LOW | tests/controllers/music/test_library_listing_queries.py | 217 | CODE | |
| LOW | tests/controllers/streams/smart_fades/conftest.py | 27 | CODE | |
| LOW | …s/controllers/player_queues/test_player_queues_sort.py | 36 | CODE | |
| LOW | tests/helpers/test_scrobbler.py | 307 | 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 | 355 | CODE | |
| LOW | music_assistant/controllers/music/media/podcasts.py | 91 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 218 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 159 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 179 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 199 | CODE | |
| LOW | music_assistant/controllers/music/media/artists.py | 179 | CODE | |
| LOW | music_assistant/controllers/tasks/controller.py | 259 | CODE | |
| LOW | music_assistant/controllers/cache/helpers.py | 49 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/smart_fades/test_provider.py | 40 | # Clip ends 0.2s after the last beat to avoid end-of-track hallucination. | COMMENT |
| MEDIUM⚡ | …ts/controllers/streams/smart_fades/test_vocal_aware.py | 483 | # FireRed hallucinates vocal-like activity in the low-energy tail, past the boundary | COMMENT |
| MEDIUM | music_assistant/providers/airplay/stream.py | 200 | # `connected` this makes readiness fully event-driven, so START can | COMMENT |
| MEDIUM | music_assistant/providers/airplay/player.py | 664 | # The lock windows live inside the orchestration: the dispatch decision and | COMMENT |
| MEDIUM | music_assistant/providers/airplay/stream_session.py | 203 | # anchor with a short lead. Readiness is fully event-driven | COMMENT |
| MEDIUM | …ant/controllers/streams/smart_fades/planner/context.py | 85 | # exceed ~6dB and re-orchestrate (band fractions move) | COMMENT |
| MEDIUM | scripts/perf/perf_server.py | 191 | # skip the harness' own frames - they are measurement scaffolding | COMMENT |
| MEDIUM | …instructions/music-assistant-standards.instructions.md | 66 | - **MUST** stay event-driven: when state looks stale, add or fix the missing event instead of polling; prefer mDNS/annou | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/providers/spotify/test_playback_auth.py | 199 | 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 | 272 | CODE | |
| MEDIUM | tests/providers/squeezelite/test_player.py | 26 | CODE | |
| MEDIUM | tests/providers/filesystem_local/test_nfo_resolution.py | 973 | CODE | |
| MEDIUM | tests/providers/spotify_connect/test_provider.py | 103 | CODE | |
| MEDIUM | tests/controllers/music/test_sync_resilience.py | 205 | CODE | |
| MEDIUM | tests/controllers/streams/test_audio_buffer.py | 509 | CODE | |
| MEDIUM | tests/controllers/streams/test_stream_capacity.py | 659 | CODE | |
| MEDIUM | tests/helpers/test_ffmpeg.py | 767 | CODE | |
| MEDIUM | music_assistant/models/media_capabilities.py | 251 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …c_assistant/providers/_demo_music_provider/__init__.py | 532 | # for most providers this will be HTTP but you can also use CUSTOM | COMMENT |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 187 | # make sure to include the version in the album name | COMMENT |
| LOW | music_assistant/providers/theaudiodb/__init__.py | 215 | # make sure to include the version in the album name | COMMENT |
| LOW | music_assistant/providers/lastfm_scrobble/__init__.py | 142 | 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 | 149 | # you can use this for instance to trigger custom (non-mdns) discovery of plugins | COMMENT |
| MEDIUM | …_assistant/providers/_demo_player_provider/provider.py | 64 | # you can use this to do any async initialization of the provider, | COMMENT |
| MEDIUM | …_assistant/providers/_demo_player_provider/provider.py | 151 | # note that you can use this point to update the player connection info | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 391 | # make sure to finish any removal jobs | COMMENT |
| LOW | music_assistant/translations/en.json | 1668 | "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/vrt_max/conftest.py | 65 | values = {CONF_USERNAME: "user@example.com", CONF_PASSWORD: "secret"} | CODE |
| LOW | tests/providers/vrt_max/test_auth.py | 23 | def _auth(username: str = "user@example.com") -> VrtMaxAuth: | CODE |
| LOW | tests/providers/msx_bridge/test_http_server.py | 2013 | queue_item_id="placeholder", | CODE |
| LOW | …iders/fastmcp_server/test_provider_command_registry.py | 1167 | error_code=999, message="login failed for other@example.org" | CODE |
| LOW⚡ | tests/providers/yandex_music/test_api_client.py | 1541 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW | tests/providers/yandex_music/test_api_client.py | 53 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW⚡ | tests/providers/kion_music/test_api_client.py | 251 | real_client = ClientAsync("fake-token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 23 | return KionMusicClient("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 37 | mock_cls.assert_called_once_with("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 220 | real_client = ClientAsync("fake-token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 273 | real_client = ClientAsync("fake-token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW⚡ | tests/helpers/test_podcast_parsers.py | 825 | assert cues[0].speaker == "Jane Doe" | CODE |
| LOW⚡ | tests/helpers/test_transcripts.py | 52 | assert cues[1].speaker == "Jane Doe" | CODE |
| LOW⚡ | tests/helpers/test_transcripts.py | 252 | assert parse_transcript_cues(document)[0].speaker == "Jane Doe" | CODE |
| LOW | tests/helpers/test_helpers.py | 217 | ("Great Song [with Jane Doe]", ("Jane Doe",)), | 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 |
|---|---|---|---|---|
| HIGH | …sic_assistant/providers/nicovideo/converters/stream.py | 57 | Convert StreamConversionData into StreamDetails. Args: conversion_data: Data containing vi | 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 | 771 | Get streamdetails for a track or audiobook. Delegates to the streaming handler for proper multi-file s | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/audible/test_audible.py | 42 | def helper(mass_mock: AsyncMock, audible_client_mock: AsyncMock) -> AudibleHelper: | CODE |
| LOW | tests/providers/storytel/test_storytel_helper.py | 26 | def helper() -> StorytelHelper: | CODE |
| LOW | tests/helpers/test_jwt_auth.py | 19 | def helper() -> JWTHelper: | CODE |
| LOW | music_assistant/providers/nicovideo/converters/base.py | 29 | def helper(self) -> NicovideoConverterHelper: | CODE |
| LOW | music_assistant/providers/sonos/cloud_queue.py | 56 | async def handle_request(self, request: web.Request) -> web.Response: | CODE |
| LOW | music_assistant/controllers/tasks/controller.py | 153 | def run_task(self, task_id: str) -> BackgroundTask: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/filesystem_local/__init__.py | 2437 | # TODO: implement favorite status based on rating ? | COMMENT |