Commit Graph
63 Commits
Author SHA1 Message Date
vicrodh fa6538df2c feat(keybindings): implement centralized keybindings system
Phase 1: Core infrastructure
- Add keyboard.ts with event-to-shortcut conversion, display formatting
- Add keybindingsStore.ts with action registry, conflict detection, persistence

Phase 2: Migration
- Migrate +page.svelte shortcuts to use keybinding manager
- Register global actions: playback, navigation, UI controls
- Integrate FocusMode with contextual seek actions
- Simplify ExpandedPlayer to use keybinding handler
- Add i18n translations for keybinding labels (en/es)
2026-02-02 23:02:33 -06:00
vicrodh 739c29b2c9 i18n: translate GenreFilter module to Spanish
- Add genreFilter section to en.json and es.json with all filter UI strings
- Translate GenreFilterButton: genre prefix, genre count, filter title
- Translate GenreFilterPopup: title, options, expand/collapse, clear
- Use get(t) pattern for translations inside functions
2026-02-02 18:32:01 -06:00
vicrodh 3919b59eb2 i18n: translate LocalLibraryTagEditorModal to Spanish
- Translated modal title and form labels
- Translated search buttons and results text
- Translated table headers (track, title, disc)
- Translated persistence options (sidecar vs direct)
- Translated progress states (writing tags, saving)
- Added placeholder translations for year and genre examples
2026-02-02 18:19:49 -06:00
vicrodh 059dce3114 i18n: translate PlaylistModal to Spanish
- Translated modal titles (new/edit/add to playlist)
- Translated form labels and placeholders
- Translated buttons (create, save, cancel, delete)
- Translated track count and playlist count labels
- Added missing translation keys for actions (add, create, deleteConfirm)
- Used get(t) in $derived() to avoid PostCSS extraction issues
2026-02-02 18:14:32 -06:00
vicrodh a489b2e875 i18n(search): translate context menus and empty states
- Update play menu items (Play now, Play next, Add to queue)
- Update navigation items (Go to artist, Go to album)
- Translate View more buttons
- Add noPlaylistsFor translation key

cc
2026-02-02 17:21:08 -06:00
vicrodh 5900e0bb83 i18n(settings): translate integrations section labels and placeholders
- Update Last.fm API key and shared secret labels
- Update Last.fm authorize button text
- Update ListenBrainz labels and token hint
- Add translations for connecting/opening states
- Add apiKey, sharedSecret, userToken translation keys

cc
2026-02-02 17:19:16 -06:00
vicrodh ef99d5f0ce i18n(components): translate dropdown placeholders and modal labels
- Update Dropdown.svelte with search placeholder translation
- Update DeviceDropdown.svelte with searchDevices placeholder
- Update GenreFilterPopup.svelte with searchGenres placeholder
- Update PlaylistModal.svelte with name and description labels
- Add playlist.name and playlist.descriptionOptional keys

cc
2026-02-02 17:17:40 -06:00
vicrodh 5b35851f41 i18n(library): translate empty states and headers
- Add translations for loading/error states
- Translate empty states for albums, artists, tracks views
- Translate header titles and subtitle
- Update button titles (Scan, Settings, Play All, Shuffle)
- Translate offline mode notice
- Translate filter panel labels
- Add editAlbumMetadataTitle key for tooltips

cc
2026-02-02 17:15:29 -06:00
vicrodh 1e2d074065 i18n(favorites): translate empty states, loading, and headers
- Add t import and use translations for all empty state messages
- Translate loading states (favorites, playlists, albums)
- Translate section headers (Discography, EPs & Singles, Live Albums)
- Translate button titles (Play All, Shuffle, More, Search, Clear)
- Add hint translations for liking items to favorites
- Update getSortLabel to use sort.* translation keys
- Update getTabLabel to use favorites.tabLabels.* keys

