OpenDeezer

module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 27, 2026 License: AGPL-3.0

README

OpenDeezer

An open source reimplementation of Deezer. Log in once (the GUIs sign you in through an embedded Deezer web view — no ARL hunting), then browse your liked songs, playlists, charts, artists and search, and stream — each track is streamed, Blowfish stripe-decrypted, decoded and played locally, in memory (MP3, or FLAC on HiFi). Your ARL never leaves your machine except in the requests it makes to Deezer.

One Go engine does the whole streaming path (login, decrypt, decode, playback); six native front-ends sit on top of it. By Cycl0o0.

Clients

Client Stack Builds
Terminal (TUI) Go · Bubble Tea linux · macOS · windows (amd64/arm64)
macOS SwiftUI · Liquid Glass (macOS 26) universal (Apple Silicon + Intel) gui/macos
Linux (unified) auto-picks GTK4 or Qt6 by desktop x86_64 · aarch64 gui/linux
GNOME GTK4 · libadwaita x86_64 · aarch64 gui/gnome
KDE Qt6 Widgets · Breeze x86_64 · aarch64 gui/kde
Windows WinUI 3 · C++/WinRT · Fluent x64 gui/windows

The unified Linux client is one opendeezer command that auto-selects the native toolkit for your desktop (Qt/Breeze on KDE-family, GTK4/libadwaita elsewhere) — LibreOffice-style. The standalone gui/gnome / gui/kde binaries are also available if you prefer one toolkit.

Prebuilt binaries for everything are on the Releases page.

Features

Browse & discover

  • Liked songs, your playlists, and full search — tracks, artists, albums, playlists.
  • Charts — global top tracks, albums, artists and playlists.
  • Artist pages — top tracks, discography and related artists.
  • Synced lyrics — karaoke-style, line-by-line; plain-text fallback.
  • Deezer Flow — your personalized, endless track stream.
  • Podcasts — search shows, browse episodes, play.

Library editing

  • Like / unlike tracks; add to playlist; create / rename / delete playlists.

Playback

  • Quality tiers — Normal (MP3 128), High (MP3 320), HiFi (FLAC lossless); HiFi auto-falls-back to MP3 when your account or the track isn't entitled.
  • Gapless transitions, crossfade, ReplayGain loudness normalization.
  • Output-device selection (powered by the malgo/miniaudio backend).
  • Shuffle, repeat (off/all/one), seek, volume; resume the last track on launch.
  • Shows the actual output format that's playing (e.g. "FLAC · lossless").
  • OS media controls + now-playing — MPRIS on Linux (GNOME/KDE/TUI media keys
    • overlays), Now Playing + media keys on macOS, SMTC on Windows.

Accounts & UX

  • One-click login — sign in via the embedded Deezer web view; the ARL is captured automatically (manual ARL entry still available).
  • Shows your account tier after login; a clear "ARL expired" re-login prompt.
  • Background playback / close-to-tray in the GUIs.
  • Album art (truecolor half-blocks in the TUI; native everywhere else).
  • TUI extras: queue view, lyrics, help screen, themes, vim keys, resume.
  • Settings persisted to ~/.config/opendeezer/; ARL stays local.

Install

Download a binary from Releases.

GUIs — just launch and click Log in with Deezer: an embedded web view opens the Deezer login, and once you're in, your session (ARL) is captured automatically and saved locally for next time. No manual token needed.

Terminal (TUI) — build it and provide your ARL:

make build          # -> ./opendeezer   (or: go build -o opendeezer ./cmd/opendeezer)
./opendeezer -save-arl <your-arl>   # writes ~/.config/opendeezer/arl.txt (0600)
./opendeezer

Or pass it inline: DEEZER_ARL=<your-arl> ./opendeezer. For the GUIs, see each gui/<platform>/README.md for build steps. A Homebrew formula is in packaging/homebrew/.

Your ARL is the arl cookie from an authenticated deezer.com browser session (the GUI web-login grabs it for you). Treat it like a password — it grants access to your account.

Requirements

  • A Deezer Premium account (HiFi tier for FLAC).
  • Building from source: Go 1.25+, a C compiler, and a working audio device. The audio backend is malgo (miniaudio), so cgo is required on every platform (Linux/macOS/Windows).
  • Linux: ALSA dev headers (libasound2-dev); plus the toolkit dev packages for the GUIs — GTK4/libadwaita/json-glib and libwebkitgtk-6.0-dev (GNOME web-login), and/or Qt6 and qt6-webengine-dev (KDE web-login).
  • macOS GUI: macOS 26 (Tahoe) + Xcode 26 for the Liquid Glass APIs (the login web view uses the system WebKit framework — no extra dependency).
  • Windows GUI: Windows 10 1809+/11, Visual Studio 2022 + Windows App SDK, MinGW-w64 (Go cgo builds the engine DLL), and the Edge WebView2 runtime (preinstalled on Windows 11) for the login web view.
  • TUI album art needs a 256-color or truecolor terminal.

