Files
qbz/docs/release-1.1.19/CHANGELOG_FULL.md
T

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)