cc
2026-02-02 17:10:52 -06:00
vicrodh ca11c43a4b merge: fix/general-debug-1.1.7 into pre-release (resolve i18n conflicts) 2026-02-02 16:41:38 -06:00
vicrodh 0c5c0ce1a8 i18n: add LocalLibraryView translations for empty states and UI 2026-02-02 16:38:53 -06:00
vicrodh 1d2a9f6636 i18n: add Settings, Storage, and Blacklist Manager translations
- MusicBrainz integration labels
- Storage section summary
- Complete BlacklistManagerView translations (title, description,
  search, empty states, confirm modal)
2026-02-02 16:38:02 -06:00
vicrodh a63bc1cbcd merge: integrate pre-release blacklist feature with i18n fixes 2026-02-02 16:34:52 -06:00
vicrodh 805fec1529 i18n: add Settings audio, offline library, and updates translations
Complete Spanish translations for:
- Audio settings (backend, ALSA plugin, hardware volume, streaming)
- Offline library section (repair, manage, clear)
- Updates section (check on launch, show changelog)
- Flatpak warning messages
2026-02-02 16:29:04 -06:00
vicrodh 2dc9989d22 i18n: Add greeting and toast translations
- Add time-based greeting translations (goodMorning, goodAfternoon,
  goodEvening, goodNight) to homeSettings section
- Update homeSettingsStore to export getGreetingInfo for i18n support
- Update HomeView.svelte to use translated greetings
- Add comprehensive toast translations (~60 keys) for all user-facing
  notifications including queue, playback, offline, favorites, etc.
- Update +page.svelte to use $t() for all showToast calls
- Complete Spanish translations for all new keys
2026-02-02 15:45:35 -06:00
vicrodh e09c7e4a94 i18n: add missing Spanish translations for settings, audio, library and metadata 2026-02-02 15:35:04 -06:00
vicrodh f95348bb1e feat(blacklist): add Blacklist Manager View
- Create BlacklistManagerView component with list of blocked artists
- Add enable/disable toggle, search filter, and clear all function
- Integrate navigation to blacklist manager from Settings
- Add Content Filtering section in Settings with artist count
- Add i18n translations for English and Spanish
- Wire up view routing in +page.svelte
2026-02-02 13:46:27 -06:00
vicrodh 90e4216826 Merge feature/immersive-player into pre-release 2026-02-01 04:31:59 -06:00
vicrodh e08593af41 feat(nowplaying): make track title clickable to open track info modal
Added onTrackClick handler to NowPlayingBar that opens TrackInfoModal when
the track title is clicked. Uses cursor: help for informative visual cue.
Only works for non-local tracks.
2026-02-01 04:04:02 -06:00
vicrodh 38b7ea7aef fix: enforce streaming quality setting by clearing cache on change
Issue #34 - Max quality setting not respected

Changes:
- Remove 'Prefer Highest Available' toggle (was dead code, conflicted with quality dropdown)
- Clear playback cache (L1+L2) when streaming quality changes
- Show toast notification when cache is cleared
- Add description to streaming quality setting
- Update i18n for new messages (en/es)

This ensures the quality setting takes effect immediately, important for:
- Users with metered internet connections
- Users with hardware sample rate limitations (e.g., DACs limited to 96kHz)

The Qobuz API respects format_id and downsamples server-side, so this
change guarantees the correct quality is fetched for new streams.
2026-01-31 23:15:09 -06:00
vicrodh 011ee02ec9 Merge pre-release into feature/immersive-player
Resolved conflicts:
- src-tauri/src/api/client.rs: Keep TrackUnavailable error handling
- i18n files: Combined immersive player keys with trackUnavailable key
2026-01-31 17:19:03 -06:00
vicrodh 6e55e36652 fix: use proper i18n keys in TrackReplacementModal
Added playlist-specific keys for search button, cancel, loading,
and preview instead of generic common.* keys that didn't exist.
2026-01-31 17:05:46 -06:00
vicrodh 2ffd9df133 feat: add "Find available version" option for unavailable tracks
- Add TrackReplacementModal to search for replacement tracks
- Add onFindReplacement action to TrackMenu context menu
- Show replacement option only for owned playlists with unavailable tracks
- Replacement searches by track title + artist
- Shows quality info (bit depth, sample rate) to help user choose
- Supports preview playback before confirming
- Replace old track with new one in playlist

