No description
  • Rust 99.2%
  • Shell 0.4%
  • Python 0.2%
  • Makefile 0.2%
Find a file
2026-10-12 14:29:28 -04:00
.agents Restore the style-review agent to opencode's default agent directory 2026-10-04 11:33:17 -04:00
.opencode/agent Restore the style-review agent to opencode's default agent directory 2026-10-04 11:33:17 -04:00
.woodpecker Split the daemon client out of deezer-client into deezerd-client 2026-10-05 09:38:19 -04:00
crates tui: scope filters to the list they were typed on — Browser.filter_stack mirrors the details drill stack (push on drill, pop-restore on back-out, remove-on-failed-fetch via remove_detail), drilling in and tab changes and replace-plays drop the active filter, and the parent's filter returns on pop until cleared with an Esc on that level 2026-10-12 14:29:28 -04:00
packaging fix: logs 2026-10-09 07:41:46 -04:00
scripts diag-checkpoint: per-sample %CPU columns and a 5s default interval 2026-10-11 18:38:20 -04:00
.containerignore Move the project plans and the style-review agent to .agents/ 2026-10-04 11:29:04 -04:00
.gitignore fix: ignore smoke test artifacts 2026-10-10 10:56:59 -04:00
AGENTS.md docs: fill in the rustdoc surface and reword the narrative comments 2026-10-11 22:15:24 -04:00
API.md docs: update the layout facts for the playback split and reorganized crates 2026-10-11 22:10:17 -04:00
ARCHITECTURE.md docs: update the layout facts for the playback split and reorganized crates 2026-10-11 22:10:17 -04:00
Cargo.toml Add crate metadata for crates.io publishing 2026-10-06 07:54:26 -04:00
Containerfile add: containerized inner-loop build (podman + fedora:44) and make defaults 2026-09-29 22:03:47 -04:00
LICENSE Relicense under Apache-2.0 2026-10-06 07:53:24 -04:00
Makefile Add the rpm container smoke test 2026-10-09 10:34:42 -04:00
README.md Relicense under Apache-2.0 2026-10-06 07:53:24 -04:00

deezerd

A small, lightweight Deezer client, driven by a headless daemon that plays decrypted audio through its in-process playback engine, with a localhost HTTP surface for control and integration with arbitrary frontends.

Development is assisted with OpenCode, powered by GLM 5.3 Flash.

Licensed under Apache-2.0.

Cargo workspace, virtual manifest:

  • crates/deezer-client/, the standalone Deezer-facing library: DeezerClient (Deezer's public and private APIs, ARL auth, Blowfish/MD5 decryption)
  • crates/deezerd-client/, the deezerd client library: DaemonClient (the daemon's HTTP contract) re-exporting deezer-client flat, the stable surface both binaries consume
  • crates/deezerd/, the daemon and reference CLI binary for interacting with it
  • crates/deezerd-tui/, the terminal UI for interacting with a running daemon

The daemon's HTTP surface is documented in API.md.

Quickstart

Build with cargo build --release, or if you have podman handy you can make release to use a container to do the build for you and handle all the build dependencies neatly.

  • target/release/deezerd-tui --login — capture your Deezer ARL in a browser once; the daemon falls back to the state file the login writes (this is optional, launching a TUI against an unauthenticated daemon will offer to run the login)
  • target/release/deezerd --arl <token> — start the daemon on localhost, with a specific ARL provided
  • target/release/deezerd client play --playlist <id> — play a playlist, album, or podcast through the daemon's playback engine
  • target/release/deezerd client search "<query>" --type track — search Deezer
  • target/release/deezerd-tui — drive the running daemon from the TUI

Install

  • make install — the binaries, docs, hicolor icons, the .desktop entry, and the daemon's user unit into ~/.local; pass sudo PREFIX=/usr/local make install for a system-wide install
  • make rpm — the deezerd (daemon + user unit) and deezerd-tui (TUI + .desktop + icons) rpms, built offline from vendored crates into tmp/dist/

After installing, systemctl --user enable --now deezerd runs the daemon. Environment variables (like an explicitly provided ARL token, which takes precedence over the live login flow and state, or overriding the port) go in ~/.config/deezerd/env — the unit documents the variables.

On legality and morality

Streams audio on demand, fetched transiently into memory and served to local frontends. Nothing is cached or written to disk automatically. The daemon binds to 127.0.0.1, holds audio, details on artists/tracks/albums, album art, and lyrics in memory only. It uses your own Deezer credentials (your ARL session token, stored locally with 0600 permissions) for strictly personal, non-commercial use, one Deezer account per daemon.

The in-memory design exists because I don't want to get sued — so know what you're agreeing to:

  • Deezer's Terms of Use authorize personal and private use of Deezer's own site, service and applications; third-party clients are not an explicitly sanctioned surface.
  • Article 6 of the ToU forbids bypassing Deezer's protective technical measures, any download or transfer of Content into storage (calling out hard drives specifically) "whether permanently or temporarily", and automated collection of data from the service in a section talking about scraping. The daemon's private-API calls and in-memory decryption fall within the letter of those clauses, by my read.
  • Article 7 of the ToU makes the account grounds for suspension "without notice or compensation" for bypassing protective measures or using multiple simultaneous connections. The consequence lands on your account, not this software.
  • The only type of account I test is a paid account, I literally don't even know if a free account can log in. Control over what quality you're allowed to play lives on the API side, so you won't get good audio quality without a paid account. If you want deezerd to work well for you, subscribe and send Deezer your money to make sure you're supporting them and the artists you're enjoying.
  • Listen reports go to Deezer unconditionally as I believe that properly reporting playback is what drives artist monetization. I oppose royalty siphoning the way I oppose piracy.

Use at your own risk. This web site is not endorsed by, directly affiliated with, maintained, authorized, or sponsored by Deezer. All product and company names are the registered trademarks of their original owners. The use of any trade name or trademark is for identification and reference purposes only and does not imply any association with the trademark holder of their product brand.