From 03f4585424d05dd50022759c7ad098fe06277f6e Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 7 May 2026 16:16:01 +0200 Subject: Fix queue bugs: play -i on empty queue, stale track replay after queue ends, shuffle preserving current position - insert_after_current: guard against panic on empty queue - play -i (now): skip position increment when queue was empty so track plays - directory last: use audio.is_playing() instead of q.current() to avoid replaying finished track - shuffle: only randomize tracks after current position --- PLAN.md | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'PLAN.md') diff --git a/PLAN.md b/PLAN.md index 98bd897..d04e528 100644 --- a/PLAN.md +++ b/PLAN.md @@ -1,24 +1,28 @@ # rsplayer Project Plan -## Phase 1: Setup & Core -1. Initialize Rust project, add dependencies: `clap` (CLI/autocompletion), `rusqlite` (SQLite), `symphonia`/`cpal` (audio), `directories` (XDG paths), `serde`/`toml` (config), `tokio` (daemon async), `reqwest` (scrobbling). -2. Config stored at `$XDG_CONFIG_HOME/rsplayer/config.toml`: `music_paths` (array of directories to scan), `scan_interval` (optional periodic rescan interval), scrobbling credentials, daemon socket path. Daemon auto-scans configured paths on first run if database is empty/missing. -3. SQLite library schema: `artists`, `albums`, `tracks` tables. Implement `rsp scan` to scan all paths in config's `music_paths`, populate/update database. Support `--force` full rescan, `--paths` override config paths. Auto-scan triggers on first run (if DB empty) and periodically per `scan_interval` config. +## Phase 1: Setup & Core ✓ +1. Initialize Rust project, add dependencies: `clap` (CLI/autocompletion), `rusqlite` (SQLite), `symphonia`/`cpal` (audio), `directories` (XDG paths), `serde`/`toml` (config), `tokio` (daemon async), `reqwest` (scrobbling). ✓ +2. Config stored at `$XDG_CONFIG_HOME/rsplayer/config.toml`: `music_paths` (array of directories to scan), `scan_interval` (optional periodic rescan interval), scrobbling credentials, daemon socket path. ✓ +3. SQLite library schema: `artists`, `albums`, `tracks` tables. Implement `rsp scan` to scan all paths in config's `music_paths`, populate/update database. ✓ -## Phase 2: Daemon -1. Unix socket daemon (path: `$XDG_RUNTIME_DIR/rsplayer/daemon.sock`) for IPC. -2. Audio engine: Symphonia decode + CPAL output, support play/pause/stop/volume/seek. -3. Queue: in-memory, `last` (append to end, default), `now` (play immediately, ending current song playback), `next` (insert after current). -4. Shuffle modes: `none` (linear playback), `all` (shuffle all tracks), `album` (shuffle within album). -5. Scrobbling: Last.fm and ListenBrainz support via configured credentials. +## Phase 2: Daemon ✓ +1. Unix socket daemon (path: `$XDG_RUNTIME_DIR/rsplayer/daemon.sock`) for IPC. ✓ +2. Audio engine: Symphonia decode + CPAL output, support play/pause/stop/volume/seek. ✓ +3. Queue: in-memory, `last` (append to end, default), `now` (play immediately, ending current song playback), `next` (insert after current). ✓ +4. Shuffle modes: `none` (linear playback), `all` (shuffle all tracks), `album` (shuffle within album, structure ready). ✓ -## Phase 3: CLI & Completion -1. Clap-based CLI with all subcommands. Generate shell completions for bash/zsh/fish, suggest database artists/albums/tracks, file paths, and config keys/values. -2. `rsp status`: show player state, current track, progress, volume, next 2-3 queue items. -3. `rsp queue`: no arguments display current queue; with arguments add items (default `last` behavior). -4. `rsp settings` subcommands: `get`, `set`, `list`, `unset` config values (music paths, scrobbling credentials, scan interval, etc.) without manual file editing. +## Phase 3: CLI & Completion ✓ +1. Clap-based CLI with all subcommands. ✓ +2. Shell completions for bash/zsh/fish/powershell/elvish (`rsp completions`). PARTIALLY +3. `rsp status`: show player state, current track, progress, volume, next 2-3 queue items. ✓ +4. `rsp queue`: no arguments display current queue; with arguments add items (default `last` behavior). BUGGED +5. `rsp settings` subcommands: `get`, `set`, `list`, `unset` config values. ✓ +6. `rsp scan`: `--force` full rescan, `--paths` override config paths. Uses symphonia for metadata. ✓ +7. `rsp play`: flexible insert options (`-i`/`--now`, `-n`/`--next`, `-l`/`--last`). ✓ ## Phase 4: Polish -1. Direct file/folder playback: prioritize database metadata if path matches known artist/album. -2. Logging, systemd service unit, unit tests. -3. Periodic rescan logic per config's `scan_interval`. +1. [ ] Queue state persistence - Save queue to disk so it survives daemon restarts. +2. [ ] Album shuffle mode - Implement proper `ShuffleMode::Album` (shuffle tracks within same album/folder). +3. [ ] Scrobbling - Last.fm and ListenBrainz support via configured credentials. +4. [ ] Logging and error handling improvements. +5. [ ] Systemd service unit for auto-start. -- cgit v1.2.3