Also fix tooltip for unavailable tracks to show a complete message
instead of "is no longer available" (now shows "Track no longer
available in Qobuz library")
2026-01-31 16:45:23 -06:00
vicrodh e68c3128b6 feat: auto-skip unavailable tracks with user-friendly error
Backend:
- Add TrackUnavailable error type for tracks removed from Qobuz
- Validate stream URL response - detect missing URL with restrictions
- Add SampleRestrictedByRightHolders to restriction check
- Return specific error when track is unavailable vs quality unavailable

Frontend:
- Detect track unavailable errors in playTrack()
- Show friendly toast: Track title is no longer available
- Auto-skip to next track in queue after 500ms delay
- Add i18n translations (en/es) for trackUnavailable message
2026-01-31 16:10:26 -06:00
vicrodh e479705803 feat(immersive): implement Suggestions panel with artist playlists and radio
Layout:
- Top section: Artist curated playlists (from Qobuz) + Song Radio card (QBZ)
- Bottom section: Recommended tracks from artist's discography

Features:
- Artist playlists fetched via get_artist_detail (includes curated playlists)
- Song Radio card with experimental badge and tooltip
- Recommended tracks shuffled from artist's tracks_appears_on
- Single API call per artist (efficient loading)
- Loading state with spinner, empty state handling
- Play buttons with hover effects

Technical:
- Uses existing create_track_radio command for radio generation
- Tracks loadedArtistId to prevent duplicate requests
- Added translations for songRadio, radioExperimental, recommendedTracks
2026-01-31 12:22:39 -06:00
vicrodh fe274c466d feat(immersive): replace Credits panel with Track Info panel
- Create TrackInfoPanel with full track metadata and credits
- Display: duration, quality, ISRC, label, and all performer credits
- Uses same backend as TrackInfoModal (get_track_info command)
- Rename tab from 'Credits' to 'Track Info' (player.trackInfo)
- Update keyboard shortcut from 'C' to 'T' for Track Info tab
- Fix actions.clearQueue -> player.clearQueue translation key
- Add i18n translations for trackInfo in EN/ES
- Delete old placeholder CreditsPanel
2026-01-31 11:12:25 -06:00
vicrodh f012ba33f4 perf(immersive): fix critical CPU usage issue in background blur
Performance problem:
- WebKitWebProcess consuming 97% CPU on one core
- Cause: CSS filter: blur(120px) on large image is extremely expensive
  in WebKit/GTK which cannot GPU-accelerate this operation

Solution:
- Replace CSS blur with Canvas-based tiny thumbnail approach
- Draw image to 8x8 canvas, apply color adjustments, scale up via CSS
- Natural pixelation creates blur-like effect with ZERO CPU cost
- Remove backdrop-filter: blur() from header elements (use solid bg)

Also fixed:
- Change Mic icon to Mic2 to match rest of app
- Add missing i18n translations for player.credits and player.suggestions
2026-01-31 11:01:34 -06:00
vicrodh 7b5cf5e0a6 feat(settings): add theme filter, collapsible sections, and compact account
- Add Kurosaki light theme (cream/gold color palette)
- Add theme type filter button (dark/light/all) to cycle through themes
- Make Offline Library and Storage sections collapsible with descriptions
- Compact Account section with inline layout and subscription badge
- Navigation items now use i18n translation keys for reactive labels
2026-01-30 08:40:01 -06:00
vicrodh fb0ab88b51 fix: refresh theme palettes and names
cx
2026-01-29 16:33:45 -06:00
vicrodh 21b1950857 feat: add Mira theme and reorder list
cx
2026-01-29 13:57:23 -06:00
vicrodh 0056d74824 chore: update theme slugs
cx
2026-01-29 13:54:10 -06:00
vicrodh 7f9a580a8c feat: rename new theme labels
cx
2026-01-29 13:30:32 -06:00
vicrodh edfb167393 i18n: add translations for sort options and artist sections
- Add sort translations: default, newest, oldest, titleAsc, titleDesc, artist
- Add missing artist section translations: tributes, others, playlists
- Both English and Spanish locales updated
2026-01-23 17:19:42 -06:00
vicrodh d8d87c8955 feat(favorites): add album sorting options
Add sort dropdown for favorite albums with options:
- Default (API order)
- Newest First (by release date)
- Oldest First (by release date)
- Title (A-Z / Z-A)
- Artist

Sort preference is persisted to localStorage.
2026-01-23 16:41:51 -06:00
vicrodh 077aa01356 feat(settings): add system tray settings
Add tray icon configuration options:
- Enable/disable tray icon (requires restart)
- Minimize to tray: hide window when clicking minimize
- Close to tray: hide window instead of quitting

Rust backend: TraySettingsState with SQLite persistence
Frontend: SettingsView tray subsection with toggles

Related to #15 (title bar settings)
2026-01-23 16:38:17 -06:00
vicrodh 3fb597f3fb fix(settings): simplify title bar settings to hide-only option
Remove "Use QBZ title bar" toggle since switching to system decorations
doesn't work reliably on Linux when the window was created without
decorations. Keep only "Hide title bar" option for tiling WM users.
2026-01-23 16:28:50 -06:00
vicrodh 3ac957ddda feat(settings): add title bar configuration
Phase 1 implementation:
- Add titleBarStore.ts for managing title bar visibility
- "Use QBZ title bar" toggle (default ON) - switches between custom and system decorations
- "Remove title bar" toggle (default OFF) - hides title bar completely for tiling WM users
- Dynamically adjust layout heights when title bar is hidden
- Add i18n translations (en/es)
- Settings integrate with Tauri window.setDecorations() API
2026-01-23 16:16:20 -06:00
vicrodh d0177096af feat(ui): add collapsible sidebar
- Add sidebarStore.ts for expanded/collapsed state with localStorage persistence
- Modify NavigationItem to support collapsed mode (icon-only with tooltip)
- Update Sidebar component with toggle button and collapsed styles
- Width transitions from 280px (expanded) to 64px (collapsed)
- Add i18n translations for collapse/expand actions (en/es)
2026-01-23 15:31:49 -06:00
vicrodh 0f025ae5ef refactor(i18n): replace download terminology with offline library
- Update en.json and es.json with new terminology
- Change "Download" to "Make available offline"
- Change "Downloads" section to "Offline Library"
- Update notifications: cachingStarted, cachedForOffline, cachingFailed
- Update UI copy in SettingsView, TrackMenu, AlbumMenu
- Update toast messages in +page.svelte to use offline terminology
- Change DownloadButton tooltips to use offline language

cc
2026-01-23 11:50:17 -06:00
vicrodh 9501a4b909 fix(queue): improve Up Next counter with total, remaining, and infinite modes
- Show format: (20 of 139, 135 left) for normal playback
- Show format: (20 of ∞) for infinite play or radio mode
- Remove Load More from Queue section (not needed)
- Add Load More to History section for tracks > 20
- Add isRadioMode prop to detect radio context
- Pass both queueTotalTracks and queueRemainingTracks
2026-01-23 11:01:08 -06:00
vicrodh fe3db6397a fix(queue): show real queue total in Up Next counter (X of Y) 2026-01-23 10:49:40 -06:00
vicrodh 4ea105edd9 fix(queue): center spectrum animation, add infinite play banner, fix playlist context
- Center spectrum bars in album art with subtle glow effect
- Add dismissible banner when infinite play is enabled
- Add detailed tooltip for infinite play button
- Fix missing playback context when using Play All in playlists
2026-01-23 10:41:07 -06:00
vicrodh 84c2261829 feat(queue): redesign QueuePanel with tabs, history, and infinite play
- Add Queue/History tabs with new layout
- Implement Now Playing card with spectrum animation
- Add History tab showing recently played tracks from backend
- Add Infinite Play toggle (persisted to localStorage)
- Relocate search to footer (expands left)
- Add Up Next counter (X/Y format)
- Implement 20-track pagination with load more
- Add proper i18n keys for new features
- Add new SVG icons (add-to-list, trash-list)
2026-01-23 10:28:16 -06:00
vicrodh 2a8b7c6d55 feat: Qobuz™ compliance, subscription gating, and settings cleanup
cx
2026-01-22 10:33:45 -06:00
vicrodh 5bd52cc89b feat(phase4.3): add favorites edit modal component
- Create FavoritesEditModal with preset icon grid
- Add custom image upload button
- Add tab reorder UI with up/down buttons
- Integrate edit button in Favorites page header (top-right)
- Add i18n keys for EN and ES
- Wire modal save handler to backend

cc
2026-01-18 14:02:37 -06:00
vicrodh 12067d7a61 fix(phase3): context navigation and autoplay persistence
- Fixed context navigation using correct property names (.type, .id)
- Simplified autoplay setting from radio buttons to toggle switch
- Fixed tooltip using native title attribute (like QualityBadge)
- Removed custom tooltip CSS and hover state
- Updated translations (en/es) for clearer autoplay behavior description

cp
2026-01-18 04:53:43 -06:00
vicrodh ae3a90d378 fix(i18n): add translations for playback preferences
Added translations for:
- Autoplay behavior setting
- Continue within source / Play only selected track options
- Show context icon setting and tooltip

Both English and Spanish translations added.

Changed StackIcon tooltip to use native browser title (matches QualityBadge style).
Removed arrow indicator from context icon (cursor change is sufficient).

cp
2026-01-18 04:09:20 -06:00
vicrodh cac5a0c173 Remove unused API Keys UI and infrastructure
All API requests now go through Cloudflare Workers proxy.
User-provided credentials were collected but never used.

Removed:
- src-tauri/src/api_keys.rs (entire module)
- API Keys section from Settings UI
- ApiKeysState and related commands
- User credential parameters from providers
- Simplified DiscogsClient (removed with_user_credentials)
- Cleaned up imports and translations

Moved documentation:
- CHANGELOG-api-keys-refactor.md
- HANDOFF-MERGE.md
- MERGE-PREP.md
- POST-MERGE-CLEANUP.md
Moved to: qbz-nix-docs/feature-api-keys-refactor/

This cleanup reduces codebase by ~715 lines and removes
confusing UI that promised functionality that didn't work.
2026-01-17 17:09:49 -06:00
vicrodh c810663c6f feat: implement 3-state DAC badge and hardware sample rate detection
Backend changes:
- Add audio_diagnostics module to read actual hardware sample rate from /proc/asound
- New command get_hardware_audio_status() parses hw_params for real-time monitoring
- Add glob dependency for file pattern matching

Frontend (AudioOutputBadges):
- Implement 3-state DAC badge system:
  - Green: DAC passthrough working correctly (rates match)
  - Yellow: DAC passthrough ON but resampling detected (warning)
  - Gray: DAC passthrough OFF (intentionally disabled)
- Dynamic tooltips showing actual hardware sample rate
- Compare file sample rate vs hardware sample rate
- Increase tooltip z-index to 9999 to prevent occlusion issues
- Add pointer-events: none to tooltip to prevent interaction issues

Frontend (SettingsView):
- Replace hardcoded "192 kHz" with dynamic hardware sample rate
- Load and display actual hardware audio status
- Show format details (e.g., S32_LE) when available
- Display "No active playback" when no audio is playing
- Add muted styling for inactive state

Frontend (QualityBadge):
- Add native tooltip showing tier and format
- Add cursor: help to indicate interactivity

i18n:
- Add "noActivePlayback" translations (EN/ES)

This allows users to verify bit-perfect playback is working and detect
resampling issues that would compromise audio quality.
2026-01-16 21:14:22 -06:00
vicrodh 9499203c69 Refine offline mode UX for unavailable tracks and playlist filters
- Remove wifi-off icon from unavailable tracks in playlist detail view,
  keeping only the disabled styling for a cleaner look
- Rename "Available Offline" filter to "Fully Available Offline" to
  clarify it shows only playlists where all tracks are available
- Update filter logic to only show all_local playlists in the fully
  available filter, not partially available ones
- Fix visible filter in offline mode to respect showPartialPlaylists
  setting by using isPlaylistAvailableOffline function
2026-01-16 09:35:40 -06:00