Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 6678a8317f fix(snap): use system sqlite for arm64 link
cx
2026-02-05 18:07:46 -06:00
vicrodh 0639027fbb chore: remove old ROADMAP.md (moved to docs) 2026-02-05 17:56:39 -06:00
vicrodh 4829236c29 fix(readme): change all badges to flat-square style 2026-02-05 17:47:00 -06:00
vicrodh 2cac902d81 fix(readme): replace Snapcraft badge with shields.io inline badge
Remove the large standalone Snapcraft badge and add a shields.io
badge matching the style of the other badges in the header row.
2026-02-05 17:45:08 -06:00
vicrodh a8004f1a92 fix(immersive): increase menu opacity and auto-close on mouse leave
Bump window menu background from 0.7 to 0.8. Add 2-second auto-close
timer when mouse leaves the menu area; re-entering cancels the timer.
2026-02-05 17:40:07 -06:00
vicrodh fe10c0514b fix(immersive): adjust window menu opacity and alignment
Increase background opacity from 0.5 to 0.7 and open menu to the
right (left-aligned) instead of right-aligned.
2026-02-05 17:24:26 -06:00
vicrodh 95d5eba026 feat(immersive): add window controls dropdown to player bar
Replace the non-functional '...' button with a dropdown menu
containing Fullscreen, Maximize/Restore, Minimize, and Exit
Immersive options. Menu uses the same glassmorphism style as the
player bar for visual consistency.
2026-02-05 17:22:05 -06:00
vicrodh 1256a15a5a feat(i18n): add window control translation keys for immersive player
Add fullScreen, exitFullScreen, maximize, restore, minimize, and
exitImmersive keys to the player section in all 4 locale files.
2026-02-05 17:22:00 -06:00
vicrodh 59bcbe9dd7 feat(immersive): persist and restore view preference (#51)
On open, restore the preferred view from localStorage. When set to
'remember', save the current view on every view/tab switch via header
or keyboard. When set to a specific view, always open to that view.
2026-02-05 17:05:46 -06:00
vicrodh 27763582a0 feat(settings): add immersive default view dropdown (#51)
Add dropdown in Settings > Appearance to choose which view immersive
mode opens with. Options: Remember last used (default), 6 focus views,
and 4 split-mode combinations. Persisted via localStorage.
2026-02-05 17:05:42 -06:00
vicrodh 62c0810a67 feat(i18n): add immersive default view translation keys
Add immersiveDefaultView label and immersiveViews object with all 11
view options to en.json, es.json, fr.json, and de.json under
settings.appearance.
2026-02-05 17:05:37 -06:00
vicrodh 7718f10b37 feat(visualizer): update TappedSource to work with f32 samples
Change Source<Item = i16> to Source<Item = f32> throughout.
Remove i16-to-f32 normalization since f32 samples are already in
[-1.0, 1.0] range. Update tests to use f32 sample data.
2026-02-05 16:20:03 -06:00
vicrodh a923798bae feat(audio): add write_f32() and migrate PlaybackEngine to f32 pipeline
PlaybackEngine::append() now accepts Source<Item = f32>.
ALSA Direct thread uses f32 buffer and calls write_f32().

New write_f32() method in AlsaDirectStream converts f32 samples to
hardware format with full 24-bit precision:
- S24_3LE: f32 -> 24-bit packed 3 bytes (SMSL/Topping DACs)
- S32LE: f32 -> i32 full range
- S24LE: f32 -> 24-bit in i32 container
- S16LE: f32 -> i16
- FloatLE: direct write

Old write(&[i16]) kept for safety during migration.
2026-02-05 16:19:27 -06:00
vicrodh 2c276154b8 feat(streaming): change IncrementalStreamingSource output from i16 to f32
Update sample queue, SampleBuffer, and Iterator Item type to f32.
Streaming playback from Qobuz now preserves 24-bit audio data.
2026-02-05 16:17:49 -06:00
vicrodh 1219493dff feat(player): change player module sample type from i16 to f32
Update AudioSpecs, decode_with_symphonia(), decode_with_fallback(),
wrap_source closure, and all Source boxing casts to use f32 samples.
This ensures 24-bit audio data flows through the player without
truncation to 16-bit.
2026-02-05 16:17:27 -06:00
vicrodh ba828866ef feat(rodio): change SymphoniaDecoder output from i16 to f32
Change SampleBuffer<i16> to SampleBuffer<f32> in the vendored rodio
decoder. This preserves 24-bit audio data (f32 has 24 bits of
significand) instead of truncating to 16-bit at decode time.

Affects: symphonia.rs (SampleBuffer, Iterator::Item)
         mod.rs (Decoder, LoopedDecoder, DecoderImpl Iterator::Item)
2026-02-05 16:16:34 -06:00
vicrodh c0508c8050 chore: ignore snapcraft remote-build logs
cx
2026-02-05 11:59:51 -06:00
vicrodh cbfb91ad2f fix: show favorite state for popular tracks on artist page
Subscribe to favoritesStore in ArtistDetailView to display filled
heart icon when a track is already favorited. The button now toggles
(add/remove) instead of only adding, with proper loading state.
2026-02-05 11:25:12 -06:00
vicrodh a70a33577c fix(player): resume playback from queue after stop (#46)
When user presses STOP then PLAY, playback now resumes the current
queue track instead of doing nothing. Added onResumeFromStop callback
in playerStore that queries the backend queue state and re-plays the
current track. The audio cache ensures instant playback within the
same session.
2026-02-05 11:11:48 -06:00
vicrodh a2cd01e449 fix(album): add defensive fallback for blank album page (#43)
When activeView is 'album' but selectedAlbum is null, show an error
message with a back button instead of a blank page. Also add detailed
console logging in handleAlbumClick to help diagnose the root cause
for users who can reproduce.
2026-02-05 08:47:31 -06:00
vicrodh af0e235bb2 fix(immersive): close lyrics sidebar when entering immersive (#47)
Lyrics sidebar was staying open behind the immersive player, causing
duplicate CPU usage for synced lyrics rendering. Now hideLyricsSidebar
is called alongside closeAllMenus when opening fullscreen or focus mode.
2026-02-05 08:37:52 -06:00
vicrodh 2f5f5ff8a6 fix(volume): restore pre-mute volume on unmute (#48)
Mute now saves the current volume before setting to 0, and unmute
restores it. Pre-mute volume persists in localStorage across sessions.
Centralized toggleMute in playerStore so all UI components (NowPlayingBar,
immersive VolumeSlider) behave consistently. Also moved session volume
persistence into setVolume to avoid duplication.
2026-02-05 08:36:56 -06:00
vicrodh 348d57e84f fix(immersive): close popups and raise z-index on open (#47)
Dropdowns and popups with z-index 10000 were appearing over the
immersive player (z-index 100). Raise immersive to 10001 and call
closeAll() on the floating menu store when entering immersive mode.
2026-02-05 08:34:13 -06:00
vicrodh c87f8f982e fix(audio): disable limit-quality-to-device feature (#45)
The device capability detection was unreliable, causing incorrect
downgrades to 16b/44.1kHz on some PipeWire+DAC setups. Disconnect
the quality limiting logic in play_track and prefetch_track, hide
the toggle from settings UI, and default to off. Code preserved
for future fix.
2026-02-05 08:32:13 -06:00
vicrodh 8cd28920c3 fix(snap): prioritize gnome sdk libs in link
cx
2026-02-05 07:22:46 -06:00
vicrodh 419348804b fix(snap): add gnome sdk rpath link flags
cx
2026-02-05 06:19:44 -06:00
vicrodh db37bdf3e3 fix(snap): prefer gnome sdk libs in build
cx
2026-02-05 05:28:39 -06:00
vicrodh 0c66215734 fix(snap): add arm64 build support
cx
2026-02-05 04:25:04 -06:00
vicrodh 614cd5cfbc docs: drop macos section from README
cx
2026-02-05 04:16:08 -06:00
vicrodh 9266ec7e1a docs: add 1.1.8 highlights to README
cx
2026-02-05 04:15:23 -06:00
vicrodh c8c1053ede chore(snap): symlink packaging snapcraft.yaml
cx
2026-02-05 04:14:12 -06:00
vicrodh 617721a1c7 docs: update audio notes and include 1.1.8 release docs
cx
2026-02-05 04:12:56 -06:00
vicrodh b1afa5f40b docs: add snap badge and post-install steps
cx
2026-02-05 04:09:08 -06:00
vicrodh f67193fe82 chore(snap): add root snapcraft.yaml
cx
2026-02-05 04:09:00 -06:00
vicrodh eb27f6df76 chore(snap): align snap name with store
cx
2026-02-05 03:37:28 -06:00
vicrodh 3dcd17a516 chore: ignore snapcraft build dirs
cx
2026-02-05 03:33:16 -06:00
vicrodh 93efeb7c1b fix(snap): rely on staged alsa configs
cx
2026-02-05 03:26:40 -06:00
vicrodh d5b655cf5c fix(snap): enable pipewire alsa pcm
cx
2026-02-05 03:21:09 -06:00
vicrodh e2f8219f4f fix(snap): provide alsa conf.d
cx
2026-02-05 03:04:50 -06:00
vicrodh 64beef783b fix(snap): bind alsa config path
cx
2026-02-05 03:02:03 -06:00
vicrodh f353a5eef1 fix(snap): stage alsa config data
cx
2026-02-05 02:46:39 -06:00
vicrodh bfcae6ab2a fix(snap): include pulse utils and network status
cx
2026-02-05 02:45:15 -06:00
vicrodh 3716dea7a9 fix(snap): build via tauri cli
cx
2026-02-05 02:30:20 -06:00
vicrodh c5411b8ddf fix(snap): correct perl patch syntax
cx
2026-02-05 02:23:35 -06:00
vicrodh d548da318d fix(snap): avoid python in build patch
cx
2026-02-05 02:22:48 -06:00
vicrodh a65025def8 fix(snap): patch portal override in build
cx
2026-02-05 02:21:59 -06:00
vicrodh de93411de0 fix(snap): allow portal override
cx
2026-02-05 02:21:18 -06:00
vicrodh dd11e81a07 chore: ignore snap artifacts
cx
2026-02-05 02:15:51 -06:00
vicrodh e373779a4a fix(snap): passthrough webkit layout
cx
2026-02-05 02:11:33 -06:00
vicrodh ffe6f78138 fix(snap): bind webkit process path
cx
2026-02-05 02:07:22 -06:00
vicrodh de10fa2a39 fix(snap): set webkit exec path
cx
2026-02-05 02:05:36 -06:00
vicrodh dc13171526 fix(snap): prefer gnome gl libraries
cx
2026-02-05 02:03:48 -06:00
vicrodh c06dfd38aa chore(snap): add store metadata
cx
2026-02-05 01:58:58 -06:00
vicrodh 2555457f93 fix(snap): build tauri with manifest path
cx
2026-02-05 01:47:05 -06:00
vicrodh 4131d15293 chore(snap): place gui assets with snapcraft
cx
2026-02-05 01:36:18 -06:00
vicrodh ceb552d5c8 chore(snap): prepare snapcraft for v1.1.8
cx
2026-02-05 01:35:17 -06:00
vicrodh 6d49e2ce5a chore: bump version to 1.1.8 2026-02-04 20:48:22 -06:00
vicrodh d30c25be85 fix(suggestions): search more tracks and try normalized artist names
1. Artist name normalization fallback:
   - If "Mikael Åkerfeldt" finds no results, also try "Mikael Akerfeldt"
   - Helps with artists whose Qobuz name lacks accents

2. Increased track search limits:
   - Playlist artists: search up to 30 tracks (was 9)
   - API search: fetch 100-500 results to find enough matches
   - Needed because search results mix artist's tracks with appearances

This should fix:
- Missing Opeth tracks (all 9 found were already in playlist)
- Mikael Åkerfeldt not found (Qobuz has "Mikael Akerfeldt")
2026-02-04 20:45:46 -06:00
vicrodh c28c80962b fix(genres): force English locale for genre list API
Ensures genre names are consistent (English) for all users regardless
of their Qobuz registration country. This affects the genre filter
in Home and Favorites views.
2026-02-04 20:40:35 -06:00
vicrodh 39c67123e7 fix(suggestions): force English locale for genre checking
Qobuz returns localized genre names based on user's registered address,
not app language. This caused genre filtering to fail when user sees
"América Latina" instead of "Latin".

Solution: Pass lang=en explicitly when fetching artist albums for genre
verification. This ensures consistent English genre names regardless of
user's registration country.

Also simplified the incompatible genres list since we only need English now.
2026-02-04 20:39:50 -06:00
vicrodh c4432dea80 fix(suggestions): add localized genre names and improve logging
1. Add localized genre names to blocklist:
   - Spanish: "América latina", "música latina", "infantil", etc.
   - French: "variété française", "comptines", etc.
   - German: "Kindermusik", etc.

2. Upgrade step 4a logging to INFO level to debug missing Opeth tracks
   - Shows which playlist artists are being searched
   - Shows how many tracks found vs skipped (already in playlist)
2026-02-04 20:37:35 -06:00
vicrodh 295d0496d2 fix(suggestions): resolve deadlock in Qobuz similar artists fallback
Pass client reference to search_artist_tracks_by_qobuz_id instead of
acquiring a new lock, which caused deadlock when step 4c already held
the qobuz_client lock.
2026-02-04 20:32:44 -06:00
vicrodh f385e3a75b fix(suggestions): add Qobuz similar artists fallback and accent normalization
Two improvements:

1. Accent normalization in artist validation
   - Now "Mikael Åkerfeldt" matches "Mikael Akerfeldt" in Qobuz
   - Uses existing normalize_name() function for comparison

2. Qobuz similar artists as fallback (step 4c)
   - When pool has <20 tracks after MusicBrainz relationships
   - Fetches similar artists from Qobuz API for each playlist artist
   - These artists are guaranteed to exist in Qobuz
   - Still applies genre compatibility filter

This ensures playlists with few MusicBrainz relationships (like solo
artists) still get meaningful suggestions from Qobuz's own similarity
data.
2026-02-04 20:23:29 -06:00
vicrodh c30b367e07 fix(suggestions): expand incompatible genre list
Add more genres and keywords to filter:
- Electronic/Dance: trance, techno, house, EDM, dubstep, etc.
- Spoken word: audiobook, hörbuch, podcast, meditation, ASMR
- Country: country, bluegrass, americana
- New age: healing, spa, yoga, mindfulness
- Additional title keywords: "gelesen von", "read by", "trance mix"

This prevents suggestions like:
- Tony Parsons (trance DJ) in Iron Maiden playlist
- Tony Parsons (German audiobook narrator) in metal playlist
2026-02-04 20:14:34 -06:00
vicrodh c03c5e525c fix(suggestions): add genre validation to filter incompatible artists
When validating if an artist exists in Qobuz, now also checks their
album genres against a blocklist. This prevents false matches like:

- "Martin Lopez" (bachata singer) matching when we want the drummer
- "Martin Mendez" (merengue) matching when we want the bassist

Incompatible genres: bachata, merengue, reggaeton, salsa, cumbia,
k-pop, j-pop, gospel, children's music, etc.

The validation fetches up to 5 albums and checks both genre metadata
and album titles for incompatible keywords.
2026-02-04 19:55:37 -06:00
vicrodh eb7e848e94 fix(suggestions): validate artists exist in Qobuz before searching tracks
Add pre-validation step that checks if an artist has a dedicated Qobuz
page before searching for their tracks. This prevents false matches for:

- Session musicians who don't have their own catalog (e.g., Martin Lopez
  the drummer returning tracks from unrelated Martin Lopez artists)
- Names that exist in MusicBrainz but not in Qobuz's artist database

The validation searches Qobuz artists for exact name match with
albums_count > 0. Also matches tracks by Qobuz artist ID when possible
(more precise than name matching).

Also fix outdated test assertions for config defaults.
2026-02-04 19:46:50 -06:00
vicrodh 4af2b0b1bd fix(suggestions): even stricter name matching for 2-word names
- For 2-word names: require EXACT same words (no extra words allowed)
- 'Martin Lopez' vs 'Tomas Martin Lopez' → REJECT (different word count)
- 'George Harrison' vs 'Harrison, George' → ACCEPT (same words, different order)
2026-02-04 19:41:54 -06:00
vicrodh 3a94e250c7 fix(suggestions): strict artist name matching to prevent false positives
- Add normalize_name() to handle accents (Martín -> Martin)
- Require ALL words of shorter name to match longer name
- Remove permissive 'contains' checks that allowed partial matches
- For 2-3 word names, require 66%+ match ratio
- Prevents 'Martín Méndez' from matching 'Tomas Martin Lopez'
2026-02-04 19:40:54 -06:00
vicrodh ed1bd31554 fix(suggestions): improve pool management and artist identity validation
- Increase pool sizes (INITIAL_POOL 18->30, EXPANDED_POOL 60->100, MAX_POOL 120->200)
- Add auto-refresh when available tracks fall below threshold (MIN_AVAILABLE_THRESHOLD=12)
- Add artist identity validation to filter incompatible genres (prevents merengue in metal playlists)
- Log when artists are skipped due to incompatible disambiguation
- Increase backend defaults (max_artists 20->30, tracks_per_artist 5->6, max_pool_size 100->150)
2026-02-04 19:34:52 -06:00
vicrodh 1bb9fc8382 fix(collage): add size constraints to prevent image overflow 2026-02-04 19:17:03 -06:00
vicrodh 61b4c38ea4 chore: update logo 2026-02-04 18:53:50 -06:00
vicrodh 94c867c934 chore: bump version to 1.1.8-rc-6 for workflow testing 2026-02-04 18:46:58 -06:00
vicrodh 31df685e08 fix: lower jump-nav z-index to prevent overlap with dropdown menus
Reduced z-index from 4 to 1 to ensure dropdown menus appear above
the sticky navigation bar.

cc
2026-02-04 17:25:16 -06:00
vicrodh 4dec2df315 chore: temporarily disable remote control setup guide button
Content not ready for release.

cc
2026-02-04 16:51:50 -06:00
vicrodh eaed5b3c9e refactor(artist): improve hide artist button
- Hide button only shows when content filtering is enabled
- Use custom blind-eye.svg icon
- Remove border for cleaner look
- Banner also conditional on filtering being enabled

cc
2026-02-04 14:58:06 -06:00
vicrodh 7e8e79c025 refactor(artist): replace blacklist button with hide dropdown
- Replaced prominent blacklist button with smaller tertiary button
- Button now opens dropdown with descriptive help text:
  "Hide this artist - Don't show in searches, playlists, discover, etc."
- Updated terminology from "blacklist" to "hide/show"
- Updated banner and toast messages for consistency
- Uses EyeOff icon instead of Ban for softer visual

cc
2026-02-04 14:35:21 -06:00
vicrodh 0877213625 feat: add warning toast type
The 'warning' type was being used but not defined in ToastType.

cc
2026-02-04 14:20:07 -06:00
vicrodh a044017c3b fix: more $t() and store access issues in $derived() blocks
- PlaylistModal: convert $derived with get(t) to regular function
- LocalLibraryTagEditorModal: rename 't' to 'track' in map to avoid
  shadowing the t store

cc
2026-02-04 14:18:36 -06:00
vicrodh 73e7d799df i18n: add download.* keys to French and German locales
cc
2026-02-04 14:05:45 -06:00
vicrodh c9b26eb4db fix: remove $t() calls from $derived() blocks to fix PostCSS errors
vite-plugin-svelte CSS extraction fails when $t() is used inside $derived().
This causes "[postcss] Unknown word <script" errors that appear to be cache
issues but are actually a known Svelte 5 / vite-plugin-svelte incompatibility.

Files fixed:
- DownloadButton.svelte: use titleKey pattern with function resolver
- DACSetupWizard.svelte: use labelKey pattern resolved in WizardStepper
- RemoteControlSetupGuide.svelte: use labelKey pattern
- WizardStepper.svelte: support optional labelKey with $t() in template

Also added download.* translation keys to en.json and es.json.

cc
2026-02-04 14:05:18 -06:00
vicrodh 4cfde680aa chore: remove debug logging from HomeView
cc
2026-02-04 08:14:45 -06:00
vicrodh deaffa183d feat(home): add Qobuz discover playlists section with tag filter
- Add backend endpoint for /discover/playlists API
- Add PlaylistTagFilter dropdown component for filtering by genre
- Add QobuzPlaylistCard with CSS blur background effect (color-thief style)
- Add HorizontalScrollRow header snippet for custom headers with scroll controls
- Add session cache store for caching API responses
- Add i18n keys for playlist filter and discover section

cc
2026-02-03 21:37:26 -06:00
vicrodh 9341e9ee19 fix: migrate cached_artists table to include locale column
Old database schemas created before locale support was added
caused "no such column: locale" errors when fetching artists.
The migration detects this and drops the old table so it gets
recreated with the correct schema.

Fixes Top Artists section not appearing in Home view.
2026-02-03 17:11:38 -06:00
vicrodh 2818ac4d29 security: improve credential encryption and CORS configurability
Security improvements based on code review:

1. Credential Encryption (Critical)
   - Replace XOR obfuscation with AES-256-GCM encryption
   - Derive key from machine ID (tied to specific machine)
   - Add migration support for legacy XOR format
   - Automatic re-encryption on first load of legacy credentials

2. HTTPS Default (Medium)
   - Change default `secure` setting to `true` for new installs
   - Existing users keep their current setting

3. Configurable CORS Origins (High)
   - Replace hardcoded domain whitelist with SQLite-backed storage
   - Default origins: vicrodh.github.io, control.qbz.lol
   - Add commands: get/add/remove origins, restore defaults
   - Origins can be customized for third-party clients
   - Server restarts automatically when origins change

New dependencies:
   - aes-gcm: AES-256-GCM authenticated encryption
   - sha2: SHA-256 for key derivation
2026-02-03 12:36:18 -06:00
vicrodh 8e7d9de754 docs: add OpenAPI specification for Remote Control API
Add comprehensive OpenAPI 3.1 documentation covering all REST endpoints:
- Connection/auth endpoints (ping, cert)
- Playback control (play, pause, seek, volume, next, previous)
- Queue management (add, shuffle, repeat, play index)
- Search (tracks, albums, artists)
- Favorites management
- Library (album/artist details)
- Real-time updates (SSE and WebSocket)

Also add /api/docs endpoint to serve the spec when Remote Control is active.
This enables developers to build custom clients (web, CLI, mobile).
2026-02-03 11:34:04 -06:00
vicrodh 001cadcbe7 refactor(settings): move Remote Control to end, make collapsible
- Move Remote Control section to end of Settings (after Updates)
- Make section collapsible, closed by default
- Keep Experimental badge visible when collapsed
- Update nav sidebar order to reflect new position
- Remove unused .section-title-row CSS selectors
2026-02-03 11:17:40 -06:00
vicrodh 1039241d28 feat(api): add SSE endpoint for real-time playback updates
Add /api/events endpoint using Server-Sent Events (SSE) as a more
efficient alternative to WebSocket for pushing playback state updates
to PWA clients. SSE provides automatic reconnection and is simpler
to implement on the client side.

- Add tokio-stream dependency with sync feature for BroadcastStream
- Implement sse_handler with 15s keep-alive ping
- Keep /api/ws for backwards compatibility
2026-02-03 10:57:16 -06:00
vicrodh 596efc05ce feat(api): add add-to-queue-next endpoint 2026-02-03 09:31:20 -06:00
vicrodh 477258d94a feat(remote): sync shuffle/repeat between desktop and PWA
- Add shuffle/repeat fields to PlaybackEvent struct
- Emit queue:state event when shuffle/repeat changes via API
- Add queue event listener in desktop frontend
- Include shuffle/repeat in WebSocket broadcasts
- PWA updates shuffle/repeat from WebSocket messages

This enables bidirectional sync: changes from PWA update desktop UI,
and changes from desktop update PWA via WebSocket.
2026-02-03 09:22:55 -06:00
vicrodh 6b85086b0a fix(player): sync volume from backend playback events
Update the local volume state when receiving playback events from the
backend. This ensures the volume slider reflects changes made via
remote control or other external sources.
2026-02-03 09:14:52 -06:00
vicrodh b0ddf2d020 fix(player): always keep event listener active for remote control
The playback event listener was only started when currentTrack existed,
creating a chicken-and-egg problem: external playback (from PWA) couldn't
set currentTrack because the listener wasn't active to receive the event.

Now the listener is always active, allowing remote control to update the
player state even when nothing is playing locally.
2026-02-03 09:00:09 -06:00
vicrodh 21054b9f22 fix(player): update player state immediately on external track change
Call notifyListeners() right after setting currentTrack when track
changes from remote control. Also update isPlaying and currentTime
from the event to ensure player UI reflects correct state.

Added debug logging for queue track mismatches.
2026-02-03 08:39:09 -06:00
vicrodh d1347bc425 fix(player): sync queue when track changes from remote control
When a track change is detected from an external source (e.g., PWA
remote control), also sync the full queue state. This fixes the issue
where desktop UI showed empty queue after PWA started playback.
2026-02-03 08:28:39 -06:00
vicrodh 651d0b0792 chore: bump version to 1.1.8-rc-5 2026-02-03 08:28:34 -06:00
vicrodh 027d5d74d2 fix(api): emit playback events immediately to update desktop UI
Add emit_playback_update() to notify both desktop UI (Tauri event) and
PWA (WebSocket) when playback state changes from remote commands.

Previously, desktop UI would only update on the next polling cycle (up
to 5 seconds), making the remote control feel unresponsive.
2026-02-03 08:17:46 -06:00
vicrodh 0651acf1db Add playback preferences API endpoint for remote control
- GET /api/playback/preferences - get current autoplay mode
- POST /api/playback/autoplay - set autoplay mode (continue/track_only/infinite)
2026-02-03 07:54:39 -06:00
vicrodh 8e4d39684a feat(api): add album and artist detail endpoints 2026-02-03 05:52:12 -06:00
vicrodh 22834822df feat(api): add favorites and album playback endpoints
- GET /api/favorites - Get user favorites (albums, tracks, artists)
- POST /api/favorites/add - Add item to favorites
- POST /api/favorites/remove - Remove item from favorites
- POST /api/album/play - Play album (clears queue and adds all tracks)
2026-02-03 05:49:53 -06:00
vicrodh da93c746cf feat(remote-control): add setup guide wizard and experimental badge
- Add RemoteControlSetupGuide component with step-by-step instructions
- Include certificate installation guides for iOS, macOS, Windows, Android
- Mark remote control section as "Experimental" with red badge
- Add Setup Guide button to open the wizard
- Add translations for wizard (en/es)
2026-02-03 05:38:20 -06:00
vicrodh 4972c76746 feat(api): add search_all endpoint for combined search
- GET /api/search/all returns albums, tracks, and artists
- Parallel search queries for better performance
- Respects artist blacklist filtering
2026-02-03 05:31:38 -06:00