A fast, all-in-one scriptable music downloader for Qobuz, Deezer, Tidal, and SoundCloud.
Note
A fork of nathom/streamrip that works again: Python 3.14 and 3.15, with most open upstream issues and pull requests worked through (see CHANGELOG.md). Streaming services change their APIs without notice, so it needs upkeep: it works now, with no promise that it stays maintained.
- Tracks, albums, playlists, discographies and labels; queue several in one go
- Spotify and Apple Music playlists through last.fm
- Tagged, with cover art, and converted to FLAC, ALAC, AIFF, MP3, AAC, OGG or Opus if you like
- Remembers what it downloaded;
streamrip repairretries what failed - Interactive search on every source
Open the latest release
and download Source code (zip). Do not download the .tar.gz package from
Assets; it does not include the installer scripts. Extract the source archive,
open its directory, and run the local installer. It fetches Python 3.14 with
uv if needed and installs streamrip into a .venv
next to the installer.
./install.sh.\install.ps1With Python 3.14 already there, install it into a venv of your own, or with pipx or uv:
python3 -m venv .venv && source .venv/bin/activate # fish: activate.fish
pip install .
pipx install .
uv tool install .Download and extract the dev branch,
then open the extracted directory and run the local installer. This is
unstable and may be broken between commits.
./install.sh.\install.ps1pip install .streamrip needs ffmpeg (Tidal hi-res,
SoundCloud, conversion) and checks for it before logging in to anything:
apt install ffmpeg, brew install ffmpeg or winget install ffmpeg, or the
bundled one with pip install imageio-ffmpeg in streamrip's environment
(pipx inject streamrip imageio-ffmpeg for pipx).
Important
pip install streamrip, the AUR package and brew install streamrip install
upstream streamrip, whose last release doesn't install on Python 3.14.
streamrip asks for what it needs the first time you use a source, and saves it in the config. A login that stops working is asked for again.
-
Qobuz needs a subscription, or downloads the albums you bought. Qobuz's web login has no device-code flow to poll (unlike Tidal's), but it does save a working login token for itself the moment you're logged in, so streamrip offers a choice of how to grab that:
- An isolated browser window that logs in and captures the token with no further input from you. Drives a Chrome-family browser already on your machine (Chrome, Edge, Brave, Chromium, ...) in a throwaway profile — no existing session to work around, nothing downloaded. If none is found (Firefox/LibreWolf-only setups), it asks before downloading Playwright's own small browser instead.
- Your own browser, open to the login page.
Log in first, then paste the short script streamrip prints into the
console (F12) — Qobuz reloads the page on login, which would stop the
script if pasted beforehand. It reads the token Qobuz's own web player
already saves for itself in
localStorage. Nothing is downloaded or driven; a few lines of JavaScript run in the browser you already have open. - By hand: copy
user.idanduser_auth_tokenfrom DevTools → Network yourself.
Options 1 and 2 fall back to manual entry if nothing arrives within a few minutes. Credentials are saved for later use either way.
-
Tidal needs a subscription. streamrip shows a link to log in with on any device, twice: Tidal serves hi-res (up to 24-bit, 192 kHz) and CD quality through two separate logins. Each track is asked for in hi-res first and falls back to 16-bit FLAC when Tidal has no hi-res master.
hires_client = falsein[tidal]skips the hi-res login and gets 16-bit FLAC only. -
Deezer has no sign-in for outside apps, and its email and password login is behind a captcha. What streamrip logs in with is the
arlcookie of a logged-in web session, so it offers a choice of how to get it:- An isolated browser window, the same one Qobuz uses (see above). You
log in there yourself; streamrip keeps only the
arlcookie once you're in, and never sees your password. - By hand: copy the
arlcookie from your browser's DevTools (how to find it).
The quality follows your subscription.
- An isolated browser window, the same one Qobuz uses (see above). You
log in there yourself; streamrip keeps only the
-
SoundCloud needs nothing.
streamrip url https://www.qobuz.com/us-en/album/rumours-fleetwood-mac/0603497941032 # one or more URLs
streamrip file urls.txt # the URLs in a file
streamrip --codec mp3 url https://tidal.com/browse/album/147569387
streamrip --quality 3 url https://tidal.com/browse/album/147569387
streamrip search tidal album 'fleetwood mac rumours' # pick from the results
streamrip lastfm https://www.last.fm/user/nathan3895/playlists/12126195
streamrip repair # retry what failed
streamrip config open # every option, explainedBy default streamrip asks every source for its highest quality and steps down,
one level at a time, when a track doesn't have it. --quality is the highest
quality to download (SoundCloud has one per track):
| Quality | Audio | Sources |
|---|---|---|
| 0 | 128 kbps MP3 or AAC | Deezer, Tidal |
| 1 | 320 kbps MP3 or AAC | Deezer, Tidal, Qobuz |
| 2 | 16 bit, 44.1 kHz (CD) | Deezer, Tidal, Qobuz |
| 3 | 24 bit, ≤ 96 kHz | Tidal, Qobuz |
| 4 | 24 bit, ≤ 192 kHz | Qobuz |
Every command has a --help.
Search shows each result's cover next to its details. Terminals with SIXEL or Kitty graphics support (Konsole, foot and Windows Terminal, for example) show it as an image; the others fall back to colored blocks, which are less sharp.
Report problems in the issue tracker,
with the Bug Report or Feature Request template. For code, poetry install --all-extras
sets things up; poetry run pytest and poetry run ruff check . && poetry run ruff format .
should pass before you open a pull request to dev. A few tests drive a real
Chrome-family browser (Chrome, Edge, Chromium, Brave...); they are skipped when
there is none, and CI fails if its runner has none. pytest -m "not real_browser"
leaves them out.
streamrip was written by nathom (consider sponsoring nathom); this fork builds on everyone who sent fixes upstream, credited in CHANGELOG.md. Thanks to Vitiko98, Sorrow446 and DashLt for their contributions. streamrip was inspired by rip, qobuz-dl, Qo-DL Reborn, Tidal-Media-Downloader and scdl.
I will not be responsible for how you use streamrip. By using streamrip, you agree to the terms and conditions of the Qobuz, Tidal, and Deezer APIs.

