- PLAYLIST_NAMES config key (comma-separated list); falls back to PLAYLIST_NAME
- run_update_job syncs songs to every configured playlist, merges results
- Settings form: dynamic add/remove playlist rows instead of single input
- get_web_config reads config.json directly so form is consistent in
container environments where env vars override runtime config
- Playlist tab: dropdown to pick which playlist to browse when multiple exist
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
song_counts tallies how many times each song appears across all runs
(powers the Top Songs ranking). total_scraped uses the unique seen
set separately so the stat card stays deduplicated.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- total_scraped: unique songs ever seen playing (not per-run sum)
- total_missing: unique songs ever reported not in Plex library
- total_matched: matched_count from most recent successful run
- Added (144) stays cumulative — each add is a real playlist event
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
total_scraped and station_counts now reflect distinct songs seen
across all history, not the sum of scraped_count per run.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SSE-based live sync log drawer (ThreadingHTTPServer + queue.Queue log handler)
- Playlist tab: load tracks from Plex, sort, per-track remove
- Match rate donut chart alongside station bar on Overview
- Expandable history rows showing per-station breakdown chips
- Buy list dedup (POST /api/buy-list-dedup) + Copy All Links button
- Date range filter on History run log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>