TUI controls

Key Action Key Action
↑/↓ or j/k move z toggle shuffle
g / G top / bottom r cycle repeat (off→all→one)
enter open / play +/- volume
esc / ⌫ back ←/→ seek ±10s
space play / pause h quality (Normal→High→HiFi)
n / p next / prev R toggle ReplayGain
f like current track x cycle crossfade
/ search ctrl+g toggle gapless
l lyrics (synced) d output device
u queue view c now-playing + art
s stop t cycle theme
? help i about · q quit

Home screen entries: Liked Songs · My Playlists · ⚡ Flow · 📈 Charts · 🎙 Podcasts · 🔍 Search (and ▶ Resume when a saved position exists).

How it works

ARL ─login (gw-light)→ browse (gw + public REST): search, charts, artists,
                       lyrics, Flow, podcasts, library writes
                     → resolve track → encrypted CDN URL (MP3 128/320 or FLAC)
                     → streaming download → Blowfish BF_CBC_STRIPE decrypt
                       (plain stream for podcast episodes)
                     → MP3 (go-mp3) / FLAC (mewkiz) decode → PCM ring
                     → malgo (miniaudio) output device → speakers
  • internal/deezer — login, browse (search/charts/artists/lyrics/Flow/podcasts), library writes, track→URL resolve, the stripe decryptor.
  • internal/audio — malgo backend: streaming buffer → decode → PCM ring with seek, ReplayGain, gapless, crossfade and output-device selection.
  • internal/queue — the shared playback queue (shuffle/repeat/history).
  • internal/mpris — Linux MPRIS media controls.
  • internal/log — leveled file logging ($OPENDEEZER_LOG).
  • internal/ui — the Bubble Tea TUI.
  • corelib — the engine exposed as a C ABI (-buildmode=c-archive for macOS/Linux, -buildmode=c-shared DLL for Windows) so the native GUIs link it.

Build from source

Clone the repo, then build whichever client you want — they all build the same Go engine (corelib) underneath. Each build.sh / build.ps1 compiles the engine first, then the native app.

Terminal (any OS) — Go 1.25+ and a C compiler (the malgo audio backend needs cgo on every platform; Linux also needs libasound2-dev, Windows needs MinGW-w64):

CGO_ENABLED=1 go build -o opendeezer ./cmd/opendeezer      # or: make build

macOS app — macOS 26 (Tahoe) + Xcode 26, Go:

cd gui/macos && make app        # -> OpenDeezer.app (universal: Apple Silicon + Intel)

Linux — unified (auto-picks GTK/Qt) — libgtk-4-dev libadwaita-1-dev libjson-glib-dev libwebkitgtk-6.0-dev libsoup-3.0-dev qt6-base-dev qt6-webengine-dev libasound2-dev meson ninja-build cmake + gcc, Go:

cd gui/linux && ./build.sh && ./dist/opendeezer

Linux — single toolkit:

cd gui/gnome && ./build.sh && ./opendeezer-gnome     # GTK4 / libadwaita
cd gui/kde   && ./build.sh && ./opendeezer-kde       # Qt6 / Breeze

Windows app — Windows 10/11, Visual Studio 2022 + Windows App SDK, MinGW-w64 (Go cgo), Go:

cd gui\windows; .\build.ps1     # -> bin\x64\Release\OpenDeezer.exe

FAQ

How do I log in? In the GUIs, click Log in with Deezer — an embedded web view opens the real Deezer login, and once you sign in, OpenDeezer reads the arl session cookie automatically and saves it locally. Manual ARL entry is still there as a fallback. The TUI uses DEEZER_ARL / opendeezer -save-arl <arl>.

Does it have Flow / podcasts / charts / lyrics? Yes — Deezer Flow (personalized stream), podcast search + episode playback, global charts, artist pages, and synced lyrics are all built in.

Can I edit my library? Yes — like/unlike tracks, add tracks to playlists, and create/rename/delete playlists.

