Listen — your one question is actually four hiding in a trench coat, and the Zotify every guide on Google tells you to install is fucking dead since August '25. Most guides haven’t noticed. Below are the boxes — paste-ready configs, the four working pipelines, the Apple Music backdoor that wants no subscription, the dragons and the exact fixes. Crack 'em open, take what you need.
🎯 The 4 pipelines — pick yours, paste, done
one decision, one tool, one config flag that decides if it works
| If you want… |
Use |
Quality · Catch |
Easy + offline, don’t care about source |
Googolplexed0/zotify |
OGG 320kbps from Spotify · BULK_WAIT_TIME=30 or it 429s you |
Zero install, paste a link |
@DeezLoad2Bot |
FLAC from Deezer’s catalog · bot vanishes monthly, follow @DEDSEClulz for the current handle |
True lossless FLAC/ALAC |
nathom/streamrip v2.2.0 |
24-bit FLAC from Deezer/Qobuz, ALAC from Apple · paid sub OR free with use_deezloader = true |
Apple Music ALAC, no Apple sub |
AppleMusicDecrypt + wm.wol.moe wrapper |
Up to 24/192 true lossless · wrapper down? flip to wm1.wol.moe |
Free streamrip trick most people miss. Set use_deezloader = true in ~/.config/streamrip/config.toml → free 320kbps Deezer MP3, no ARL token rabbit hole. Sidesteps the whole “where do I get an ARL” supply chain.
🔥 The dead-repo trap — Zotify is a corpse, use this fork or waste a Saturday
15-second read · the August 2025 login change + the one-line install that actually works
The canonical zotify-dev/zotify fell over in August 2025 when Spotify rewrote the login flow. Original = dead. Fork = alive. The fork:
pip install git+https://github.com/Googolplexed0/zotify.git
That’s it. v0.9.0, actively patched, current rate-limit fight is being fought live in issue #135.
Login note — use your email, not username. Spotify killed terminal-only login in the August 2025 change. The fork handles the browser handshake automatically; just click the link it prints.
Any guide saying pip install zotify without specifying the fork is reading from 2024. Close the tab.
🪤 The 4 dragons + paste-ready fixes
every error you’ll see → one-line fix · click when something breaks
These aren’t failures. They’re the path. Each one has a fix shorter than a tweet.
Error rate limit exceeded 429 (Zotify) → Spotify pushing back. Paste in config:
BULK_WAIT_TIME = 30
DOWNLOAD_RATE_LIMITER = 1
Maintainer’s own recommendation — README troubleshooting.
Error invalid_client OAuth fail (streamrip + Tidal) → Tidal broke their OAuth Oct 2025. Switch to Deezer side, or wait — nathom patches inside a week or two.
Error decryption error (AppleMusicDecrypt) → the v2 README literally says “this problem usually disappears after a few days.” Flip to alternate wrapper:
[instance]
url = "wm1.wol.moe"
secure = true
Wrong recording grabbed (got the live version instead of studio) → ~3% of cross-service ISRC matches slip, usually remasters that legitimately got new ISRCs. Run beets after — its manual-match prompt fixes these one click each.
🧪 My setup — burner account, exact config, the one time it bit me
60-second read · paste my config, skip the trial-and-error
Running Googolplexed0/zotify on a burner Spotify account. The config (~/.config/zotify/config.json highlights):
{
"BULK_WAIT_TIME": 30,
"DOWNLOAD_RATE_LIMITER": 1,
"DOWNLOAD_FORMAT": "ogg",
"DOWNLOAD_QUALITY": "VERY_HIGH",
"OUTPUT": "{album_artist}/{album} ({year})/{track_number:02} - {artist} - {title}.{ext}"
}
50-song playlist clears in ~20 minutes. No rate-limit drama. The output template plays nicely with beets if you bolt it on later (see
).
From the trenches — I copied credentials.json to a second machine once without deleting the old one. Spotify saw two clients on one session and froze the login for two hours. Fix:
rm ~/.local/share/zotify/credentials.json
Then log in again with your email (not username — August 2025 change).
🔧 The library layer — the part you said you wanted but didn't know to name
downloader picks bytes · this layer turns them into a library that survives three years
You said in the OP: “preserve playlist info” + “avoid losing track of songs I’ve saved.” That’s not a downloader job. Different layer entirely.
The stack:
-
beets — the heavy hitter. Runs after your downloader. Pulls metadata from MusicBrainz, embeds cover art, normalizes filenames, dedups.
pip install beets
beet config -e # opens the YAML
Enable the Spotify plugin → stores spotify_album_id + ISRC permanently. Your library remembers which Spotify playlist a track came from, forever.
-
MusicBrainz Picard — GUI if YAML scares you. Drag folder → Lookup → tagged.
-
Lidarr — Sonarr but for music. Track an artist, Lidarr grabs new releases on release day.
-
Wicklowwolf’s Docker stack — production setup. Glues Lidarr + LidaTube + Lidify + Syncify (the last one auto-syncs Spotify playlists via yt-dlp on a schedule). One docker compose up and the whole thing runs.
Any pipeline from chapter
+ beets = the reliable local music setup you described in the OP.
🧨 Deeper underground — Apple ALAC free, PlayPlay post-DMCA, Spotube alive
click only if you want to see the mechanism behind the curtain
Apple Music ALAC without paying Apple a cent. AppleMusicDecrypt v2 supports public decryption-wrapper instances. Paste in config.toml:
[instance]
url = "wm.wol.moe"
secure = true
Wrapper does the DRM-decryption on someone else’s server (40 MB/s per instance). True lossless 16/44.1 → 24/192. Backup instance: wm1.wol.moe. Biggest “wait what” finding in this entire topic.
Spotify Lossless cannot be downloaded by any third-party tool, period. Spotify launched Lossless for Premium Sept 10, 2025 — but Spotify Connect (the protocol librespot speaks) doesn’t deliver FLAC. The librespot maintainer has scaffolded FLAC support in code; Spotify just won’t serve it. Anyone claiming “Spotify Lossless download” is selling air unless they’re running PlayPlay decryption against a paid Premium account.
Spotify’s audio DRM isn’t Widevine — it’s called PlayPlay. Widevine is for video podcasts only. PlayPlay = the lock on audio. cycyrild got DMCA’d in April 2025 for shipping a PlayPlay bypass — same dev reframed the work as a research project. The code lives at cycyrild/spotify-dl-cli (runner) + cycyrild/another-unplayplay (key generator). Not for beginners, but the mechanism is on full display.
Spotube isn’t dead either. Spotify cease-and-desisted Spotube in early 2025; project pivoted to a plugin architecture. Install Spotube v5.1.1 → add spotube-plugin-spotify separately → Spotify integration restored. Most “Spotube is dead” reviews from mid-2025 missed the pivot.
📋 Your 7 concerns mapped — so you know I read every word
proof of listening · 7 things asked, 7 places they get handled
| You wrote |
Lives in |
| Maintained, not abandoned |
The dead-repo trap + every pipeline link verified May 2026 |
| Won’t smuggle malware |
All four pipelines = open-source GitHub, code is readable |
| Audio quality |
Pipeline 1 → 320kbps · Pipelines 3-4 → true lossless |
| Metadata handling |
Downloader = tags · beets = library (different layer, see ) |
| Playlist info preserved |
beets stores spotify_album_id + ISRC forever |
| Big playlists |
All tools handle hundreds — set rate-limiter (see ) |
| Beginner-friendly |
Pipeline 1 (one binary) or Pipeline 2 (Telegram, zero install) |
⚡ One-liner cheat sheet — every command in one place, pin this
the whole post in 12 commands · paste, run, done
Install the alive Zotify fork:
pip install git+https://github.com/Googolplexed0/zotify.git
Install streamrip (any quality, any service):
pip install streamrip
rip config -o # opens config.toml — set use_deezloader=true for free 320k
Install AppleMusicDecrypt + use the free wrapper:
git clone https://github.com/WorldObservationLog/AppleMusicDecrypt.git
cd AppleMusicDecrypt && bash ./tools/install-deps.sh && poetry install
cp config.example.toml config.toml
# In config.toml set: url = "wm.wol.moe", secure = true
poetry run python main.py
Install beets + Spotify plugin (the library layer):
pip install beets
beet config -e # add 'spotify' to plugins list
beet import ~/Music
Telegram path (zero install): drop a Spotify link to @DeezLoad2Bot. Done.
streamrip free 320kbps Deezer (no ARL): in ~/.config/streamrip/config.toml → [deezer] use_deezloader = true.
Reset Zotify login if Spotify freezes it:
rm ~/.local/share/zotify/credentials.json
The simple-pimple: original Zotify = dust. The fork is the loot. Apple Music ALAC = free via wm.wol.moe. Library = beets, always beets. Most guides will still send you to the corpse next week — you’ll know better. Three configs, twenty minutes, real music library. Now go raid.