Commit Graph
2498 Commits
Author SHA1 Message Date
vicrodh 9f82235bbb feat: add BookletViewer component with pdfjs-dist
Modal PDF viewer for album booklets with page navigation,
zoom controls, and keyboard shortcuts. Uses pdfjs-dist to
render PDF pages from URL in canvas.
2026-02-26 14:40:14 -06:00
vicrodh c110d9ab85 feat: add goodies/booklet types to frontend and adapter
Add QobuzGoody interface, goodies field to QobuzAlbum and AlbumDetail,
and pass goodies through in convertQobuzAlbum adapter.
2026-02-26 14:39:10 -06:00
vicrodh 65d457f3b4 feat: add Goody model to qbz-models for album booklets
Add Goody struct and goodies field to Album for Qobuz album
booklet/liner notes PDF support.
2026-02-26 14:38:43 -06:00
vicrodh dfc3b2137c feat: per-panel FPS settings for all immersive animations
All animations default to 60fps. Each panel reads its own setting
from userStorage via shared fpsConfig utility. Settings UI shows
a collapsed section with per-panel dropdowns:

- Background Blur, Spectrum, X/Y (Lissajous), Oscilloscope,
  Energy Bands, Transient Pulse, Album Reactive, Spectral Ribbon

Options: Disabled, 15, 30, 60, 120 FPS
i18n keys added to all 4 locales (en, es, de, fr)
2026-02-26 14:22:30 -06:00
vicrodh 75e31e4b32 feat: configurable ambient background FPS in settings
Add setting for immersive background animation frame rate:
- Disabled, 15 FPS (default), 30 FPS, 60 FPS, 120 FPS
- Persisted via userStorage, read at canvas init
- Disabled renders a single static frame
- Setting placed in Appearance section after immersive default view
- i18n keys added to all 4 locales (en, es, de, fr)

Visualizer panels reverted to 30fps (unrelated to ambient bg).
2026-02-26 14:19:02 -06:00
vicrodh c99bd72df4 feat: bump all visualizer panels from 30fps to 60fps
Updated frame throttle in all immersive panels:
- LissajousPanel (X/Y)
- VisualizerPanel (spectrum)
- OscilloscopePanel
- EnergyBandsPanel
- TransientPulsePanel
- AlbumReactivePanel

