Commit Graph
212 Commits
Author SHA1 Message Date
vicrodh 99877fa740 fix(v2): align immersive track info/radio and i18n history keys
cx
2026-02-16 19:27:47 -06:00
vicrodh 58f1957a05 feat(runtime): implement phased V2 login commands for runtime contract
Add V2 commands that implement the ADR Runtime Session Contract:
- v2_init_client: Phase 1 - init client only (bundle tokens)
- v2_auto_login: Phase 2 - auto-login with blocking V2 auth
- v2_manual_login: Manual login with blocking V2 auth

This allows frontend to control ToS check between init and auth:
1. v2_init_client() -> InitializedNoAuth
2. activate_user_session() -> restore session
3. loadTosAcceptance() -> check ToS
4. v2_auto_login() or v2_manual_login() -> Ready

V2 CoreBridge auth is now REQUIRED per ADR - login fails if V2 fails.

Migrate LoginView.svelte to use new V2 commands:
- Replace init_client with v2_init_client
- Replace auto_login with v2_auto_login
- Replace login with v2_manual_login

Add i18n keys for V2 auth errors in all 4 locales.
2026-02-15 04:02:34 -06:00
vicrodh 3a8ef43227 feat(audio): add device refresh button and per-DAC sample rate limit
- Add refresh button next to device dropdown to re-enumerate devices
  without app restart (fixes #69)
- Re-enable quality limiting with per-device sample rate storage
- User can manually set max sample rate per DAC (44.1k to 384k)
- Quality limiting is opt-in (disabled by default)
- Streaming Quality dropdown always takes priority (fixes #72)

Backend: HashMap<device_id, max_rate> stored as JSON in SQLite
Frontend: Conditional UI shows rate dropdown when limit is enabled
2026-02-13 12:56:50 -06:00
vicrodh 333e6f224a feat(ui): show default device name under System Default option
Adds a help text showing which device is the current system default.
This helps users understand what "System Default" will actually use.

Backend:
- New command `get_default_device_name` that uses pactl for PipeWire/Pulse
  and CPAL for ALSA to get the current default device

Frontend:
- Shows "(System Default is: <device name>)" under the output device setting
- Styled as secondary description text (italic, muted)

Translations added for en, es, de, fr.
2026-02-13 12:35:56 -06:00
vicrodh ebae1aa83a feat(ui): add volume step buttons and playlist search
- Add +/- buttons to volume control for 5% increments
- Reduce SongCard min-width from 508px to 436px
- Add playlist search in sidebar header with expandable input
- Add translations for new features in all 4 locales

cc
2026-02-13 07:54:36 -06:00
vicrodh 3f8914e8cb Move graphics settings to Composition section
- Add Hardware Acceleration toggle to Composition section
- Move Force DMA-BUF toggle from Developer Mode to Composition
- Add i18n keys for new composition toggles (en, es, de, fr)

These settings logically belong together since they both control
GPU rendering behavior. Hardware Acceleration is the broad switch
that enables GPU; Force DMA-BUF controls the specific buffer-sharing
mechanism with the compositor.
2026-02-12 14:16:52 -06:00
vicrodh 14e657e8af Optimize console log capture in production
Only capture log/info levels in dev builds or when verbose mode is
explicitly enabled in Developer Mode. Always capture error/warn for
bug tracking. Reduces GC/CPU overhead in production builds.

Adds toggle in Settings > Developer Mode to enable verbose capture
when debugging production issues.
2026-02-12 13:34:02 -06:00
vicrodh 9c5245f2ce Add context menu for queue tracks
QueuePanel:
- Add vertical ... icon to the right of track duration
- Context menu with 3 options:
  - Remove from Queue (calls backend remove_from_queue)
  - Add to Playlist (reuses existing playlist modal)
  - Show Track Info (reuses existing track info modal)
- Menu shows on button click, closes on click outside

+page.svelte:
- Add handlers: handleRemoveFromQueue, handleQueueTrackAddToPlaylist,
  handleQueueTrackInfo
- Wire up new QueuePanel props

i18n: Add toast messages for remove from queue (all 4 locales)
2026-02-12 13:20:08 -06:00
vicrodh 1959000fd0 Expose graphics fallback status to UI with warning
Backend:
- Add static atomics to track graphics startup state
- Add set_startup_graphics_state() called from main.rs
- Add get_graphics_startup_status command for frontend

Frontend (SettingsView):
- Query graphics startup status on mount
- Show prominent red warning in Composition section when
  using fallback graphics settings
- Display recovery command (qbz --reset-graphics)

i18n: Add fallbackWarning/fallbackDesc to all 4 locales

This helps users understand when graphics settings failed to
load and may be causing performance degradation.
2026-02-12 13:11:47 -06:00
vicrodh a69009d23d feat: add "Make available offline" option for playlists
Cherry-picked from main (126a5714)

cc
2026-02-12 09:46:13 -06:00
vicrodh 968a9d7116 fix: disable gapless when DAC Passthrough is active
Cherry-picked from main (ab3dac32)

cc
2026-02-12 09:45:55 -06:00
vicrodh aed7e43c0f feat(settings): add collapsible Composition section in Appearance
Replace the misleading Hardware Acceleration toggle (which was a no-op
since v1.1.12 reverted to env-var-only control) and the standalone
Force X11 toggle with a collapsible "Composition" subsection that:

- Groups all GPU/rendering settings in one place
- Shows help text explaining what the section controls
- Includes a crash recovery warning with terminal command
- Keeps Force X11 toggle (functional, writes to DB)
- Adds GDK_SCALE and GDK_DPI_SCALE inputs (shown when Force X11 on)
- Lists all env var overrides with descriptions
- Translated in all 4 locales (en, es, de, fr)
2026-02-10 20:32:40 -06:00
vicrodh 0f31dcd310 feat: add persistent Force X11 setting for Wayland crash workaround
Add a toggle in Settings > Appearance to force X11 (XWayland) backend
on Wayland sessions. Persisted in graphics_settings.db, env var
QBZ_FORCE_X11=1|0 overrides for crash recovery. Also fixes the
display server log to report effective GDK backend instead of
session type.
2026-02-10 07:18:15 -06:00
vicrodh b76b369d9b feat: wire up discover playlists browse page with navigation and i18n 2026-02-10 01:51:31 -06:00
vicrodh ba62057545 feat: add Qobuzissimes, Albums of the Week, Press Accolades browse pages
- Add 3 new Rust endpoint constants and command mappings for
  /discover/qobuzissims, /discover/albumOfTheWeek, /discover/pressAward
- Add 3 new navigation ViewType values and genre filter contexts
- Extend DiscoverBrowseView to handle the 3 new endpoint types
- Add See All links with chevron caret and pipe separator to all 6
  discover sections in HomeView (newReleases, mostStreamed,
  essentialDiscography, qobuzissimes, editorPicks, pressAwards)
- Wire up 3 new views in +page.svelte with full album action callbacks
- Rename Editor's Picks to Albums of the Week, Press Awards to Press
  Accolades across all 4 locale files (en, es, de, fr)
- Fix rank badge: top-right position, Impact font, 35px size
- See All styling: inline-flex with ChevronRight icon, pipe divider,
  15px gap before nav buttons, #666666 color matching nav buttons
2026-02-10 01:10:28 -06:00
vicrodh c9bdcae855 feat: add discover browse pages for New Releases, Ideal Discography, Top Albums
Add full-page browsing views for the three discover sections that were
previously only shown as limited carousels on the Home page.

Backend: add get_discover_albums Tauri command with endpoints for
newReleases, idealDiscography, and mostStreamed. Uses paginated API
calls with genre_ids filtering.

Frontend: new DiscoverBrowseView component with virtualized grid/list,
genre filter dropdown, client-side search, and infinite scroll.
VirtualizedFavoritesAlbumGrid gains ranking support (showRanking),
infinite scroll (onLoadMore), and loading indicator.

HomeView sections now show "See All" links that navigate to the
dedicated browse pages. i18n keys added to all 4 locales.
2026-02-10 00:46:39 -06:00
vicrodh 4bbf97a131 feat(playlist-import): multipart playlists for 2000+ track imports
Qobuz limits playlists to 2000 tracks. When matched tracks exceed
this limit, the importer now automatically splits into multiple
playlists named "Playlist (Part 1)", "Playlist (Part 2)", etc.

- models.rs: qobuz_playlist_id -> qobuz_playlist_ids Vec, add parts_created
- importer.rs: chunk matched tracks by 2000, create playlist per chunk
- Frontend: show parts count in summary, move all parts to folder
- i18n: add partsCreated key in en/es/de/fr
2026-02-09 18:43:46 -06:00
vicrodh 9fdd1dd0df feat(playlist-import): concurrent matching with progress reporting
Replace sequential track matching with buffer_unordered(8) for 8
concurrent Qobuz API calls, reducing import time ~8x. Add real-time
progress events (import:progress, import:phase) emitted from Rust
backend and consumed by frontend via Tauri event listeners.

Frontend shows progress bar, matching status text, and current track
name during import. Individual search failures are now logged and
skipped instead of aborting the entire import.
2026-02-09 17:53:04 -06:00
vicrodh 8cc0a8a6ae fix(i18n): replace hardcoded strings in PlaylistModal
Replace 5 hardcoded validation messages ('Please enter a playlist
name', 'Please select a playlist') with i18n keys playlist.enterName
and playlist.selectPlaylist across all 4 locales.
2026-02-09 17:23:12 -06:00
vicrodh f85d04fa68 fix(playlist): migrate duplicate modal to Svelte 5 and add i18n
Migrate PlaylistDuplicateConfirmModal from Svelte 4 (export let,
createEventDispatcher, on:click) to Svelte 5 ($props, callback
props, onclick). Replace hardcoded English strings with i18n keys
under playlist.duplicates for all 4 locales (en, es, de, fr).
2026-02-09 17:13:23 -06:00
vicrodh fcafac095c fix(window): always restart on system titlebar toggle
Runtime decoration toggling doesn't work reliably in either direction
on Linux/Wayland. Always restart the app so the window is recreated
with the correct decoration state.
2026-02-09 14:40:31 -06:00
vicrodh 68b227f46c fix(window): only restart when enabling system titlebar
Disabling system titlebar works at runtime (decorations:true -> false
is fine on Linux/Wayland). Only enabling requires a restart because
the window must be born with decorations:true for WM buttons to work.

When disabling: remove OS decorations via setDecorations(false) and
restore the custom title bar immediately via notifyListeners().
2026-02-09 13:38:12 -06:00
vicrodh c88974c468 feat(window): restart app on system titlebar toggle
Since the window must be created with the correct decoration state
(runtime toggling doesn't work on Linux/Wayland), persist the setting
to the Rust backend and restart the app immediately.

Add restart_app Tauri command using AppHandle::restart(). Update i18n
descriptions to inform the user the app will restart.
2026-02-09 13:36:57 -06:00
vicrodh 7b5bd166d4 feat(settings): add system title bar toggle
Add option to use OS native window decorations instead of the custom
QBZ title bar. Uses Tauri setDecorations() API to toggle at runtime.
Disables "Hide title bar" toggle when system bar is active.
2026-02-09 13:03:56 -06:00
vicrodh ada4e85606 Merge remote-tracking branch 'origin/feature/internal/plex-lan-local-poc' into pre-release 2026-02-09 04:33:48 -06:00
vicrodh 28020f0efa feat(settings): refine plex integration ux and labels
cx
2026-02-09 04:30:13 -06:00
vicrodh 0c62e43a56 feat(plex): redesign settings flow and gate local library integration
cx
2026-02-09 03:38:57 -06:00
vicrodh fb3204f2e4 merge(pre-release): sync latest integration branch into plex feature
cx
2026-02-09 02:25:37 -06:00
vicrodh 2eeb8cf865 Add hardware acceleration toggle in Settings > Appearance
GPU rendering is opt-in via a toggle with restart-required toast.
Recovery from crash: QBZ_HARDWARE_ACCEL=0 qbz (env var always
overrides the stored setting). i18n keys added to all 4 locales.
2026-02-09 02:12:59 -06:00
vicrodh bf99a19eb3 fix(plex): hydrate track quality and show plex source indicator
cx
2026-02-09 01:47:24 -06:00
vicrodh 228563454b feat(plex): checkpoint plex lan integration and quality sync
cx
2026-02-09 01:28:11 -06:00
vicrodh 659a5b7718 Add i18n keys for structured quality tooltip
Replace single degradedTooltip string with quality.tooltip.*
keys (source, output, resampled, fix) for the new custom tooltip
in QualityBadge. Updated all 4 locales (en, es, de, fr).
2026-02-08 16:26:31 -06:00
vicrodh 2040ab116c Add degraded quality tooltip explaining resampling and how to fix it 2026-02-08 15:55:53 -06:00
vicrodh edaf6e442c Rework LogsModal: per-tab upload, URL display with copy, bug report hint
Upload is now per-tab (Terminal/Console separately). Each tab shows a
checkmark after upload. URL displayed inline with copy button. Help text
appears after first upload encouraging users to share both URLs.
2026-02-08 15:13:52 -06:00
vicrodh 2fda58b823 Add i18n keys for Developer Mode section in all 4 locales 2026-02-08 15:01:02 -06:00
vicrodh 33d69ef3f3 Add i18n keys for reset audio, factory reset; move streaming keys to playback
Moves streamUncached, initialBuffer, streamingOnly and related keys
from settings.audio to settings.playback in all 4 locale files.
Adds reset audio/playback keys to settings.audio section.
Adds factory reset keys to settings.storage section.
2026-02-08 14:06:46 -06:00
vicrodh 857c2da99d fix(i18n): add missing actions.playNext key to all locales
The Favorites tracks context menu used actions.playNext which did
not exist, showing the raw key instead of the translated label.
2026-02-08 12:16:26 -06:00
vicrodh d2531ea700 refactor(ui): move gapless toggle from player bar to settings
Remove gapless button from NowPlayingBar and place it in
SettingsView under Playback section. The toggle is now sensitive to
blocking settings: auto-disables when ALSA Direct backend or
streaming-only mode is activated. Gapless itself never blocks other
settings. Added inline experimental label and descriptive tooltips
with proper i18n for all 4 locales.
2026-02-08 10:18:52 -06:00
vicrodh 71bfb8dc17 feat(ui): add gapless playback toggle button to player bar
Add a toggleable gapless button next to the repeat button in the
NowPlayingBar. The setting persists in audio_settings.db and controls
whether the audio thread pre-queues the next track for gapless
transitions. Includes i18n keys for all 4 locales.
2026-02-08 09:45:13 -06:00
vicrodh 00d0ce7835 feat(ui): add normalization toggle to player bar
Adds 3-state normalization icon between fullscreen and volume controls.
Uses mask-image SVGs for theme-compatible coloring. Reduces song card
min-width by 72px to accommodate the new control.
2026-02-07 22:55:18 -06:00
vicrodh a237be3a83 Differentiate DAC Passthrough tooltip from ALSA Direct bit-perfect
DAC badge tooltip now says "Active" instead of "Bit-perfect" since
PipeWire passthrough is best-effort, not guaranteed bit-perfect like
ALSA Direct hw:X,Y. Added a brief note in Settings when DAC Passthrough
is enabled clarifying the distinction. Also i18n'd the hardcoded
dacPassthroughTooltipOverride string in SettingsView.
2026-02-07 20:37:31 -06:00
vicrodh be56ecff90 i18n: replace hardcoded strings in AudioOutputBadges tooltip
Moved all hardcoded English/Spanish tooltip text to i18n keys
under audioBadges section in all 4 locale files.
Removed dead dacTooltip derived property (unused in template).
2026-02-07 18:11:49 -06:00
vicrodh 5d617365c2 fix: show changelog button provides loading state and error feedback
The button previously failed silently when version was unavailable or
the GitHub API request failed. Now shows loading state while fetching
and a toast notification on failure.
2026-02-07 02:53:43 -06:00
vicrodh 09774c151f add DE and FR translations for playlist import modal 2026-02-06 23:39:04 -06:00
vicrodh 1256a15a5a feat(i18n): add window control translation keys for immersive player
Add fullScreen, exitFullScreen, maximize, restore, minimize, and
exitImmersive keys to the player section in all 4 locale files.
2026-02-05 17:22:00 -06:00
vicrodh 62c0810a67 feat(i18n): add immersive default view translation keys
Add immersiveDefaultView label and immersiveViews object with all 11
view options to en.json, es.json, fr.json, and de.json under
settings.appearance.
2026-02-05 17:05:37 -06:00
vicrodh 73e7d799df i18n: add download.* keys to French and German locales
cc
2026-02-04 14:05:45 -06:00
vicrodh 229d24f891 feat(remote-control): add HTTPS mode and cert flow
cx
2026-02-03 04:48:23 -06:00
vicrodh b906f747fa Merge feature/internal/qbz-control: Remote Control API
Features:
- Axum REST API server for remote control
- WebSocket real-time playback updates
- Token-based authentication with QR pairing
- LAN-only security middleware
- Settings UI for enabling/configuring remote control
2026-02-03 03:52:06 -06:00
vicrodh 363ca4c264 feat(remote-control): add LAN API server, settings UI, and QR pairing\n\n- add axum API server with LAN-only + token auth + CORS allowlist\n- expose playback and search endpoints plus WS updates\n- persist remote control settings (enabled/port/token)\n- add settings UI with QR/token controls and i18n\n\ncx 2026-02-03 03:47:48 -06:00