Each playlist now has its own station checkboxes in Settings.
Sync scrapes the union of all stations once, then filters songs
by source before syncing each playlist separately.
Config stored as PLAYLISTS JSON: [{name, stations}, ...].
Backward-compatible with flat PLAYLIST_NAME + SELECTED_STATIONS.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>