Commit Graph
2641 Commits
Author SHA1 Message Date
vicrodh 5f1d5a24ce feat(ui): add album cover context menu in AlbumDetailView
Right-click on album artwork shows context menu with:
- Add/Change/Remove custom album cover
- Open in browser
- Save as...

Also adds v2_save_image_url_to_file backend command.

cc
2026-02-24 10:06:02 -06:00
vicrodh cac07b92d7 feat(i18n): add album cover context menu translations
Keys for add/change/remove custom cover, open in browser,
save as, and toast messages. All 4 locales (en, es, de, fr).

cc
2026-02-24 10:01:34 -06:00
vicrodh 877c3e4a0c feat(store): add customAlbumCoverStore with init/clear lifecycle
Frontend store for custom album covers. Initialized on login,
cleared on logout. Same pattern as customArtistImageStore.

cc
2026-02-24 10:00:24 -06:00
vicrodh 958561ab5d feat(backend): add custom album cover commands
v2_library_set_custom_album_cover: resize, cache, store in db
v2_library_remove_custom_album_cover: delete files + db entry
v2_library_get_all_custom_album_covers: bulk load for frontend store

cc
2026-02-24 09:59:29 -06:00
vicrodh 5dc83145bb feat(db): add custom_album_covers table and methods
Schema for user-uploaded custom album covers (keyed by album_id).
Database methods: set, get, remove, get_all.

cc
2026-02-24 09:58:27 -06:00
vicrodh 03507c0a49 fix(keybindings): restore original queue shortcut to q
Closes #125

