Replace Spotify API with screenshot taste workflow and example profile.
Remove spotify integration; add TASTE-FROM-SCREENSHOTS guide; ship Ozan settings.json and taste_seeds.json as Cursor examples plus new wandering dervish track. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Live Ozan Radio
|
||||
|
||||
Personal AI radio — **no catalog music, ever**. DeepSeek is the DJ. Google **Lyria 3** composes every track. Taste comes from `settings.json` (and optionally Spotify).
|
||||
Personal AI radio — **no catalog music, ever**. DeepSeek is the DJ. Google **Lyria 3** composes every track. Taste comes from `settings.json` + `taste_seeds.json` — usually built from **Spotify screenshots in Cursor** (no Spotify API).
|
||||
|
||||
Inspired by [Magenta RealTime 2](https://magenta.withgoogle.com/magenta-realtime-2) (live, ~200ms) and [Lyria 3](https://deepmind.google/models/lyria/) (full songs via Gemini API). On Mac you can layer MRT2 for true live improvisation; this repo ships the cross-platform Lyria + DeepSeek stack first.
|
||||
|
||||
@@ -10,8 +10,7 @@ Inspired by [Magenta RealTime 2](https://magenta.withgoogle.com/magenta-realtime
|
||||
|-------|---------|------|
|
||||
| DJ brain | DeepSeek (Tinqs proxy or BYOK) | Mood, prompts, chat, variety |
|
||||
| Music engine | Google Lyria 3 Pro / Clip | Generate MP3 tracks |
|
||||
| Taste | `settings.json` + `taste_seeds.json` | Genres, mood, instruments — DJ reads every request |
|
||||
| Taste (optional) | Spotify Web API | Top artists, genres — never plays Spotify |
|
||||
| Taste | `settings.json` + `taste_seeds.json` | Profile from screenshots or manual edit — see below |
|
||||
| Player | FastAPI + `gateway/player.html` | Stream queue, library, chat, dashboard |
|
||||
| Live (optional) | Magenta RealTime 2 | Apple Silicon only — see below |
|
||||
|
||||
@@ -37,9 +36,15 @@ When shuffle is on (default):
|
||||
|
||||
Daily generation stats live in `songs/stats.json` (gitignored, local runtime only).
|
||||
|
||||
## Taste from Spotify screenshots (recommended)
|
||||
|
||||
**No Spotify API keys.** Screenshot your library (Home, Daily Mixes, playlists), open this repo in **Cursor**, attach images, and paste the prompt from **[docs/TASTE-FROM-SCREENSHOTS.md](docs/TASTE-FROM-SCREENSHOTS.md)**. The agent updates `settings.json` and `taste_seeds.json`.
|
||||
|
||||
Share that doc with friends — same flow for group taste (WhatsApp links + screenshots).
|
||||
|
||||
## Taste (`settings.json`)
|
||||
|
||||
Edit `settings.json` at the repo root. The DJ reloads it on every generate and chat.
|
||||
Edit `settings.json` at the repo root, or let Cursor fill it from screenshots. The DJ reloads it on every generate and chat.
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -58,7 +63,7 @@ Edit `settings.json` at the repo root. The DJ reloads it on every generate and c
|
||||
}
|
||||
```
|
||||
|
||||
Default taste profile: **ethnic world dubtronica** (global roots + dub space + electronic groove).
|
||||
**Example profile (Ozan):** checked-in [`settings.json`](settings.json) + [`taste_seeds.json`](taste_seeds.json) — Anadolu psych + ethnic dubtronica from Spotify screenshots. Copy the structure for your own taste.
|
||||
|
||||
The player settings panel PATCHes `playback` and `limits` via `/api/settings` and writes back to this file.
|
||||
|
||||
@@ -82,7 +87,8 @@ python -m venv .venv
|
||||
.venv\Scripts\activate
|
||||
pip install -e .
|
||||
copy .env.example .env
|
||||
# Fill GEMINI_API_KEY + DEEPSEEK_API_KEY (and Spotify if you have them)
|
||||
# Fill GEMINI_API_KEY + DEEPSEEK_API_KEY
|
||||
# Taste: docs/TASTE-FROM-SCREENSHOTS.md (Cursor + Spotify screenshots)
|
||||
|
||||
$env:DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
|
||||
python -m ozan_radio serve
|
||||
@@ -102,7 +108,6 @@ python -m ozan_radio generate
|
||||
| `GEMINI_API_KEY` | Yes | [Google AI Studio](https://aistudio.google.com/apikey) — Lyria 3 |
|
||||
| `DEEPSEEK_API_KEY` | Yes | Tinqs proxy token or DeepSeek direct |
|
||||
| `DEEPSEEK_BASE_URL` | No | Default `https://api.deepseek.com/v1` |
|
||||
| `SPOTIFY_*` | No | Refresh token flow — taste only |
|
||||
| `LYRIA_MODEL` | No | `lyria-3-pro-preview` (default) or `lyria-3-clip-preview` |
|
||||
| `RADIO_OUTPUT_DIR` | No | Default `./songs` |
|
||||
|
||||
@@ -115,15 +120,6 @@ python -m ozan_radio generate
|
||||
|
||||
At the default cap of 10 new songs/day with Lyria Pro, projected max spend is **~$0.82/day**. Adjust `costs` and `limits` in `settings.json` or the player settings panel.
|
||||
|
||||
### Spotify setup (optional taste)
|
||||
|
||||
1. Create an app at [Spotify Developer Dashboard](https://developer.spotify.com/dashboard).
|
||||
2. Add redirect URI `http://127.0.0.1:8888/callback`.
|
||||
3. Complete OAuth once to obtain a refresh token (scope: `user-top-read`).
|
||||
4. Paste `SPOTIFY_CLIENT_ID`, `SPOTIFY_CLIENT_SECRET`, `SPOTIFY_REFRESH_TOKEN` into `.env`.
|
||||
|
||||
If Spotify is not configured, the DJ uses `settings.json` + `taste_seeds.json`.
|
||||
|
||||
## API
|
||||
|
||||
| Method | Path | Description |
|
||||
|
||||
Reference in New Issue
Block a user