Commit Graph
100 Commits
Author SHA1 Message Date
yonlu f9b2ad95b7 test(04-02): add config and sub-config validation tests
- Theme: hex color regex + background shade enum validation
- Tracklist: column ID recognition + duplicate detection
- Favorites: icon style enum validation
- Library: directory existence + scan concurrency mode validation
- Config: load/save roundtrip, missing file handling, composed errors, defaults
2026-03-03 17:00:12 -05:00
yonlu 8d60dc05ce test(04-01): add queue core operations and navigation tests
- Queue operations: SetQueue, AddTrack, InsertTracksAt, MoveQueueTracks, RemoveTrack, Clear, ToggleShuffle, CycleRepeat
- Navigation: nextIndex/previousIndex in all repeat modes (off/all/one)
- Shuffle: generateShuffleOrder properties (no duplicates, current at [0]), shuffle navigation
- Mock TrackLoader and seedAudioFiles helper for DB-backed tests
- 23 tests total (14 core + 9 navigation) all passing with -race
2026-03-03 16:59:45 -05:00
yonlu 5400df257c docs(04): create phase plan for queue, config & player tests 2026-03-03 13:32:55 -05:00
yonlu 6e3c95ea61 docs(04): capture phase context 2026-03-03 09:50:16 -05:00
yonlu 062d429513 docs(phase-03): complete phase execution 2026-03-02 22:10:35 -05:00
yonlu c3a6e1161f docs(03-01): complete test infrastructure plan 2026-03-02 22:07:40 -05:00
yonlu bae9d70d23 feat(03-01): create NewTestDB helper for in-memory SQLite test databases
- Add testhelper.go with exported NewTestDB(t *testing.T) *DB
- Opens :memory: SQLite with same connection params as production
- Shares applyPRAGMAs, schema application loop, and runMigrations
- Registers t.Cleanup for automatic DB close
- No orphan cleanup, no functional options, no error return
2026-03-02 22:05:39 -05:00
yonlu d34881530a feat(03-01): extract shared applyPRAGMAs and add production PRAGMAs to NewDB
- Extract inline foreign_keys PRAGMA into shared applyPRAGMAs function
- Add synchronous=NORMAL, cache_size=-8000, mmap_size=67108864 PRAGMAs
- NewDB now calls applyPRAGMAs instead of inline PRAGMA exec
- applyPRAGMAs will be reused by NewTestDB for production-mirroring tests
2026-03-02 22:04:49 -05:00
yonlu abaf46ef1f docs(03): create phase plan 2026-03-02 21:21:52 -05:00
yonlu b47b64b625 docs(03): capture phase context 2026-03-02 21:06:50 -05:00
yonlu b17ce5d0e4 docs(phase-02): complete phase execution 2026-03-02 19:24:27 -05:00
yonlu 1c9356b6ad docs(02-02): complete artist credit error checking & scan warnings plan
- SUMMARY.md with all task commits and self-check
- STATE.md advanced to Phase 2 complete (2/2 plans)
- ROADMAP.md updated with Phase 2 complete status
- REQUIREMENTS.md marked CORR-08, CORR-09 complete
2026-03-02 19:21:06 -05:00
yonlu e6866ded9d feat(02-02): add ScanWarning type and reclassify scan errors as warnings
- Add ScanWarning struct with FilePath/Phase/Err to ScanMetrics
- Add mutex-protected addWarning method for concurrent use
- Reclassify walk, extraction, commit, orphan, variant, FTS failures as warnings
- Update commitBatch to return only fatal tx.Commit errors
- Update cachedLinkArtist to check errors via database.IsUniqueViolation
- Update handleConfigUpdate to capture and log scan warning count
2026-03-02 19:18:11 -05:00
yonlu 0d5b76cb0f docs(02-01): complete error handling & config fixes plan
- SUMMARY.md with all task commits and self-check
- STATE.md advanced to Phase 2 Plan 1/2 complete
- ROADMAP.md updated with Phase 2 progress
- REQUIREMENTS.md marked CORR-05, CORR-06, CORR-07 complete
2026-03-02 18:42:28 -05:00
yonlu 0860b2fd4b fix(02-01): log MPRIS callback errors instead of discarding them
- OnPause, OnPlayPause, OnStop, OnSeek now check errors and log at Warn level
- All four MPRIS closures use yj.logger.Warn for non-fatal error reporting
- No more silently discarded player.Pause() / player.Seek() errors
2026-03-02 18:39:54 -05:00
yonlu 2a86408201 fix(02-01): eliminate package-level startupErr and fix config file permissions
- Move startupErr from package-level var to YellowJacketApp struct field
- Update OnStartup and OnDomReady to reference yj.startupErr
- Change config.Save() file permissions from 0o666 to 0o644
- Fix nlreturn lint in database/errors.go (pre-existing, blocking commit hook)
2026-03-02 18:39:15 -05:00
yonlu bd86dc1086 docs(02): create phase plan for backend correctness 2026-03-02 18:21:18 -05:00
yonlu e5eaac66f8 docs(02-backend-correctness): research phase domain 2026-03-02 18:16:14 -05:00
yonlu bb02609ff5 docs(02): capture phase context 2026-03-02 18:05:30 -05:00
yonlu 8717cbfae3 docs(quick-8): complete duplicate tracks dialog plan
- Add 8-SUMMARY.md with execution results
- Update STATE.md with quick task 008 entry
2026-03-01 11:16:32 -05:00
yonlu 917a79a8d6 feat(quick-8): wire duplicate detection into playlist-picker and playlist-view
- playlist-picker checks for duplicates before adding tracks
- playlist-view drag-drop handler checks for duplicates before adding
- Both show duplicate-tracks-dialog when duplicates found
- Non-duplicate tracks added directly when no duplicates exist
2026-03-01 11:15:05 -05:00
yonlu 9f3ba2b9d4 feat(quick-8): create duplicate-tracks-dialog component
- Step through duplicate tracks one-by-one with Add/Skip buttons
- Apply to all remaining toggle for batch operations
- Dispatches playlist-action-complete when done
- Follows project wa-dialog patterns from track-details and phantom-resolver
2026-03-01 11:13:32 -05:00
yonlu 83de934c39 feat(quick-8): add FindDuplicateTracksInPlaylist backend method
- Add DuplicateTrackInfo and DuplicateCheckResult types
- Implement FindDuplicateTracksInPlaylist on playlist Service
- Regenerate Wails TypeScript bindings
2026-03-01 11:12:04 -05:00
yonlu 5ab214baed docs(quick-008): plan duplicate tracks dialog for playlist additions 2026-03-01 11:02:38 -05:00
yonlu 96a9dc43d5 docs(quick-7): complete pin default playlist to top plan
- Add 7-SUMMARY.md with implementation details and self-check
- Update STATE.md with quick task 007 entry and session context
2026-03-01 10:08:11 -05:00
yonlu e6378e1f0d feat(quick-7): wire frontend pin-default-playlist feature end-to-end
- Add pinDefault state, getter, setter to favorites-store
- Add pinDefault getter and setPinDefault to favorites-controller
- Update sortedEntries in playlist-view to pin default playlist to top
- Add Pin to Top toggle in config page Favorites section
- Add Wails bindings for GetPinDefaultPlaylist/SetPinDefaultPlaylist
- React to PinDefault in FavoritesConfigChanged event payload
2026-03-01 10:06:56 -05:00
yonlu 6e123bd47f feat(quick-7): add PinDefault config field with backend getter/setter
- Add PinDefault bool to favorites.Config struct with TOML tag
- Add GetPinDefaultPlaylist() and SetPinDefaultPlaylist() methods
- Include PinDefault in emitFavoritesChanged event payload
- Default to true (pinned) for new config installations
2026-03-01 10:05:22 -05:00
yonlu 0119cb469a docs(quick-006): complete remove list icon from playlist names plan
- Add 6-SUMMARY.md with execution results
- Update STATE.md with quick task 006 completion
2026-03-01 09:45:12 -05:00
yonlu 3c19766fd0 feat(quick-006): remove list icon from playlists, add favorites icon to default
- Replace static list icon with conditional: favorites icon for default playlist, nothing for others
- Reduce playlist-body left padding from 42px to 32px for tighter alignment without icon
2026-03-01 09:44:16 -05:00
yonlu e8570cbb62 docs(quick-5): complete sort dropdown for playlist view plan
- Add execution summary with task details and deviation log
- Update STATE.md with quick task 005 entry
2026-03-01 08:54:30 -05:00
yonlu 5c07485535 feat(quick-5): add sort dropdown UI and client-side sorting to playlist view
- Add sort toolbar with dropdown (Recent, Name, Date Created, Track Count)
- Add ascending/descending direction toggle button
- Persist sort preference in localStorage across view switches
- Default sort is Recent (modified DESC) matching existing DB order
- Replicate sort toolbar CSS pattern from track-list component
2026-03-01 08:53:06 -05:00
yonlu bdaff478e8 feat(quick-5): add CreatedAt/UpdatedAt to playlist Summary struct
- Add CreatedAt and UpdatedAt string fields to Summary struct
- Format as RFC3339 at all construction sites in playlist.go and favorites.go
- Update TypeScript bindings with new fields in models.ts
2026-03-01 08:51:00 -05:00
yonlu ea3648f3f8 docs(quick-5): plan sort dropdown for playlist view 2026-03-01 08:36:16 -05:00
yonlu 85412e2eaa docs(quick-4): Add set as default playlist context menu option for single playlist selection 2026-02-28 14:26:51 -05:00
yonlu af62fa4981 docs(quick-4): complete 'Set as Default Playlist' context menu plan
- Add 4-SUMMARY.md with execution results
- Update STATE.md with quick task 004 entry
2026-02-28 14:26:20 -05:00
yonlu 9971b635b8 feat(quick-4): add 'Set as Default Playlist' context menu option
- Add 'set-default' case in onPlaylistContextAction handler
- Add wa-dropdown-item with star icon in single-select guard block
- Option only appears when right-clicking a single playlist
2026-02-28 14:25:31 -05:00
yonlu a877031297 docs(quick-3): Add multi-select to playlist view with context menu delete support 2026-02-28 14:16:56 -05:00
yonlu 99401ab5c7 docs(quick-3): complete playlist multi-select plan
- Add 3-SUMMARY.md with execution results
- Update STATE.md with quick task 003 entry
2026-02-28 14:16:26 -05:00
yonlu c92ced2c74 feat(quick-3): wire playlist context menu for batch delete of selected playlists
- Update handlePlaylistContextMenu to respect multi-selection on right-click
- Make onPlaylistContextAction async with batch delete support
- Show 'Delete N Playlists' in context menu when multiple playlists selected
- Hide 'Rename' option when multiple playlists are selected
- Clear playlist selection after any context action completes
2026-02-28 14:15:24 -05:00
yonlu e13151ffa5 feat(quick-3): add playlist-level multi-select state and selection handling
- Add selectedPlaylists Set and lastSelectedPlaylistIndex for multi-select state
- Replace handleToggle with handlePlaylistHeaderClick supporting Ctrl/Shift+Click
- Clear playlist selection when entering track selection scope
- Clear playlist selection on outside clicks
- Add .playlist-header.selected CSS with selection background color
- Wire header click to new handler with selected class in template
2026-02-28 14:14:29 -05:00
yonlu be38937f84 docs(quick-002): complete auto-rename duplicate playlists on import summary
- Add 002-SUMMARY.md with task details and verification results
- Update STATE.md quick tasks table
2026-02-28 13:54:12 -05:00
yonlu 8ba8bbe7be feat(quick-002): add uniquePlaylistName helper and wire into ImportPlaylist
- Add uniquePlaylistName method to auto-rename duplicate names with (1), (2), etc.
- Call uniquePlaylistName only from ImportPlaylist, not CreatePlaylist
2026-02-28 13:53:21 -05:00
yonlu 04b2088b28 feat(quick-002): add CountPlaylistsByName SQL query and regenerate sqlc
- Add CountPlaylistsByName :one query to playlists.sql
- Regenerate sqlc to produce Go function
2026-02-28 13:52:21 -05:00
yonlu 981bd046da docs(quick-002): plan auto-rename duplicate playlists on import 2026-02-28 13:42:31 -05:00
yonlu a5be8e1efc docs(quick-001): multi-playlist import support 2026-02-28 13:33:28 -05:00
yonlu 50c8a3344a docs(quick-001): complete multi-playlist import support summary 2026-02-28 13:32:56 -05:00
yonlu 2a542bf3bc feat(quick-001): regenerate bindings and update frontend for multi-import
- Wails bindings reflect new PlaylistFilePicker and ImportPlaylists signatures
- Frontend handleImportPlaylist now passes file array to ImportPlaylists
2026-02-28 13:31:29 -05:00
yonlu c34e4ad029 feat(quick-001): add multi-file picker and batch import support
- Update PlaylistFilePicker to return []string via OpenMultipleFilesDialog
- Add ImportPlaylists method for sequential batch import with partial success
2026-02-28 13:30:36 -05:00
yonlu 7f52dce296 docs(quick-001): plan multi-playlist import support 2026-02-28 13:18:49 -05:00
yonlu 6b4f0bf14b docs(phase-01): complete phase execution 2026-02-28 12:16:37 -05:00
yonlu cd07bdf37b docs(01-01): complete SetContext race fixes plan
- Created 01-01-SUMMARY.md with execution results
- Updated STATE.md with Phase 1 completion and decisions
- Updated ROADMAP.md progress (Phase 1: 1/1 plans complete)
- Marked CORR-01 through CORR-04 complete in REQUIREMENTS.md
2026-02-28 12:13:44 -05:00
yonlu 3abaeba3af fix(01-01): collapse Player.SetContext double-lock into single acquisition
- Replaced two separate Lock/Unlock pairs with single Lock/defer Unlock
- Both p.ctx assignment and p.restoreStateLocked() now run under same lock hold
- Prevents observing partially-initialized state between the two operations
2026-02-28 12:09:34 -05:00
yonlu daaa6b7f97 fix(01-01): add mutex protection to Queue, Library, and Playlist SetContext methods
- Queue.SetContext acquires existing q.mu before writing q.ctx
- Library struct gets new mu sync.Mutex; SetContext and SetRescanHooks acquire it
- Playlist Service struct gets new mu sync.Mutex; SetContext and SetFavoritesConfig acquire it
- Library and Playlist release lock before calling post-init methods (registerEventHandlers, migrateExistingPlaylists)
2026-02-28 12:09:14 -05:00
yonlu 4e2986e19c docs(01): create phase plan for concurrency race fixes 2026-02-27 14:50:27 -05:00
yonlu c086215533 docs: create roadmap (8 phases) 2026-02-27 13:16:41 -05:00
yonlu cdffd13395 docs: define v1 requirements 2026-02-27 11:16:03 -05:00
yonlu 98fd06d725 docs: complete project research for consolidation milestone 2026-02-27 10:53:44 -05:00
yonlu 1953b26957 chore: add project config 2026-02-27 10:20:07 -05:00
yonlu 94d42ada7b docs: initialize project 2026-02-27 10:20:03 -05:00
yonlu 572b7fb664 docs: map existing codebase 2026-02-26 16:58:25 -05:00
yonlu d01f5e5d14 added "default playlist"/ favorites system 2026-02-25 22:53:57 -05:00
yonlu 51da5cfb07 no longer using forked beep 2026-02-25 21:16:29 -05:00
yonlu 4f3244c992 added mpris (linux media player controls) support 2026-02-25 20:51:29 -05:00
yonlu d5010e6fa8 default user volume is 50 now 2026-02-25 19:32:44 -05:00
yonlu 012131283c fixed startup ondomready call to use wails bindings and call when complete 2026-02-25 19:10:37 -05:00
yonlu cf144bf0dd refactored many events to use wails bindings, reducing boilerplate 2026-02-25 18:51:07 -05:00
yonlu baa4644ece extracted cover art handling from library package 2026-02-25 15:31:05 -05:00
yonlu 5689c1be42 added genre cache 2026-02-25 10:16:43 -05:00
yonlu 8f1ee25053 track list search results now sorted by relevance and highlighted 2026-02-25 01:09:54 -05:00
yonlu e192d4625e playlist phantom track matching added, updated search queries for efficiency 2026-02-24 21:23:25 -05:00
yonlu ff7649600b refactored full rescan to use hook/lifecycle pattern and added rescan package 2026-02-24 16:11:41 -05:00
yonlu 768a8cf1f2 replaced track info string map with a struct 2026-02-24 15:39:54 -05:00
yonlu d764fefb10 fixed library scan using event listeners instead of store pattern 2026-02-24 15:04:35 -05:00
yonlu 1221a403cf cover grid refactor
-split component into several files
2026-02-24 09:49:34 -05:00
yonlu 352fa9da61 split queue package into multiple files. other minor fixes 2026-02-24 08:34:28 -05:00
yonlu d55cfb2411 added slide animation to grid views 2026-02-23 23:54:42 -05:00
yonlu 153cd0eae0 added refactoring catalog, fixed context menu freezing tracklist 2026-02-23 20:54:50 -05:00
yonlu d925e3d659 added mutex to player to prevent simultaneous access 2026-02-23 20:06:41 -05:00
yonlu 16060023bb audio file info added, fixed right click selecting. 2026-02-23 19:05:57 -05:00
yonlu a6b476399e hovering now-playing cover thumb shows full-res art 2026-02-23 15:53:30 -05:00
yonlu 967816ccd2 scroll restore on artists and genres pages 2026-02-23 13:08:44 -05:00
yonlu 3349e785d7 playing a new queue with shuffle enabled now starts at a random track. 2026-02-23 12:13:40 -05:00
yonlu 1dfbfd9595 added multi-select to artists and genres views 2026-02-23 11:46:44 -05:00
yonlu 588acf09ef added genres page 2026-02-23 11:10:21 -05:00
yonlu a08d59a4a0 context submenus now close when not hovering over 2026-02-23 10:47:32 -05:00
yonlu 90b7661483 added track-details page 2026-02-23 10:38:27 -05:00
yonlu d89dee44e3 single track drag-and-drop ghost 2026-02-23 09:42:11 -05:00
yonlu bd9652b378 faster fetching for artist albums 2026-02-22 20:42:32 -05:00
yonlu ab5f690c05 search results pill added to artist grid 2026-02-22 20:30:28 -05:00
yonlu 3c06277820 added context menu to artist grid 2026-02-22 19:52:46 -05:00
yonlu 9dabfb81c5 beginnings of artist grid and artist details view 2026-02-22 19:17:27 -05:00
yonlu 30bbdd7c53 added basic sorting in track-list and cover-grid 2026-02-22 17:16:01 -05:00
yonlu 8a2ceb9107 improved column resize logic 2026-02-22 14:53:35 -05:00
yonlu d3b04a9c29 added visual indicator of search results 2026-02-22 14:13:35 -05:00
yonlu 9cb1c6674a changed genre scanning to parse multiple genres, updated db to accommodate. 2026-02-22 13:59:28 -05:00
yonlu 3947c2d6aa fixed drag-and-drop visual styling 2026-02-22 11:44:51 -05:00
yonlu b5e70a8ce6 user can configure visible columns in track-list 2026-02-22 11:24:19 -05:00
yonlu 9d84a11543 drag and drop enhancements, fixed playlist creation using old db entries, added icons-only sidebar when small width 2026-02-21 14:16:37 -05:00
yonlu 8ad952e750 Merge branch 'wip' of github.com:LJ-Software/yellowjacket into wip 2026-02-21 11:06:11 -05:00
yonlu 4d9ab5d2b8 cleaned up album selection behavior, context menu now closes when clicking outside of it 2026-02-21 11:02:54 -05:00