Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh c8a3a648f5 chore(alsa): lower device enumeration logs to debug, add 5th retry
Reduce log noise by demoting ALSA device enumeration from info to debug.
Add a 5th backoff retry at 800ms for both hw and plughw paths as a
safety net for any EBUSY cases that slip through the lifecycle fix.

cc
2026-04-07 11:53:23 -06:00
vicrodh 426a4d0dba fix(player): stop engine before dropping ALSA stream on format change
In the Play and PlayStreaming handlers, the old engine's writer thread
still holds an Arc<AlsaDirectStream> when the stream_opt is dropped and
a new snd_pcm_open() is attempted. This causes EBUSY on track switches
with sample rate changes. Reorder to: stop engine -> drop stream -> open
new stream, matching the Stop handler's correct lifecycle.

cc
2026-04-07 11:53:17 -06:00
vicrodh 17919cccad chore: bump flake.nix to 1.2.4
cc
2026-04-07 10:15:22 -06:00
vicrodh ee70268332 merge: v1.2.4 - Hardening playback (fix-tag) 2026-04-07 09:48:37 -06:00
vicrodh d1278e12ad chore: bump version to 1.2.4 - Hardening playback
cc
2026-04-07 09:48:04 -06:00
vicrodh 74e3ba9519 chore(logging): reduce noise in default log level
- Device enumeration (48 CPAL devices): info → debug
- Playlist fetch completion: info → debug
- Playlist command invocation: info → debug
- zbus socket_reader/tracing: filtered to warn level

These remain visible with RUST_LOG=debug or verbose log capture.

cc
2026-04-07 08:39:18 -06:00
vicrodh a279e04881 feat(credentials): use XDG portal secret for key derivation
Add per-app secret from org.freedesktop.portal.Secret as entropy
in the AES-256-GCM key derivation. DE-agnostic (works with GNOME,
KDE, etc.) and Flatpak-safe (portals auto-accessible in sandbox).

Falls back to machine_id + salt when portal is unavailable (headless,
old DEs, non-Linux). Cached for session lifetime via OnceLock.

Users will need to re-login once on upgrade (key derivation changed).

cc
2026-04-07 08:22:28 -06:00
vicrodh 6da5092605 fix(credentials): encrypt OAuth token in keyring
Token was stored as plaintext in the system keyring, visible via
secret-tool. Now AES-256-GCM encrypted before storing — keyring
entry shows ciphertext, not the raw token.

Handles migration from both plaintext keyring entries and encrypted
files from previous versions.

cc
2026-04-07 07:38:57 -06:00
vicrodh 04eab0d880 fix(credentials): keyring-only storage, no redundant file
OAuth token was saved to BOTH keyring and encrypted file, making the
keyring pointless. Now:
- Save: keyring first. Only writes file if keyring unavailable.
- Load: keyring first. If found in file, migrates to keyring and
  deletes the file.
- Result: when keyring works, no token file exists on disk.

cc
2026-04-07 07:19:44 -06:00
vicrodh 4505312280 fix(security): remove hardcoded crypto seed from cmaf crate
Move the CMAF app seed from a hardcoded constant in qbz-cmaf to a
parameter passed by callers. The seed now lives in qbz-qobuz::auth
where other app-level constants are defined. This resolves CodeQL
alerts for hard-coded cryptographic values.

Also truncate session_id in logs to avoid cleartext logging of
sensitive session identifiers.

cc
2026-04-07 07:04:33 -06:00
vicrodh 5f154aaf98 fix(logout): clear stored credentials on logout
Logout was not clearing OAuth tokens or credentials from keyring
and encrypted files. Users had to manually delete files to fully
sign out. Now clears both keyring and file storage.

cc
2026-04-07 06:52:32 -06:00
vicrodh 192f681d25 fix: bump Cargo.toml version to 1.2.3
Cargo.toml was left at 1.2.2 because the version bump sed command
only matched JSON format ("version": "1.2.2") not TOML format
(version = "1.2.2"). This caused CARGO_PKG_VERSION to report 1.2.2
at runtime, triggering the update-available modal on every launch.

