网易云音乐命令行版本
This report summarizes scanner evidence for darknessomi/musicbox, a Python project with 9,856 GitHub stars. SynthScan examined 10,773 lines of code across 45 source files, recording 137 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 16.2 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 106 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 111 finding(s).
Which changes need focused human review? 137 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 137 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/encrypt.py | 75 | def _cloudmusic_dll_encode_id(some_id: str) -> str: | CODE |
| LOW | NEMbox/api.py | 148 | def is_supported_music_quality(quality): | CODE |
| LOW | NEMbox/menu.py | 409 | def space_key_event_in_search_result(self): | CODE |
| LOW | NEMbox/player.py | 231 | def _advance_on_playback_failure(self): | CODE |
| LOW | tests/test_player.py | 6 | def test_playing_id_is_none_without_current_song(): | CODE |
| LOW | tests/test_player.py | 19 | def test_mpv_switch_uses_ipc_pause_command(): | CODE |
| LOW | tests/test_player.py | 37 | def test_stale_playback_token_is_not_current(): | CODE |
| LOW | tests/test_player.py | 63 | def test_refresh_mpv_audio_info_stores_audio_quality_separately(): | CODE |
| LOW | tests/test_player.py | 114 | def test_advance_on_playback_failure_stops_for_single_song_queue(): | CODE |
| LOW | tests/test_player.py | 127 | def test_advance_on_playback_failure_stops_when_loop_wraps_to_same_song(): | CODE |
| LOW | tests/test_player.py | 146 | def test_advance_on_playback_failure_replays_when_next_song_differs(): | CODE |
| LOW | tests/test_player.py | 164 | def test_build_playinfo_rotates_quality_label(monkeypatch): | CODE |
| LOW | tests/test_version_metadata.py | 10 | def test_release_version_sources_are_synchronized(): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 34 | def test_get_account_info_uses_current_account_endpoint(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 52 | def test_get_account_info_falls_back_to_legacy_w_endpoint(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 149 | def test_eapi_request_sends_music_u_and_nmtid_in_payload_and_cookie(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 185 | def test_eapi_header_uses_music_a_without_logged_in_identity(): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 202 | def test_eapi_request_persists_first_nmtid(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 221 | def test_eapi_request_does_not_resave_existing_nmtid(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 238 | def test_eapi_request_ignores_nmtid_save_failure(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 298 | def test_dj_radios_uses_current_hot_endpoint(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 329 | def test_logout_calls_eapi_logout_before_clearing_local(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 371 | def test_fetch_toplists_uses_api_toplist(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 385 | def test_toplists_property_caches_result(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 400 | def test_top_songlist_uses_dynamic_id(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 420 | def test_playlist_classes_are_dynamic_ordered_deduplicated_and_cached(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 447 | def test_playlist_classes_complete_two_level_tui_flow(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 487 | def test_playlist_classes_fall_back_on_invalid_response(monkeypatch): | CODE |
| LOW | tests/test_api_endpoint_updates.py | 495 | def test_playlist_classes_fall_back_on_request_error(monkeypatch): | CODE |
| LOW | tests/test_audio_quality.py | 6 | def test_parse_song_url_hides_lossless_bitrate(): | CODE |
| LOW⚡ | tests/test_audio_quality.py | 27 | def test_supported_music_quality_values(quality): | CODE |
| LOW⚡ | tests/test_audio_quality.py | 32 | def test_unsupported_music_quality_values(quality): | CODE |
| LOW⚡ | tests/test_audio_quality.py | 36 | def test_parse_songs_keeps_duration_for_mpv_progress(): | CODE |
| LOW | tests/test_daemon.py | 35 | def test_acquire_lock_is_exclusive(runtime_paths): | CODE |
| LOW | tests/test_daemon.py | 47 | def test_tune_volume_persists_when_stopped(): | CODE |
| LOW | tests/test_daemon.py | 60 | def test_daemon_volume_delta_when_stopped(runtime_paths): | CODE |
| LOW | tests/test_daemon.py | 68 | def test_daemon_rpc_ping_status_and_shutdown(runtime_paths): | CODE |
| LOW | tests/test_ui_playinfo.py | 5 | def test_playinfo_song_start_accounts_for_long_quality_label(): | CODE |
| LOW | tests/test_osdlyrics.py | 6 | def test_stop_lyrics_process_skips_when_osdlyrics_disabled(): | CODE |
| LOW | tests/test_osdlyrics.py | 11 | def test_stop_lyrics_process_survives_dbus_failure(): | CODE |
| LOW | tests/test_ui_login_qr.py | 28 | def test_build_login_qr_does_not_render_url(monkeypatch): | CODE |
| LOW⚡ | tests/test_cli.py | 465 | def test_control_autostarts_daemon(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 474 | def test_daemon_not_running_no_autostart(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 482 | def test_volume_relative_params(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 490 | def test_volume_absolute_params(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 498 | def test_queue_clear_requires_confirmation(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 507 | def test_queue_clear_with_yes(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 600 | def test_play_dry_run_album_no_side_effect(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 608 | def test_play_dry_run_songs_no_side_effect(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 618 | def test_play_conflicting_flags_rejected(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 660 | def test_download_album_success(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 670 | def test_download_songs_success(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 679 | def test_download_playlist_success(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 688 | def test_download_conflicting_flags_rejected(monkeypatch, capsys): | CODE |
| LOW⚡ | tests/test_cli.py | 698 | def test_download_all_fail_exit_nonzero(monkeypatch, capsys): | CODE |
| LOW | tests/test_cli.py | 227 | def test_song_url_rejects_unsupported_quality_before_side_effects( | CODE |
| LOW | tests/test_cli.py | 256 | def test_song_url_temporarily_applies_supported_quality(monkeypatch, capsys): | CODE |
| LOW | tests/test_cli.py | 284 | def test_recommend_not_logged_in(monkeypatch, capsys): | CODE |
| LOW | tests/test_cli.py | 291 | def test_recommend_songs_logged_in(monkeypatch, capsys): | CODE |
| LOW | tests/test_cli.py | 308 | def test_auth_login_without_no_wait_fails(monkeypatch, capsys): | CODE |
| 21 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | NEMbox/cli.py | 196 | except (KeyError, TypeError, AttributeError): | CODE |
| HIGH | NEMbox/cli.py | 943 | except (ConnectionError, OSError, ValueError): | CODE |
| HIGH | NEMbox/player.py | 373 | except FileNotFoundError: | CODE |
| HIGH | NEMbox/player.py | 420 | except (OSError, ValueError): | CODE |
| HIGH | NEMbox/player.py | 556 | except Exception: | CODE |
| HIGH | NEMbox/storage.py | 98 | except (OSError, KeyError, ValueError): | CODE |
| HIGH | NEMbox/__main__.py | 46 | except _curses.error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/ui.py | 283 | CODE | |
| LOW | NEMbox/ui.py | 393 | CODE | |
| LOW | NEMbox/api.py | 981 | CODE | |
| LOW | NEMbox/menu.py | 213 | CODE | |
| LOW | NEMbox/menu.py | 532 | CODE | |
| LOW | NEMbox/menu.py | 643 | CODE | |
| LOW | NEMbox/menu.py | 1061 | CODE | |
| LOW | NEMbox/menu.py | 1269 | CODE | |
| LOW | NEMbox/cli.py | 250 | CODE | |
| LOW | NEMbox/cli.py | 273 | CODE | |
| LOW | NEMbox/cli.py | 697 | CODE | |
| LOW | NEMbox/cli.py | 933 | CODE | |
| LOW | NEMbox/player.py | 246 | CODE | |
| LOW | NEMbox/player.py | 399 | CODE | |
| LOW | NEMbox/player.py | 466 | CODE | |
| LOW | NEMbox/player.py | 540 | CODE | |
| LOW | NEMbox/player.py | 807 | CODE | |
| LOW | NEMbox/player.py | 852 | CODE | |
| LOW | NEMbox/storage.py | 90 | CODE | |
| LOW | NEMbox/daemon.py | 95 | CODE | |
| LOW | NEMbox/daemon.py | 165 | CODE | |
| LOW | NEMbox/daemon.py | 321 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/osdlyrics.py | 150 | except Exception as e: | CODE |
| LOW | NEMbox/ui.py | 145 | except Exception as e: | CODE |
| LOW | NEMbox/ui.py | 361 | except Exception as e: | CODE |
| LOW | NEMbox/api.py | 395 | except Exception as e: | CODE |
| LOW | NEMbox/api.py | 434 | except Exception as e: | CODE |
| LOW | NEMbox/api.py | 552 | except Exception as e: | CODE |
| LOW | NEMbox/api.py | 832 | except Exception as e: | CODE |
| MEDIUM | NEMbox/api.py | 402 | def fetch_toplists(self): | CODE |
| LOW | NEMbox/menu.py | 292 | except Exception as e: | CODE |
| LOW | NEMbox/cli.py | 782 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 272 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 279 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 293 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 302 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 317 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 556 | except Exception: | CODE |
| LOW | NEMbox/player.py | 572 | except Exception as e: | CODE |
| LOW | NEMbox/player.py | 586 | except Exception as e: | CODE |
| LOW | NEMbox/daemon.py | 240 | except Exception as exc: # noqa: BLE001 — never let one request kill daemon | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/encrypt.py | 12 | __all__ = [ | CODE |
| LOW | NEMbox/kill_thread.py | 6 | __all__ = ["stop_thread"] | CODE |
| LOW | NEMbox/cmd_parser.py | 15 | __all__ = ["cmd_parser", "parse_keylist", "coroutine", "erase_coroutine"] | CODE |
| LOW | NEMbox/utils.py | 13 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/player.py | 621 | self.notify_copyright_issue() | COMMENT |
| LOW | tests/test_api.py | 1 | from NEMbox.api import NetEase, Parse | COMMENT |
| LOW | tests/test_api.py | 21 | # print(api.album(38721188)) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | NEMbox/player.py | 10 | CODE |