Add CloudDownload button to BulkActionBar for downloading selected
tracks for offline use. Fires v2_cache_favorite_track for each
selected track.
Closes#231
cc
Remove filter that excluded playlists from sidebar favorites section.
Add ListMusic icon for the playlists tab in both expanded and
collapsed popover views.
Closes#233
cc
Add idle_inhibit module using ashpd's Inhibit portal to prevent
screen blanking and system suspend while audio is playing.
- Acquires Idle+Suspend inhibit when playback starts
- Releases when paused, stopped, or track cleared
- Works on GNOME, KDE, Sway, XFCE
- Works inside Flatpak/Snap (no extra permissions needed)
- Graceful fallback if portal unavailable
Addresses #229
cc
Add log_sanitize module with mask_uuid() and mask_id() functions to
prevent security scanners from flagging user IDs and session UUIDs
in log output.
- mask_uuid: 123e4567-e89b-12d3-a456-426614174000 -> 123e4567-****-****-****-****14174000
- mask_id: 12345678 -> 1234****
- Applied to offline_user_id in session_lifecycle (CodeQL alert #50)
- Applied to session_uuid and command uuid in qconnect_service
cc
- vite 8.0.3: Rolldown replaces Rollup+esbuild as build engine
- @sveltejs/vite-plugin-svelte 7.0.0: requires vite 8, inspector integrated
- @sveltejs/kit 2.55.0: vite 8 compatibility
- vitest 4.1.2: stable vite 8 peer dep
- Remove esbuild override (no longer needed with Rolldown)
Build, tests (92/92), and svelte-check all pass.
cc
- Imports reorganized: use lofty::prelude::*, lofty::tag::*, lofty::picture::*
- Picture::new_unchecked -> Picture::unchecked().pic_type().mime_type().build()
- set_year/remove_year -> set_date/remove_date with Timestamp
- ItemKey::Unknown("ISRC") -> ItemKey::Isrc
- save_to_path(path) -> save_to_path(path, WriteOptions::default())
- get_string/remove_key now take ItemKey by value
- Bump qbz-library crate lofty dep to 0.23
cc
- Fix French text leaked into en.json (actions.radio.startArtistRadio)
- Fix capitalized key "Mono" -> "mono" in en/es/fr (matched source code)
- Translate missing refreshMetadata in es.json
- Translate missing showActiveAlbums in fr.json
- Fix typo "Artistas anterior" -> "Artistas anteriores" in es.json
- Add all new PR #226 keys to de.json and pt.json
cc
Ebuilds without matching Manifest hashes cause 'Missing digest'
errors on emerge. Download DIST files and compute BLAKE2B/SHA512
for ebuilds, metadata.xml, and tarballs.
cc
Fixes dependabot alerts #25 and #26 (high severity):
- CRL Distribution Point Scope Check Logic Error
- X.509 Name Constraints Bypass via Wildcard/Unicode CN
cc
Track 504/server errors and show orange warning triangle in
NowPlayingBar when Qobuz is having issues. Auto-clears after
10 minutes without errors. Shows status in Settings too.
cc
New dropdown in the Playback section lets users choose what happens
when all quality retries fail: ask (modal), always retry at lowest,
or always skip. Loaded from and persisted to the backend via
v2_get/set_quality_fallback_behavior.
cc
Listen for 'quality-fallback-prompt' custom events dispatched by
playbackService, open the modal with track context, and handle
try-lower / skip / close actions.
cc
When v2_play_track returns QualityExhausted, the service checks the
persisted fallback behavior: auto-retry at lowest quality, auto-skip,
or emit a custom event so the UI can show the QualityFallbackModal.
Also passes forceLowestQuality option through to the backend invoke.
cc
Modal displayed when all quality retries are exhausted during Qobuz
streaming. Offers the user two choices: retry at lowest quality or
skip to the next track. Includes a "remember my choice" checkbox
that persists the preference via v2_set_quality_fallback_behavior.
cc
Replace fixed 500ms delays with 1s/2s/4s exponential backoff.
Add 4th retry attempt at fallen-back quality level.
Return QualityExhausted structured error when all attempts fail.
Add force_lowest_quality param to v2_play_track.
cc
When a new issue selects macOS as platform, automatically labels it
platform:macos and assigns afonsojramos. Linux issues get labeled
platform:linux.
cc
Adds Linux/macOS selection as first field in bug reports, feature
requests, and feedback forms. Adapts Linux-specific fields (DE, display
server) to indicate they are Linux-only and adds macOS options to
install method and audio backend dropdowns.
cc
Qobuz changed their protocol to sometimes send QueueVersionRef
without major/minor populated. Our decoder treated these as
required fields, causing all cloud_type=6 messages to fail with
"missing required numeric field 'queue_version.major'".
Default to 0 when absent — matches the dev panel behavior.
cc
When image cache is disabled or unavailable, images were returned
as original HTTPS URLs for WebKit to load directly. On AppImage
distros where GnuTLS can't find system CA certs, this fails silently.
Now all images go through reqwest (rustls, bundled CA) and are
written to temp files as file:// URLs. WebKit never needs to
resolve HTTPS for images.
cc
Builds DMG for both Apple Silicon (aarch64) and Intel (x86_64).
Triggered on tag push or manual dispatch. Artifacts uploaded to
GitHub Releases as pre-release.
Unsigned — users bypass Gatekeeper with right-click > Open.
cc
Builds DMG for both Apple Silicon (aarch64) and Intel (x86_64).
Triggered on tag push or manual dispatch. Artifacts uploaded to
GitHub Releases as pre-release.
Unsigned — users bypass Gatekeeper with right-click > Open.
cc
ESC key was calling onClose() directly, skipping the fullscreen
exit logic. Changed to handleExitImmersive() which exits fullscreen
before closing, matching the behavior of the UI close buttons.
cc
white-space: nowrap caused help tooltips to bleed outside their
container. Changed to normal with max-width 360px so technical
help text wraps properly.
cc
- Add Gentoo/OpenRC and Void/runit to distro selector
- All systemctl commands now adapt to selected distro init system
- Verify step warns user to close wizard before testing
- Status/restart/rollback commands are distro-aware
cc
WebKitGTK 2.50.x evicts image textures from GPU memory during
repaints triggered by hover/scroll, causing momentary placeholder
flash. Force each cached image into its own compositing layer via
will-change + translateZ(0) to prevent texture eviction.
Applied in cachedSrc action so all 18 components using it are fixed.
cc
main.rs GPU conditions checked has_nvidia && !has_amd but not
has_intel, so hybrid laptops (Intel iGPU + NVIDIA dGPU) had
compositing and DMA-BUF disabled unnecessarily.
Also remove duplicate DMABUF/compositing logic from lib.rs that
ran before main.rs and conflicted with its GPU-aware decisions.
cc
Tabular view comparing saved vs runtime settings for audio,
graphics, and environment variables. Collapsible sections with
match/mismatch indicators and export to clipboard.
cc
apply_linux_webkit_workarounds() was unconditionally disabling
DMABUF renderer and compositing mode, ignoring what the user
configured in Appearance > Composition settings.
Now reads graphics_settings.db and developer_settings.db at startup
(readonly, before Tauri state init) so toggles actually take effect.
- Add new_readonly() to GraphicsSettingsStore and DeveloperSettingsStore
- Hardware Acceleration ON = compositing enabled
- Force DMA-BUF toggle respected for WEBKIT_DISABLE_DMABUF_RENDERER
- Env vars still override saved settings
cc
Replace 8+ sequential per-section IPC calls with a single batch
command. Backend reads all tracks once instead of N times.
- Add v2_check_albums_fully_cached_batch (single DB read, HashMap return)
- Remove per-section await tick() + loadAllAlbumDownloadStatuses() calls
- Single batch call at end of loadHome() after all data resolves
- Keep individual check for on-click refresh (single album)
cc