# Todo / scratch

## What works now

- Login → server hits `/Users/AuthenticateByName`, token+user_id persisted to `~/.config/player/config.json`
- Subsequent launches skip login, jump straight to library
- Library view: 3 columns (artists / albums / tracks), scrollable, click-to-drill
- **All HTTP is async** — `http_submit` queues a worker thread; `http_pump()` runs once per frame and fires callbacks on the main thread. UI no longer freezes during fetches or downloads.
- **MP3 + FLAC playback** via vendored `dr_mp3.h` / `dr_flac.h` (compiled to `modules/audio_decoders/linux/decoders.a` — `build.jai` auto-rebuilds when the .c source is newer). Decoded to s16 PCM and handed to Sound_Player as `Sound_Data.LINEAR_SAMPLE_ARRAY`.
- OGG + WAV continue through `Sound.load_audio_data` (Sound_Player's native path).
- Click a track → downloads (async) → decodes → plays. Auto-advance via Sound_Player's `release_asset` callback firing `track_finished`.
- Pause/resume via `user_volume_scale` mute trick (still not a real pause)
- Now-playing screen with title/artist/album, transport buttons, scrub bar
- Logout button on library top-right clears `config.json`

## Known stubs / rough edges

- **Memory leak**: each played track leaks its decoded PCM buffer (~50 MB for a 5-min FLAC). The `release_asset` callback should call `decoder_free` for MP3/FLAC paths and `free` for OGG/WAV — currently it only flips `track_finished`. Track allocation type per-Sound_Data so the release knows which allocator to use.
- `audio_toggle_pause` is volume-mute, not real pause — cursor keeps advancing
- No real seek (scrub bar is read-only)
- Image cache never evicts — hold for thousands of items but unbounded over a long session (low priority)
- Failed image fetches stay marked `failed` forever; no retry. Often that's right (item has no art) but transient network errors should retry once
- `gfx/shaders.jai` is still `Simp.immediate_quad` (mirrored bars + bass pulse, but no GLSL fragment shader yet)
- `client.jai` still has the old sync `http_get`/`http_post` and `Http_Response` / `build_auth_header` — async.jai uses `build_auth_header` so the helpers stay, but the sync wrappers are dead code now
- Stream URL `/Audio/{id}/stream` returns the original file. If the original is something exotic (Opus, AAC, etc.) it'll fail. Could fall back to `/Audio/{id}/universal` with `audioCodec=mp3` or similar to force-transcode for unsupported formats.

## Next likely tasks (in rough order)

1. Free the decoded buffer when the stream ends (fix the leak)
2. Fetch primary image per album, decode with stb_image, upload as `Simp.Texture`, render in album rows + as backdrop on now-playing
3. Real FFT (dr_libs author's work? or kissfft) hooked to Sound_Player's mixed output buffer
4. Custom GLSL fragment shader for the visualizer (replaces the bar stack)
5. Album-level "play all" button in the album column
6. Real per-stream pause + seek
7. Search bar above artists column
