diff --git a/docs/BETA_TEST_CHECKLIST_1.1.15-rc-1.md b/docs/BETA_TEST_CHECKLIST_1.1.15-rc-1.md deleted file mode 100644 index 3eeb90f02..000000000 --- a/docs/BETA_TEST_CHECKLIST_1.1.15-rc-1.md +++ /dev/null @@ -1,50 +0,0 @@ -# QBZ 1.1.15-rc-1 Beta Test Checklist - -Thanks for helping validate this release candidate. - -## Important context - -- This RC includes significant backend changes. -- Please test your normal daily flows end-to-end, not only new features. -- Any regression report is valuable, even if it looks minor. - -## Region note for Purchases - -Qobuz purchases are not available in all countries (for example Mexico). If Purchases is unavailable in your region/account, report that as "not testable" and continue with the rest of the checklist. - -## Purchases validation (if available on your account) - -1. Open `Purchases` from sidebar. -2. Confirm albums and tracks load (no empty-error state). -3. Search by artist/album/track and confirm results update correctly. -4. Open album detail and confirm tracklist renders. -5. Verify format selector options are visible. -6. Download one track to a chosen folder. -7. Download full album to a chosen folder. -8. Restart app and verify downloaded state persists. -9. Confirm unavailable purchases show clear unavailable UI. - -## Core regression checklist (all testers) - -1. Login, restart app, and confirm session persistence. -2. Home loads correctly and navigation remains responsive. -3. Search (all tabs you normally use) returns expected results. -4. Playback basics: play/pause, next/prev, seekbar, queue advance. -5. Queue operations: add, reorder, shuffle, clear queue, history behavior. -6. Favorites: tracks/albums/artists/playlists (load and toggle). -7. Playlists: open, edit, reorder tracks, play all. -8. Local Library: browse albums/artists/tracks and play local content. -9. Settings panels: open each section and confirm no command-not-found errors. -10. Immersive mode: open, switch tabs, return to main player. - -## Report template - -Please include: - -- OS + desktop environment -- QBZ version: `1.1.15-rc-1` -- Repro steps -- Expected vs actual behavior -- Console/terminal logs if available -- Screenshot/video if useful - diff --git a/docs/release-1.1.19/CHANGELOG_FULL.md b/docs/release-1.1.19/CHANGELOG_FULL.md new file mode 100644 index 000000000..e7015defd --- /dev/null +++ b/docs/release-1.1.19/CHANGELOG_FULL.md @@ -0,0 +1,212 @@ +# 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 + +--- + +## 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) diff --git a/docs/release-1.1.19/CHANGELOG_HIGHLIGHTS.md b/docs/release-1.1.19/CHANGELOG_HIGHLIGHTS.md new file mode 100644 index 000000000..47bd861fa --- /dev/null +++ b/docs/release-1.1.19/CHANGELOG_HIGHLIGHTS.md @@ -0,0 +1,40 @@ +# QBZ 1.1.19 Release Highlights + +## Highlights + +- **Audio engine upgraded** — vendored rodio/cpal removed; now on upstream rodio 0.22 with ALSA sample rate fallback, gapless on all backends, and smart quality downgrade +- **Booklet viewer** — albums with digital booklets get an in-app PDF viewer powered by native MuPDF; includes download button +- **3 Neon visualizers** — Laser, Tunnel, and Comet; all music-reactive with bass/mid/high response. Comet extracts colors from album artwork +- **Artist discovery** — MusicBrainz tag-based recommendations with tag-scoped thumbs down and similarity percentages +- **Label Releases redesigned** — logo header, sorting, filters, group-by-artist toggle, and search +- **Explicit badges** — shown across the entire app + +## Audio + +- ALSA sample rate fallback when DAC doesn't support requested rate +- PipeWire suspension before ALSA Direct exclusive access +- Gapless playback now available on ALSA Direct, defaults to ON +- Smart quality downgrade with hardware compatibility tooltip + +## Immersive + +- 3-mode background system (Full/Lite/Off) with auto-degrade on low FPS +- Per-panel FPS settings for each visualizer +- Comet visualizer adopts album art palette and fades on silence + +## Security + +- Removed hardcoded key material, cryptographic session IDs, DOM-based sanitization, log redaction + +## Stability + +- Graceful shutdown — no more heap corruption on exit +- Window size validation and clamping +- Flatpak tray icon and Snap MPRIS fixes + +## Bug Fixes + +- Equalizer bars no longer animate when paused +- Navigation scroll position scoped per item with 1-hour TTL +- Home settings apply immediately without reload +- Download paths corrected to Artist/Album/track structure diff --git a/docs/release-1.1.19/TAG_DETAILS.md b/docs/release-1.1.19/TAG_DETAILS.md new file mode 100644 index 000000000..aead08763 --- /dev/null +++ b/docs/release-1.1.19/TAG_DETAILS.md @@ -0,0 +1,101 @@ +# 1.1.19 — Limpiando la casa + +Massive housekeeping release. Upgraded the audio engine, hardened security, rebuilt the booklet viewer, and added three new Neon visualizers — all while fixing dozens of stability issues across shutdown, window management, and audio routing. + +--- + +## Audio Engine Upgrade — rodio 0.22 + +The vendored rodio/cpal fork has been removed entirely. QBZ now uses upstream rodio 0.22, which means faster updates, fewer maintenance headaches, and broader hardware compatibility. + + - **ALSA sample rate fallback** — if your DAC doesn't support the requested rate, QBZ now falls back gracefully instead of failing silently + - **PipeWire suspension** — PipeWire sink is suspended before ALSA Direct takes exclusive access, eliminating DeviceBusy errors on first play + - **Gapless playback on ALSA Direct** — gapless is now available on all backends and defaults to ON + - **Smart quality downgrade** — when hardware can't handle a sample rate, QBZ automatically selects the best compatible quality and shows a tooltip explaining why + +## Booklet Viewer — MuPDF + + - **PDF booklets** — albums with digital booklets now show a booklet button; opens a full in-app viewer + - **MuPDF backend** — replaced pdfjs-dist with native MuPDF rendering for crisp, fast page display + - **Download button** — save the booklet PDF directly from the viewer + +## Neon Visualizers + +Three new Canvas 2D visualizers under the Neon category in Immersive mode: + + - **Laser** — neon laser beams that pulse and bend with the music + - **Tunnel** — depth-tunnel effect with warped rings and flowing wisps + - **Comet** — watercolor nebula with curved wisps, tunnel rings, and a central abyss; extracts colors from album artwork so each album has its own palette + +All three respond dynamically to bass, mids, and highs. The Comet visualizer fades nearly to black during silence and breathes back to life when the music returns. Subtle corner vignettes using the darkest album art color protect track info text readability. + +## Immersive Improvements + + - **3-mode background** — Full (GPU shader), Lite (CSS blur), or Off; auto-degrades on sustained low FPS with a dismissible notification + - **Per-panel FPS** — each visualizer panel has its own FPS setting; defaults to 15 FPS for battery life + - **Configurable ambient FPS** — separate from panel FPS + +## Artist Discovery — MusicBrainz Tags + + - **Tag-based recommendations** — "You May Also Like" in the Artist Network sidebar now uses MusicBrainz genre tags to find related artists, breaking away from the typical "similar artist" bubble + - **Tag-scoped thumbs down** — dismiss an artist from a specific genre context (e.g., AC/DC dismissed from "electronic" but still valid in "metal"); instant removal with reserve replacement + - **Similarity percentage** — each recommended artist shows how closely they match based on shared tags + +## Artist Network Sidebar + + - **Open by default** — sidebar auto-opens when visiting an artist page; preference persisted + - **State restoration** — closing the sidebar for Queue or Lyrics remembers the previous state and restores it when they close + - **Clean transitions** — no more stale data flash when navigating between artists + - **Simplified header** — "Artist Network" title with PanelRightClose icon; empty relationship sections are hidden + +## Security Hardening + + - Removed hardcoded key material from credential encryption + - Cryptographically secure session ID generation + - DOM-based HTML sanitization replacing regex + - Sensitive identifiers redacted from backend logs + - Hardened CI workflow permissions and input handling + +## Label Releases View + + - **Redesigned** — new layout with label logo, sorting (date/title/popularity), filters (album/EP/single/live), and search + - **Group by artist** — toggle to organize releases by artist with collapsible sections + - **Performance** — virtualized rendering for labels with hundreds of releases + +## New Features + + - **Explicit content badges** — shown across the entire app where applicable + - **Search track context menu** — right-click on search result tracks now works + - **Track/disc number extraction** — local library now reads track and disc numbers from file tags during import + - **Spotify import via embed scraping** — removed API dependency; imports work without Spotify credentials + - **Window size validation** — prevents GDK crashes from corrupt stored dimensions (by @arminfelder, PR #136) + - **GPU detection** — AMD and Intel GPU identification for composition profile recommendations + - **GSK renderer control** — choose between Cairo, GL, NGL, or Vulkan rendering backends + - **Cancel download** — purchase album downloads can now be cancelled mid-progress + - **Miniplayer shortcuts** — keyboard shortcuts for miniplayer controls + +## Stability Fixes + + - **Graceful shutdown** — eliminated heap corruption on exit caused by double-destroy of WebKit windows + - **Window size clamping** — prevents oversized windows from crashing GDK on restore + - **Secondary window teardown** — miniplayer and secondary windows close cleanly before app exit + - **Flatpak tray icon** — correct icon path resolution inside the Flatpak sandbox + - **Snap MPRIS** — declared as slot instead of plug for proper media control integration + +## Bug Fixes + + - Equalizer animation no longer appears active when player is paused + - Home settings changes apply immediately without page reload + - Navigation scroll position is now 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 + - Audio settings sync on startup for OAuth login path + - Output device name updates during playback via polling + - Svelte a11y and component warnings resolved across 26+ components + +--- + +Special thanks to **@arminfelder** for contributing window size validation (PR #136). + +Full changelog: https://github.com/vicrodh/qbz/compare/v1.1.18...v1.1.19 diff --git a/src/lib/components/AboutModal.svelte b/src/lib/components/AboutModal.svelte index d6ed3eb72..bef93cfa7 100644 --- a/src/lib/components/AboutModal.svelte +++ b/src/lib/components/AboutModal.svelte @@ -167,6 +167,11 @@ boxdot +