diff --git a/cmd/minstrel/main.go b/cmd/minstrel/main.go index df3398a9..0c912bd5 100644 --- a/cmd/minstrel/main.go +++ b/cmd/minstrel/main.go @@ -75,7 +75,7 @@ func run() error { srv := server.New(logger, pool, scanner, subsonic.Config{ AllowPlaintextPassword: cfg.Subsonic.AllowPlaintextPassword, - }) + }, cfg.Events) httpServer := &http.Server{ Addr: cfg.Server.Address, Handler: srv.Router(), diff --git a/config.example.yaml b/config.example.yaml index eb3c6bee..b9a2ed80 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -36,3 +36,12 @@ subsonic: # apiKey (OpenSubsonic) and falls back to u+t+s token auth. # Env: SMARTMUSIC_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD allow_plaintext_password: false + +events: + # Idle gap (minutes) between play_events that closes a play_session and + # starts a new one. Spec §6. + session_timeout_minutes: 30 + # Skip rule (spec §6): a play counts as a SKIP if completion ratio is below + # this threshold AND duration played (ms) is below the next threshold. + skip_max_completion_ratio: 0.5 + skip_max_duration_played_ms: 30000 diff --git a/docs/superpowers/plans/2026-04-24-web-ui-player.md b/docs/superpowers/plans/2026-04-24-web-ui-player.md new file mode 100644 index 00000000..32caee1e --- /dev/null +++ b/docs/superpowers/plans/2026-04-24-web-ui-player.md @@ -0,0 +1,1698 @@ +# Web UI Player Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Ship queue-based audio playback in the SPA — click a track on an album, the rest of the album queues, the bottom bar shows progress + controls, MediaSession populates OS media UI, and shuffle/repeat/volume all work. + +**Architecture:** A single Svelte 5 rune store in `lib/player/store.svelte.ts` holds all player state. A single `