cc
2026-04-07 06:41:19 -06:00
vicrodh 2a6bb658b1 fix(credentials): improve keyring failure logging visibility
Keyring save/load failures were logged at debug level, making them
invisible in normal logs. Users on KDE Plasma 6 reported the keyring
feature not working (#276) but couldn't see why.

Promoted keyring failures to warn level with actionable messages
(e.g., KDE users need org.freedesktop.secrets enabled in KWallet).

cc
2026-04-07 06:29:28 -06:00
vicrodh 11bffe7071 fix(cmaf): fetch all audio segments (off-by-one in segment loop)
Loop used 1..n_segments (exclusive) but n_segments is the count of
audio segments, not the last index. Segments are numbered 1 through
n_segments, so the loop must be 1..=n_segments (inclusive).

This caused the last ~9 seconds of every CMAF-streamed track to be
missing. Confirmed with diagnostic logging: table_total_samples
exceeded actual decoded frames by exactly one segment's worth.

cc
2026-04-07 06:17:37 -06:00
vicrodh 89c29195fb chore: bump flake.nix to 1.2.3
Hashes left empty — nix build will report correct values on first run.

cc
2026-04-06 17:56:21 -06:00
vicrodh 38ffd8d82f chore: bump version to 1.2.3 - Hardening playback
cc
2026-04-06 17:28:06 -06:00
vicrodh c9d628a966 merge: v1.2.3 - Hardening playback
CMAF segmented streaming, quality negotiation, ALSA hardening,
offline playback controls, system keyring, security updates.
2026-04-06 17:24:34 -06:00
vicrodh 7ff5e9593e fix(gentoo): align source ebuild template with working overlay
Template had a different src_compile (npm run build + cargo build)
than the overlay's working ebuild (npx tauri build --no-bundle).
Now they match exactly, preventing the release workflow from
breaking the overlay.

cc
2026-04-06 17:24:19 -06:00
vicrodh c86fe7de9e docs: add release 1.2.3 notes and update contributors
Add AdamArstall to README and About modal (scroll restoration fixes).
Release docs for 1.2.3 - Hardening playback.

cc
2026-04-06 17:18:54 -06:00
vicrodh e14e0a14a1 fix(logout): stop playback before deactivating session
Logout left audio playing through the ALSA/PipeWire backend while
tearing down the session. Now explicitly stops playback and clears
MPRIS state as the first step of logout.

cc
2026-04-06 16:59:27 -06:00
vicrodh 241dcf0814 feat(security): store OAuth token in system keyring
OAuth token save/load/clear now use the system keyring (GNOME Keyring,
KDE Wallet) as primary storage, with the existing AES-256-GCM
encrypted file as automatic fallback.

On first load from file, the token is migrated to the keyring
automatically for future use.

The previous commit enabled the keyring backend but only wired it
for email+password credentials (no longer used). This wires it
for the OAuth token which is the active auth method.

cc
2026-04-06 16:56:22 -06:00
vicrodh c37f3d7595 feat(security): enable system keyring for credential storage
Enable async-secret-service + crypto-rust features on the keyring
crate, activating GNOME Keyring and KDE Wallet support. The keyring
integration code was already written but the crate was compiled
without any platform backend, so it silently failed every time.

OAuth tokens will now be stored in the system keyring when available,
with encrypted file as automatic fallback.

Added org.freedesktop.secrets to Flatpak finish-args for sandbox
keyring access.

Fixes #215

cc
2026-04-06 16:20:26 -06:00
vicrodh 54139ad4d3 fix(offline): allow playback controls without API client init
pause, resume, stop, seek, and volume commands required
RequiresClientInit which fails when offline (no internet = no bundle
extraction = client not initialized). These commands only use the
local Player/CoreBridge, not the Qobuz API client.

Changed to RequiresUserSession which passes in offline mode since
the offline session activates from cached user data.

Fixes #173

cc
2026-04-06 16:07:59 -06:00
vicrodh a7da06341f chore(deps-dev): bump svelte 5.55.0 -> 5.55.1
Closes #253

cc
2026-04-06 15:16:57 -06:00
vicrodh 3eab5b72ac chore(deps-dev): bump jsdom 27.4.0 -> 29.0.1
Closes #254

cc
2026-04-06 15:16:46 -06:00
vicrodh 2c0f42b885 chore(deps): bump dirs 5 -> 6 across all crates
Zero API changes, only bumps internal deps (windows-sys, redox_users).
Eliminates duplicate dirs versions in Cargo.lock.

Closes #257

cc
2026-04-06 15:16:34 -06:00
vicrodh a98d3d953a chore(deps): bump vite 8.0.3 -> 8.0.5 (security)
Fixes 3 dev server vulnerabilities:
- Path traversal in optimized deps .map handling
- Arbitrary file read via WebSocket
- server.fs.deny bypass with queries

Closes #274

cc
2026-04-06 15:14:10 -06:00
vicrodh f86bc9607e merge: CMAF segmented streaming pipeline
New encrypted CMAF streaming via Akamai CDN, replacing legacy nginx
direct downloads that were failing with "1 byte EOF" for many tracks.

Key changes:
- qbz-cmaf crate: HKDF key derivation, AES-CBC/CTR decryption, CMAF parsing
- qbz-qobuz: session/start + file/url endpoints
- Streaming playback: init segment fetch (~500ms) then background segment download
- CMAF-first with legacy fallback on all download paths
- Quality matching: request track's actual quality, not always UltraHiRes

cc
2026-04-06 15:10:01 -06:00
vicrodh 3df84f81e7 fix(quality): request track's actual quality instead of always UltraHiRes
playTrack() was always sending the user's max quality setting (Hi-Res+)
regardless of what the track actually offers. A 44.1kHz/24bit track
would trigger 3 API fallback calls (UltraHiRes -> HiRes -> Lossless)
and the cache was discarded as "lower quality" for re-download.

New effectiveQuality() picks the minimum of user max and track metadata
(bit_depth + sampling_rate), so a 24bit/96kHz track requests Hi-Res
directly (1 API call) and cache matches perfectly.

cc
2026-04-06 15:07:41 -06:00
vicrodh 6103044a2e fix(quality): parse track metadata quality instead of defaulting to UltraHiRes
Frontend sends "24bit/44.1kHz" format from track metadata, but
parse_quality fell through to default UltraHiRes for unknown formats.
This caused unnecessary API quality fallback cascades (3 calls per
track) and cache mismatches where cached 24bit/44.1kHz data was
discarded for re-download that returns the same quality.

Now parses "XXbit/YYYkHz" format and maps to the correct Quality
level, requesting exactly what the track offers.

cc
2026-04-06 15:03:23 -06:00
vicrodh 8b9abdea58 Revert "fix(cache): don't discard 24-bit cache for sample rate mismatch"
This reverts commit 49fc2ae41e.
2026-04-06 14:56:54 -06:00
vicrodh 49fc2ae41e fix(cache): don't discard 24-bit cache for sample rate mismatch
A track mastered at 44.1kHz/24bit IS the maximum quality available.
Re-downloading won't produce a higher sample rate. Only check bit
depth for UltraHiRes/HiRes quality matching — if cache has 24-bit,
use it regardless of sample rate.

Previously, requesting UltraHiRes with a 44.1kHz/24bit cache would
discard the cache and re-download, getting the exact same data.

cc
2026-04-06 14:55:26 -06:00
vicrodh 63120010d9 fix(download): migrate remaining legacy paths to CMAF-first
Add CMAF fallback to streaming probe failure, standard download,
and individual prefetch paths. Legacy nginx CDN path kept as
automatic fallback for each. Cast/DLNA/offline-cache paths marked
with TODO (require CoreBridge parameter plumbing).

cc
2026-04-06 14:19:24 -06:00
vicrodh dcde40b0fe fix(prefetch): use CMAF pipeline for prefetch downloads
Prefetch was still using the legacy nginx CDN path, causing "1 byte
EOF" failures on tracks that only work via the new Akamai CDN. Now
tries CMAF full download first, falls back to legacy on failure.

cc
2026-04-06 14:04:20 -06:00
vicrodh 01a12e2134 feat(streaming): CMAF streaming playback with immediate start
Replace full-download CMAF with streaming: fetch init segment, start
playback, then download+decrypt audio segments in background. Player
begins playing after ~500ms instead of waiting for full download.

cc
2026-04-06 13:47:33 -06:00
vicrodh bf555ab143 feat(streaming): CMAF segmented download pipeline
Download tracks via Qobuz Akamai CDN with encrypted CMAF segments.
Derives session key (HKDF), unwraps content key (AES-CBC), decrypts
frames (AES-CTR), reassembles into standard FLAC. Falls back to legacy
track/getFileUrl if CMAF fails.

- Add qbz-cmaf dependency to src-tauri
- Make ensure_cmaf_session public on QobuzClient
- Add ensure_cmaf_session and get_file_url passthroughs to CoreBridge
- Add download_audio_cmaf and try_cmaf_download helpers
- Wire CMAF as primary download path in v2_play_track with legacy fallback

cc
2026-04-06 13:31:41 -06:00
vicrodh 0265cb996c feat(qobuz): add session/start and file/url CMAF endpoints
New CMAF session management with lazy renewal and file/url endpoint
returning segmented encrypted streaming URLs.

cc
2026-04-06 13:19:57 -06:00
vicrodh 8133931df5 feat(models): add SessionStartResponse and TrackFileUrl types
New response models for the CMAF streaming API endpoints
(session/start and file/url).

cc
2026-04-06 13:15:54 -06:00
vicrodh b3a9069712 feat(cmaf): add CMAF segment parser
Parse init segment (FLAC header + segment table) and audio segments
(frame entries with IVs for AES-CTR decryption).

cc
2026-04-06 13:12:55 -06:00
vicrodh 794dd9f24c feat(cmaf): add qbz-cmaf crate with crypto module
HKDF-SHA256 session key derivation, AES-128-CBC content key unwrap,
AES-128-CTR frame decryption, and MD5 request signing for Qobuz
CMAF segmented streaming.

cc
2026-04-06 13:10:00 -06:00
vicrodh 9a95a54e0f fix(queue): prevent ghost next_track after context switch
Auto-advance from a previous track could arrive after the user
switched to a new album/playlist, advancing the new queue's index
and skipping a track (observed: Sorceress track skipped).

Added queue epoch counter that increments on setQueue/clearQueue.
nextTrackGuarded() captures epoch before the invoke and discards
the result if the queue changed while in-flight. Applied to all
auto-advance paths (track-end, gapless transition) but not to
manual skip (user-initiated).

cc
2026-04-06 11:42:28 -06:00
vicrodh def821bd33 fix(download): add User-Agent header and remove stale timeout
download_audio() was sending bare GET requests without User-Agent,
while all other CDN request paths (probe, streaming) sent Mozilla/5.0.
CDNs commonly reject or truncate responses from requests without
User-Agent, explaining the "1 byte then EOF" failures on tracks
that work fine in the web player.

Also removed the 120s total timeout that contradicted the comment
saying "no total timeout" — Hi-Res+ files can be 200MB+ and need
more than 120s on slower connections.

cc
2026-04-06 11:42:02 -06:00
vicrodh 4439070032 fix(alsa): progressive backoff retry on device busy during track skip
When skipping tracks quickly, the previous PCM handle may not be
fully released by the kernel before the new track tries to open
the same ALSA device (snd_pcm_open fails with EBUSY).

Previous behavior: single retry after 200ms PipeWire suspend, then
immediate failure. This didn't cover our own PCM race condition.

New behavior: 4 retries with progressive backoff (50/100/200/400ms)
for both hw and plughw paths. PipeWire suspend still attempted once
upfront. Total worst-case wait: 750ms (vs 200ms before), but the
early retries at 50-100ms cover the common fast-skip case.

cc
2026-04-06 11:23:35 -06:00
vicrodh 9f2c423cd4 fix(offline-cache): prevent HTTP/2 connection pool poisoning
StreamFetcher used a persistent reqwest::Client for the entire app
session. When a CDN connection broke mid-transfer, the HTTP/2 pool
kept reusing the dead connection, causing all subsequent downloads to
fail after 1 byte ("end of file before message length reached").

Changes:
- StreamFetcher now creates a fresh client per download attempt,
  matching the pattern used by download_audio() which never had
  this issue
- Added retry logic with exponential backoff (3 retries, 1s/3s/5s)
  — offline cache previously had zero retries for multi-hundred-MB
  downloads
- Clean up partial .tmp files on failure before retrying
- Extracted try_download() for clean retry loop

Root cause: issue #268 / reported in #270 testing

cc
2026-04-06 11:14:41 -06:00
vicrodh 09fcb5eb7b chore(deps): upgrade alsa crate 0.9 -> 0.10
Remove dead alsa dependency from src-tauri/Cargo.toml (code lives in
qbz-audio since V2 migration) and bump qbz-audio to alsa 0.10.
Eliminates duplicate alsa versions in Cargo.lock.

Breaking changes in 0.10 (Format/ChmapPosition reorder) do not affect
QBZ — we use catch-all matches and never rely on PartialOrd.

Closes #260

cc
2026-04-06 09:18:27 -06:00
vicrodh 96967e8112 chore: regenerate lockfiles for tauri-plugin-os dependency
PR #265 added @tauri-apps/plugin-os (npm) and tauri-plugin-os (cargo)
but did not commit the updated lockfiles.

cc
2026-04-05 21:23:41 -06:00
Victor RH 5a4f014b79 Merge pull request #265 from afonsojramos/gate-flatpak-snap-macos
Reviewed: clean platform detection refactor, no audio code touched, all gates correct. Lockfiles will be regenerated post-merge.
2026-04-05 21:18:31 -06:00
Victor RH 9cbbbad652 Merge pull request #272 from afonsojramos/investigate-corrupted-app
Reviewed: clean minimal fix, no Linux impact, ad-hoc signing is correct approach.
2026-04-05 21:18:21 -06:00
Victor RH c179359797 Merge pull request #247 from GwendalBeaumont/refactor/external/i18n-components
Reviewed: all 4 flagged issues confirmed fixed. Minor follow-up needed for performerRoles translations and typo key.
2026-04-05 21:18:09 -06:00
vicrodh 34daf20f0b style(immersive): match Static and AlbumReactive cover sizing to other views
Artwork bumped from min(45vh, 360px) to min(52vh, 460px), matching
coverflow center cover. Padding reduced to 52px/88px consistent with
other panels. Responsive breakpoints updated accordingly.

cc
2026-04-05 17:39:49 -06:00
vicrodh e5e1516b41 style(immersive): soften quality badge backdrop to keep glassy look
Reduce background from 0.55 to 0.25 opacity, increase blur to 12px.
Maintains legibility without losing the crystalline/glass effect.

cc
2026-04-05 17:36:29 -06:00
vicrodh b431142d40 fix(coverflow): restore original spacing, rely on z-index for layering
The side covers partially overlapping the center is correct coverflow
behavior — they just need to render BEHIND the center cover. Center
has z-index: 10, sides have 4/3. Restored original-style offsets
(200px/340px) with 45deg rotation for the classic coverflow look.

cc
2026-04-05 17:35:41 -06:00
vicrodh a73cfee901 fix(coverflow): restore center image, add quality badge backdrop
Remove transform-style: preserve-3d and translateZ which caused center
cover to render as ghost/transparent. Remove duplicate perspective on
parent panel. Add dark backdrop to quality badge in all immersive views
for legibility on light backgrounds.

cc
2026-04-05 16:06:05 -06:00
vicrodh 0096c57baa fix(coverflow): eliminate side cover overlap with center
Three changes to prevent overlap:
1. translateX increased from 280px to 400px for adjacent covers
2. rotateY reduced from 45deg to 30deg (less inward swing)
3. Added translateZ(-120px) to push side items behind the Z-plane

The 3D perspective projection with rotateY causes the near edge of
side covers to swing toward center. Reducing rotation and adding
Z-depth separation fixes the visual overlap.

cc
2026-04-05 16:00:50 -06:00
vicrodh 716806865b fix(coverflow): larger covers, fix overlap, remove broken animation
Center cover bumped from 360px to 460px. Side covers pushed out to
280px/460px offsets (from 180/300) to prevent overlapping the center.
Removed broken slideLeft/slideRight keyframe animations that
referenced unset --translate-x variable and conflicted with the CSS
transitions already on each item. Transitions alone handle all
position changes smoothly on click/skip.

cc
2026-04-05 15:56:55 -06:00
vicrodh 53a02f4e5e style(immersive): increase font sizes +4pt in split panels
Bump all font-size values by 4px in TrackInfoPanel, QueuePanel, and
SuggestionsPanel for better legibility in immersive split mode.

cc
2026-04-05 15:00:46 -06:00
vicrodh ade8d90386 style(immersive): increase artwork size and reduce wasted padding
Bump artwork vh constraint from 60vh to 72vh — the previous value was
the bottleneck on laptop screens (461px on 768px viewport). Now yields
~553px. Reduce vertical padding from 164px to 140px total. Compact
track info margins below artwork.

cc
2026-04-05 14:21:48 -06:00
vicrodh 2de1aa5d2d Revert "style(immersive): restructure split layout to fill available space"
This reverts commit db27a36123.
2026-04-05 14:18:50 -06:00
vicrodh db27a36123 style(immersive): restructure split layout to fill available space
Change from center-center floating layout to stretch-fill approach.
Artwork section now gets fixed 42% width proportion and fills column
height. Artwork max-width overridden to 100% of column (no viewport
caps). Columns stretch to fill available height, eliminating dead
space above/below. Track info made more compact. Panel section
removes max-width cap for lyrics to breathe.

cc
2026-04-05 14:14:45 -06:00
vicrodh 59dc9c9d7a style(immersive): larger artwork, Montserrat font, hidden scrollbar
Remove fixed px caps on artwork — now scales purely with viewport
(42vw/60vh). Switch lyrics font from condensed Oswald to Montserrat
for better legibility. Hide scrollbar in immersive lyrics (scrolling
still works). Add padding to artwork column for breathing room.

cc
2026-04-05 14:08:44 -06:00
vicrodh a3f63f2148 style(immersive): improve split lyrics layout for better space usage
Artwork scales with viewport (min of 500px/38vw/58vh) instead of fixed
380px cap. Lyrics use responsive clamp() sizing (up to 34px inactive,
42px active) with better line-height. Reduced padding/gaps throughout
split mode for less dead space. Tighter mask gradient on lyrics panel.

cc
2026-04-05 14:00:47 -06:00
vicrodh 6f230382b0 fix(gentoo): use npx tauri build in ebuild template
cargo build alone doesn't embed the frontend. npx tauri build
--no-bundle handles the full build pipeline correctly.

cc
2026-04-05 11:24:14 -06:00
vicrodh 4187c6a096 fix(gentoo): revert ebuild template to network-sandbox style
The cargo eclass requires pre-generated offline crate sources which
the CI workflow never set up. Revert to the working approach: inherit
xdg only, RESTRICT network-sandbox, direct npm ci + cargo build.

cc
2026-04-05 11:01:13 -06:00
vicrodh bbb91de490 fix(gentoo): replace virtual/rust with dev-lang/rust in ebuild template
virtual/rust has no ebuilds in current Gentoo repos (deprecated).

cc
2026-04-05 10:54:32 -06:00
vicrodh ba6998778a feat(ui): add Allow Quality Fallback toggle in Audio settings
Off by default. Toggle in Audio settings controls whether QBZ
silently downgrades quality when the requested tier is unavailable.
i18n keys added to all 5 locales.

cc
2026-04-05 10:46:08 -06:00
vicrodh 1934d501ed feat(audio): make quality fallback opt-in via allow_quality_fallback setting
Off by default. When disabled, if the requested quality is unavailable
the download/stream fails instead of silently downgrading. Persisted
to audio_settings DB. Applied to offline cache downloads.

cc
2026-04-05 10:44:05 -06:00
vicrodh f39cf7c95f fix(gentoo): correct pipewire USE flag and clang package path in ebuild template
pipewire[alsa-plugin] -> pipewire[pipewire-alsa] (correct USE flag name)
sys-devel/clang -> llvm-core/clang (package moved in Gentoo repos)

cc
2026-04-05 10:33:09 -06:00
vicrodh d474a55d70 lore(changelog): auth changes
Updating docs for tag release.
2026-04-05 09:39:51 -06:00
vicrodh 27c006d38f fix(cache): validate quality on cache hit, keep fallback if re-download fails (#270)
When a track is cached at lower quality than requested (e.g. CD quality
cached during a Qobuz outage, but user wants Hi-Res), the cache hit is
now detected via FLAC header inspection (sample_rate + bit_depth).

If quality is insufficient, QBZ attempts a fresh download at the
requested quality. If the download fails (network error), the cached
lower-quality version is played instead of failing entirely.

cc
2026-04-04 21:36:19 -06:00
vicrodh 223dbf553e fix(security): override esbuild to 0.25.x (CVE in <= 0.24.2)
svelte-i18n pins esbuild ^0.19.2 which is vulnerable. Override to
0.25.x resolves dependabot alert #2. Build verified.

cc
2026-04-04 21:18:33 -06:00
vicrodh 12b8b3491a fix(auth): disable basic auth in bootstrap and legacy commands
Bootstrap no longer attempts email/password login — only OAuth token
restore. v2_manual_login and v2_auto_login now return immediately with
deprecation errors. Users with old saved credentials will see the
login screen instead of hitting Qobuz's deprecated endpoint.

cc
2026-04-04 21:13:41 -06:00
vicrodh 7588a4804a feat(ui): add system browser OAuth link in login view
Secondary link-style option below the main OAuth button. Opens the
user's default browser (Firefox, Chrome, etc.) instead of the Tauri
WebView. Useful for password managers and saved sessions.

i18n keys added to all 5 locales.

cc
2026-04-04 21:05:36 -06:00
vicrodh 648f690a0b feat(auth): add system browser OAuth login and extract shared finalize_oauth_login
Refactor: shared finalize_oauth_login() handles code exchange, CoreBridge
injection, session activation, and token persistence. Frontend-agnostic,
reusable by GUI, TUI, and headless clients.

New command: v2_start_system_browser_oauth spawns a local axum listener,
opens the user's default browser for Qobuz OAuth, and captures the
redirect code automatically.

cc
2026-04-04 21:03:11 -06:00
vicrodh a8e6d151dc fix(security): remove sensitive values from log lines flagged by CodeQL
session_uuid and user_id removed from log output entirely.
CodeQL does not recognize custom sanitizer functions as sufficient.

cc
2026-04-04 20:38:09 -06:00
vicrodh d79eb8e1a8 feat(ui): add Lock Output Device toggle for JACK/DAW routing (#263)
PipeWire-only setting, disabled when DAC Passthrough is active.
i18n keys added to all 5 locales.

cc
2026-04-04 12:12:08 -06:00
vicrodh 83e43949b7 feat(audio): add skip_sink_switch option for JACK/DAW routing (#263)
When enabled, skips pactl set-default-sink on stream creation.
Preserves external audio routing (JACK, qjackctl, Reaper).
Mutually exclusive with DAC passthrough.

cc
2026-04-04 12:08:22 -06:00
vicrodh e4e40b21e0 docs: add release notes for v1.2.2
cc
2026-04-04 11:28:05 -06:00
vicrodh ea2280f848 chore: update codename to Bye bye plain auth
cc
2026-04-04 11:19:52 -06:00
vicrodh ee019851ef chore: bump version to 1.2.2
cc
2026-04-04 11:15:15 -06:00
vicrodh a3dc3a28ee Merge remote-tracking branch 'origin/pre-release' into pre-release 2026-04-04 11:10:13 -06:00
Victor RH 4aed668bbb Merge pull request #255 from vicrodh/dependabot/cargo/src-tauri/pre-release/tempfile-3.27.0
chore(deps): bump tempfile from 3.26.0 to 3.27.0 in /src-tauri
2026-04-04 11:04:16 -06:00
Victor RH 5e3d824f5f Merge pull request #256 from vicrodh/dependabot/npm_and_yarn/pre-release/svelte-check-4.4.6
chore(deps-dev): bump svelte-check from 4.4.5 to 4.4.6
2026-04-04 11:04:14 -06:00
Victor RH 9e2fa8943e Merge pull request #258 from vicrodh/dependabot/cargo/src-tauri/pre-release/env_logger-0.11.10
chore(deps): bump env_logger from 0.11.9 to 0.11.10 in /src-tauri
2026-04-04 11:04:12 -06:00
Victor RH b05d0773a9 Merge pull request #259 from vicrodh/dependabot/cargo/src-tauri/pre-release/uuid-1.23.0
chore(deps): bump uuid from 1.22.0 to 1.23.0 in /src-tauri
2026-04-04 11:04:10 -06:00
Victor RH 2c75ee776c Merge pull request #264 from afonsojramos/macos-config-compat
fix(macos): gate Linux graphics CLI flags and crash handler
2026-04-04 10:57:41 -06:00
Victor RH 8c484075d1 Merge pull request #266 from afonsojramos/use-released-coreaudio
fix(deps): use released coreaudio-rs and notify-rust instead of forks
2026-04-04 10:57:39 -06:00
vicrodh e66117fbc4 feat(auth): remove basic auth login, OAuth only
Qobuz no longer accepts basic auth. Remove email/password fields,
manual login handler, and "Remember me" checkbox from LoginView.
OAuth browser login is now the sole authentication method.

cc
2026-04-04 10:39:51 -06:00
vicrodh 34a18093d0 fix: restore albumId/artistId on session resume for player bar navigation
setCurrentTrack during session restore was missing albumId and artistId,
causing Go to Album / Go to Artist clicks to silently fail until a new
track was played. Also restore isLocal, source, and parental_warning for
full parity with the normal playback path.

Closes #252

cc
2026-04-02 11:54:02 -06:00
vicrodh 3ac7073b9c feat(qobuz): migrate login_with_token to V2 crates
Add login_with_token to QobuzClient and QbzCore for restoring
sessions from saved OAuth tokens. Previously only existed in
the legacy client.

cc
2026-04-02 07:47:45 -06:00
vicrodh 211f45a557 fix(favorites): bulk make offline now actually downloads tracks
handleBulkMakeOffline was calling v2_cache_favorite_track which only
saves metadata to the favorites cache. Replaced with
cacheTracksForOfflineBatch which triggers the real offline download.

cc
2026-04-01 17:39:51 -06:00
Victor RH e56b0cbb6a Merge pull request #238 from afonsojramos/fix/macos-x86-build
fix(macos): enable x86_64 cross-compilation
2026-04-01 16:29:13 -06:00
Victor RH 38c5512507 Merge pull request #250 from afonsojramos/macos-tray-settings-audit
feat(settings): use menu bar terminology and hide redundant tray settings on macOS
2026-04-01 16:22:08 -06:00
Victor RH 00e76471d0 Merge pull request #249 from afonsojramos/macos-immersive-drag-bar
fix: make immersive mode window draggable on macOS
2026-04-01 16:22:05 -06:00
Victor RH bd7e5cbe9a Merge pull request #248 from afonsojramos/cmd-comma-settings
feat: add Cmd+, keyboard shortcut to open settings
2026-04-01 16:22:03 -06:00
vicrodh 35d0ff39f0 chore: remove unused github.svg (replaced by simple-icons in PR #237)
cc
2026-03-31 20:27:29 -06:00
Victor RH 1b10f6c132 Merge pull request #246 from afonsojramos/feat/macos-rich-notifications-pr
feat(macos): add album artwork to notifications
2026-03-31 20:27:23 -06:00
Victor RH 4b988a6c61 Merge pull request #245 from afonsojramos/fix/macos-hide-linux-settings
fix(macos): hide Linux-only settings and fix content padding
2026-03-31 20:27:16 -06:00
Victor RH 4a8f2e5562 Merge pull request #244 from afonsojramos/fix/macos-gate-idle-inhibit
fix(macos): gate idle_inhibit module for Linux only
2026-03-31 20:27:09 -06:00
Victor RH b2f75cc85c Merge pull request #239 from afonsojramos/feat/macos-deep-link
feat(macos): add deep link support for qobuzapp:// URLs
2026-03-31 20:27:02 -06:00
Victor RH fbac26ad34 Merge pull request #237 from afonsojramos/fix/lucide-github-icon
fix: replace removed Github icon with simple-icons
2026-03-31 20:26:36 -06:00