Highlights
- Downloads are faster and smoother. The download pipeline and FFmpeg conversion now use native asyncio for non-blocking I/O, and the progress bar reports more accurate stages (searching, getting metadata, downloading, converting).
- Several providers are working again:
- Piped: now searches via a working API instance and downloads through
yt-dlp. - AZLyrics: no longer blocked by a redirect loop.
- Bandcamp: no longer crashes on malformed API responses.
- SoundCloud: fixed a bug where result durations were compared in milliseconds, causing poor matches.
- Piped: now searches via a working API instance and downloads through
- Web UI fixes: the web player should work again, including when launched from the prebuilt executables.
- Docker image changes:
- The base image moved from
python:3.13-alpinetopython:3.14-slim-bookworm, and Deno is now pre-installed in the image, so JavaScript-runtime-dependent downloads work out of the box.
- The base image moved from
- For those using spotDL as a library: the downloader is now async-first.
Downloader.search_and_downloadwill raise an error if called from a running event loop —await Downloader.async_search_and_downloadinstead.
Caution
The executables attached to this release crash on startup with AudioProviderError: Deprecated Feature: Support for Python version 3.10 has been deprecated.
Use v4.5.2 instead, which fixes this.
This also affects pip installs of 4.5.1 running on Python 3.10 — upgrade with pip install -U spotdl, or use Python 3.11+.
The executable downloads have been removed from this release.
What's Changed
- Fix Docker Build by @TzurSoffer in #2677
- Bump idna from 3.14 to 3.15 by @dependabot[bot] in #2685
- Improved progress bar by @bolshoytoster in #2700
- Fix SoundCloud result duration reported in milliseconds by @Silverarmor in #2740
- Fix Web Player (Fix found by DavidNery) by @TzurSoffer in #2679
- Fix AZLyrics redirect-loop block and surface lyrics provider errors in debug logs by @bolshoytoster in #2697
- Bump soupsieve from 2.8.3 to 2.8.4 by @dependabot[bot] in #2731
- Fix slugify function None and empty string handling by @bob-jones-cs in #2708
- Populate artists in SoundCloud from author, fall back to author in artist match if no artists by @bob-jones-cs in #2707
- Refactor FFmpeg subprocess and Downloader to use native asyncio for non-blocking I/O by @oericdacosta in #2722
- Fix operator precedence bug in convert() stream-copy condition by @Silverarmor in #2743
- Bump python-multipart from 0.0.28 to 0.0.31 by @dependabot[bot] in #2717
- Bump pymdown-extensions from 10.21.2 to 10.21.3 by @dependabot[bot] in #2684
- Bump urllib3 from 2.6.3 to 2.7.0 by @dependabot[bot] in #2674
- Fix Bandcamp and Piped provider failures by @renbkna in #2724
- Fix KeyError: 'videoDetails' when downloading from YouTube Music links by @Silverarmor in #2744
- Upgrade spotapi to 1.2.8, drop tls_client bundling from build script by @Silverarmor in #2747
- Release v4.5.1 by @Silverarmor in #2745
New Contributors
- @bob-jones-cs made their first contribution in #2708
- @renbkna made their first contribution in #2724
Full Changelog: v4.5.0...v4.5.1