Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found).
This report summarizes scanner evidence for spotDL/spotify-downloader, a Python project with 26,295 GitHub stars. SynthScan examined 48,085 lines of code across 142 source files, recording 266 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 7.7 (Moderate 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? 115 finding(s).
Are imports declared and package/API names verified? 31 finding(s).
Are wrappers, guards, and repeated structures necessary? 178 finding(s).
Which changes need focused human review? 266 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 266 distinct pattern matches across 13 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 | spotdl/__init__.py | 20 | __all__ = ["Spotdl", "console_entry_point", "__version__"] | CODE |
| LOW | spotdl/__init__.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/types/options.py | 11 | __all__ = [ | CODE |
| LOW | spotdl/types/album.py | 11 | __all__ = ["Album", "AlbumError"] | CODE |
| LOW | spotdl/types/artist.py | 13 | __all__ = ["Artist", "ArtistError"] | CODE |
| LOW | spotdl/types/result.py | 10 | __all__ = ["Result"] | CODE |
| LOW | spotdl/types/playlist.py | 12 | __all__ = ["Playlist", "PlaylistError"] | CODE |
| LOW | spotdl/types/playlist.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/types/saved.py | 11 | __all__ = ["Saved", "SavedError"] | CODE |
| LOW | spotdl/types/song.py | 13 | __all__ = ["Song", "SongList", "SongError"] | CODE |
| LOW | spotdl/web/api.py | 33 | __all__ = [ | CODE |
| LOW | spotdl/web/routes.py | 28 | __all__ = ["router"] | CODE |
| LOW | spotdl/providers/lyrics/genius.py | 13 | __all__ = ["Genius"] | CODE |
| LOW | spotdl/providers/lyrics/musixmatch.py | 14 | __all__ = ["MusixMatch"] | CODE |
| LOW | spotdl/providers/lyrics/synced.py | 12 | __all__ = ["Synced"] | CODE |
| LOW | spotdl/providers/lyrics/__init__.py | 11 | __all__ = ["AzLyrics", "Genius", "MusixMatch", "Synced", "LyricsProvider"] | CODE |
| LOW | spotdl/providers/lyrics/base.py | 11 | __all__ = ["LyricsProvider"] | CODE |
| LOW | spotdl/providers/lyrics/base.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/lyrics/azlyrics.py | 13 | __all__ = ["AzLyrics"] | CODE |
| LOW | spotdl/providers/lyrics/azlyrics.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/audio/bandcamp.py | 16 | __all__ = ["BandCamp"] | CODE |
| LOW | spotdl/providers/audio/bandcamp.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/audio/youtube.py | 12 | __all__ = ["YouTube"] | CODE |
| LOW | spotdl/providers/audio/sliderkz.py | 14 | __all__ = ["SliderKZ"] | CODE |
| LOW | spotdl/providers/audio/sliderkz.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/audio/__init__.py | 17 | __all__ = [ | CODE |
| LOW | spotdl/providers/audio/soundcloud.py | 16 | __all__ = ["SoundCloud"] | CODE |
| LOW | spotdl/providers/audio/soundcloud.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/audio/ytmusic.py | 14 | __all__ = ["YouTubeMusic"] | CODE |
| LOW | spotdl/providers/audio/ytmusic.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/providers/audio/base.py | 23 | __all__ = ["AudioProviderError", "AudioProvider", "ISRC_REGEX", "YTDLLogger"] | CODE |
| LOW | spotdl/providers/audio/base.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | spotdl/providers/audio/piped.py | 17 | __all__ = ["Piped"] | CODE |
| LOW⚡ | spotdl/providers/audio/piped.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/logging.py | 16 | __all__ = [ | CODE |
| LOW | spotdl/utils/console.py | 15 | __all__ = [ | CODE |
| LOW | spotdl/utils/formatter.py | 23 | __all__ = [ | CODE |
| LOW | spotdl/utils/formatter.py | 73 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/web.py | 23 | __all__ = [ | CODE |
| LOW | spotdl/utils/config.py | 22 | __all__ = [ | CODE |
| LOW | spotdl/utils/config.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/metadata.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/metadata.py | 51 | __all__ = [ | CODE |
| LOW | spotdl/utils/downloader.py | 7 | __all__ = ["check_ytmusic_connection"] | CODE |
| LOW | spotdl/utils/arguments.py | 17 | __all__ = ["OPERATIONS", "SmartFormatter", "parse_arguments"] | CODE |
| LOW | spotdl/utils/ffmpeg.py | 24 | __all__ = [ | CODE |
| LOW | spotdl/utils/matching.py | 20 | __all__ = [ | CODE |
| LOW | spotdl/utils/matching.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/m3u.py | 12 | __all__ = [ | CODE |
| LOW | spotdl/utils/m3u.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/static.py | 9 | __all__ = [ | CODE |
| LOW | spotdl/utils/archive.py | 8 | __all__ = ["Archive"] | CODE |
| LOW | spotdl/utils/search.py | 26 | __all__ = [ | CODE |
| LOW | spotdl/utils/search.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/deno.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/deno.py | 21 | __all__ = [ | CODE |
| LOW | spotdl/utils/github.py | 15 | __all__ = [ | CODE |
| LOW | spotdl/utils/spotify.py | 23 | __all__ = [ | CODE |
| LOW | spotdl/utils/spotify.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | spotdl/utils/lrc.py | 16 | logger = logging.getLogger(__name__) | CODE |
| 23 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | spotdl/providers/lyrics/genius.py | 0 | returns the results for the given song. ### arguments - name: the name of the song. - artists: the artists of the song. | STRING |
| HIGH | spotdl/providers/lyrics/musixmatch.py | 0 | returns the results for the given song. ### arguments - name: the name of the song. - artists: the artists of the song. | STRING |
| HIGH | spotdl/providers/lyrics/synced.py | 0 | returns the results for the given song. ### arguments - name: the name of the song. - artists: the artists of the song. | STRING |
| HIGH | spotdl/providers/lyrics/base.py | 0 | returns the results for the given song. ### arguments - name: the name of the song. - artists: the artists of the song. | STRING |
| HIGH | spotdl/providers/lyrics/azlyrics.py | 0 | returns the results for the given song. ### arguments - name: the name of the song. - artists: the artists of the song. | STRING |
| HIGH | spotdl/providers/lyrics/genius.py | 0 | extracts the lyrics from the given url. ### arguments - url: the url to extract the lyrics from. - kwargs: additional ar | STRING |
| HIGH | spotdl/providers/lyrics/musixmatch.py | 0 | extracts the lyrics from the given url. ### arguments - url: the url to extract the lyrics from. - kwargs: additional ar | STRING |
| HIGH | spotdl/providers/lyrics/synced.py | 0 | extracts the lyrics from the given url. ### arguments - url: the url to extract the lyrics from. - kwargs: additional ar | STRING |
| HIGH | spotdl/providers/lyrics/base.py | 0 | extracts the lyrics from the given url. ### arguments - url: the url to extract the lyrics from. - kwargs: additional ar | STRING |
| HIGH | spotdl/providers/lyrics/azlyrics.py | 0 | extracts the lyrics from the given url. ### arguments - url: the url to extract the lyrics from. - kwargs: additional ar | STRING |
| HIGH | spotdl/providers/audio/bandcamp.py | 0 | get results from soundcloud ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused | STRING |
| HIGH | spotdl/providers/audio/sliderkz.py | 0 | get results from soundcloud ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused | STRING |
| HIGH | spotdl/providers/audio/soundcloud.py | 0 | get results from soundcloud ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 76 | def fake_create_subprocess_exec(*args, stdout=None, stderr=None, **kwargs): | CODE |
| LOW | tests/types/test_song.py | 112 | # def test_song_from_search_term(): | COMMENT |
| LOW | tests/types/test_song.py | 197 | def test_song_from_data_dump_wrong_type(): | CODE |
| LOW | tests/types/test_playlist.py | 30 | def test_playlist_wrong_initget_results(): | CODE |
| LOW | tests/types/test_playlist.py | 61 | def test_playlist_from_string(): | CODE |
| LOW | tests/providers/lyrics/test_musixmatch.py | 7 | # def test_get_musixmatch_lyrics(): | COMMENT |
| LOW | tests/providers/audio/test_youtube.py | 84 | def test_yt_get_results_normalizes_null_metadata(mocker): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 79 | def malformed_optional_bandcamp_payload(): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 132 | def test_bandcamp_search_handles_invalid_json_and_malformed_rows(monkeypatch): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 160 | def test_bandcamp_get_results_handles_bad_candidates_and_optional_data(monkeypatch): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 203 | def test_piped_get_results_handles_failed_api_responses_and_malformed_rows(): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 263 | def test_piped_get_results_uses_api_proxy_isrc_and_canonical_youtube_url(): | CODE |
| LOW | tests/providers/audio/test_bandcamp_piped.py | 282 | def test_piped_get_download_metadata_delegates_to_yt_dlp_with_proxy(mocker): | CODE |
| LOW | tests/providers/audio/test_ytmusic.py | 54 | def test_ytm_get_results_retries_with_new_client(mocker): | CODE |
| LOW | tests/utils/test_logging.py | 8 | def test_spotdl_formatter_format(): | CODE |
| LOW | tests/utils/test_search.py | 94 | def test_get_simple_songs_skips_missing_video_details(monkeypatch): | CODE |
| LOW | tests/utils/test_github.py | 35 | def test_check_for_updates_fail(monkeypatch): | CODE |
| LOW | tests/utils/test_formatter.py | 104 | def test_create_file_name_restrict(): | CODE |
| LOW⚡ | tests/utils/test_config.py | 51 | def test_get_config_not_created(setup): | CODE |
| LOW⚡ | tests/utils/test_config.py | 60 | def test_use_official_api_default(): | CODE |
| LOW⚡ | tests/utils/test_config.py | 70 | def test_use_official_api_from_config(): | CODE |
| LOW | tests/utils/test_config.py | 84 | def test_use_official_api_argument_overrides_config(): | CODE |
| LOW | tests/utils/test_matching.py | 4 | def test_calc_album_match_without_song_album(mocker): | CODE |
| LOW | tests/utils/test_ffmpeg.py | 29 | def test_is_not_ffmpeg_installed(monkeypatch): | STRING |
| LOW | tests/utils/test_ffmpeg.py | 42 | def test_get_none_ffmpeg_path(monkeypatch): | STRING |
| LOW | tests/utils/test_ffmpeg.py | 55 | def test_get_none_ffmpeg_version(monkeypatch): | STRING |
| LOW | tests/utils/test_ffmpeg.py | 69 | def test_get_none_local_ffmpeg(monkeypatch): | STRING |
| LOW | tests/utils/test_downloader.py | 4 | def test_check_ytmusic_connection_suppresses_empty_search_log(mocker): | CODE |
| LOW | tests/utils/test_deno.py | 33 | def test_is_not_deno_installed(monkeypatch): | CODE |
| LOW | tests/utils/test_deno.py | 84 | def test_get_local_deno_yt_dlp_options(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_deno.py | 104 | def test_get_local_deno_yt_dlp_options_ignores_non_executable(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_deno.py | 118 | def test_get_local_deno_yt_dlp_options_ignores_missing_local(monkeypatch): | CODE |
| LOW | tests/utils/test_deno.py | 128 | def test_user_js_runtime_overrides_local_deno(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_deno.py | 147 | def test_audio_provider_uses_local_deno_yt_dlp_options(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_deno.py | 173 | def test_piped_uses_local_deno_yt_dlp_options(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_deno.py | 240 | def test_download_deno_unsupported_platform(monkeypatch): | CODE |
| LOW | tests/utils/test_deno.py | 252 | def test_download_deno_invalid_archive(monkeypatch, tmp_path): | CODE |
| LOW | tests/utils/test_spotify.py | 45 | def test_init_uses_free_client_by_default(monkeypatch): | CODE |
| LOW | tests/utils/test_spotify.py | 94 | def test_init_uses_official_client_when_requested(monkeypatch): | CODE |
| LOW | tests/utils/test_spotify.py | 144 | def test_init_uses_official_client_for_official_api_only_options(monkeypatch, caplog): | CODE |
| LOW | tests/utils/test_arguments.py | 11 | def test_parse_use_official_api(monkeypatch): | CODE |
| LOW | spotdl/web/routes.py | 153 | async def handle_get_client_downloads(datastar_signals: ReadSignals): | CODE |
| LOW | spotdl/web/routes.py | 183 | async def handle_get_client_settings(datastar_signals: ReadSignals): | CODE |
| LOW | spotdl/web/routes.py | 207 | async def handle_post_client_settings(datastar_signals: ReadSignals): | CODE |
| LOW | spotdl/web/routes.py | 281 | async def handle_post_client_download(datastar_signals: ReadSignals): | STRING |
| LOW | spotdl/web/routes.py | 348 | async def handle_get_client_component_settings(datastar_signals: ReadSignals): | STRING |
| LOW | spotdl/web/routes.py | 388 | async def handle_client_component_search_input_rotating_placeholder(): | CODE |
| LOW⚡ | spotdl/providers/audio/piped.py | 26 | def _legacy_piped_watch_url_to_youtube(url: str) -> str: | CODE |
| LOW | spotdl/utils/search.py | 471 | def get_user_followed_artists() -> List[Artist]: | CODE |
| LOW | spotdl/utils/search.py | 581 | def get_song_from_file_metadata(file: Path, id3_separator: str = "/") -> Optional[Song]: | CODE |
| LOW | spotdl/utils/deno.py | 120 | def get_local_deno_yt_dlp_options() -> Dict[str, Dict[str, Dict[str, str]]]: | CODE |
| LOW | spotdl/utils/spotify.py | 152 | def _init_official_spotify_client(**kwargs) -> _OfficialSpotifyClient: | CODE |
| LOW | spotdl/utils/spotify.py | 160 | def _init_free_spotify_client(**kwargs) -> Any: | CODE |
| LOW | spotdl/download/downloader.py | 448 | async def async_search_and_download( # pylint: disable=R0911 | CODE |
| LOW | spotdl/download/progress_handler.py | 449 | def notify_conversion_complete(self, status="Embedding metadata") -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | spotdl/web/routes.py | 93 | # Create a new client if not found | COMMENT |
| MEDIUM | spotdl/utils/logging.py | 178 | # Create a rich handler | COMMENT |
| MEDIUM | spotdl/utils/config.py | 62 | # Define the new, correct XDG config path (~/.config/spotdl) | COMMENT |
| MEDIUM | spotdl/utils/config.py | 65 | # Define the old path (~/.spotdl) for backward compatibility | COMMENT |
| MEDIUM | spotdl/utils/metadata.py | 299 | # Create the image object for the file type | COMMENT |
| MEDIUM | spotdl/utils/m3u.py | 145 | # Create a single m3u file for specified song list name | COMMENT |
| MEDIUM | spotdl/download/downloader.py | 501 | # Create the output file path | COMMENT |
| MEDIUM | spotdl/download/downloader.py | 518 | # Create the temp folder path | COMMENT |
| MEDIUM | spotdl/download/downloader.py | 681 | # Create the output directory if it doesn't exist | COMMENT |
| MEDIUM | spotdl/console/save.py | 88 | # The following function calls blocking code, which would block whole event loop. | COMMENT |
| MEDIUM | spotdl/console/web.py | 58 | # Create the event loop | COMMENT |
| MEDIUM | spotdl/console/url.py | 58 | # The following function calls blocking code, which would block whole event loop. | COMMENT |
| MEDIUM | spotdl/console/meta.py | 36 | # Create a list of all songs from all paths in query | COMMENT |
| MEDIUM | spotdl/console/meta.py | 152 | # The following function calls blocking code, which would block whole event loop. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spotdl/types/playlist.py | 85 | # Add tracks to the list | COMMENT |
| LOW | spotdl/providers/audio/sliderkz.py | 60 | # Check if the response is valid | COMMENT |
| LOW | spotdl/providers/audio/base.py | 260 | # Check if any of the search results is in the | COMMENT |
| LOW | spotdl/utils/formatter.py | 351 | # Check if the file name length is greater than the limit | COMMENT |
| LOW | spotdl/utils/web.py | 128 | # Add the connection to the list of connections | COMMENT |
| LOW | spotdl/utils/metadata.py | 357 | # Check if the lyrics are in lrc format | COMMENT |
| LOW | spotdl/utils/metadata.py | 613 | # Check if the lyrics are in lrc format | COMMENT |
| LOW | spotdl/utils/downloader.py | 19 | # Check if we are getting results from YouTube Music | COMMENT |
| LOW | spotdl/utils/ffmpeg.py | 119 | # Check if ffmpeg is installed | COMMENT |
| LOW | spotdl/utils/ffmpeg.py | 144 | # Check if ffmpeg is installed | COMMENT |
| LOW | spotdl/utils/matching.py | 489 | # # Check if the main artist is simlar | COMMENT |
| LOW | spotdl/utils/matching.py | 494 | # Check if other song artists are in the result name | COMMENT |
| LOW | spotdl/utils/matching.py | 735 | # Check if result contains forbidden words | COMMENT |
| LOW | spotdl/utils/m3u.py | 110 | # Check if the file name ends with .m3u or .m3u8 | COMMENT |
| LOW | spotdl/utils/github.py | 165 | # Check if the given url is a url to a GitHub repo. If it is, tell the | COMMENT |
| LOW | spotdl/download/downloader.py | 468 | # Check if song has name/artist and url/song_id | COMMENT |
| LOW | spotdl/download/downloader.py | 521 | # Check if there is an already existing song file, with the same spotify URL in its | COMMENT |
| LOW | spotdl/console/entry_point.py | 64 | # Check if sys.argv contains an action | COMMENT |
| LOW | spotdl/console/entry_point.py | 91 | # Check if ffmpeg is installed | COMMENT |
| LOW | spotdl/console/entry_point.py | 98 | # Check if we might be blocked by YouTube Music without stopping downloads. | COMMENT |
| LOW | spotdl/console/entry_point.py | 123 | # Check if save file is present and if it's valid | COMMENT |
| LOW | spotdl/console/entry_point.py | 130 | # Check if the user is logged in | COMMENT |
| LOW | spotdl/console/meta.py | 58 | # Check if song has metadata | COMMENT |
| LOW | spotdl/console/meta.py | 122 | # Check if the song has lyric | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_main.py | 3 | CODE | |
| LOW | tests/types/test_song.py | 3 | CODE | |
| LOW | tests/utils/test_logging.py | 3 | CODE | |
| LOW | tests/utils/test_archive.py | 1 | CODE | |
| LOW | tests/utils/test_formatter.py | 3 | CODE | |
| LOW | tests/utils/test_config.py | 7 | CODE | |
| LOW | tests/utils/test_m3u.py | 1 | CODE | |
| LOW | tests/utils/test_ffmpeg.py | 12 | CODE | |
| LOW | tests/utils/test_deno.py | 10 | CODE | |
| LOW | spotdl/__init__.py | 12 | CODE | |
| LOW | spotdl/__init__.py | 13 | CODE | |
| LOW | spotdl/__main__.py | 5 | CODE | |
| LOW | spotdl/web/utils.py | 7 | CODE | |
| LOW | spotdl/providers/lyrics/__init__.py | 5 | CODE | |
| LOW | spotdl/providers/lyrics/__init__.py | 6 | CODE | |
| LOW | spotdl/providers/lyrics/__init__.py | 7 | CODE | |
| LOW | spotdl/providers/lyrics/__init__.py | 8 | CODE | |
| LOW | spotdl/providers/lyrics/__init__.py | 9 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 5 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 6 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 6 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 6 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 6 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 12 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 13 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 14 | CODE | |
| LOW | spotdl/providers/audio/__init__.py | 15 | CODE | |
| LOW | spotdl/utils/logging.py | 9 | CODE | |
| LOW | spotdl/console/__init__.py | 5 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 61 | except Exception: | CODE |
| LOW | spotdl/__init__.py | 142 | except Exception as exc: | CODE |
| LOW | spotdl/web/api.py | 203 | except Exception as exception: | CODE |
| LOW | spotdl/web/routes.py | 339 | except Exception as exception: | STRING |
| LOW | spotdl/providers/lyrics/base.py | 82 | except Exception as exc: | CODE |
| LOW | spotdl/providers/lyrics/base.py | 120 | except Exception as exc: | CODE |
| LOW | spotdl/providers/audio/bandcamp.py | 219 | except Exception as exc: | CODE |
| LOW | spotdl/providers/audio/sliderkz.py | 66 | except Exception as exc: | CODE |
| LOW | spotdl/providers/audio/base.py | 404 | except Exception as exception: | CODE |
| LOW | spotdl/utils/metadata.py | 195 | except Exception as exc: | CODE |
| LOW | spotdl/utils/metadata.py | 296 | except Exception: | CODE |
| LOW | spotdl/utils/metadata.py | 609 | except Exception: | CODE |
| LOW | spotdl/utils/search.py | 113 | except Exception as exc: | CODE |
| LOW | spotdl/utils/lrc.py | 35 | except Exception: | CODE |
| LOW | spotdl/download/downloader.py | 496 | except Exception as e: | CODE |
| LOW | spotdl/download/downloader.py | 608 | except Exception as exc: | CODE |
| LOW | spotdl/download/downloader.py | 876 | except Exception as exception: | CODE |
| LOW | spotdl/console/save.py | 64 | except Exception as exception: | CODE |
| LOW | spotdl/console/save.py | 81 | except Exception as exception: | CODE |
| LOW | spotdl/console/entry_point.py | 164 | except Exception as exc: | CODE |
| LOW | spotdl/console/url.py | 51 | except Exception as exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | spotdl/providers/lyrics/azlyrics.py | 182 | except (requests.ConnectionError, requests.TooManyRedirects): | CODE |
| HIGH | spotdl/utils/metadata.py | 609 | except Exception: | CODE |
| HIGH | spotdl/download/downloader.py | 432 | except RuntimeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spotdl/providers/audio/base.py | 160 | CODE | |
| LOW | spotdl/utils/metadata.py | 277 | CODE | |
| LOW | spotdl/utils/metadata.py | 384 | CODE | |
| LOW | spotdl/utils/ffmpeg.py | 311 | CODE | |
| LOW | spotdl/utils/ffmpeg.py | 419 | CODE | |
| LOW | spotdl/utils/m3u.py | 21 | CODE | |
| LOW | spotdl/utils/search.py | 119 | CODE | |
| LOW | spotdl/download/downloader.py | 98 | CODE | |
| LOW | spotdl/download/downloader.py | 448 | CODE | |
| LOW | spotdl/console/sync.py | 21 | CODE | |
| LOW | spotdl/console/meta.py | 22 | CODE | |
| LOW | spotdl/console/meta.py | 54 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_matching.py | 261 | ), | COMMENT |
| LOW | tests/types/test_song.py | 121 | # assert song.album_name == "Ropes" | COMMENT |
| LOW | tests/providers/lyrics/test_azlyrics.py | 1 | # import pytest | COMMENT |
| LOW | tests/providers/lyrics/test_musixmatch.py | 1 | # import pytest | COMMENT |
| LOW | spotdl/web/api.py | 41 | router = APIRouter() | COMMENT |
| LOW | spotdl/web/api.py | 61 | # if ( | COMMENT |
| LOW | spotdl/providers/lyrics/azlyrics.py | 161 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 46 | CODE | |
| LOW | spotdl/utils/formatter.py | 122 | CODE | |
| LOW | spotdl/utils/spotify.py | 209 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/types/test_song.py | 163 | "download_url": null, | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spotdl/web/static/assets/tailwindcss/browser@4.js | 7 | "use strict";(()=>{var e=10;function t(t,i){let a=i?.from?{file:i.from,code:t}:null;"\ufeff"===t[0]&&(t=" "+t.slice(1)); | CODE |