SpectralRibbon was already at 60fps.
2026-02-26 14:13:40 -06:00
vicrodh e145dca289 feat: bump immersive visualizer to 60fps
Was hardcoded at 15fps (not the 30fps from config). Updated both
the canvas frame throttle and the default config to 60fps.
2026-02-26 13:41:13 -06:00
vicrodh 0ee79d8a69 fix: destroy miniplayer window before app exit
WebKit's WebProcess was crashing (SIGABRT) during EGL/GPU resource
cleanup when the app exited with the miniplayer window still alive.
Now explicitly destroy the miniplayer window before the main process
exits, giving WebKit time to clean up gracefully.
2026-02-26 13:34:30 -06:00
vicrodh 5ceafc881c fix: bump snapcraft.yaml version to 1.1.18
snapcraft.yaml had hardcoded version and source-tag still pointing
to 1.1.17, causing Snapcraft to build/publish the wrong version.
2026-02-26 06:36:48 -06:00
Victor RH a9c393b326 Merge pull request #130 from vicrodh/dependabot/npm_and_yarn/rollup-4.59.0
chore(deps-dev): bump rollup from 4.55.2 to 4.59.0
2026-02-26 03:56:34 -06:00
dependabot[bot] ab2a70bccf chore(deps-dev): bump rollup from 4.55.2 to 4.59.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.55.2 to 4.59.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.55.2...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-26 09:43:18 +00:00
vicrodh 6d2128e90a chore: bump version to 1.1.18 2026-02-26 03:41:45 -06:00
vicrodh d21a8a3a49 Merge branch 'feature/miniplayer' into pre-release 2026-02-26 02:45:28 -06:00
vicrodh 630a8c16c5 refactor(i18n): replace get(t) with direct $t() calls in 6 components
Remove unnecessary get() wrapper from svelte/store when calling the
i18n translate function. Direct $t() works correctly in regular
functions (only $derived is problematic per ADR-001). Removes unused
get import from GenreFilterButton, FavoritesView, PlaylistDetailView,
PurchaseAlbumDetailView, PurchasesView, and SettingsView.
2026-02-26 02:44:17 -06:00
vicrodh 067264e7ec chore(scripts): add ghost-doctor and ultra-restore dev tooling
Add dev-ghost-doctor.sh (t-shadow check + runtime clean + restart) and
dev-ultra-restore.sh (deep clean with --full/--no-start/--check flags).
Improve check-no-t-shadow.sh patterns for broader t-variable detection.
Clean-dev-runtime now runs guardrail check automatically. Remove --force
from vite dev. Add npm script shortcuts for all new tools.
2026-02-26 02:44:06 -06:00
vicrodh 39a35e5467 fix(player): reduce now playing song card width for compact layouts
cx
2026-02-26 02:35:35 -06:00
vicrodh 67a159e270 fix(miniplayer): center micro window controls overlay
cx
2026-02-26 02:34:42 -06:00
vicrodh d6852500bf fix(miniplayer): refine queue artwork overlays and inline controls
cx
2026-02-26 02:22:52 -06:00
vicrodh e0cfc5d92b feat(miniplayer): add default surface setting and queue row play controls
cx
2026-02-26 02:14:09 -06:00
vicrodh 339f2b8106 fix(miniplayer): restore next/prev playback and remanent shuffle
cx
2026-02-26 02:03:15 -06:00
vicrodh 9302ffe5e6 fix(miniplayer): sync window theme with global app settings
cx
2026-02-26 01:58:37 -06:00
vicrodh 1ba6fe13d5 refactor(miniplayer): tighten compact spacing and simplify play button
cx
2026-02-26 01:54:11 -06:00
vicrodh d6b0e0f5ea feat(miniplayer): refine micro surface layout and controls
cx
2026-02-26 01:45:59 -06:00
vicrodh 99c8ae1ed3 feat(miniplayer): rebuild surfaces window with compact overlay polish
cx
2026-02-26 00:54:13 -06:00
vicrodh ddedca1b5e chore: fix remaining Rust warnings
- Allow dead_code on TokenValidationResponse.code (deserialized but not read)
- Remove unused MusicProvider import in commands_v2.rs
- Restore #[allow(non_snake_case)] on v2_plex_cache_get_tracks
- Replace drop(tokens) with let _ = tokens (drop on reference is no-op)
2026-02-25 20:57:30 -06:00
vicrodh e8979e88c0 feat(artist): add open in browser and save as to artist image context menu
Mirror the album cover context menu options: right-clicking the artist
photo now shows Open in Browser and Save As below the existing
custom image options, separated by a divider.
2026-02-25 20:27:24 -06:00
vicrodh af83cec692 feat(ui): subtle rounded corners and shadow when window is floating
Detect maximized state via Tauri window API. When the window is not
maximized (floating), apply 8px border-radius and a soft box-shadow.
Body/html backgrounds set to transparent so corners show through
the Tauri transparent window.
2026-02-25 20:20:59 -06:00
vicrodh 08c92b0bc2 fix(titlebar): match background color with sidebar across all themes
Replace hardcoded gradient with var(--bg-secondary) so the titlebar
background matches the sidebar in every theme.
2026-02-25 20:15:00 -06:00
vicrodh 6c3f7e8d40 fix(favorites): heart button works in tracks tab, animate out on unfavorite
Remove isFavoriteOverride={true} that forced all hearts filled,
preventing the toggle from having any visible effect. Subscribe to
favoritesStore so unfavorited tracks animate out (slide+fade) and
are removed from the list after 300ms without requiring a refresh.
2026-02-25 20:11:31 -06:00
vicrodh e829c5dc7f fix(home): diversify More From Favorites with per-artist cap and shuffle
Shuffle favorite artists randomly so all get a fair chance (was
deterministic, first artist dominated). Cap at 2 albums per artist.
Shuffle final results for variety on each load.
2026-02-25 20:03:48 -06:00
vicrodh 736753585e feat(titlebar): add window controls customization store and i18n keys 2026-02-25 20:00:15 -06:00
vicrodh 76cdfc73b2 fix(titlebar): reduce circular large button gap to 15px 2026-02-25 20:00:10 -06:00
vicrodh 44bb1dc6f9 feat(titlebar): scale window control button gap by size
Circular: 6px (small) -> 12px (normal) -> 18px (large)
Square: 4px (small) -> 8px (normal) -> 12px (large)
Rectangular stays flush (no gap) at all sizes.
2026-02-25 19:57:40 -06:00
vicrodh fddb7e0c40 chore: suppress camelCase warnings in V2 Tauri commands
Add #[allow(non_snake_case)] to V2 command functions and structs that
use camelCase parameter names for Tauri frontend compatibility.
Renaming to snake_case would break the frontend-backend contract.
2026-02-25 19:51:15 -06:00
vicrodh 56b4d467e3 fix(listenbrainz): fix error display, persistence, and build warning
- Remove unused ListenBrainzResponse struct (build warning)
- Fix error display showing [object Object] instead of actual message
- Persist credentials to legacy SQLite cache on connect/disconnect
  so they survive app restarts
