When navigating from album(1) to album(2), the view type stays 'album'
so the scroll reset effect didn't trigger. Now tracks currentNavItemId
changes too, and explicitly scrolls to top for forward navigation while
preserving scroll restore on back/forward.
Navigation history now tracks itemId per entry (album, artist, playlist,
label, musician, purchase-album) so back/forward restores the exact page.
Scroll positions are saved per view+itemId key and restored on back/forward.
When user enables Force DMA-BUF in Developer Settings, skip the
NVIDIA+Wayland compositing disable. This setting signals "I want
full GPU acceleration" and should grant both DMA-BUF and compositing.
- Detect Flatpak sandbox at startup and log it
- In Flatpak on Wayland, unset DISPLAY to prevent WebKitGTK from
falling back to XWayland internally (causes CPU-GPU texture
round-trips that degrade CSS blur performance)
- Per-GPU Wayland paths: only disable compositing and DMA-BUF for
NVIDIA on Wayland. AMD/Intel get full GPU acceleration on native
Wayland (compositing enabled, DMA-BUF enabled)
- Change GitHub Releases Flatpak manifest from --socket=x11 to
--socket=fallback-x11 to match Flathub and prevent XWayland
on Wayland sessions
The "other" group contains podcast episodes with release_type "album"
that should stay in Others, not be moved to Albums. Only "download"
group items should be re-categorized since download is a distribution
channel, not a content classification.
The Qobuz artist/page API returns release groups with type "epSingle"
(not "ep" or "single"), and groups like "download" and "other" contain
mixed items (singles, albums) that should be re-categorized by each
item's individual release_type field.
The Qobuz artist/page endpoint sometimes excludes the EP/single
release group from its response. When this happens, fetch them
explicitly via get_releases_grid as a non-blocking backfill.
Move session restore to run immediately after playback preferences
load, before network-heavy initializations (favorites, offline
status, recommendation scores). This eliminates the multi-second
"No track playing" gap on slow storage.
Also restore the saved playback position visually and on first play
(seek to saved position, no auto-play).
Remove Spotify API credential setup from README since playlist import
now uses embed scraping. Update resolve_via_odesli_and_search doc
comment to reflect the new Spotify data path.
Spotify client_credentials API access ends 2026-03-06. Remove all
API token/proxy code and the paginated fetch_playlist_with_token
function. Playlist imports now go straight to embed page scraping
(limited to ~50 tracks, no ISRC/album data).
Link resolver for Spotify tracks/albums also switched from API to
embed page scraping via new fetch_embed_metadata function.
Remove Spotify credentials from .env.example since they are no
longer needed.
Add a new "System (Dark / Light)" theme option that toggles between
Dark and Light themes based on OS prefers-color-scheme, with a live
matchMedia listener for instant switching. Rename old "System" (auto
palette generation) to "Match Colors" for clarity.
Applies to main window, miniplayer, and bootstrap.
Closes#148
insert_qobuz_cached_track_direct was hardcoding track_number to 0,
causing all imported tracks to show wrong numbers. Now accepts
track_number and disc_number params, and both callers (backfill
downloads and offline cache sync) extract metadata from the audio
file via MetadataExtractor before inserting.
Also fix LocalLibraryView to use || instead of ?? for track_number
fallback, so 0 correctly falls back to index-based numbering.
Closes#147
Display parental_warning badge (E icon) next to track titles in all
views: TrackRow, QueuePanel, NowPlayingBar, ImmersivePlayer with all
13 visualizer panels, MiniPlayer surfaces, and AlbumDetailView.
Propagate parental_warning field through the full data chain from
Rust backend (qbz-models, queue, commands_v2, session_store, API
server) to frontend stores, adapters, and UI components. Badge uses
CSS mask technique with explicit.svg for theme compatibility.
Add artist grouping option for Label Releases view and remove
expensive loadAllAlbums() call. Use v2_get_label_page for richer
label image data. Add groupByArtist i18n keys to all 4 locales.
- Replace generic icon with circular label logo (matches LabelView)
- Fix double close button in search: single X that clears and closes
- Add sort options: newest, oldest, title A-Z/Z-A, artist A-Z
- Add Hi-Res filter toggle
- Load all albums automatically when sorting/filtering
- i18n: add labelReleases keys to all 4 locales
- Search bar now replaces title area instead of floating separately
API analysis: Qobuz label endpoints have no server-side sort/filter
params, so all sorting and filtering is done client-side after
paginated fetch.
Gapless now works on all backends, so the UI constraints that disabled
it for DAC Passthrough and ALSA Direct are removed. Only streaming-only
mode still disables gapless (no cache available). Removed experimental
badge. Cleaned up unused i18n keys.
ALSA Direct playback thread now supports gapless via mpsc channel:
when current source ends, it checks for a queued next source and
transitions seamlessly without draining the PCM buffer.
Format mismatch still blocks gapless (bit-perfect has priority).
Gapless now defaults to enabled for all backends.
v2_set_audio_gapless_enabled, v2_set_audio_normalization_enabled, and
v2_set_audio_normalization_target now call player.reload_settings()
after writing to SQLite, so changes take effect immediately without
requiring an app restart.
Only write to gain atomic on initial measurement. Refinements now
update the cache only, preventing audible volume changes within a
single track. Inter-track normalization still works via cached values.
insert_track() now checks downloaded_purchases table to set source.
get_downloaded_purchase_track_ids() verifies file existence and
auto-removes stale entries. Closes#115
Embeds quality in album folder name instead of subfolder, so each
quality variant appears as a separate album in the local library.
Adds download error toast and fixes format labels to bracket notation.
Closes#116
Arch's rust package defaults to rust-lld which causes ring crate's
native C/ASM symbols to be missing at link time. Force traditional
ld.bfd via RUSTFLAGS.
The bundled feature compiles sqlite3.c from source but fails to
link on Arch. Use system sqlite package instead, which is the
proper distro packaging approach. Also add missing deps: sqlite,
dbus, cmake, gcc.
MPRIS was declared as a plug (control other players) but QBZ needs to
register as an MPRIS media player (be controlled by media keys). Change
to a slot with name "qbz" so snapd exposes org.mpris.MediaPlayer2.qbz
on the session bus.
- Add Flathub badge and install command to README
- Rename Flatpak section to include both Flathub and GitHub Release
- Remove mpris from snap connect instructions (interface not available)
- Apply Flathub quality guidelines: developer id block, drop categories/keywords
- Expand feature list: local library, Plex, immersive/miniplayer modes,
artist blacklist, ListenBrainz, smart cache, customization
Incorporate feedback from Flathub reviewer (yakushabb):
- Use <developer id> block instead of deprecated <developer_name>
- Remove <categories> and <keywords> (pulled from .desktop file)
Expand feature list: local library, Plex integration, immersive and
miniplayer modes, artist blacklist, ListenBrainz, smart cache, and
customization options. Sync both metainfo copies.
The metainfo.xml had a fake full hash (cff32e5d47f3b44568af9...) that
returned 404 on raw.githubusercontent.com. Replace with the real commit
hash (cff32e5da7) where screenshots exist.
Normalize notification artwork to square PNG (max 512x512, <=4 MiB) before sending Icon::Bytes via ashpd portal, so album art renders reliably without legacy fallback.\n\ncx
The XDG portal notification spec's icon field doesn't support inline
album artwork the way freedesktop Notifications does with image-path.
Dual-path approach:
- Native (non-Flatpak): use org.freedesktop.Notifications D-Bus
interface directly with image-path hint for album artwork
- Flatpak (sandboxed): use ashpd portal (Flathub requirement)
Uses ashpd::is_sandboxed() for detection and ashpd's re-exported
zbus for the direct D-Bus call, avoiding extra dependencies.
The XDG portal was not displaying album artwork when passed as a
file:// URI (showed KDE default icon instead). Send artwork as
Icon::Bytes so the portal receives the image data directly.
Replace direct D-Bus notifications (notify-rust) with XDG Desktop
Portal notifications (ashpd) for Flathub compliance. Portal
notifications use the app's .desktop file identity and don't require
--talk-name=org.freedesktop.Notifications permission.
- Replace notify-rust dep with ashpd (linux-only, tokio+notification)
- Use NotificationProxy for portal-based notifications
- Use stable ID "track-now-playing" to replace instead of stacking
- Convert artwork path to file:// URI via ashpd::Uri
- Graceful fallback when portal is unavailable
Replace binary blur toggle with a 3-option dropdown. Full mode uses
the existing WebGL2 shader, Lite mode renders a pre-blurred static
image animated with CSS transforms (compositor-driven, immune to
Wayland frame callback stutter), and Off mode shows a solid color.
Includes config migration from disableBlurBackground to backgroundMode,
updated composition profiles, and i18n for all 4 locales.
Closes#127