Skip to content
Stensel8Public
forked from nathom/streamrip

About

A fast, all-in-one scriptable music downloader for Qobuz, Deezer, Tidal, and SoundCloud.

Topics

Resources

Stars

10 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

streamrip logo

CI Latest release Python 3.14 | 3.15 Code style: ruff

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.

downloading an album

  • 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 repair retries what failed
  • Interactive search on every source

Installation

Latest release (recommended)

Latest release

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.ps1

With 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 .

dev branch (unstable, active development)

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.ps1
pip 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.

Logging in

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:

    1. 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.
    2. 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.
    3. By hand: copy user.id and user_auth_token from 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 = false in [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 arl cookie of a logged-in web session, so it offers a choice of how to get it:

    1. An isolated browser window, the same one Qobuz uses (see above). You log in there yourself; streamrip keeps only the arl cookie once you're in, and never sees your password.
    2. By hand: copy the arl cookie from your browser's DevTools (how to find it).

    The quality follows your subscription.

  • SoundCloud needs nothing.

Usage

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, explained

By 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.

streamrip interactive search

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.

Contributing

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.

Acknowledgements

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.

Disclaimer

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.

About

A fast, all-in-one scriptable music downloader for Qobuz, Deezer, Tidal, and SoundCloud.

Topics

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages