Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found).
167 matches across 9 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| HIGH | spotdl/providers/audio/bandcamp.py | 0 | get results from slider.kz ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused. |
| HIGH | spotdl/providers/audio/sliderkz.py | 0 | get results from slider.kz ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused. |
| HIGH | spotdl/providers/audio/soundcloud.py | 0 | get results from slider.kz ### arguments - search_term: the search term to search for. - args: unused. - kwargs: unused. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/conftest.py | 76 | def fake_create_subprocess_exec(*args, stdout=None, stderr=None, **kwargs): |
| LOW | tests/types/test_song.py | 112 | # def test_song_from_search_term(): |
| LOW | tests/types/test_song.py | 197 | def test_song_from_data_dump_wrong_type(): |
| LOW | tests/types/test_playlist.py | 30 | def test_playlist_wrong_initget_results(): |
| LOW | tests/types/test_playlist.py | 61 | def test_playlist_from_string(): |
| LOW | tests/providers/lyrics/test_musixmatch.py | 7 | # def test_get_musixmatch_lyrics(): |
| LOW | tests/providers/audio/test_youtube.py | 84 | def test_yt_get_results_normalizes_null_metadata(mocker): |
| LOW | tests/providers/audio/test_ytmusic.py | 54 | def test_ytm_get_results_retries_with_new_client(mocker): |
| LOW | tests/utils/test_logging.py | 8 | def test_spotdl_formatter_format(): |
| LOW | tests/utils/test_github.py | 35 | def test_check_for_updates_fail(monkeypatch): |
| LOW | tests/utils/test_formatter.py | 104 | def test_create_file_name_restrict(): |
| LOW | tests/utils/test_config.py | 51 | def test_get_config_not_created(setup): |
| LOW | tests/utils/test_config.py | 60 | def test_use_official_api_default(): |
| LOW | tests/utils/test_config.py | 70 | def test_use_official_api_from_config(): |
| LOW | tests/utils/test_config.py | 84 | def test_use_official_api_argument_overrides_config(): |
| LOW | tests/utils/test_ffmpeg.py | 29 | def test_is_not_ffmpeg_installed(monkeypatch): |
| LOW | tests/utils/test_ffmpeg.py | 42 | def test_get_none_ffmpeg_path(monkeypatch): |
| LOW | tests/utils/test_ffmpeg.py | 55 | def test_get_none_ffmpeg_version(monkeypatch): |
| LOW | tests/utils/test_ffmpeg.py | 69 | def test_get_none_local_ffmpeg(monkeypatch): |
| LOW | tests/utils/test_downloader.py | 4 | def test_check_ytmusic_connection_suppresses_empty_search_log(mocker): |
| LOW | tests/utils/test_deno.py | 33 | def test_is_not_deno_installed(monkeypatch): |
| LOW | tests/utils/test_deno.py | 84 | def test_get_local_deno_yt_dlp_options(monkeypatch, tmp_path): |
| LOW | tests/utils/test_deno.py | 104 | def test_get_local_deno_yt_dlp_options_ignores_non_executable(monkeypatch, tmp_path): |
| LOW | tests/utils/test_deno.py | 118 | def test_get_local_deno_yt_dlp_options_ignores_missing_local(monkeypatch): |
| LOW | tests/utils/test_deno.py | 128 | def test_user_js_runtime_overrides_local_deno(monkeypatch, tmp_path): |
| LOW | tests/utils/test_deno.py | 147 | def test_audio_provider_uses_local_deno_yt_dlp_options(monkeypatch, tmp_path): |
| LOW | tests/utils/test_deno.py | 173 | def test_piped_uses_local_deno_yt_dlp_options(monkeypatch, tmp_path): |
| LOW | tests/utils/test_deno.py | 239 | def test_download_deno_unsupported_platform(monkeypatch): |
| LOW | tests/utils/test_deno.py | 251 | def test_download_deno_invalid_archive(monkeypatch, tmp_path): |
| LOW | tests/utils/test_spotify.py | 45 | def test_init_uses_free_client_by_default(monkeypatch): |
| LOW | tests/utils/test_spotify.py | 94 | def test_init_uses_official_client_when_requested(monkeypatch): |
| LOW | tests/utils/test_spotify.py | 144 | def test_init_uses_official_client_for_official_api_only_options(monkeypatch, caplog): |
| LOW | tests/utils/test_arguments.py | 11 | def test_parse_use_official_api(monkeypatch): |
| LOW | spotdl/web/routes.py | 152 | async def handle_get_client_downloads(datastar_signals: ReadSignals): |
| LOW | spotdl/web/routes.py | 182 | async def handle_get_client_settings(datastar_signals: ReadSignals): |
| LOW | spotdl/web/routes.py | 206 | async def handle_post_client_settings(datastar_signals: ReadSignals): |
| LOW | spotdl/web/routes.py | 280 | async def handle_post_client_download(datastar_signals: ReadSignals): |
| LOW | spotdl/web/routes.py | 347 | async def handle_get_client_component_settings(datastar_signals: ReadSignals): |
| LOW | spotdl/web/routes.py | 387 | async def handle_client_component_search_input_rotating_placeholder(): |
| LOW | spotdl/utils/search.py | 463 | def get_user_followed_artists() -> List[Artist]: |
| LOW | spotdl/utils/search.py | 573 | def get_song_from_file_metadata(file: Path, id3_separator: str = "/") -> Optional[Song]: |
| LOW | spotdl/utils/deno.py | 120 | def get_local_deno_yt_dlp_options() -> Dict[str, Dict[str, Dict[str, str]]]: |
| LOW | spotdl/utils/spotify.py | 152 | def _init_official_spotify_client(**kwargs) -> _OfficialSpotifyClient: |
| LOW | spotdl/utils/spotify.py | 160 | def _init_free_spotify_client(**kwargs) -> Any: |
| LOW | spotdl/download/progress_handler.py | 444 | def notify_conversion_complete(self, status="Embedding metadata") -> None: |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | spotdl/web/routes.py | 92 | # Create a new client if not found |
| MEDIUM | spotdl/utils/logging.py | 187 | # Create a rich handler |
| MEDIUM | spotdl/utils/config.py | 62 | # Define the new, correct XDG config path (~/.config/spotdl) |
| MEDIUM | spotdl/utils/config.py | 65 | # Define the old path (~/.spotdl) for backward compatibility |
| MEDIUM | spotdl/utils/metadata.py | 299 | # Create the image object for the file type |
| MEDIUM | spotdl/utils/m3u.py | 145 | # Create a single m3u file for specified song list name |
| MEDIUM | spotdl/download/downloader.py | 473 | # Create the output file path |
| MEDIUM | spotdl/download/downloader.py | 490 | # Create the temp folder path |
| MEDIUM | spotdl/download/downloader.py | 650 | # Create the output directory if it doesn't exist |
| MEDIUM | spotdl/console/save.py | 88 | # The following function calls blocking code, which would block whole event loop. |
| MEDIUM | spotdl/console/web.py | 58 | # Create the event loop |
| MEDIUM | spotdl/console/url.py | 58 | # The following function calls blocking code, which would block whole event loop. |
| MEDIUM | spotdl/console/meta.py | 36 | # Create a list of all songs from all paths in query |
| MEDIUM | spotdl/console/meta.py | 152 | # The following function calls blocking code, which would block whole event loop. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | spotdl/types/playlist.py | 85 | # Add tracks to the list |
| LOW | spotdl/providers/audio/sliderkz.py | 60 | # Check if the response is valid |
| LOW | spotdl/providers/audio/base.py | 254 | # Check if any of the search results is in the |
| LOW | spotdl/utils/formatter.py | 351 | # Check if the file name length is greater than the limit |
| LOW | spotdl/utils/web.py | 128 | # Add the connection to the list of connections |
| LOW | spotdl/utils/metadata.py | 357 | # Check if the lyrics are in lrc format |
| LOW | spotdl/utils/metadata.py | 613 | # Check if the lyrics are in lrc format |
| LOW | spotdl/utils/downloader.py | 19 | # Check if we are getting results from YouTube Music |
| LOW | spotdl/utils/ffmpeg.py | 115 | # Check if ffmpeg is installed |
| LOW | spotdl/utils/ffmpeg.py | 139 | # Check if ffmpeg is installed |
| LOW | spotdl/utils/ffmpeg.py | 320 | # Check if bitrate is an integer |
| LOW | spotdl/utils/matching.py | 489 | # # Check if the main artist is simlar |
| LOW | spotdl/utils/matching.py | 494 | # Check if other song artists are in the result name |
| LOW | spotdl/utils/matching.py | 735 | # Check if result contains forbidden words |
| LOW | spotdl/utils/m3u.py | 110 | # Check if the file name ends with .m3u or .m3u8 |
| LOW | spotdl/utils/github.py | 165 | # Check if the given url is a url to a GitHub repo. If it is, tell the |
| LOW | spotdl/download/downloader.py | 441 | # Check if song has name/artist and url/song_id |
| LOW | spotdl/download/downloader.py | 493 | # Check if there is an already existing song file, with the same spotify URL in its |
| LOW | spotdl/console/entry_point.py | 64 | # Check if sys.argv contains an action |
| LOW | spotdl/console/entry_point.py | 91 | # Check if ffmpeg is installed |
| LOW | spotdl/console/entry_point.py | 98 | # Check if we might be blocked by YouTube Music without stopping downloads. |
| LOW | spotdl/console/entry_point.py | 123 | # Check if save file is present and if it's valid |
| LOW | spotdl/console/entry_point.py | 130 | # Check if the user is logged in |
| LOW | spotdl/console/meta.py | 58 | # Check if song has metadata |
| LOW | spotdl/console/meta.py | 122 | # Check if the song has lyric |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_main.py | 3 | |
| LOW | tests/types/test_song.py | 3 | |
| LOW | tests/utils/test_logging.py | 3 | |
| LOW | tests/utils/test_archive.py | 1 | |
| LOW | tests/utils/test_formatter.py | 3 | |
| LOW | tests/utils/test_config.py | 7 | |
| LOW | tests/utils/test_m3u.py | 1 | |
| LOW | tests/utils/test_ffmpeg.py | 12 | |
| LOW | tests/utils/test_deno.py | 10 | |
| LOW | spotdl/__init__.py | 12 | |
| LOW | spotdl/__init__.py | 13 | |
| LOW | spotdl/__main__.py | 5 | |
| LOW | spotdl/web/utils.py | 7 | |
| LOW | spotdl/providers/lyrics/__init__.py | 5 | |
| LOW | spotdl/providers/lyrics/__init__.py | 6 | |
| LOW | spotdl/providers/lyrics/__init__.py | 7 | |
| LOW | spotdl/providers/lyrics/__init__.py | 8 | |
| LOW | spotdl/providers/lyrics/__init__.py | 9 | |
| LOW | spotdl/providers/audio/__init__.py | 5 | |
| LOW | spotdl/providers/audio/__init__.py | 6 | |
| LOW | spotdl/providers/audio/__init__.py | 6 | |
| LOW | spotdl/providers/audio/__init__.py | 6 | |
| LOW | spotdl/providers/audio/__init__.py | 6 | |
| LOW | spotdl/providers/audio/__init__.py | 12 | |
| LOW | spotdl/providers/audio/__init__.py | 13 | |
| LOW | spotdl/providers/audio/__init__.py | 14 | |
| LOW | spotdl/providers/audio/__init__.py | 15 | |
| LOW | spotdl/utils/logging.py | 9 | |
| LOW | spotdl/console/__init__.py | 5 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/conftest.py | 61 | except Exception: |
| LOW | spotdl/__init__.py | 142 | except Exception as exc: |
| LOW | spotdl/web/api.py | 203 | except Exception as exception: |
| LOW | spotdl/web/routes.py | 338 | except Exception as exception: |
| LOW | spotdl/providers/lyrics/base.py | 82 | except Exception as exc: |
| LOW | spotdl/providers/lyrics/base.py | 120 | except Exception as exc: |
| LOW | spotdl/providers/audio/bandcamp.py | 188 | except Exception as exc: |
| LOW | spotdl/providers/audio/sliderkz.py | 66 | except Exception as exc: |
| LOW | spotdl/providers/audio/base.py | 398 | except Exception as exception: |
| LOW | spotdl/providers/audio/piped.py | 203 | except Exception as exception: |
| LOW | spotdl/utils/metadata.py | 195 | except Exception as exc: |
| LOW | spotdl/utils/metadata.py | 296 | except Exception: |
| LOW | spotdl/utils/metadata.py | 609 | except Exception: |
| LOW | spotdl/utils/search.py | 113 | except Exception as exc: |
| LOW | spotdl/utils/lrc.py | 35 | except Exception: |
| LOW | spotdl/download/downloader.py | 468 | except Exception as e: |
| LOW | spotdl/download/downloader.py | 580 | except Exception as exc: |
| LOW | spotdl/download/downloader.py | 837 | except Exception as exception: |
| LOW | spotdl/console/save.py | 64 | except Exception as exception: |
| LOW | spotdl/console/save.py | 81 | except Exception as exception: |
| LOW | spotdl/console/entry_point.py | 164 | except Exception as exc: |
| LOW | spotdl/console/url.py | 51 | except Exception as exception: |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | spotdl/providers/audio/base.py | 154 | |
| LOW | spotdl/utils/metadata.py | 277 | |
| LOW | spotdl/utils/metadata.py | 384 | |
| LOW | spotdl/utils/ffmpeg.py | 251 | |
| LOW | spotdl/utils/m3u.py | 21 | |
| LOW | spotdl/utils/search.py | 119 | |
| LOW | spotdl/download/downloader.py | 98 | |
| LOW | spotdl/download/downloader.py | 425 | |
| LOW | spotdl/console/sync.py | 21 | |
| LOW | spotdl/console/meta.py | 22 | |
| LOW | spotdl/console/meta.py | 54 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_matching.py | 261 | ), |
| LOW | tests/types/test_song.py | 121 | # assert song.album_name == "Ropes" |
| LOW | tests/providers/lyrics/test_azlyrics.py | 1 | # import pytest |
| LOW | tests/providers/lyrics/test_musixmatch.py | 1 | # import pytest |
| LOW | spotdl/web/api.py | 41 | router = APIRouter() |
| LOW | spotdl/web/api.py | 61 | # if ( |
| LOW | spotdl/providers/lyrics/azlyrics.py | 161 | js_code = None |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | tests/types/test_song.py | 163 | "download_url": null, |