260 lines
11 KiB
Markdown
260 lines
11 KiB
Markdown
# QBZ 1.1.19 Full Changelog
|
|
|
|
**Codename:** Limpiando la casa
|
|
**Commits:** ~200 since v1.1.18
|
|
|
|
---
|
|
|
|
## Audio Engine
|
|
|
|
### rodio 0.22 migration
|
|
- Removed vendored rodio/cpal fork entirely; now uses upstream rodio 0.22
|
|
- All decoder, stream, and buffer management updated to new API
|
|
- Explicit 100ms buffer size replaces vendored cpal tuning
|
|
- PipeWire clock.force-quantum disabled for rodio 0.22 compatibility
|
|
|
|
### ALSA improvements
|
|
- Sample rate fallback when DAC doesn't support the requested rate
|
|
- PipeWire sink suspended before ALSA Direct exclusive access to prevent DeviceBusy errors
|
|
- ALSA Direct gapless playback enabled and defaulted to ON
|
|
- Gapless restrictions removed for DAC Passthrough and ALSA Direct modes
|
|
- Pre-check hardware rates via /proc/asound before attempting ALSA Direct
|
|
|
|
### Smart quality downgrade
|
|
- When hardware can't handle a sample rate, QBZ selects the best compatible quality automatically
|
|
- Quality badge tooltip shows "Hardware compatibility" explanation
|
|
- Cached audio also verified against hardware rates before playback
|
|
|
|
### Other audio fixes
|
|
- Hot-reload gapless and normalization settings to active player
|
|
- Stop updating live gain during EBU R128 refinement passes
|
|
- Audio settings sync on startup for OAuth login path
|
|
- Output device name polling during playback
|
|
- Configured device name shown when player has no active stream
|
|
- Deprecated CPAL `name()` replaced with `description()`
|
|
|
|
---
|
|
|
|
## Booklet Viewer
|
|
|
|
- Albums with digital booklets show a booklet button in the album header
|
|
- Full in-app PDF viewer with page navigation
|
|
- MuPDF native backend replaces pdfjs-dist for crisp rendering and smaller bundle
|
|
- Download button to save booklet PDF locally
|
|
- Auto-fit page width on load
|
|
- V2 backend command fetches PDF through Tauri to bypass CORS
|
|
- Goody/booklet model added to qbz-models crate
|
|
- i18n keys added to all 4 locales
|
|
|
|
---
|
|
|
|
## Neon Visualizers
|
|
|
|
Three new Canvas 2D visualizers under Immersive > Neon:
|
|
|
|
### Laser (NeonFlowPanel)
|
|
- Neon laser beams that pulse, bend, and shift with bass/mid/high energy
|
|
- Dual rendering layers for glow effect
|
|
|
|
### Tunnel (TunnelFlowPanel)
|
|
- Depth-tunnel with warped elliptical rings
|
|
- Curved wisps flow outward from center
|
|
- Watercolor cloud layer for atmosphere
|
|
|
|
### Comet (CometFlowPanel)
|
|
- Watercolor nebula with curved wisps, tunnel rings, and central abyss
|
|
- Album art color extraction — samples artwork, derives 4 dominant hues + darkest color
|
|
- Palette lerps smoothly on track change
|
|
- Time-based hue mutation for continuous color evolution
|
|
- Fades to near-black during silence; wisps, rings, and clouds scale with total energy
|
|
- Corner vignettes using darkest album art color with bass-driven drift
|
|
- Beat detection spawns wisps on bass transients
|
|
|
|
### Shared
|
|
- All panels have per-panel FPS configuration
|
|
- Dedicated submenu with fixed positioning and hover bridge
|
|
|
|
---
|
|
|
|
## Immersive Mode
|
|
|
|
- **3-mode background** — Full (GPU shader), Lite (CSS blur), Off; configurable in settings
|
|
- **Auto-degrade** — sustained low FPS triggers automatic downgrade with dismissible modal notification
|
|
- **Per-panel FPS** — each visualizer has independent FPS settings; default 15 FPS
|
|
- **Configurable ambient FPS** — separate from panel FPS
|
|
- **Ambient background fixes** — 8x8 downscale replaces CSS blur; dark artwork mood preserved; MIRRORED_REPEAT for texture edges
|
|
- **Composition profiles** — GSK renderer selection and blur toggle per profile
|
|
- **GPU detection** — AMD and Intel identification for profile recommendations
|
|
- **GSK renderer control** — Cairo, GL, NGL, or Vulkan backend selection
|
|
- **Immersive settings** moved to end of Appearance section with standard collapsible pattern
|
|
|
|
---
|
|
|
|
## Artist Discovery
|
|
|
|
### MusicBrainz tag-based recommendations
|
|
- "You May Also Like" uses MusicBrainz genre tags instead of typical similar-artist APIs
|
|
- Deterministic shuffle for varied results across visits
|
|
- Shows 6 artists with 2 reserves for instant thumbs-down replacement
|
|
- Similarity percentage displayed per recommended artist
|
|
|
|
### Tag-scoped dismissals
|
|
- Thumbs down dismisses an artist from a specific tag/genre context only
|
|
- Same artist can still appear in different genre contexts
|
|
- SQLite table with composite key (tag + normalized artist name)
|
|
- Instant removal from list with reserve pull-in
|
|
|
|
### Artist Network sidebar
|
|
- Opens by default; preference persisted in localStorage
|
|
- State restoration after Queue/Lyrics close
|
|
- Clean transitions when navigating between artists (state reset on artist change)
|
|
- Simplified header: "Artist Network" title, PanelRightClose icon
|
|
- Empty relationship sections hidden automatically
|
|
|
|
---
|
|
|
|
## Label Releases View
|
|
|
|
- Completely redesigned with label logo header
|
|
- Sorting: date, title, popularity
|
|
- Filters: album, EP, single, live
|
|
- Search bar with animated expand
|
|
- Group-by-artist toggle with collapsible sections
|
|
- Performance improvements for large label catalogs
|
|
- Consistent back button and navigation height
|
|
|
|
---
|
|
|
|
## Security
|
|
|
|
- Removed hardcoded key material from credential encryption
|
|
- Cryptographically secure session ID generation (replaces deterministic)
|
|
- DOM-based HTML sanitization replacing regex-based sanitizer
|
|
- Sensitive identifiers and secrets redacted from backend logs
|
|
- Removed unused user_id accessors from Qobuz and Tauri API modules
|
|
- Hardened release-aur CI workflow permissions and input validation
|
|
|
|
---
|
|
|
|
## Spotify Import
|
|
|
|
- Removed Spotify API dependency entirely
|
|
- Uses embed page scraping for playlist import — no credentials needed
|
|
- Link resolver updated for new scraping approach
|
|
|
|
---
|
|
|
|
## New Features
|
|
|
|
- **Explicit content badges** across the entire app
|
|
- **Search track context menu** — right-click works on search result tracks
|
|
- **Track/disc number extraction** from file tags during local library import
|
|
- **Window size validation** prevents GDK crash from corrupt DB values (by @arminfelder, PR #136)
|
|
- **Cancel download** for purchase album downloads
|
|
- **Miniplayer keyboard shortcuts**
|
|
- **Autoconfig-graphics CLI tool** (`qbz --autoconfig-graphics`)
|
|
- **Custom artwork for playlists** and folder sidebar visibility controls
|
|
- **Image cache** — frontend image cache with size-aware loading, LRU eviction, and settings UI
|
|
- **Granular navigation history** with per-item scroll position
|
|
|
|
---
|
|
|
|
## Stability
|
|
|
|
- **Graceful shutdown** on RunEvent::Exit to prevent heap corruption
|
|
- **WebKit double-destroy prevention** — secondary windows close before main window
|
|
- **Window size clamping** to screen resolution; physical/logical pixel mismatch fixed
|
|
- **Flatpak tray icon** path corrected for sandbox environment
|
|
- **Snap MPRIS** declared as slot instead of plug
|
|
- **Titlebar double-click maximize** fixed
|
|
- **Opaque main window** default for shutdown stability on Linux
|
|
- **WebKit EGL shutdown workarounds** applied defensively
|
|
|
|
---
|
|
|
|
## Bug Fixes
|
|
|
|
- Equalizer animation no longer appears active when player is paused
|
|
- Home settings changes apply immediately without page reload
|
|
- Navigation scroll position scoped per item with 1-hour TTL
|
|
- Session restore no longer recalls stale scroll positions
|
|
- Download paths restructured to Artist/Album [FORMAT][Quality]/track
|
|
- EPs and singles backfilled when artist page omits them
|
|
- Search grid no longer collapses to single column on keystroke
|
|
- Escape on empty search input blurs focus instead of navigating
|
|
- Multi-select add-to-playlist sends all tracks in one call
|
|
- Deduplicate albums with quality subfolders in local library
|
|
- Reco meta caches cleared when image cache is cleared
|
|
- ML/reco module optimized for home view loading
|
|
- Artist resolution parallelized for card rendering
|
|
- Force dmabuf respected as full GPU opt-in for compositing
|
|
- FavQ and TopQ context types added to playback context
|
|
- Last.fm uses user-scoped storage for session restore
|
|
- Qobuz purchase source detection on library scan
|
|
- Svelte a11y and component warnings resolved across 26+ components
|
|
- ADR-001 compliance maintained across all new components
|
|
|
|
---
|
|
|
|
## Scene Discovery
|
|
|
|
- **Explore by location** — discover artists from the same city, country, or musical scene as any artist
|
|
- MusicBrainz-powered location and genre affinity matching with Qobuz catalog validation
|
|
- Progress tracking with animated loading phases (searching → validating → done)
|
|
- Two view modes: responsive grid and sidepanel with artist discography
|
|
- Alphabetical A-Z grouping with jump navigation index
|
|
- Genre multi-select filter with searchable popup (when >9 genres)
|
|
- Text search across discovered artists
|
|
- Sticky compact header on scroll with scene label, country flag, and genre summary
|
|
- Paginated "Load More" for large scenes
|
|
- Filtered count display (e.g., "42 / 100 artists")
|
|
|
|
---
|
|
|
|
## Discovery Tabs (Redesigned Home)
|
|
|
|
### 3-tab home layout
|
|
- **Home** — customizable feed with drag-to-reorder sections and per-section visibility toggles
|
|
- **Editor's Picks** — fixed Qobuz editorial curation (New Releases, Editor's Picks, Qobuzissimes, Press Awards, Popular Albums)
|
|
- **For You** — personalized recommendations built from listening history
|
|
|
|
### Home tab customization
|
|
- Sections include: New Releases, Press Awards, Popular Albums, Qobuzissimes, Editor's Picks, Qobuz Playlists, Your Mixes, Essential Discography, Recently Played, Continue Listening, Your Top Artists, More From Favorites
|
|
- Settings modal (gear icon) to toggle visibility and reorder sections
|
|
- Genre filter available on Home and Editor's Picks tabs
|
|
|
|
### For You tab
|
|
- Progressive loading with skeleton placeholders per section
|
|
- **Radio Stations** — 9 album-based radios (3 recent + 3 favorites + 3 top artists); dominant color extraction per card
|
|
- **Artists to Follow** — 10 suggested artists from similar-to-your-top-3 with styled 210px cards
|
|
- **Spotlight** — featured artist card with top tracks, playlists, "Create Radio" button, and "Qobuz Radio Station" subtitle; dominant color from artist image
|
|
- **Similar to [Album]** — albums related to a featured album
|
|
- **Rediscover Your Library** — neglected/forgotten albums from your collection
|
|
- **Essentials [Genre]** — essential albums from one of your top genres
|
|
|
|
### Sticky compact header
|
|
- Appears after 60px scroll; hides greeting and shows compact tab navigation with genre filter
|
|
- Edge-to-edge positioning with negative margin pattern (matching ArtistDetailView jump-nav)
|
|
- Time-based greeting (Morning/Afternoon/Evening) with i18n and username interpolation
|
|
|
|
### Session cache
|
|
- Album, artist, and track data cached to avoid redundant API calls on navigation
|
|
- Scroll position preserved per tab
|
|
|
|
---
|
|
|
|
## Packaging
|
|
|
|
- **Cargo.lock tracked in git** — enables deterministic builds for distro packagers (NixOS, etc.)
|
|
- **Tauri version sync** — @tauri-apps/api updated to 2.10.1 matching Rust crate 2.10.x
|
|
- **AUR cleanup** — removed non-functional aur-source and aur-git packages; only qbz-bin maintained
|
|
- **AUR maintainer email** updated
|
|
- **APT repository** — CI triggers APT repo update on release publish
|
|
- **Flatpak** — PipeWire stream matching restored; quality guidelines applied
|
|
|
|
---
|
|
|
|
## Contributors
|
|
|
|
- **@arminfelder** — Window size validation (PR #136)
|