cc
2026-02-24 09:51:24 -06:00
vicrodh 8fe8d39b53 feat(keybindings): add sidebar shortcut, rebrand Focus to Immersive
- Add ui.sidebar action (Shift+S) to toggle sidebar (fixes #125)
- Change ui.focusMode default to Shift+I, ui.queue to Shift+Q
- Rename "Focus Mode" to "Immersive" in all user-facing labels
- Update all 4 locale files (en, es, de, fr)
- KeybindingsSettings modal: 820px width, 3-column layout
- ShortcutInput: compact sizing (32px height, smaller fonts)

cc
2026-02-24 09:41:13 -06:00
vicrodh 2b15a0828c chore(packaging): unify .desktop files across all formats
- Add flac; keyword to all .desktop files (was only in deb template)
- Add StartupNotify=true to flatpak .desktop files (was missing)
- Add Keywords line to snap .desktop (was missing entirely)
- Unify shortDescription to match other .desktop Comment fields

cc
2026-02-24 09:32:37 -06:00
vicrodh f2e0d6727f fix(ci): add concurrency lock and detached HEAD recovery to AUR workflow
Prevents race conditions when multiple tags trigger simultaneous AUR
pushes. Recovers from corrupted master branch in AUR repo.
2026-02-23 18:33:14 -06:00
vicrodh 1981771584 chore: bump version to 1.1.17 2026-02-23 17:59:24 -06:00
vicrodh 9e4058607b fix(snap): binary renamed from qbz-nix to qbz, update to v1.1.16 2026-02-23 17:51:42 -06:00
vicrodh 00c47694b3 Merge branch 'pre-release' 2026-02-23 17:16:03 -06:00
vicrodh 67ef1d5918 fix: apply GDK_DPI_SCALE on all backends, not just XWayland
GDK_DPI_SCALE is a float multiplier that works on X11, XWayland, and
native Wayland. Previously it was only applied when force_x11 was
enabled, leaving native Wayland users with no way to compensate for
their DE scale factor from within the app.

- Move GDK_DPI_SCALE application out of the force_x11 block in main.rs
- Show the DPI Scale setting in the UI for all backends (not gated
  behind the Force X11 toggle)
- GDK_SCALE remains XWayland-only (integer, not useful on Wayland)
- Setting is already persistent in graphics_settings.db
2026-02-23 17:10:41 -06:00
vicrodh c643511f1f add StandWithPalestine banner to README 2026-02-23 17:04:42 -06:00
vicrodh 57f8bdefad feat: persist window size and maximized state across sessions
- Add window_width, window_height, is_maximized columns to window_settings DB
  with automatic migration for existing installs
- Restore saved size on startup; restore maximized state after window creation
- Save non-maximized size on every Resize event
- Save maximized flag on CloseRequested
- Default remains 1280x800 for first launch
2026-02-23 16:58:35 -06:00
vicrodh e32ad6edd0 fix: store ToS after successful login instead of gating login on ToS
- Remove require_tos_accepted gate from all login commands
  (v2_auto_login, v2_manual_login, v2_start_oauth_login, v2_login)
- Call accept_tos_best_effort after each successful session activation
  so the value is persisted the moment login succeeds
- Re-initialize LegalSettingsStore in accept_tos_best_effort if torn
  down (e.g. after factory reset that deletes legal_settings.db)
- Bootstrap ToS check now fails open (unwrap_or(true)) so saved
  credentials still trigger auto-login after a factory reset

The frontend checkbox already gates the UI; the backend gate was
causing double-failures when the DB was unavailable post-factory-reset.
2026-02-23 16:47:24 -06:00
vicrodh f8514c8c20 feat(oauth): support Google/Apple/Facebook OAuth popups via on_new_window
window.open() calls from social login providers are intercepted and opened
as related WebviewWindows (required on Linux/WebKitGTK). Both the main
window and all popups watch for play.qobuz.com?code_autorisation= so the
code is captured regardless of which window receives the final redirect.

Cleanup on timeout/cancel iterates all qobuz-oauth* windows.
2026-02-23 16:07:44 -06:00
vicrodh 3b4397ee2c sync: pull pre-release base 2026-02-23 16:07:44 -06:00
vicrodh 5017bb4f82 feat: added browser auth method to align new Qobuz requirements 2026-02-23 15:36:10 -06:00
vicrodh 835fd19934 feat(oauth): persist session token for automatic re-auth on restart
- Save user_auth_token after successful OAuth login
- On bootstrap, restore session via saved token if no email/password creds
- If token is expired, clear it so user sees login screen normally
- Clear OAuth token on v2_clear_saved_credentials (logout)
- Add login_with_token() to api client (reuses OAuth /user/login step)

Also rename t->translateStore in NowPlayingBar.svelte (ADR-001 fix from Codex)
and improve clean-dev-runtime.sh to kill all stale processes and ports
2026-02-23 15:30:43 -06:00
vicrodh eb609faf0b chore(oauth): remove sensitive values from log output 2026-02-23 15:25:31 -06:00
vicrodh 21358aa876 fix(oauth): use 'code' param for /oauth/callback API (Qobuz uses code_autorisation in redirect URL but 'code' in the API) 2026-02-23 15:24:40 -06:00
vicrodh 674990ebe5 debug(oauth): log response body on /oauth/callback failure, add app_id query param 2026-02-23 15:22:06 -06:00
vicrodh 22060d1d35 fix(oauth): correct parameter names (code_autorisation, not code)
Qobuz redirects to play.qobuz.com/discover?code_autorisation=XXX
not ?code=XXX. Both the navigation intercept and the /oauth/callback
API call were using the wrong parameter name, so the code was never
captured and the exchange request was malformed.
2026-02-23 15:18:52 -06:00
vicrodh fea13ecee7 fix(oauth): close window from navigation callback, always return true
on_navigation returning false does not reliably block HTTP 302 redirects
on WebKitGTK (Linux). Closing the window from within the callback is
more reliable than calling close() from an async Tokio thread.

Changes:
- Always return true from on_navigation (never try to block)
- Close oauth window inside on_navigation callback after code capture
- Best-effort close via app.get_webview_window() after await (fallback)
- Add logging of every URL visited for debugging
- Idempotent: ignore duplicate code captures if callback fires twice
2026-02-23 15:16:05 -06:00
vicrodh 35ac015bb7 feat(login): add OAuth browser login button and fix ToS persistence race condition 2026-02-23 14:45:34 -06:00
vicrodh e5d34ccee7 feat(commands): add v2_start_oauth_login Tauri command with WebView browser login 2026-02-23 14:45:30 -06:00
vicrodh afbe541fca feat(api): add private_key extraction, OAUTH_CALLBACK path, and login_with_oauth_code to legacy client 2026-02-23 14:45:27 -06:00
vicrodh 9d6be623d4 feat(core): add set_session to QbzCore and login_with_session to CoreBridge for OAuth 2026-02-23 14:45:24 -06:00
vicrodh 5ed96c1d2d feat(qobuz): add private_key extraction and login_with_oauth_code to qbz-qobuz client 2026-02-23 14:45:20 -06:00
vicrodh 1c3cff46a3 fix(login): await ToS persistence before backend login call
The subscribe handler in qobuzLegalStore persists acceptance fire-and-
forget. If the user checks the box and immediately clicks Login, the
async write can lose the race against require_tos_accepted() which reads
the DB synchronously. Force a synchronous persist in handleLogin() so the
backend gate always sees the correct value.
2026-02-23 14:13:00 -06:00
vicrodh 3489819841 release: merge pre-release into main for v1.1.15 2026-02-23 13:15:11 -06:00
vicrodh b8eadf9fe2 docs: add vorce queue fix credit and QA thank-you to 1.1.15 release notes 2026-02-23 13:11:58 -06:00
vicrodh 161b304c55 docs: reformat 1.1.15 TAG_DETAILS to match established release note style 2026-02-23 12:47:41 -06:00
vicrodh 305af37a67 docs: add 1.1.15 release notes (tag details, highlights, full changelog) 2026-02-23 12:25:55 -06:00
vicrodh 0df1448a69 chore(release): bump root snapcraft.yaml to 1.1.15 2026-02-23 12:19:13 -06:00
vicrodh 26db1c1728 chore(release): bump version to 1.1.15 2026-02-23 12:18:08 -06:00
vicrodh 5678032722 Merge branch 'pre-release' of github.com:vicrodh/qbz into pre-release
# Conflicts:
#	src/lib/components/views/ArtistDetailView.svelte
2026-02-23 12:15:38 -06:00
vicrodh 84709b4adc fix(navigation): expire scroll positions after 1 hour 2026-02-23 12:14:04 -06:00
vicrodh 69b60b1bd9 fix(navigation): scope scroll position by item ID to prevent bleed between different albums/artists
Previously all albums shared one scroll position key ('album'), so
opening any album would restore the scroll from the last album visited.
Now keyed as 'album:id', 'artist:id', 'playlist:id' so each item
tracks its own position independently. Back navigates to exact scroll,
fresh opens start at 0.
2026-02-23 12:09:40 -06:00
vicrodh 6b6dd54944 fix(multi-select): move BulkActionBar to bottom position, add LabelView multi-select
- Revert placement='top' to default bottom sticky across all views
- Content area already has padding-bottom: 100px in all views so no
  track is ever hidden behind the bar
- AlbumDetailView/ArtistDetailView/WeeklySuggestView: bar now after tracks
- DynamicSuggestView/FavQView/TopQView: bar now after tracks (new views)
- LabelView: complete multi-select implementation with checkbox rows,
  Select toggle button, and BulkActionBar after popular tracks list
2026-02-23 12:05:14 -06:00
vicrodh e2beba23f2 feat(multi-select): Phase 3 - AlbumDetailView, ArtistDetailView, WeeklySuggestView
AlbumDetailView:
- Select toggle button alongside AlbumMenu in action bar
- TrackRow selectable/selected/onToggleSelect props wired
- BulkActionBar with play next/later, add to playlist, add to favorites
- buildAlbumQueueTracks helper (album artwork and artist from album props)

ArtistDetailView (Popular Tracks section):
- Select button in section-header-actions alongside Play All
- Checkbox injected before track-number in custom track-row div
- click/keydown/contextmenu handlers respect multiSelectMode
- multi-selected highlight CSS
- BulkActionBar with add to favorites using toggleTrackFavorite

WeeklySuggestView:
- Select toggle button in track-controls (next to search)
- TrackRow selectable/selected/onToggleSelect props wired
- BulkActionBar with play next/later, add to playlist
- Reuses existing buildQueueTracks helper
2026-02-23 11:31:58 -06:00
vicrodh 127841a18b feat(multi-select): Phase 2 - PlaylistDetailView + BulkActionBar fixes
- Add multi-select mode to PlaylistDetailView (independent of custom order mode):
  Select toggle button in track-controls toolbar, multiSelectedKeys state,
  checkboxes per row, multi-selected highlight, BulkActionBar with play
  next/later, add to playlist, and bulk remove from playlist
- Bulk remove handles local tracks (one-by-one), Qobuz tracks with
  playlistTrackId, and fallback trackId in a single invocation each
- Add onRemoveFavorites prop to BulkActionBar (HeartOff icon, danger style)
- Fix FavoritesView: replace Add to Favorites with Remove from Favorites
  (tracks are already in favorites, remove makes sense there)
2026-02-23 11:13:09 -06:00
vicrodh b1a7ce51c7 feat(multi-select): Phase 1 - FavoritesView track multi-select
- Add BulkActionBar component (sticky-bottom bar with queue split button,
  add to playlist, add to favorites, clear selection)
- Add selectable/selected/onToggleSelect props to TrackRow with checkbox UI
- Add .selected highlight and .track-checkbox CSS to TrackRow
- Extend VirtualizedTrackList with selectable/selectedIds/onToggleSelect props
- Wire FavoritesView tracks tab: Select toggle button in toolbar,
  selectedTrackIds state, BulkActionBar with bulk queue/favorites/playlist handlers
- Add actions.select and actions.cancelSelection i18n keys to all 4 locales
2026-02-23 11:07:30 -06:00
vicrodh 9de0c3c233 feat(backend): add bulk queue and bulk favorites commands
- v2_bulk_add_to_queue: add multiple tracks to end of queue
- v2_bulk_add_to_queue_next: add multiple tracks as play next (reversed
  to preserve selection order)
- v2_bulk_add_favorites: add multiple tracks to favorites via API then
  update local cache atomically (lock not held across await points)
- v2_add_tracks_to_playlist and v2_remove_tracks_from_playlist already
  accept Vec<u64> — no changes needed for playlist bulk actions
2026-02-23 10:55:59 -06:00
vicrodh f53af39185 feat(favorites): show album artwork in track rows, add release codename
- Favorite tracks now display album art between track number and title,
  matching the layout used in PlaylistDetailView (showArtwork=true)
- VirtualizedTrackList gains showArtwork and getArtworkUrl props
- AboutModal: add release codename 'La marrano de engorda' (1.1.15)
- README: remove stale KWin native title bar manual workaround section
2026-02-23 10:25:36 -06:00
vicrodh e843cb736f fix(svelte): remove hidden t shadow and harden checker
cx
2026-02-23 10:09:41 -06:00
vicrodh 7084c49182 docs: document manual KWin SSD rule for native Plasma title bar on KDE Wayland 2026-02-23 10:01:51 -06:00
vicrodh c473b86a2d fix: cleanup stale KWin SSD rule written by 1.1.14 on startup 2026-02-23 10:00:46 -06:00
vicrodh 9db1e5ca6b perf(cache): increase L1 to 400MB and L2 to 800MB
L1 (memory): 300MB -> 400MB (+100MB)
L2 (disk):   500MB -> 800MB (+300MB)
2026-02-23 08:55:33 -06:00