Music Assistant is a free, opensource Media library manager that connects to your streaming services and a wide range of connected speakers. The server is the beating heart, the core of Music Assistant and must run on an always-on device like a Raspberry Pi, a NAS or an Intel NUC or alike.
This report presents the forensic synthetic code analysis of music-assistant/server, a Python project with 3,007 GitHub stars. SynthScan v2.0 examined 699,428 lines of code across 2253 source files, recording 17511 pattern matches distributed across 24 syntactic categories. The overall adjusted score of 31.1 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 17511 distinct pattern matches across 24 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 57 | def pytest_report_to_serializable() -> Generator[None, object, object]: | CODE |
| LOW | tests/conftest.py | 70 | def isolate_models_global_cache() -> Generator[None]: | CODE |
| LOW⚡ | tests/test_library_sync.py | 838 | async def test_set_provider_mappings_overwrite_keeps_existing_when_empty( | CODE |
| LOW⚡ | tests/test_library_sync.py | 853 | async def test_set_provider_mappings_no_mappings_is_noop(mock_controller: Mock) -> None: | CODE |
| LOW⚡ | tests/test_library_sync.py | 866 | async def test_set_provider_mappings_upsert_preserves_null_in_library( | CODE |
| LOW | tests/test_library_sync.py | 91 | async def test_add_item_to_library_sets_in_library_true() -> None: | CODE |
| LOW | tests/test_library_sync.py | 125 | async def test_add_item_to_library_sets_in_library_even_when_sync_back_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 159 | async def test_add_item_to_library_sets_in_library_even_when_edit_not_supported() -> None: | CODE |
| LOW | tests/test_library_sync.py | 191 | async def test_add_album_imports_tracks_when_enabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 230 | async def test_add_album_does_not_import_tracks_when_disabled() -> None: | CODE |
| LOW | tests/test_library_sync.py | 262 | async def test_add_album_only_imports_tracks_for_added_instance() -> None: | CODE |
| LOW | tests/test_library_sync.py | 313 | async def test_refresh_item_preserves_in_library_state() -> None: | CODE |
| LOW | tests/test_library_sync.py | 357 | async def test_refresh_item_preserves_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 399 | async def test_refresh_item_respects_provider_set_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 443 | async def test_refresh_item_non_library_item_skips_update() -> None: | CODE |
| LOW | tests/test_library_sync.py | 477 | async def test_sync_library_marks_removed_item_in_library_false() -> None: | CODE |
| LOW | tests/test_library_sync.py | 528 | async def test_sync_library_deletions_disabled_keeps_item() -> None: | CODE |
| LOW | tests/test_library_sync.py | 572 | async def test_sync_library_deletion_unmarks_favorite_when_no_other_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 602 | async def test_sync_library_deletion_keeps_favorite_when_other_provider_has_it() -> None: | CODE |
| LOW | tests/test_library_sync.py | 643 | async def test_sync_library_always_stores_cache_regardless_of_deletion_setting() -> None: | CODE |
| LOW | tests/test_library_sync.py | 675 | def _create_controller_for_filter_tests() -> Mock: | CODE |
| LOW | tests/test_library_sync.py | 685 | async def test_apply_filters_in_library_only_without_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 717 | async def test_apply_filters_in_library_only_with_provider_filter() -> None: | CODE |
| LOW | tests/test_library_sync.py | 750 | async def test_apply_filters_no_in_library_filter_by_default() -> None: | CODE |
| LOW | tests/test_library_sync.py | 774 | async def test_apply_filters_provider_filter_without_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 822 | async def test_set_provider_mappings_overwrite_deletes_and_reinserts( | CODE |
| LOW | tests/test_library_sync.py | 887 | async def test_set_provider_mappings_upsert_writes_explicit_in_library( | CODE |
| LOW | tests/test_library_sync.py | 910 | async def test_library_items_default_filters_in_library_only() -> None: | CODE |
| LOW | tests/test_library_sync.py | 924 | async def test_library_items_defaults_to_summary() -> None: | CODE |
| LOW | tests/test_library_sync.py | 937 | def test_ensure_provider_filter_keeps_plugin_provider_mappings() -> None: | CODE |
| LOW | tests/test_library_sync.py | 958 | def test_ensure_provider_filter_rejects_unallowed_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 978 | def test_ensure_provider_filter_allows_explicit_non_music_provider() -> None: | CODE |
| LOW | tests/test_library_sync.py | 997 | def test_ensure_provider_filter_does_not_auto_allow_other_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1020 | def test_select_provider_id_prefers_allowed_music_over_plugin() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1057 | def test_select_provider_id_falls_back_to_plugin_when_no_allowed_music() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1094 | async def test_get_library_item_does_not_filter_in_library() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1114 | async def test_update_item_in_library_skips_non_music_providers() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1155 | def _create_event_capture_controller( | CODE |
| LOW | tests/test_library_sync.py | 1174 | async def test_add_and_update_item_emit_events_outside_sync() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1194 | async def test_provider_sync_suppresses_per_item_events() -> None: | CODE |
| LOW | tests/test_library_sync.py | 1233 | async def test_concurrent_add_rechecks_match_inside_lock() -> 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_minor_release_with_diverged_previous_tag( | CODE |
| LOW | tests/test_generate_release_notes.py | 207 | def test_filter_dependency_bumps(generate_notes: types.ModuleType) -> None: | CODE |
| LOW | tests/test_generate_release_notes.py | 226 | def test_filter_dependency_bumps_drop_all(generate_notes: types.ModuleType) -> None: | CODE |
| LOW | tests/test_generate_release_notes.py | 244 | def test_write_outputs_hands_notes_over_via_file( | CODE |
| LOW | tests/test_generate_release_notes.py | 265 | def test_notes_are_shrunk_to_fit_body_limit( | CODE |
| LOW | tests/test_generate_release_notes.py | 317 | def test_categorize_prs_excludes_title_prefixes(generate_notes: types.ModuleType) -> None: | CODE |
| LOW | tests/test_generate_release_notes.py | 338 | def test_extract_frontend_changes_skips_lokalise_bullets( | CODE |
| LOW | tests/test_numba_cache_isolation.py | 16 | def test_numba_kernel_cache_is_process_private(pytestconfig: pytest.Config) -> None: | CODE |
| LOW | tests/test_provider_manifests.py | 54 | async def test_has_setup_flow_true_when_module_present( | CODE |
| LOW | tests/test_provider_manifests.py | 66 | async def test_has_setup_flow_false_when_module_absent( | CODE |
| LOW | tests/test_provider_manifests.py | 77 | async def test_has_setup_flow_ignores_internal_import_errors( | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 53 | async def test_update_playlist_metadata_processes_dynamic_playlists() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 87 | async def test_refresh_playlist_metadata_batch_query_excludes_dynamic_playlists() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 102 | async def test_refresh_playlist_metadata_batch_reports_corrupt_row_reactively() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 127 | async def test_refresh_playlist_metadata_batch_clears_stale_corrupt_rows() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 140 | async def test_refresh_playlist_metadata_batch_reraises_unrelated_db_error() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 228 | async def test_sync_overwrites_name_for_noneditable_dynamic_playlist() -> None: | CODE |
| LOW | tests/test_dynamic_playlist_framework.py | 243 | async def test_sync_overwrites_images_for_noneditable_dynamic_playlist() -> None: | CODE |
| 12633 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/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/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/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_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/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 | …endation_override/test_demo_recommendation_override.py | 0 | construct a minimal provider with stubbed mass/manifest/config. | STRING |
| HIGH | …roviders/_demo_plugin_provider/test_recommendations.py | 0 | construct a minimal provider with stubbed mass/manifest/config. | STRING |
| HIGH | tests/models/test_provider.py | 0 | construct a minimal provider with stubbed mass/manifest/config. | STRING |
| HIGH | tests/controllers/music/test_recommendations_items.py | 0 | construct a minimal provider with stubbed mass/manifest/config. | STRING |
| HIGH | …sts/controllers/music/test_recommendations_timeouts.py | 0 | construct a minimal provider with stubbed mass/manifest/config. | STRING |
| HIGH | tests/providers/tunein/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| HIGH | tests/providers/deezer/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| HIGH | tests/providers/nicovideo/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| HIGH | tests/providers/musicme/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| HIGH | tests/providers/opensubsonic/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| HIGH | tests/providers/kion_music/test_recommendations.py | 0 | make the @use_cache decorator treat every call as a cache miss. | STRING |
| 558 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 | 273 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 275 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 491 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 493 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 513 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 515 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 570 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 572 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 596 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 598 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 737 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 739 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 916 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 918 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 964 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 966 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 1541 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/mammamiradio/test_mammamiradio.py | 1543 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 302 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 304 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1197 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1199 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1569 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/mammamiradio/test_mammamiradio.py | 1571 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 180 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 266 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/apple_music/test_api_client.py | 268 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 80 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 82 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 147 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 149 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 305 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/providers/apple_music/test_api_client.py | 307 | # --------------------------------------------------------------------------- | 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 |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 524 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/providers/yandex_smarthome/test_direct.py | 526 | # --------------------------------------------------------------------------- | COMMENT |
| 627 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library_sync.py | 3 | CODE | |
| LOW | tests/test_generate_release_notes.py | 3 | CODE | |
| LOW | tests/test_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_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 | …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/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_ytmusic.py | 3 | CODE | |
| LOW | tests/providers/ytmusic/test_recommendations.py | 3 | CODE | |
| LOW | tests/providers/teddycloud/test_provider.py | 3 | CODE | |
| LOW | tests/providers/bandcamp/conftest.py | 3 | CODE | |
| LOW | tests/providers/bandcamp/test_ids.py | 3 | CODE | |
| LOW | tests/providers/sync_group/test_sync_group.py | 3 | CODE | |
| 1475 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/test_library_sync.py | 834 | mock_controller.mass.music.database.delete.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 835 | mock_controller.mass.music.database.upsert_many.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 848 | mock_controller.mass.music.database.delete.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 849 | mock_controller.mass.music.database.upsert_many.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 861 | mock_controller.mass.music.database.delete.assert_not_called() | CODE |
| CRITICAL⚡ | tests/test_library_sync.py | 862 | mock_controller.mass.music.database.upsert_many.assert_not_called() | CODE |
| CRITICAL | tests/providers/msx_bridge/test_party_qr_cover.py | 350 | assert mass_mock.http_session.get.call_args.kwargs.get("allow_redirects") is False | CODE |
| CRITICAL | tests/providers/filesystem/test_nfo_resolution.py | 626 | provider.mass.music.artists.get_library_item_by_external_id.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_metadata_file_cache.py | 645 | provider.mass.music.artists.get_library_artist_tracks.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_metadata_file_cache.py | 689 | provider.mass.music.artists.get_library_artist_albums.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_metadata_file_cache.py | 692 | provider.mass.music.albums.get_library_album_tracks.assert_awaited_once_with( | CODE |
| CRITICAL | tests/providers/filesystem/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/test_sound_effects.py | 78 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sound_effects.py | 150 | provider.mass.music.tracks.get_library_item_by_prov_id.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sound_effects.py | 175 | provider.mass.music.tracks.get_library_item_by_prov_id.assert_awaited_once_with( | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 96 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 103 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 110 | provider.mass.music.database.get_rows_from_query.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 127 | provider.mass.music.tracks.add_item_to_library.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 150 | provider.mass.music.tracks.add_item_to_library.assert_called_once() | CODE |
| CRITICAL⚡ | tests/providers/filesystem/test_sync_config.py | 163 | provider.mass.music.playlists.add_item_to_library.assert_not_called() # type: ignore[attr-defined] | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 181 | provider.mass.music.playlists.add_item_to_library.assert_called_once() | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 204 | provider.mass.music.audiobooks.add_item_to_library.assert_called_once() | CODE |
| CRITICAL | tests/providers/filesystem/test_sync_config.py | 228 | provider.mass.music.podcasts.add_item_to_library.assert_called_once() | 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 | 2029 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2064 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2075 | pinned_player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2092 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | CODE |
| CRITICAL | tests/providers/airplay/test_stream.py | 2167 | player.provider.mass.config.set_raw_player_config_value.assert_not_called() | 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/builtin/test_infinite_mix.py | 94 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 111 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/builtin/test_infinite_mix.py | 161 | provider.mass.music.tracks.library_items.assert_called_once_with( | CODE |
| CRITICAL⚡ | tests/providers/tidal/test_streaming.py | 480 | provider_mock.mass.music.tracks.update_provider_mapping.assert_awaited_once() | CODE |
| CRITICAL⚡ | tests/providers/tidal/test_streaming.py | 481 | provider_mock.mass.music.tracks.update_provider_mapping.assert_awaited_with( | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 410 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 430 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL | tests/providers/tidal/test_streaming.py | 454 | provider_mock.mass.music.tracks.update_provider_mapping.assert_not_called() | CODE |
| CRITICAL⚡ | tests/controllers/music/test_sync_resilience.py | 213 | mass.music.get_controller.return_value.set_provider_mappings.assert_not_called() | CODE |
| CRITICAL⚡ | tests/controllers/music/test_sync_resilience.py | 225 | mass.music.get_controller.return_value.get_library_item.assert_awaited_once_with(99) | CODE |
| CRITICAL⚡ | tests/controllers/music/test_sync_resilience.py | 538 | mass.music.get_controller.return_value.get_library_item.assert_not_called() | CODE |
| CRITICAL | tests/controllers/music/test_sync_resilience.py | 154 | mass.music.get_controller.return_value.get_library_item.assert_awaited_once_with(99) | CODE |
| CRITICAL | tests/controllers/music/test_sync_resilience.py | 505 | mass.music.get_controller.return_value.get_library_item.assert_awaited_once_with(99) | CODE |
| CRITICAL | tests/controllers/music/test_sync_resilience.py | 590 | mass.music.get_controller.return_value.get_library_item.assert_awaited_once_with(99) | CODE |
| CRITICAL | …/controllers/streams/test_audio_analysis_controller.py | 657 | provider.mass.streams.audio_analysis.get_audio_analysis_version.assert_awaited_once_with( | CODE |
| CRITICAL | tests/controllers/streams/test_live_announcements.py | 415 | harness.mass.webserver.auth.authenticate_with_token.assert_not_called() | CODE |
| CRITICAL⚡ | tests/controllers/player_queues/test_stop_teardown.py | 76 | fake.mass.streams.audio_processing.clear.assert_called_once_with("q", "sess-1") | CODE |
| CRITICAL | tests/controllers/player_queues/test_stop_teardown.py | 95 | fake.mass.streams.audio_processing.clear.assert_called_once_with("q", "sess-1") | CODE |
| CRITICAL | tests/controllers/player_queues/test_stop_teardown.py | 134 | fake.mass.streams.audio_processing.clear.assert_not_called() | CODE |
| CRITICAL⚡ | tests/controllers/player_queues/test_autoplay.py | 128 | queues.mass.music.tracks.library_items.assert_awaited_once() | CODE |
| CRITICAL⚡ | …ts/controllers/player_queues/test_autoplay_dispatch.py | 237 | queues.mass.music.audiobooks.get_collection.assert_not_called() | CODE |
| CRITICAL | tests/controllers/metadata/test_enrichment.py | 62 | enrichment.mass.music.albums.update_item_in_library.assert_awaited_once() | CODE |
| CRITICAL | …rollers/metadata/test_playlist_metadata_integration.py | 225 | enrichment.mass.music.playlists.update_item_in_library.assert_called_once() | CODE |
| CRITICAL | tests/helpers/test_util.py | 238 | socket_mock.return_value.__enter__.return_value.bind.assert_called_once_with((host, 38800)) | CODE |
| 30 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_diagnostics.py | 170 | 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 | 528 | except Exception as err: | CODE |
| LOW | tests/controllers/streams/test_get_media_stream.py | 254 | except Exception as err: | CODE |
| MEDIUM | music_assistant/mass.py | 1416 | def _on_provider_loaded() -> None: | CODE |
| LOW | music_assistant/mass.py | 199 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 376 | except Exception: | CODE |
| LOW | music_assistant/mass.py | 904 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 921 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 947 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1008 | except Exception as exc: | CODE |
| LOW | music_assistant/mass.py | 1081 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 1392 | except Exception: | CODE |
| LOW | music_assistant/mass.py | 1398 | except Exception as unload_err: | CODE |
| LOW | music_assistant/mass.py | 1419 | except Exception as err: | CODE |
| LOW | music_assistant/mass.py | 1475 | 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 | 100 | except Exception: | CODE |
| LOW | music_assistant/providers/hass_players/helpers.py | 139 | except Exception as exc: | CODE |
| LOW | music_assistant/providers/ytmusic/__init__.py | 805 | except Exception as err: | CODE |
| LOW | music_assistant/providers/vban_receiver/provider.py | 215 | except Exception as err: | CODE |
| LOW | music_assistant/providers/sync_group/player.py | 1167 | except Exception as err: | CODE |
| LOW | music_assistant/providers/apple_music/library.py | 357 | except Exception as err: | CODE |
| LOW | music_assistant/providers/smart_fades/provider.py | 591 | 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/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 |
| LOW | music_assistant/providers/zvuk_music/provider.py | 547 | except Exception as err: | CODE |
| LOW | music_assistant/providers/jellyfin/__init__.py | 128 | except Exception as err: | CODE |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 420 | except Exception as err: | CODE |
| 664 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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/musicbrainz/test_recommendations.py | 87 | def _set_library(provider_mock: Mock, artists: list[Artist]) -> None: | CODE |
| LOW | tests/providers/fastmcp_server/test_e2e_hotswap.py | 62 | def _set_config_values(cfg: MagicMock, **overrides: Any) -> None: | CODE |
| LOW | tests/providers/snapcast/conftest.py | 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 | 223 | async def set_trusted_unpaired(self, client_id: str, enabled: bool) -> None: | CODE |
| LOW | tests/providers/sendspin/test_bridge_manager.py | 472 | 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/sonos/test_provider.py | 118 | async def _setup_player(*_args: object) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 116 | def _set_runtime_mass(runtime: AIRadioRuntimeMixin, mass: Any) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 1527 | async def _set_shuffle(_queue_id: str, _shuffle_enabled: bool) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_runtime.py | 2127 | async def _set_shuffle(queue_id: str, shuffle_enabled: bool) -> None: | CODE |
| LOW | tests/providers/ai_radio/test_queue_dj.py | 82 | 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 | 1570 | async def _set_track_genres(mass: MusicAssistant, track_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 124 | async def _set_podcast_genres(mass: MusicAssistant, podcast_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/music/test_genres.py | 1581 | async def _set_album_genres(mass: MusicAssistant, album_id: int, genres: list[str]) -> None: | CODE |
| LOW | tests/controllers/config/test_setup_flows.py | 1345 | def _set_player_conf(flow_mass: MusicAssistant, player: MockPlayer) -> None: | CODE |
| LOW | tests/controllers/config/test_save_scheduling.py | 54 | def _set_without_delay(controller: ConfigController, key: str, value: Any) -> None: | CODE |
| LOW | tests/controllers/config/test_remove_player_config.py | 81 | def set_protocol_parent_id(self, parent_id: str | None) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 1154 | def _set_play_media_override(mock_mass: MagicMock, value: bool) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 3019 | def _set_limits(mock_mass: MagicMock, min_volume: int, max_volume: int) -> None: | CODE |
| LOW | tests/controllers/players/test_player_controller.py | 5797 | async def _set_members(**kwargs: list[str]) -> 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/helpers/test_scrobbler.py | 36 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_scrobbler.py | 200 | async def _update_now_playing(self, report: MediaItemPlaybackProgressReport) -> None: | CODE |
| LOW | tests/helpers/test_throttle_retry.py | 38 | def set_side_effects(self, effects: Sequence[Exception | str]) -> None: | CODE |
| LOW | music_assistant/mass.py | 1496 | async def _update_available_providers_cache(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1520 | async def _setup_storage(self) -> None: | CODE |
| LOW | music_assistant/mass.py | 1527 | def _set_state(self, new_state: CoreState) -> None: | CODE |
| LOW | music_assistant/__main__.py | 279 | 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 | 367 | def update_from_compressed_state(self, state: CompressedState) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 379 | def _update_hass_features(self, hass_supported_features: MediaPlayerEntityFeature) -> None: | CODE |
| LOW | music_assistant/providers/hass_players/player.py | 404 | def _update_attributes(self, attributes: dict[str, Any]) -> None: | CODE |
| LOW | music_assistant/providers/sync_group/player.py | 1025 | def _update_attributes(self) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1887 | async def _set_playlog_from_user(self, user: User) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1900 | async def _set_playlog_from_user_sync(self, progresses: list[MediaProgress]) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1964 | async def _update_playlog_book(self, progress: MediaProgress) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1987 | async def _update_playlog_episode(self, progress: MediaProgress) -> None: | CODE |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 2009 | async def _update_book_narrators(self, library_id: str) -> None: | CODE |
| LOW | music_assistant/providers/apple_music/library.py | 212 | async def set_favorite(self, prov_item_id: str, media_type: MediaType, favorite: bool) -> None: | CODE |
| LOW⚡ | music_assistant/providers/apple_music/provider.py | 248 | async def set_favorite(self, prov_item_id: str, media_type: MediaType, favorite: bool) -> None: | CODE |
| LOW | music_assistant/providers/apple_music/__init__.py | 22 | __all__ = ["AppleMusicProvider", "setup"] | CODE |
| LOW | …ic_assistant/providers/apple_music/helpers/__init__.py | 6 | __all__ = [ | CODE |
| LOW | music_assistant/providers/bose_soundtouch/provider.py | 88 | async def update_config(self, config: ProviderConfig, changed_keys: set[str]) -> None: | CODE |
| LOW | music_assistant/providers/bose_soundtouch/player.py | 113 | def set_static_attributes(self, info: Info) -> None: | CODE |
| 291 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/providers/mammamiradio/test_mammamiradio.py | 1122 | """session_state stopped/empty_queue (now_playing null) renders the station name.""" | STRING |
| HIGH | tests/providers/spotify/test_playback_auth.py | 234 | ('{"username": null, "auth_data": "blob"}', "u1", False), | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 369 | queue.push(b"first") | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 370 | queue.push(b"second") | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 371 | queue.push('{"type": "stream/clear"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 379 | queue.push('{"type": "stream/start"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 380 | queue.push('{"type": "stream/clear"}') | CODE |
| HIGH⚡ | tests/providers/milkdrop_visualizer/test_tap.py | 381 | queue.push(b"frame") | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 311 | 1: ("smart_fades", '{"spectral_centroid": [1.5, null, 2.5, null], "bpm": 120}'), | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 314 | 3: ("other_domain", '{"spectral_centroid": [null], "bpm": 100}'), | CODE |
| HIGH⚡ | tests/controllers/music/test_music_migrations.py | 318 | 5: ("smart_fades", '{"spectral_centroid": null, "bpm": 90}'), | CODE |
| 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 | music_assistant/providers/msx_bridge/http_server.py | 704 | params.push('sendspin=1'); | CODE |
| HIGH | music_assistant/providers/msx_bridge/http_server.py | 710 | params.push(boxes[i].getAttribute('data-kiosk-param') + '=0'); | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 175 | info: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 176 | sessionToken: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 177 | selectedClientId: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 184 | setupCallback: null, | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 189 | if (cachedTokens && typeof cachedTokens === "object") state.tokens = cachedTokens; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 324 | if (!value || !value.startsWith("/")) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 327 | if (callback.origin !== window.location.origin) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 328 | if (!/\\/setup_flow\\/callback\\/[a-f0-9]+$/.test(callback.pathname)) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 331 | return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 336 | if (!state.setupCallback || state.setupCallbackSent) return; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 365 | if (!c || !state.lastSnippet) return null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 367 | try { parsed = JSON.parse(state.lastSnippet); } catch (_) { return null; } | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 368 | const inner = (parsed.mcpServers && parsed.mcpServers.ma) || null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 368 | const inner = (parsed.mcpServers && parsed.mcpServers.ma) || null; | CODE |
| HIGH⚡ | …sic_assistant/providers/fastmcp_server/connect/page.py | 369 | if (!inner) return null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 204 | let data = null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 305 | state.sessionToken = null; | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 313 | showMsg((data && data.error) || ("HTTP " + res.status), "bad"); | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 351 | if (navigator.clipboard && navigator.clipboard.writeText) { | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 442 | showMsg((data && data.error) || "Sign-in failed.", "bad"); | CODE |
| HIGH | …sic_assistant/providers/fastmcp_server/connect/page.py | 453 | 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 | 590 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/providers/sendspin/playback.py | 1391 | await processor.push(chunk) | CODE |
| HIGH | music_assistant/providers/milkdrop_visualizer/tap.py | 141 | 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 | 423 | # non-finite floats serialize to JSON null, which corrupts the stored row; | COMMENT |
| HIGH | music_assistant/controllers/webserver/api_docs.py | 1012 | # Filter out None/null types (None, NoneType, null all mean JSON null) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_library_sync.py | 477 | CODE | |
| LOW | tests/test_library_sync.py | 528 | CODE | |
| LOW | tests/integration/test_library_summary_items.py | 159 | CODE | |
| LOW | tests/providers/msx_bridge/test_http_server.py | 1543 | CODE | |
| LOW | tests/providers/fastmcp_server/test_origin.py | 321 | CODE | |
| LOW | tests/providers/fastmcp_server/test_config_security.py | 49 | CODE | |
| LOW | tests/providers/fastmcp_server/test_config_security.py | 76 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2294 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 2613 | CODE | |
| LOW | tests/providers/music_quiz/test_models.py | 331 | 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 | 293 | CODE | |
| LOW | music_assistant/providers/openai_tts/__init__.py | 296 | CODE | |
| LOW | music_assistant/providers/hass_players/provider.py | 150 | CODE | |
| LOW | music_assistant/providers/hass_players/player.py | 404 | CODE | |
| LOW | music_assistant/providers/mammamiradio/__init__.py | 200 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 221 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 432 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 533 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 554 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 638 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 715 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 868 | CODE | |
| LOW | music_assistant/providers/ytmusic/__init__.py | 719 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 329 | CODE | |
| LOW | music_assistant/providers/ytmusic/helpers.py | 338 | CODE | |
| LOW | music_assistant/providers/vban_receiver/provider.py | 251 | CODE | |
| LOW | music_assistant/providers/teddycloud/provider.py | 78 | CODE | |
| LOW | music_assistant/providers/bandcamp/converters.py | 56 | CODE | |
| LOW | music_assistant/providers/sync_group/player.py | 128 | CODE | |
| LOW | music_assistant/providers/sync_group/player.py | 448 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 419 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 484 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1075 | CODE | |
| LOW | music_assistant/providers/audiobookshelf/__init__.py | 1700 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 225 | CODE | |
| LOW | music_assistant/providers/apple_music/library.py | 296 | 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 | music_assistant/providers/bose_soundtouch/player.py | 394 | CODE | |
| LOW | …nt/providers/bose_soundtouch/client/client/__init__.py | 172 | CODE | |
| LOW | …nt/providers/bose_soundtouch/client/client/__init__.py | 221 | 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/playlist_metadata/__init__.py | 1099 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 182 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 492 | CODE | |
| LOW | music_assistant/providers/playlist_metadata/__init__.py | 1146 | CODE | |
| LOW | music_assistant/providers/test/__init__.py | 148 | CODE | |
| LOW | music_assistant/providers/hass/__init__.py | 508 | CODE | |
| LOW | music_assistant/providers/bbc_sounds/__init__.py | 512 | CODE | |
| LOW | music_assistant/providers/bbc_sounds/__init__.py | 664 | CODE | |
| LOW | music_assistant/providers/radioparadise/parsers.py | 53 | CODE | |
| LOW | music_assistant/providers/tunein/__init__.py | 93 | CODE | |
| 231 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/vban_receiver/provider.py | 319 | # 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 | 598 | # Check if guest access is enabled | COMMENT |
| LOW | music_assistant/providers/party/__init__.py | 877 | # Check if guest access and skip are enabled | COMMENT |
| LOW | music_assistant/providers/spotify/provider.py | 188 | # 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/msx_bridge/http_server.py | 1677 | # Check if we need to create a new shared stream (leader creates it) | 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 | 3279 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/yandex_music/api_client.py | 739 | # 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 | 477 | # Check if we have a valid response with tracks collection | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 641 | # Check if manual player switching is allowed | COMMENT |
| LOW | music_assistant/providers/yandex_station/provider.py | 249 | # Check if player already registered (cloud-discovered) — connect Glagol | COMMENT |
| LOW | music_assistant/providers/pandora/provider.py | 433 | # Check if already cached in session | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 219 | # Check if we have enough results across all types | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 336 | # Check if this is audiobook content using improved detection | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 345 | # Check if this is podcast content | COMMENT |
| LOW | music_assistant/providers/internet_archive/provider.py | 604 | # Check if this is the same as album artist to avoid duplicates (case-insensitive) | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 795 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 831 | # Check if this is a collection (collections have the format "collection:<key>") | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1273 | # Check if album rating meets the configured threshold for favorites | COMMENT |
| LOW | music_assistant/providers/plex/__init__.py | 1507 | # Check if track rating meets the configured threshold for favorites | COMMENT |
| LOW⚡ | music_assistant/providers/plex_connect/gdm.py | 179 | # Check if this is a discovery request (M-SEARCH) not our own HELLO | COMMENT |
| LOW | music_assistant/providers/webdav/provider.py | 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 | 1915 | # Check if we've already reached the limit | COMMENT |
| LOW | music_assistant/providers/kion_music/api_client.py | 571 | # Check if it's LRC format (synced lyrics have timestamps like [00:12.34]) | COMMENT |
| LOW | music_assistant/providers/sendspin/provider.py | 1560 | # Check if client still exists (may have disconnected while waiting) | COMMENT |
| LOW | music_assistant/providers/podcastfeed/__init__.py | 199 | # 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 | 1773 | # Check if the protocol player is actually available | COMMENT |
| LOW | music_assistant/models/player.py | 3487 | # Check if member_id is a provider instance ID | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 499 | # Check if the search query is a streaming provider public shareable URL | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 384 | # Check if any existing mapping's item_id has been modified for non-streaming providers | COMMENT |
| LOW | music_assistant/controllers/music/media/genres.py | 2021 | # 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 | 2071 | # Check if this name was deliberately excluded in this taxonomy before creating | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3137 | # Check if parent config still exists | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3325 | # Check if new source is external (not MA-managed) | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 3389 | # 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 | 865 | # Check if keeper already has an active link from this domain | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 989 | # Check if linking succeeded (may be refused for duplicate domain) | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 1622 | # Check if this protocol has a parent_id pointing to this native player | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2201 | # Check if this member is in the parent's group via protocol | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2220 | # Check if child's protocol player is in parent's native group_members | COMMENT |
| LOW | music_assistant/controllers/players/protocol_linking.py | 2287 | # Check if parent supports this protocol (including native protocol) | COMMENT |
| 53 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/fastmcp_server/conftest.py | 1 | """ | COMMENT |
| LOW | tests/controllers/streams/test_audio_sources.py | 421 | ) -> None: | COMMENT |
| LOW | music_assistant/constants.py | 901 | "Cache-Control": "no-cache", | COMMENT |
| LOW | music_assistant/providers/vban_receiver/provider.py | 361 | self, source_id: str, player_id: str, owner_player_id: str, stream_session_id: str | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 241 | # It allows retrieving the library/favorite artists from your provider. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 281 | # It allows retrieving the library/favorite albums from your provider. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 301 | # You are free to implement caching in your provider, as long as you return all items | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 321 | # the 'sync_library' method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 341 | # If you need more fine grained control over the sync process, you can override | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 361 | # to easily apply caching to this method. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 381 | # Get full details of a single Album. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 401 | # NOTE: Because this is often static data, it is advised to apply caching here | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 421 | # Mandatory only if you reported ARTIST_ALBUMS in the supported_features. | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 501 | Returns a boolean with the fully_played status | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 641 | Must be fast: return static or cached row descriptors only, without | COMMENT |
| LOW | …c_assistant/providers/_demo_music_provider/__init__.py | 681 | # return UniqueList(await self._fetch_new_releases()) | COMMENT |
| LOW | …assistant/providers/_demo_music_provider/setup_flow.py | 41 | """ | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 121 | # Only realign the effective member list to the preset when we are | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 561 | # protocol doesn't support dynamic leader switching or not playing | COMMENT |
| LOW | music_assistant/providers/sync_group/player.py | 881 | # Sonos that can play via either its native protocol or via AirPlay). The | 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/hass/control_entities.py | 21 | COMMENT | |
| LOW | music_assistant/providers/spotify/constants.py | 21 | CONF_SOLOIST_API_KEY = "soloist_api_key" | COMMENT |
| LOW | music_assistant/providers/spotify/constants.py | 41 | # of two identically named entries is exactly what ends this session badly. | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 101 | from music_assistant.providers.spotify_connect.soloist.runtime import SoloistEvent | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 121 | # - the burst must stay SMALL: during the burst window the read is unpaced, | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 141 | _SEEK_CONFIRM_TIMEOUT_S: Final[float] = 15.0 | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 161 | _IDLE_TIMEOUT_S: Final[float] = 5.0 | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 181 | # the URI match in _signal_ready depends on. Resume well below the cap so the | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 941 | raise AudioError("Spotify Soloist is not connected") | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 1001 | if self._error: | COMMENT |
| LOW | music_assistant/providers/spotify/backends/soloist.py | 2421 | # nothing to disprove. Only a seek BACK has to see the engine come | COMMENT |
| LOW | music_assistant/providers/msx_bridge/static/input.js | 1 | /******************************************************************************/ | COMMENT |
| LOW | …ridge/static/web/sendspin-js/silent-audio.generated.js | 1 | // Auto-generated by scripts/bundle-silent-audio.js | COMMENT |
| LOW | music_assistant/providers/amplipi/constants.py | 61 | "bluetooth": "Bluetooth", | COMMENT |
| LOW | …_assistant/providers/fastmcp_server/connect/_revoke.py | 41 | # loaded (frontend / torch are not installed), so fall back to | COMMENT |
| LOW | …t/providers/fastmcp_server/debug/inspect_serializer.py | 41 | # — walking them drags every other provider, queue, player, cache and | COMMENT |
| LOW | …sic_assistant/providers/sonic_analysis/clap_prompts.py | 101 | # Calibration provenance | COMMENT |
| LOW | music_assistant/providers/yandex_music/constants.py | 81 | # 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 | ] = OrderedDict() | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 41 | _PALETTE_DIM_FACTOR = 0.45 | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 101 | color_gradient_spread: float | COMMENT |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 181 | COMMENT | |
| LOW | music_assistant/providers/hue_entertainment/analyzer.py | 201 | # Transient scaling, beat animation fraction, pulse peak and color gradient | COMMENT |
| LOW | …sic_assistant/providers/snapcast/snapweb/snapstream.js | 381 | // rate = 1.0 - Math.min(rate, 0.0005); | COMMENT |
| LOW | music_assistant/providers/chromecast/constants.py | 41 | COMMENT | |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 481 | preventing bit-depth/sample-rate mismatches that cause noise. | COMMENT |
| LOW | music_assistant/providers/yandex_ynison/provider.py | 1161 | self.logger.warning("Ynison active on our device but no MA player available") | COMMENT |
| LOW | …sic_assistant/providers/yandex_ynison/ynison_client.py | 721 | COMMENT | |
| LOW | music_assistant/providers/yandex_station/player.py | 601 | alice_state = state.get("aliceState", "") | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 701 | # Same-track guard: | COMMENT |
| LOW | music_assistant/providers/yandex_station/player.py | 781 | # we'd never see the next track Alice queued. Keeping it muted | 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 | # wait that times out here has simply run out of planning time and falls back, | COMMENT |
| 85 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_webserver_auth.py | 165 | # Create a user first | COMMENT |
| MEDIUM | tests/test_remote_access.py | 589 | # Create a session first | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 20 | # Create a mock SearchResultTrack | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 39 | # Create a mock SearchResultAlbum | COMMENT |
| MEDIUM | tests/providers/bandcamp/test_converters.py | 102 | # Create a mock SearchResultArtist | COMMENT |
| MEDIUM | tests/providers/apple_music/test_library.py | 485 | # Create an ItemMapping instead of a Track | COMMENT |
| MEDIUM | tests/providers/msx_bridge/test_player.py | 463 | # Create a member whose play_media calls back into leader's propagation | COMMENT |
| MEDIUM | tests/providers/smart_playlist/test_smart_playlist.py | 1742 | # 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/providers/tidal/test_streaming.py | 524 | # Create a mapping that triggers the update path | COMMENT |
| MEDIUM | tests/controllers/players/test_protocol_linking.py | 55 | # Create a mock manifest | COMMENT |
| MEDIUM | tests/helpers/test_throttle_retry.py | 329 | # Create a date 60 seconds in the future | COMMENT |
| MEDIUM | music_assistant/providers/vban_receiver/vban.py | 44 | # Create a socket and set the options | COMMENT |
| MEDIUM | …c_assistant/providers/_demo_music_provider/__init__.py | 472 | # 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 | 793 | # Create a QueueItem from the media item | COMMENT |
| MEDIUM | music_assistant/providers/spotify/parsers.py | 281 | # Create a minimal podcast reference if none available | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 772 | # Create a full Artist object so MA doesn't try to resolve it. | COMMENT |
| MEDIUM | music_assistant/providers/deezer/parsers.py | 800 | # Create a full Album object so MA doesn't try to resolve it. | COMMENT |
| MEDIUM | …istant/providers/nicovideo/provider_mixins/playlist.py | 120 | # Create a new mylist using niconico.py | COMMENT |
| MEDIUM | …assistant/providers/digitally_incorporated/__init__.py | 765 | # 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 | 1890 | # Create a recommendation folder for each hub | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 40 | # This method is optional and should be implemented if you need to handle | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 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 | 302 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 310 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | …ic_assistant/providers/_demo_player_provider/player.py | 322 | # This method is optional and should be implemented if the player supports | COMMENT |
| MEDIUM | music_assistant/controllers/config/providers.py | 592 | # Create the config with only the server-default entries (no provider options: those | COMMENT |
| MEDIUM | music_assistant/controllers/webserver/auth.py | 1116 | # 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 | 469 | # Create the user | COMMENT |
| MEDIUM | music_assistant/controllers/metadata/radio.py | 469 | # 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 | 704 | # (that path is only for the seamless handoff). Instead, dissolve+reform | COMMENT |
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 890 | # the remaining member never joined the session, so no seamless handoff | COMMENT |
| MEDIUM | tests/providers/sync_group/test_sync_group.py | 593 | """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 | 350 | # the level the user just set. | COMMENT |
| MEDIUM | tests/helpers/test_audio.py | 150 | # 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 | 370 | # Note that (local) file based providers will simply return all artist tracks here. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/constants.py | 52 | # group can do a seamless leader handoff; otherwise it must dissolve and | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1211 | # a seamless handoff must stay on the protocol carrying the stream. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1232 | # so the session continuation is seamless. | COMMENT |
| MEDIUM | music_assistant/providers/sync_group/player.py | 1254 | # 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 | 1042 | # 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/sonos/provider.py | 259 | # we just return the previous, current and next item in the queue. | COMMENT |
| LOW | music_assistant/providers/filesystem_local/__init__.py | 382 | # for audiobooks and podcasts we just return all library items | COMMENT |
| LOW | music_assistant/models/provider.py | 218 | # default implementation - simply use the instance number/index | COMMENT |
| LOW | music_assistant/models/music_provider.py | 1956 | # just return False here to trigger that logic | COMMENT |
| LOW⚡ | music_assistant/models/player.py | 1298 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 1280 | # default implementation will simply call set_members | COMMENT |
| LOW | music_assistant/models/player.py | 3312 | # Scenario 1: Player is a protocol player - just return the (expanded) result | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 3283 | # simply return the first item because search is already sorted by best match | COMMENT |
| LOW | music_assistant/controllers/music/media/playlists.py | 696 | # simply sort by quality and just add the first available version | COMMENT |
| LOW | music_assistant/controllers/music/media/base.py | 1052 | # simply return the fallback item | COMMENT |
| LOW | music_assistant/controllers/players/controller.py | 1564 | # else: any other media item, just add it to the favorites directly | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 816 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/streams/controller.py | 1195 | # just set an insane high content length to make sure the player keeps playing | COMMENT |
| LOW | music_assistant/controllers/webserver/api_docs.py | 982 | # Remove the ellipsis and just use the type | COMMENT |
| LOW | …ssistant/controllers/player_queues/playback_tracker.py | 380 | # so we just return the queue index and the elapsed time | COMMENT |
| LOW | music_assistant/helpers/api.py | 105 | # we can just use the bound type for documentation purposes | COMMENT |
| LOW | music_assistant/helpers/audio.py | 888 | # 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 |
|---|---|---|---|---|
| LOW⚡ | tests/controllers/music/test_genres.py | 2376 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2379 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2353 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5073 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5120 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5129 | # 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 | 457 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 479 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 508 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 253 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 260 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 264 | # 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 | 2376 | # Step 2: album gains its own genre metadata. | COMMENT |
| LOW⚡ | tests/controllers/music/test_genres.py | 2379 | # Step 3: incremental scan must replace the derived mapping with a direct one, | COMMENT |
| LOW | tests/controllers/music/test_genres.py | 2353 | # Step 1: album has no genres yet → propagation creates a derived mapping. | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5073 | # Step 1: Mock config - AirPlay has cached parent, Sendspin does not | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5120 | # Step 2: AirPlay reconnects first - links via cached parent_id | COMMENT |
| LOW⚡ | tests/controllers/players/test_protocol_linking.py | 5129 | # 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 | 457 | # Step 1: Send device ID and method | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 479 | # Step 2: SRP authentication | STRING |
| LOW | music_assistant/providers/airplay/pairing.py | 508 | # Step 3: Encrypt and send auth public key using AES-GCM | STRING |
| LOW⚡ | music_assistant/helpers/tags.py | 253 | # Step 1: Always split on featuring splitters | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 260 | # Step 2: If no expected_count or already at/above target, we're done | COMMENT |
| LOW⚡ | music_assistant/helpers/tags.py | 264 | # 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/providers/zvuk_music/test_parsers.py | 72 | CODE | |
| LOW | tests/providers/zvuk_music/test_parsers.py | 137 | CODE | |
| LOW | tests/providers/music_quiz/test_plugin.py | 114 | CODE | |
| LOW | tests/providers/chromecast/test_media_status_updates.py | 108 | CODE | |
| LOW | tests/providers/smart_playlist/test_smart_playlist.py | 367 | CODE | |
| LOW | tests/providers/airplay/test_dashboard.py | 30 | CODE | |
| LOW | tests/providers/airplay/dacp/conftest.py | 78 | CODE | |
| LOW | tests/providers/plex/test_provider_methods.py | 75 | 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 | 197 | CODE | |
| LOW | tests/controllers/streams/smart_fades/conftest.py | 21 | 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 | 352 | CODE | |
| LOW | music_assistant/providers/squeezelite/player.py | 798 | CODE | |
| LOW | music_assistant/controllers/music/media/tracks.py | 240 | CODE | |
| LOW | music_assistant/controllers/music/media/podcasts.py | 78 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 204 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 151 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 169 | CODE | |
| LOW | music_assistant/controllers/music/media/audiobooks.py | 187 | CODE | |
| LOW | music_assistant/controllers/music/media/artists.py | 157 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 481 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 1479 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 428 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 446 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 464 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 1416 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 1437 | CODE | |
| LOW | music_assistant/controllers/music/media/base.py | 1458 | CODE | |
| LOW | music_assistant/controllers/music/media/albums.py | 165 | CODE | |
| LOW | music_assistant/controllers/tasks/controller.py | 253 | CODE | |
| LOW | music_assistant/controllers/cache/helpers.py | 48 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/providers/smart_playlist/test_smart_playlist.py | 1841 | # AI-generated description tests | COMMENT |
| HIGH | music_assistant/providers/zvuk_music/constants.py | 29 | # 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 |
|---|---|---|---|---|
| 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 | 447 | # FireRed hallucinates vocal-like activity in the low-energy tail, past the boundary | COMMENT |
| MEDIUM | music_assistant/providers/airplay/stream.py | 198 | # `connected` this makes readiness fully event-driven, so START can | COMMENT |
| MEDIUM | music_assistant/providers/airplay/player.py | 652 | # 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 | 79 | # 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 | …c_assistant/providers/_demo_music_provider/__init__.py | 531 | # 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 | 136 | self.logger.info("No session key available, don't forget to authenticate!") | CODE |
| LOW | music_assistant/providers/lastfm_scrobble/strings.json | 26 | "label": "Successfully logged in as {0}, don't forget to hit save to complete the setup" | CODE |
| MEDIUM | …_assistant/providers/_demo_plugin_provider/__init__.py | 150 | # 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 | 150 | # note that you can use this point to update the player connection info | COMMENT |
| LOW | music_assistant/controllers/music/controller.py | 321 | # make sure to finish any removal jobs | COMMENT |
| LOW | music_assistant/translations/en.json | 1582 | "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 |
|---|---|---|---|---|
| MEDIUM | tests/providers/msx_bridge/conftest.py | 25 | CODE | |
| MEDIUM | tests/providers/filesystem/test_nfo_resolution.py | 972 | CODE | |
| MEDIUM | tests/providers/yandex_ynison/test_ynison_client.py | 1298 | CODE | |
| MEDIUM | tests/providers/airplay/test_protocol_crash.py | 55 | CODE | |
| MEDIUM | tests/providers/kion_music/test_streaming.py | 265 | CODE | |
| MEDIUM | tests/providers/squeezelite/test_player.py | 25 | 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 | 358 | CODE | |
| MEDIUM | music_assistant/models/plugin.py | 181 | 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 | 761 | 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/yandex_music/test_api_client.py | 1556 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW | tests/providers/yandex_music/test_api_client.py | 48 | client = YandexMusicClient(token=SecretStr("fake_token")) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 21 | return KionMusicClient("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | tests/providers/kion_music/test_api_client.py | 35 | mock_cls.assert_called_once_with("fake_token", base_url=DEFAULT_BASE_URL) | CODE |
| LOW | …nt/providers/snapcast/snapweb/assets/index-BYMjFABP.js | 129 | `&&(Q.value+=" ");const U=B.boxSizing,ee=Bu(B.paddingBottom)+Bu(B.paddingTop),q=Bu(B.borderBottomWidth)+Bu(B.borderTopWi | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/providers/audible/test_audible.py | 41 | def helper(mass_mock: AsyncMock, audible_client_mock: AsyncMock) -> AudibleHelper: | CODE |
| LOW | music_assistant/providers/nicovideo/converters/base.py | 29 | def helper(self) -> NicovideoConverterHelper: | CODE |
| LOW | music_assistant/controllers/tasks/controller.py | 149 | def run_task(self, task_id: str) -> BackgroundTask: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | music_assistant/providers/filesystem_local/__init__.py | 2150 | track.favorite = False # TODO: implement favorite status based on rating ? | CODE |