Can I choose the output device or use gapless/crossfade? Yes. The audio engine (malgo/miniaudio) supports output-device selection, gapless transitions, crossfade and ReplayGain — all in settings (or TUI keys d / ctrl+g / x / R).

What's an ARL? Your Deezer session token — the arl cookie from a logged-in deezer.com browser session. It authenticates you the same way the official app does. Treat it like a password; it only ever lives on your own machine.

Why does it need my Deezer login (ARL) instead of an API key? Deezer's public API doesn't allow full-track streaming. The only way to play your music is the same authenticated path the official client uses, which needs your session (the ARL).

Why Deezer Premium only? Streaming full, high-quality tracks (and FLAC) is a Premium entitlement. A free account can't stream full tracks the way OpenDeezer plays them. OpenDeezer only plays content your own account is already entitled to.

Why can't I download / save tracks? OpenDeezer is a player, not a ripper. It decrypts and decodes each track in memory to play it — it never writes tracks to disk. Saving decrypted files would be piracy; that's deliberately not what this does. Stream your own entitled music, like the official app.

Does my ARL get uploaded anywhere? No. Login, decrypt and decode all run on your machine; the only requests that leave are to Deezer itself. The in-browser config generator never uploads your token either.

Is this legal? Will my account get banned? Grey zone. It reaches Deezer the unofficial way and decrypts your own entitled content locally, which almost certainly breaks Deezer's terms for third-party apps. Personal/educational use, your own Premium account, your own risk. Not affiliated with Deezer.

Does it support HiFi / FLAC? Yes — if your account is HiFi-entitled. Pick HiFi in settings (or press h in the TUI); it streams lossless FLAC and falls back to MP3 when a track or account isn't entitled.

Why not just use the official app? Mostly because it's a reverse-engineering project and a learning exercise. You also get lightweight, local-first native clients (including a terminal one), no telemetry, on platforms the official app may not serve.

Is it open source? Yes, AGPL-3.0. Read it, build it, audit exactly what it does.

The fine print

Personal/educational use, your own Premium account, your own risk. It reaches Deezer the unofficial way and decrypts your own entitled content locally, which almost certainly breaks Deezer's terms for third-party apps. Not affiliated with Deezer. AGPL-3.0.

Directories

Path Synopsis
cmd
opendeezer command
Command opendeezer is a terminal Deezer client: log in with your ARL, browse liked songs / playlists / search, and stream — decrypt + decode + play all locally.
Command opendeezer is a terminal Deezer client: log in with your ARL, browse liked songs / playlists / search, and stream — decrypt + decode + play all locally.
Command deezercore exposes the OpenDeezer engine (login, browse, decrypt + decode + playback) as a C-callable library so native GUIs (SwiftUI on macOS, GTK/libadwaita on GNOME, Qt on KDE) can drive it in-process.
Command deezercore exposes the OpenDeezer engine (login, browse, decrypt + decode + playback) as a C-callable library so native GUIs (SwiftUI on macOS, GTK/libadwaita on GNOME, Qt on KDE) can drive it in-process.
internal
audio
Package audio is the malgo (miniaudio) playback engine: it streams, decrypts and decodes Deezer audio (MP3 + FLAC) into a PCM ring that a single output device drains.
Package audio is the malgo (miniaudio) playback engine: it streams, decrypts and decodes Deezer audio (MP3 + FLAC) into a PCM ring that a single output device drains.
deezer
Package deezer is a Deezer client: ARL login, gw-light + public REST browse, and track -> CDN-url resolution.
Package deezer is a Deezer client: ARL login, gw-light + public REST browse, and track -> CDN-url resolution.
log
Package log is a tiny leveled logger for OpenDeezer.
Package log is a tiny leveled logger for OpenDeezer.
mpris
Package mpris exposes the player over the MPRIS D-Bus interface so Linux desktops (GNOME/KDE media overlays, media keys) show and control playback.
Package mpris exposes the player over the MPRIS D-Bus interface so Linux desktops (GNOME/KDE media overlays, media keys) show and control playback.
queue
Package queue is the playback queue model shared by the TUI and the C API (via corelib), so shuffle/repeat/prev-history behaviour is defined once instead of being re-implemented per frontend.
Package queue is the playback queue model shared by the TUI and the C API (via corelib), so shuffle/repeat/prev-history behaviour is defined once instead of being re-implemented per frontend.
ui
Package ui is the Bubble Tea TUI for OpenDeezer: a menu/list browser with an always-visible now-playing footer.
Package ui is the Bubble Tea TUI for OpenDeezer: a menu/list browser with an always-visible now-playing footer.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL