diff --git a/SUBSONIC_SERVER_BLUEPRINT.md b/SUBSONIC_SERVER_BLUEPRINT.md index 6d2e4ae..a1c427d 100644 --- a/SUBSONIC_SERVER_BLUEPRINT.md +++ b/SUBSONIC_SERVER_BLUEPRINT.md @@ -477,98 +477,98 @@ Responsibilities: ## Project Setup -- [ ] Choose repository structure and naming -- [ ] Initialize Go module -- [ ] Initialize frontend app in `apps/web` -- [ ] Add root `.editorconfig` -- [ ] Add root `.gitignore` +- [x] Choose repository structure and naming +- [x] Initialize Go module +- [x] Initialize frontend app in `apps/web` +- [x] Add root `.editorconfig` +- [x] Add root `.gitignore` - [ ] Add backend formatter/linter commands - [ ] Add frontend formatter/linter commands -- [ ] Add shared `Makefile` or task runner -- [ ] Add `.env.example` -- [ ] Add `docker-compose.yml` -- [ ] Add backend `Dockerfile` +- [x] Add shared `Makefile` or task runner +- [x] Add `.env.example` +- [x] Add `docker-compose.yml` +- [x] Add backend `Dockerfile` - [ ] Add frontend `Dockerfile` if needed - [ ] Add CI workflow for lint/build/test ## Backend Bootstrap -- [ ] Create `cmd/server/main.go` -- [ ] Add config loading -- [ ] Add HTTP server bootstrap -- [ ] Add graceful shutdown +- [x] Create `cmd/server/main.go` +- [x] Add config loading +- [x] Add HTTP server bootstrap +- [x] Add graceful shutdown - [ ] Add structured logging -- [ ] Add health endpoint -- [ ] Add request logging middleware -- [ ] Add panic recovery middleware -- [ ] Add CORS strategy for local dev +- [x] Add health endpoint +- [x] Add request logging middleware +- [x] Add panic recovery middleware +- [x] Add CORS strategy for local dev ## Database -- [ ] Choose migration tool -- [ ] Create initial schema migration -- [ ] Add DB connection setup -- [ ] Add migration runner at startup -- [ ] Add indexes for artist/album/track lookup +- [x] Choose migration tool +- [x] Create initial schema migration +- [x] Add DB connection setup +- [x] Add migration runner at startup +- [x] Add indexes for artist/album/track lookup - [ ] Add indexes for search -- [ ] Add repository helpers or query layer +- [x] Add repository helpers or query layer ## Auth and Users -- [ ] Create users table -- [ ] Implement password hashing -- [ ] Implement login endpoint -- [ ] Implement session or bearer token issuance -- [ ] Implement auth middleware -- [ ] Implement current user endpoint -- [ ] Implement admin bootstrap user creation +- [x] Create users table +- [x] Implement password hashing +- [x] Implement login endpoint +- [x] Implement session or bearer token issuance +- [x] Implement auth middleware +- [x] Implement current user endpoint +- [x] Implement admin bootstrap user creation - [ ] Add logout endpoint ## Library Scanning -- [ ] Add library roots table +- [x] Add library roots table - [ ] Add config for one or more music paths -- [ ] Recursively discover supported audio files -- [ ] Ignore unsupported file types -- [ ] Read tags from files -- [ ] Map tags into normalized artist/album/track model -- [ ] Extract embedded artwork when present -- [ ] Load folder sidecar artwork when present -- [ ] Persist scan results transactionally -- [ ] Track deleted files and remove stale DB rows -- [ ] Add initial full scan command -- [ ] Add rescan endpoint or admin action +- [x] Recursively discover supported audio files +- [x] Ignore unsupported file types +- [x] Read tags from files +- [x] Map tags into normalized artist/album/track model +- [x] Extract embedded artwork when present +- [x] Load folder sidecar artwork when present +- [x] Persist scan results transactionally +- [x] Track deleted files and remove stale DB rows +- [x] Add initial full scan command +- [x] Add rescan endpoint or admin action - [ ] Add filesystem watch or scheduled scan - [ ] Record scan job progress -- [ ] Expose scan status endpoint +- [x] Expose scan status endpoint ## Browse API -- [ ] List artists -- [ ] Artist detail with albums -- [ ] Album detail with tracks -- [ ] Track detail -- [ ] Recent albums -- [ ] Random albums or songs +- [x] List artists +- [x] Artist detail with albums +- [x] Album detail with tracks +- [x] Track detail +- [x] Recent albums +- [x] Random albums or songs - [ ] Favorites listing -- [ ] Search endpoint +- [x] Search endpoint - [ ] Pagination support - [ ] Sorting support ## Streaming -- [ ] Implement authenticated stream endpoint -- [ ] Support range requests -- [ ] Support HEAD where appropriate -- [ ] Return correct content type -- [ ] Handle missing files gracefully -- [ ] Add cover art endpoint +- [x] Implement authenticated stream endpoint +- [x] Support range requests +- [x] Support HEAD where appropriate +- [x] Return correct content type +- [x] Handle missing files gracefully +- [x] Add cover art endpoint - [ ] Add basic download endpoint ## Playlists and History -- [ ] Create playlists table -- [ ] Create playlist tracks table +- [x] Create playlists table +- [x] Create playlist tracks table - [ ] Add create playlist endpoint - [ ] Add rename playlist endpoint - [ ] Add delete playlist endpoint @@ -580,7 +580,7 @@ Responsibilities: ## Favorites -- [ ] Add favorites table +- [x] Add favorites table - [ ] Star track - [ ] Unstar track - [ ] Star album if desired @@ -590,20 +590,20 @@ Responsibilities: ## Subsonic Compatibility -- [ ] Implement request auth parsing -- [ ] Support username/password auth where needed +- [x] Implement request auth parsing +- [x] Support username/password auth where needed - [ ] Support token/salt auth -- [ ] Add common Subsonic response builder -- [ ] Implement `ping` -- [ ] Implement `getLicense` -- [ ] Implement `getArtists` -- [ ] Implement `getArtist` -- [ ] Implement `getAlbum` -- [ ] Implement `getSong` -- [ ] Implement `stream` -- [ ] Implement `getCoverArt` +- [x] Add common Subsonic response builder +- [x] Implement `ping` +- [x] Implement `getLicense` +- [x] Implement `getArtists` +- [x] Implement `getArtist` +- [x] Implement `getAlbum` +- [x] Implement `getSong` +- [x] Implement `stream` +- [x] Implement `getCoverArt` - [ ] Implement `search3` -- [ ] Implement `getRandomSongs` +- [x] Implement `getRandomSongs` - [ ] Implement `getStarred2` - [ ] Implement `star` - [ ] Implement `unstar` @@ -613,20 +613,20 @@ Responsibilities: ## Frontend Bootstrap -- [ ] Create Vite React TypeScript app -- [ ] Configure routing -- [ ] Configure Tailwind +- [x] Create Vite React TypeScript app +- [x] Configure routing +- [x] Configure Tailwind - [ ] Add Radix UI primitives -- [ ] Add TanStack Query client -- [ ] Add Zustand stores -- [ ] Add API client layer -- [ ] Add auth persistence strategy +- [x] Add TanStack Query client +- [x] Add Zustand stores +- [x] Add API client layer +- [x] Add auth persistence strategy - [ ] Add theme tokens and CSS variables ## Frontend App Shell -- [ ] Login page -- [ ] App layout with sidebar/topbar/player area +- [x] Login page +- [x] App layout with sidebar/topbar/player area - [ ] Responsive navigation - [ ] Toast/notification system - [ ] Error boundary @@ -634,10 +634,10 @@ Responsibilities: ## Frontend Music Views -- [ ] Home page -- [ ] Artists grid/list page -- [ ] Artist detail page -- [ ] Album detail page +- [x] Home page +- [x] Artists grid/list page +- [x] Artist detail page +- [x] Album detail page - [ ] Playlist page - [ ] Search results page - [ ] Favorites page @@ -645,18 +645,18 @@ Responsibilities: ## Frontend Player -- [ ] Global player store -- [ ] Queue model -- [ ] Play/pause -- [ ] Next/previous +- [x] Global player store +- [x] Queue model +- [x] Play/pause +- [x] Next/previous - [ ] Seek bar -- [ ] Volume control +- [x] Volume control - [ ] Repeat modes - [ ] Shuffle -- [ ] Track switching -- [ ] Keyboard shortcuts -- [ ] Mini player -- [ ] Expanded player +- [x] Track switching +- [x] Keyboard shortcuts +- [x] Mini player +- [x] Expanded player ## Quality and Testing @@ -668,18 +668,18 @@ Responsibilities: - [ ] Frontend component tests for player and key pages - [ ] Frontend E2E smoke tests - [ ] Test with a realistic sample library -- [ ] Test on Windows paths +- [x] Test on Windows paths - [ ] Test on Linux paths - [ ] Test large album art and missing metadata edge cases ## Deployment -- [ ] Build production frontend assets -- [ ] Serve frontend assets from backend or reverse proxy -- [ ] Docker image for all-in-one deployment -- [ ] Persistent DB volume -- [ ] Persistent cache volume -- [ ] Music folder mount strategy +- [x] Build production frontend assets +- [x] Serve frontend assets from backend or reverse proxy +- [x] Docker image for all-in-one deployment +- [x] Persistent DB volume +- [x] Persistent cache volume +- [x] Music folder mount strategy - [ ] Reverse proxy example - [ ] HTTPS deployment notes - [ ] Backup/restore notes @@ -688,7 +688,7 @@ Responsibilities: - [ ] On-the-fly transcoding - [ ] Multi-bitrate streaming profiles -- [ ] Lyrics support +- [x] Lyrics support - [ ] Last.fm or ListenBrainz scrobbling - [ ] Shareable public links - [ ] Smart playlists