audioplayer/CLAUDE.md
2026-04-29 06:57:46 +03:00

53 lines
2.1 KiB
Markdown

# player — Jellyfin music player in Jai
This is a vibe-coded project. Pure AI-assisted work. Take agency, but check `ai/` for current direction before making big calls.
## What this is
A desktop music player that talks to a Jellyfin server. End goal: looks like a ridiculous 2000s audio player that shipped on a CD-ROM with an album — chunky skinned UI, neon gradients, glossy buttons, a spectrum visualizer behind the now-playing screen, music-reactive shaders, artist art front and center.
## Build
```
cd /home/katajisto/player
/home/katajisto/bin/jai/bin/jai-linux build.jai
./build/player
```
`build.jai` is a metaprogram. It points the import path at `./modules` (vendored: `Jaison`, `stb_image`) and falls back to the standard Jai modules at `/home/katajisto/bin/jai/modules`.
## Code layout
`src/main.jai` is intentionally tiny — it just `#load`s an `index.jai` from each subfolder. Each subfolder owns its surface area:
- `core/` — app state, window, frame loop, time
- `jellyfin/` — HTTP client (libcurl), auth, library browsing, image fetch, stream URLs
- `audio/` — Sound_Player wrapper, queue, FFT analysis for the visualizer
- `ui/` — theme, fonts, and `views/` (one file per screen)
- `gfx/` — custom shaders, texture loading
- `util/` — log, helpers
Each folder has an `index.jai` that `#load`s every file in that folder. To add a file, drop it in and add a `#load` line.
## Dependencies
- **Simp** (Jai stdlib) — rendering
- **GetRect_LeftHanded** (Jai stdlib) — UI widgets
- **Sound_Player** (Jai stdlib) — audio playback (ALSA on linux, CoreAudio on mac)
- **Curl** (Jai stdlib) — HTTP to Jellyfin
- **Jaison** (vendored) — JSON
- **stb_image** (vendored) — single-header PNG/JPG decode for artist images
Cross-platform target: linux + macOS.
## AI notes
See `ai/` for live design notes:
- `ai/aesthetic.md` — visual direction
- `ai/architecture.md` — code layout rationale
- `ai/decisions.md` — decision log
- `ai/todo.md` — running todo / scratch
Update `ai/decisions.md` when you make a non-obvious choice. Update `ai/todo.md` when you punt on something.