crabidy/jamendody
Test User ab3bd7c63a docs: bring the book and every README up to date
The docs drifted behind three changes: the /queues + /bookmarks +
/captures split folding into one /crabidy provider, three providers
arriving (soundcloud, jamendo, abs) with nothing written about them, and
the spectrum toggle moving off v to f when library visual mode took v/V.

- The book gains a page per undocumented provider — /soundcloud,
  /jamendo, /abs — each with its tree, its playback path, every config
  option, and how to log in. The providers index and intro list all nine
  roots in the order the server actually serves them.
- Every provider now documents its login: Tidal's device flow (and that
  a broken tidaly.toml is the one fatal provider config), audiobookshelf
  API keys, the optional SoundCloud token and where to read it out of a
  browser, YouTube cookie exports, Jamendo's shipped key, and "nothing
  to do" for fyyd and /fs.
- fsdy's README described three server-managed mounts under
  ~/.config/crabidy that have not existed for a while; it now describes
  /crabidy over the state dir plus the shared content store, and how
  deletes there never touch store audio.
- Stale /captures/<name> save paths in the tidaldy and ytdy READMEs are
  /crabidy/<name>. The TUI key table, the README walkthrough, and the
  spectrum section use f, and visual mode (v/V) is documented.
- config.md and the README list all seven provider config files, say
  plainly that credentials are stored in cleartext, and cover the audio
  output device; the CLI page documents audio-devices and features.
- No README or docs page references architecture/, quality/, or plan/
  any more: the book describes the system as it is, and points at the
  crate READMEs for usage and config.
- devenv-docs.nix was never committed even though devenv.nix imports it,
  so a fresh clone could not enter the shell at all. It is in now, which
  also makes the README's `devenv shell -- docs` work.

Also fixes two ./store.md links in providers/fs.md that pointed one
directory too shallow.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 11:04:25 +02:00
..
src jamendo: ship a default client_id so /jamendo works out of the box 2026-07-25 10:54:50 +02:00
Cargo.toml Add the Jamendo provider (/jamendo) for Creative-Commons music 2026-07-24 13:43:05 +02:00
README.md docs: bring the book and every README up to date 2026-07-25 11:04:25 +02:00

README.md

jamendody — the Jamendo provider

Mounts Jamendo at /jamendo in the crabidy library: search a large catalogue of Creative-Commons licensed music, play it, and browse the album a track came from.

Logging in

Nothing to do. Jamendo has no user login — the public catalogue needs only an app key (client_id) identifying the application, not you, and this crate ships a working default (DEFAULT_CLIENT_ID). /jamendo mounts with no configuration, and init writes the key it used into jamendo.toml so the effective value is always visible.

Bring your own key if you use Jamendo heavily — the rate limit is per key, so the shipped default is a shared budget:

  1. Register at devportal.jamendo.com and create an application.
  2. Copy its Client ID into ~/.config/crabidy/jamendo.toml as client_id.
  3. Restart the server. A configured key always wins over the default.

Nothing expires and there is no refresh flow. The key is redacted from Debug and never logged, but keep the file private.

How it works

/jamendo
├── search                  create a search term with `%`
│   └── <term>              matching tracks
├── track/<id>              a single track (canonical address)
└── album/<id>              an album and its tracks (canonical address)

search is creatable: press % and type a term, and the term becomes a child node holding its results. e renames it (re-running the search), d deletes it. Terms live in memory, so a restart forgets the list.

Tracks and albums are addressed by id whatever browse node you reached them through, so a queued track survives deleting the search term that found it. From a track you can navigate to its album to hear the rest.

Playback is a direct MP3 URL streamed over the player's ordinary HTTP path — no HLS, no helper binary, and seeking works. Captures (W) download those files into the content store.

Configuration — ~/.config/crabidy/jamendo.toml

# The app key. Unset (or blank) uses the key this crate ships with, which is
# written back here on first start. Replace it with your own from
# devportal.jamendo.com for your own rate limit.
# client_id = "..."

# Optional, defaults shown.
# audioformat = "mp31"      # "mp31" (default) or "mp32"; see below
# search_results = 50       # tracks per search term (Jamendo caps at 200)
# album_tracks = 200        # tracks listed per album
# call_timeout_secs = 30    # per-request timeout

mp31 is Jamendo's freely streamable MP3. mp32 (higher bitrate) is not reliably provisioned for the streaming URL and comes back empty for many tracks, which is why it is not the default; a Pro account can set it explicitly. When a track has no audio in the requested format the provider falls back rather than failing the listing.

Failure behavior

  • Missing or empty client_id: the shipped default is used.
  • A revoked or rate-limited key: listings error, the provider stays mounted.
  • API or network failure: the affected listing errors, the provider stays.

Build the server without the jamendo cargo feature to leave this provider out of the binary entirely.