2026-02-25 19:13:15 -06:00
vicrodh dce0b5c900 feat(settings): convert to tab-based navigation
Replace scroll-based section navigation with tab-based rendering where
only one section is visible at a time. Merge Offline Mode into Downloads
tab. Move Remote Control into Developer tab. Uncollapse previously
collapsed sections (Downloads, Storage, Developer). Add Developer to
nav tabs.
2026-02-25 18:59:40 -06:00
vicrodh 867abb5f51 feat(search): hide SearchView input when search is in titlebar
When the titlebar search is active, the search input inside SearchView
is redundant. Hide it so only the tabs and results remain. The query
still syncs from the titlebar via the shared searchState store.
2026-02-25 17:56:11 -06:00
vicrodh bff518e638 feat(search): add toggleable search bar in titlebar
Search input can now live in the titlebar instead of the sidebar,
controlled by a new toggle in Settings > Appearance. When the custom
titlebar is hidden or system titlebar is active, search stays in the
sidebar regardless of the toggle.

- New searchBarLocationStore with localStorage persistence
- TitleBar accepts search props and exposes focusSearch()
- Sidebar hides its search container when titlebar search is active
- Ctrl+F focuses the active search input in both modes
- Titlebar height increased from 32px to 36px to fit the search field
- Translations added to all 4 locale files (en, es, de, fr)
2026-02-25 17:53:13 -06:00
vicrodh 7babed1e63 chore: remove test file 2026-02-25 17:22:20 -06:00
vicrodh 3f5170e3bd test: should pass 2026-02-25 17:22:17 -06:00
vicrodh a68594f348 fix(adr-001): replace t variable names in store callbacks
Rename t -> item/track in .map()/.filter() callbacks in
favoritesStore.ts and queueStore.ts to comply with ADR-001
and prevent intermittent PostCSS extraction failures.

cc
2026-02-25 17:18:07 -06:00
vicrodh cc21491079 fix(search): search shortcut works with collapsed sidebar
Expand the sidebar automatically when Ctrl+F is pressed while it's
collapsed. Also replace setTimeout with Svelte's tick() in focusSearch
to properly wait for DOM updates before focusing the input.

Closes #124

cc
2026-02-25 16:55:55 -06:00
vicrodh 4e2be5d77e fix(search): use v2_search_playlists command for playlist search
Playlist search tab was invoking legacy 'search_playlists' command
which no longer exists. Updated both initial search and load-more
to use 'v2_search_playlists', matching the other search tabs.

Closes #129

cc
2026-02-25 16:49:22 -06:00
vicrodh 0227e0cb50 fix: More From Favorites now shows discovery albums from favorite artists
Previously, the section displayed the user's own favorite albums — the
same albums they had already marked as favorites.  Now it resolves the
artists behind those favorite albums (and favorite tracks), fetches
their catalogs from the Qobuz API (parallel, max 8 artists, 25 albums
each), and filters out albums the user already has in favorites or
recently played.  Results are cached in reco_album_meta for instant
future lookups.

Closes #122
2026-02-24 15:30:03 -06:00
vicrodh c72a168bf6 fix: clear progress bar and add-to-library button after adding
After clicking Add to Local Library, the in-memory download state is
cleared so the progress bar and button disappear. Also triggers a
background scan of the added folder so the library indexes the new
files without requiring a manual refresh.
2026-02-24 15:12:06 -06:00
vicrodh 6067eb280b feat: format-aware download status in album detail view
Download checkmarks now only show for the currently selected format.
In-memory store tracks formatId per album download, and the album
detail view checks track.downloaded_format_ids from backend against
the selected format dropdown. Switching quality hides checkmarks
from a different format's downloads.
2026-02-24 15:09:16 -06:00
vicrodh 4073b9fd35 feat: track download format in SQLite for per-quality status
Migrate downloaded_purchases to compound PK (track_id, format_id) so
the same track downloaded in MP3 and FLAC are tracked separately.
Album detail endpoint now returns downloaded_format_ids per track.
2026-02-24 15:07:58 -06:00
vicrodh 4435674210 fix: persist download checkmarks across restarts, keep track numbers
Album detail view now checks track.downloaded (from SQLite) in
addition to in-memory session status, so checkmarks survive restart.
Track numbers are no longer replaced by checkmarks -- the number
column always shows the track number (spinner only while downloading),
and the download column handles all status indicators.
2026-02-24 14:42:53 -06:00
vicrodh f31dd8755c feat: allow re-downloading purchased tracks
Green checkmark on downloaded tracks now shows a download icon on
hover, allowing users to re-download in a different format or
location. Applied to both the Purchases track list and album detail.
2026-02-24 14:31:17 -06:00
vicrodh 43d8f90153 feat: add quality/format selector for individual track downloads
When downloading a single track from the Purchases tab, if multiple
formats are available a popup lets the user choose before the folder
picker opens. Single-format tracks proceed directly as before.
2026-02-24 14:30:27 -06:00