Skip to main content

Download your Spotify library to tagged, organized MP3s

Project description

🎵 cassettify

Download your Spotify library to tagged MP3s — organized, art-embedded, and ready to play anywhere.

Cassettify connects to your Spotify account and gives you an interactive terminal UI to browse your playlists, liked songs, saved albums, and followed artists, pick exactly what you want, and download it via YouTube Music (using spotdl). Downloads run in the background with an animated cassette-tape progress screen while you keep browsing.

Songs land as:

<output>/<Artist>/<Album>/<track-number> - <title>.mp3

with full ID3 tags and embedded album art.


Install

pip install cassettify

Or via Homebrew:

brew tap bsolidgold/cassettify
brew install cassettify

Quick start

cassettify

On first launch, a setup wizard connects your Spotify account (see First run below), then drops you into the library browser.


Command-line options

cassettify                           # interactive library browser
cassettify "Dark Side of the Moon"   # download a specific playlist by name, skip the browser
cassettify --all                     # queue every playlist
cassettify --output ~/Music/Downloads     # use this output folder for this run only
cassettify --set-output ~/Music/Downloads # permanently change the output folder (offers to move your library)
cassettify --setup                   # re-run the setup wizard (re-auth, change folder, move library)
cassettify --cookies auto            # grab YouTube cookies from your browser (see Rate limits)
cassettify --cookies chrome          # ...or from a specific browser
Option Description
[playlist] Name of a playlist to download directly, skipping the browser
--all, -a Queue every one of your playlists
--output, -o PATH Override the output directory for this run
--set-output PATH Change the saved output directory, with an option to move your existing library
--setup Re-run the setup wizard
--cookies [browser] Extract YouTube cookies from a browser (auto to auto-detect) and exit

Browsing & selecting music

Launching cassettify with no arguments opens the library browser. The top level has four categories:

  • ♥ Liked Songs — your saved tracks
  • ◈ Playlists — your Spotify playlists
  • ▣ Saved Albums — albums you've saved
  • ♪ Followed Artists — artists you follow → their albums

Drill into any playlist, album, or artist to pick individual songs, or select a whole source at once. Your selections are preserved as you navigate in and out — pick a few songs from one playlist, back out, grab an album, and they all stay selected.

Keyboard controls

In a list (categories / playlists / albums / artists):

Key Action
/ Move the cursor
Enter Drill in (browse the tracks / albums inside)
Space Select the entire source (all its tracks)
/ Search the list (Esc closes search)
D Start/open downloads for everything you've selected
Esc Go back a level (quits from the top level)

When picking individual tracks:

Key Action
Space Toggle the highlighted track
A Select all
N Select none
D Download everything selected
Esc Save your picks and go back

Downloading in the background

Press D anytime to start downloading what you've selected. The cassette screen shows the current track, an animated spinning reel, a live status (searching → downloading → tagging) with an elapsed timer, the remaining queue, and what's finished.

Downloads keep running in the background:

  • Esc on the cassette screen returns you to the library — downloads keep going. A status line at the top shows progress while you browse.
  • D again reopens the cassette and adds any newly-selected songs to the running queue.
  • Songs already downloaded (or queued, or selected from two places) are never downloaded twice.
  • Q quits.

Tracks already on disk are skipped on future runs, so re-running is always safe.


First run

The setup wizard walks you through connecting a free Spotify app:

  1. Go to developer.spotify.com/dashboard and log in
  2. Click Create app
  3. Set the Redirect URI to exactly:
    https://127.0.0.1:8888/callback
    
  4. Copy your Client ID and Client Secret and paste them into the wizard
  5. Choose where to save your music

When you authorize, your browser opens to Spotify and a local HTTPS server catches the response automatically (you'll see a one-time self-signed-certificate warning — click Advanced → Proceed). No copy-pasting URLs.

Credentials are saved to ~/.cassettify/config.json with owner-only permissions. You won't need to set up again.


Changing where music is saved

Two ways:

cassettify --set-output ~/Music/Downloads

This updates the saved default and, if your old folder has music, asks whether to move it. Or re-run cassettify --setup — the folder step pre-fills your current location and offers a "Move my existing tracks" checkbox.

Moving preserves the Artist/Album/Track structure and never overwrites — anything already present at the destination is left untouched.


Rate limits & cookies

YouTube may rate-limit you after downloading a lot of tracks quickly ("you might be blocked…"). The fix is to download using your logged-in browser session:

cassettify --cookies auto      # auto-detect your browser
cassettify --cookies chrome    # or name it: chrome / safari / firefox / edge / brave / ...

Cassettify also tries this automatically on first run. Cookies are read straight from your browser (no manual export) and saved to ~/.cassettify/cookies.txt, which every download then uses.

  • Chrome on macOS prompts for Keychain access the first time — click Always Allow.
  • Safari needs your terminal to have Full Disk Access (System Settings → Privacy & Security).

If a block is already in effect, adding cookies (or simply waiting ~30–60 min) clears it.


Files & state

Path What it holds
~/.cassettify/config.json Spotify credentials + saved output folder (owner-only)
~/.cassettify/cache.json IDs of already-downloaded tracks (so they're skipped)
~/.cassettify/cookies.txt YouTube cookies used for downloads
~/.cassettify/failed.log Tracks that couldn't be matched or downloaded
~/.cassettify/.spotify_cache Cached Spotify OAuth token

Requirements


Notes

Audio is sourced from YouTube Music via spotdl. Cassettify is intended for personal archival use only — please respect the terms of service of the platforms involved.


License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cassettify-0.2.0.tar.gz (32.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cassettify-0.2.0-py3-none-any.whl (24.5 kB view details)

Uploaded Python 3

File details

Details for the file cassettify-0.2.0.tar.gz.

File metadata

  • Download URL: cassettify-0.2.0.tar.gz
  • Upload date:
  • Size: 32.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for cassettify-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ccd99691f31a84a3159265cf7398800993de7322bee0adbde9444292b79dadfd
MD5 a94c23626da0b152e550fc19c9d0f546
BLAKE2b-256 a9a853f02015f0b41f97444aaab71fda2669ed02f034991aca181fa0d0f71be9

See more details on using hashes here.

File details

Details for the file cassettify-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: cassettify-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 24.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for cassettify-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e0aacc396f0d8cd219a1c93b749f4b8ce5c35f5d814d651f12ab415d762829f1
MD5 f1dda86e787e387bd4b6bfa1b90c9555
BLAKE2b-256 4859d76b0435b522df3e3393c225006d94917d391a87321be3f28b56e8c6a5e7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page