Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 4f16ec044b fix(library): normalize tag fields 2026-01-13 09:18:41 -06:00
vicrodh 0de536b1a0 feat(library): smarter folder art and metadata fallbacks 2026-01-13 09:14:02 -06:00
vicrodh 166571566a perf(rodio): set fixed ALSA buffer size on linux 2026-01-13 08:38:24 -06:00
vicrodh f2c1fce6da perf(player): reduce sink empty polling frequency 2026-01-13 01:18:40 -06:00
vicrodh c68c943a95 perf(rodio): reduce periodic control polling 2026-01-13 01:17:35 -06:00
vicrodh bdd6776188 perf(alsa): increase buffer/period to reduce wakeups 2026-01-13 01:17:07 -06:00
vicrodh 86258f019f chore(aur): add missing runtime deps 2026-01-13 01:12:29 -06:00
vicrodh 52379b1718 fix(player): normalize pause deadline assignments 2026-01-13 01:00:22 -06:00
vicrodh e927a61505 fix(app): set TMPDIR and resolve pause deadline compile errors 2026-01-13 00:55:32 -06:00
vicrodh aacf8a7dc1 fix(player): correct pause suspend deadline assignment 2026-01-13 00:37:06 -06:00
vicrodh 333ae44d5a fix(player): resume path compile fixes 2026-01-13 00:32:32 -06:00
vicrodh 1e6a8b1aee perf(rodio): reduce control polling during playback 2026-01-13 00:27:03 -06:00
vicrodh 3c1c598e34 perf(player): suspend audio stream after pause 2026-01-13 00:23:00 -06:00
vicrodh 486cc191f9 perf(alsa): reduce playback wakeups via cpal buffer tuning 2026-01-13 00:17:28 -06:00
vicrodh bb44dd96cd perf(player): lazy init and release audio stream 2026-01-12 22:17:54 -06:00
vicrodh 3226dc251a perf(app): slow playback polling when idle 2026-01-12 22:04:51 -06:00
vicrodh c8eccbcec2 fix(player): resolve idle loop borrow conflicts 2026-01-12 21:52:52 -06:00
vicrodh 03a0a13e26 perf(player): block audio thread when idle 2026-01-12 21:47:43 -06:00
vicrodh 1f49e001b5 perf: lazy-initialize media server to save CPU when not casting
The media server was starting at app launch and polling every 250ms
even when not using Chromecast/DLNA casting. Now it only starts when
the user actually tries to cast audio.
2026-01-12 20:57:34 -06:00
vicrodh dbc004eed7 perf: add lazy loading and reduce memory footprint
- Add loading="lazy" decoding="async" to images in AlbumCard, ArtistDetailView
- Convert AlbumCard hover from JS state to CSS :hover (fewer re-renders)
- Reduce IntersectionObserver thresholds from 4 to 1 in ArtistDetailView
- Reduce default audio cache from 500MB to 200MB
2026-01-12 20:42:34 -06:00
vicrodh 3e8fe0771a perf: add adaptive polling and fix lyrics interval leak
- Playback state polling: 1000ms when paused, 250ms when playing
- Audio thread timeout: 500ms when idle, 100ms when playing
- Lyrics interval: self-check to auto-stop when conditions not met
- Add cleanup return to lyrics  in +page.svelte
- Add build-and-run.sh and monitor-resources.sh scripts
- Add OPTIMIZATION_PLAN.md documentation
2026-01-12 20:38:48 -06:00
vicrodh 9a817a5203 fix: use correct desktop file for AUR with Icon=qbz 2026-01-12 19:07:40 -06:00
vicrodh ee45918d22 fix: sync full PKGBUILD from repo instead of partial sed updates 2026-01-12 18:31:04 -06:00
vicrodh a76db696a3 feat: use PAT token to trigger release-aur workflow automatically 2026-01-12 18:11:10 -06:00
vicrodh 11a731298e fix: restore file ownership after generating .SRCINFO 2026-01-12 18:06:51 -06:00
vicrodh 118d6a7202 fix: run makepkg as non-root user in release-aur workflow 2026-01-12 18:04:47 -06:00
vicrodh f42e63bcb3 Fix icons with transparent background and improve AUR packaging
- Regenerate all icons from logo.png with proper transparency
- Add 48x48, 64x64, 256x256 icon sizes for better freedesktop integration
- Update tarball structure to use proper hicolor paths
- Update PKGBUILD to install all icon sizes
- Improve AUR package description
2026-01-12 17:27:42 -06:00
vicrodh 535f8c0bdd Update PKGBUILD with correct SHA256 for v1.0.0 release 2026-01-12 17:11:54 -06:00
vicrodh 7fce220799 build: add tarball artifact for AUR package 2026-01-12 16:11:09 -06:00
vicrodh 73d2bd114a feat(ui): show now-playing indicator in album and playlist rows 2026-01-12 15:56:08 -06:00
vicrodh 7a142b8d3e fix(ui): refresh sidebar playlist visibility 2026-01-12 15:39:08 -06:00
vicrodh 78ff72e58a fix(dlna): use device-described control URLs 2026-01-12 14:33:07 -06:00
vicrodh 0acfb5343b fix(cast): keep Chromecast session alive 2026-01-12 14:26:12 -06:00
vicrodh 7287da5b27 docs: update README and add AUR automation
- Add installation instructions (AUR, Flatpak, AppImage)
- Document all API keys (Last.fm, Discogs, Spotify, Tidal)
- Add playlist import feature documentation
- Update project structure
- Add PKGBUILD for qbz-bin AUR package
- Add workflow to auto-update AUR on release
- Update .env.example with Spotify/Tidal variables
2026-01-12 14:23:16 -06:00
vicrodh 1b6c895f62 fix(cast): route playback controls to cast devices 2026-01-12 14:14:32 -06:00
vicrodh 39f6907fc1 fix(cast): use target-local IP for media server 2026-01-12 13:56:33 -06:00
vicrodh 39acb0b59e fix(flatpak): use GNOME SDK 48 with manual Node/Rust install
- Switch to GNOME SDK 48 which includes webkit2gtk-4.1
- Install Node.js 20 LTS directly from tarball (no SDK extension needed)
- Install Rust via rustup for latest stable version
- Add flatpak build directories to .gitignore
2026-01-12 13:21:28 -06:00
vicrodh c762e91437 fix(player): avoid symphonia track borrow 2026-01-12 13:14:10 -06:00
vicrodh be28ab1396 fix(library): allow local artwork paths 2026-01-12 13:05:04 -06:00
vicrodh 3f13212978 fix(player): decode alac via symphonia 2026-01-12 13:04:45 -06:00
vicrodh 0c456d4ae3 fix(player): avoid moved mp4 hint 2026-01-12 12:44:37 -06:00
vicrodh 32ac732b7d fix(flatpak): use rustup to install latest Rust in SDK 23.08
SDK 24.08 doesn't have javascriptcoregtk-4.1 (uses webkit 6.0).
SDK 23.08 has Rust 1.81 which doesn't support edition2024.
Solution: use SDK 23.08 with webkit2gtk 4.1 but install Rust via rustup.
2026-01-12 12:40:03 -06:00
vicrodh 6adb979e3d fix(flatpak): upgrade to SDK 24.08 for Rust 2024 edition support
The zbus 5.x crate requires Rust edition2024 which needs Rust 1.85+.
SDK 23.08 only has Rust 1.81. Upgrade to 24.08 which has a newer Rust.
Also upgrade node extension from node20 to node22.
2026-01-12 12:31:41 -06:00
vicrodh 9bcc4e2888 fix(asset): allow home paths for artwork 2026-01-12 12:30:37 -06:00
vicrodh a6e7a0ca6a fix(player): add mp4 decode fallback 2026-01-12 12:30:23 -06:00
vicrodh 7f3055ca02 fix(flatpak): use cargo build instead of tauri CLI
The flatpak SDK's tauri-cli version doesn't support --bundles none.
Use cargo build --release directly to build only the binary.
2026-01-12 12:25:36 -06:00
vicrodh 520370eedc fix(flatpak): remove invalid --allow-network flag from workflow
Network access is now enabled via build-args in the flatpak manifest.
2026-01-12 12:19:18 -06:00
vicrodh 5383a5fcee fix(flatpak): enable network access during build
Add build-args with --share=network to allow npm ci to fetch packages
during flatpak build process.
2026-01-12 12:15:14 -06:00
vicrodh 4229c5385a fix(flatpak): enable network access for npm during build 2026-01-12 12:04:04 -06:00
vicrodh d2b219ea1d fix: CI workflow failures
Linux workflow:
- Remove xdg-portal feature from tauri-plugin-dialog to fix ashpd/zbus version incompatibility
- The ashpd 0.11.0 crate has breaking changes with zbus 5.x

Flatpak workflow:
- Use build-options.append-path instead of shell export to properly set PATH for SDK extensions
- This ensures npm/rust binaries are available in all build commands
2026-01-12 11:55:04 -06:00
vicrodh eefec87d91 feat: add API Keys settings section for user-provided credentials
- Add api_keys module with store for user-provided credentials (Spotify, Tidal, Discogs)
- Add commands to get/set/clear credentials for each provider
- Update providers to check user credentials first (priority: user > embedded > env)
- Add collapsible API Keys section to SettingsView
- Show status badges (Active, Custom, Not configured) for each provider
- Store user credentials in localStorage with backend sync
2026-01-12 11:52:18 -06:00
vicrodh 3e58803962 feat(build): embed API credentials at compile time
- Add option_env! for Discogs, Spotify, Tidal credentials
- Credentials embedded in binary during CI build
- Falls back to runtime env vars for development/user override
- Add secrets to GitHub Actions workflows for Linux and Flatpak builds
- Fix Linux build: add libasound2-dev, libssl-dev
- Fix Flatpak build: use --user flag for flatpak operations
2026-01-12 11:38:11 -06:00
vicrodh a591579c23 fix(ci): add libasound2-dev and libssl-dev for Linux build
alsa-sys crate requires ALSA development headers.
openssl-sys may need SSL headers too.
2026-01-12 11:24:09 -06:00
vicrodh 1b42ce0751 fix(ci): use --user flag for flatpak operations in CI
GitHub Actions runners don't allow system-wide flatpak operations.
Use --user flag for remote-add, install, and flatpak-builder.
2026-01-12 11:19:40 -06:00
vicrodh b8dac90c2a chore(release): sync version from tag 2026-01-12 11:14:15 -06:00
vicrodh 5eac9676de chore(packaging): add linux workflows and manifests 2026-01-12 11:14:15 -06:00
vicrodh ac35875351 docs: update roadmap and readme for casting completion
- Mark DLNA/Chromecast casting as complete in ROADMAP
- Note AirPlay as deferred (no Rust RAOP library)
- Add Network Casting section to README features
- Add cast/ module to project structure
- Update v1.0 launch status: all 6 items complete
2026-01-12 11:13:45 -06:00
vicrodh 7503ba4730 fix(settings): add scrollbar to SettingsView
- Add height: 100% and overflow-y: auto for scrolling
- Add consistent scrollbar styling
- Add proper padding for scrollbar area
2026-01-12 11:05:09 -06:00
vicrodh 21582315cc feat: wire save queue as playlist, disable AirPlay backend
- Add handleSaveQueueAsPlaylist() to collect queue track IDs
- Wire QueuePanel "Save as Playlist" button to open playlist modal
- Comment out AirPlay commands in lib.rs (RAOP not implemented)
- Comment out AirPlay state initialization
- Move documentation files to qbz-nix-docs/ directory

AirPlay research concluded no viable Rust RAOP library exists.
Feature deferred until custom implementation or library emerges.
See qbz-nix-docs/AIRPLAY_IMPLEMENTATION_STATUS.md for details.
2026-01-12 11:00:02 -06:00
vicrodh 9fda678b61 feat(artist): add live albums section 2026-01-12 10:52:00 -06:00
vicrodh 97193c8ce2 Hide AirPlay from UI until RAOP streaming is implemented
- Remove AirPlay tab from CastPicker (keep code for future)
- Disable AirPlay discovery/polling to reduce network traffic
- Add comprehensive technical brief at docs/AIRPLAY_IMPLEMENTATION_STATUS.md
  documenting what's complete, what's missing, and potential solutions

AirPlay discovery code is preserved and working - only the UI and
network calls are disabled. Can be re-enabled once RAOP sender is implemented.
2026-01-12 10:31:06 -06:00
vicrodh 1ac6d15551 Implement Chromecast frontend and DLNA AVTransport casting
Frontend:
- Add castStore for managing cast state (connect, disconnect, play, pause, etc)
- Update CastPicker to use castStore, show connected device banner with disconnect
- Wire isCastConnected to NowPlayingBar and ExpandedPlayer for visual indicator
- Modify playbackService to cast when connected instead of local playback

DLNA Backend:
- Implement full AVTransport SOAP client with:
  - SetAVTransportURI with DIDL-Lite metadata
  - Play, Pause, Stop, Seek actions
  - RenderingControl SetVolume
- Add dlna_play_track command that fetches stream, downloads audio, and serves via media server
- Share media server between Chromecast and DLNA
2026-01-12 10:11:09 -06:00
vicrodh a4c09041a4 Add ALSA error auto-recovery with startup retry
- Add stream_error flag to SharedState for tracking audio errors
- Add startup retry logic (5 attempts, 500ms delay) for audio init
- Auto-reinit audio device when sink creation fails 3+ times
- Handles PipeWire/ALSA not ready at app launch scenario
2026-01-12 09:42:40 -06:00
vicrodh d515ac905f refactor(miniplayer): remove pin button, shadow, make artwork clickable
- Remove pin button and related code (didn't work properly)
- Remove shadow from miniplayer frame
- Remove padding/border-radius for cleaner look
- Make artwork clickable (for future view mode switching)
- Move drag handler to top-section, artwork has pointer cursor
2026-01-12 09:30:04 -06:00
vicrodh e4483b4afa fix(session): fetch track details on restore for album/artist links
- Fetch full track info from Qobuz API when restoring session
- Populate albumId and artistId for working album/artist links
- Show correct quality badge (bitDepth/sampleRate) instead of placeholder
- Fallback to cached data if API call fails
2026-01-12 09:16:16 -06:00
vicrodh 2c40769c7d fix(miniplayer): size race condition and system title bar on restore
- Add 50ms delay after setMinSize before setSize to prevent race condition
- Remove setDecorations(true) on restore - app uses custom title bar (CSD)
- Keep decorations: false throughout miniplayer mode transitions
2026-01-12 09:09:41 -06:00
vicrodh e93144e5ef feat(toast): buffering toast with shimmer effect, persistent until loaded
- Add 'buffering' toast type that doesn't auto-hide
- Add shimmer animation to "Buffering" text
- Add spinning loader icon for buffering state
- Toast shows "Buffering... [track name]" format
- Dismiss buffering toast when track loads or on error
- Remove callback pattern, use toastStore directly in services

fix(artwork): show empty placeholder when no artwork available

- NowPlayingBar shows empty placeholder instead of Play icon
- Miniplayer shows empty placeholder instead of Play icon
- Prevents showing incorrect CD placeholder on session restore
2026-01-12 09:06:58 -06:00
vicrodh 434f8d8a67 refactor(miniplayer): new layout matching user mockup
- Top section: artwork (square) + track info with restore button
- Track info shows "Artist — Album" format
- Full-width seek bar in middle
- Bottom: media controls left, window controls right (queue, pin)
2026-01-12 08:59:50 -06:00
vicrodh 5ebbcaca0b fix(miniplayer): restore button, resizable window, smaller cover art
- Move drag handler to artwork-section and track-info only, not parent
- Buttons in window-controls and controls-row now receive clicks
- Enable window resizing in miniplayer mode
- Reduce cover art width from 180px to 110px (~60% of original)
2026-01-12 08:49:53 -06:00
vicrodh 0aeb4fbbcc fix: MiniPlayer size 400x200, queue state null check, UI adjustments
- Changed dimensions to 400x200
- Reduced shadow area padding from 8px to 4px
- Added 6px margin around album art
- Fixed TypeError on qState.tracks.length with null checks
- Increased font sizes and control button sizes for larger window
2026-01-12 08:45:57 -06:00
vicrodh b186119221 fix: MiniPlayer size - setMinSize before setSize to bypass 800x600 minimum
- Added core:window:allow-set-min-size permission
- Call setMinSize(300x140) before setSize to allow smaller window
- Restore original minSize (800x600) when exiting miniplayer
- Added more console logs for debugging
2026-01-12 08:40:30 -06:00
vicrodh dc2c4237e6 fix: MiniPlayer button clicks, 300px width, 8px margin, transparency
- Stop event propagation on all buttons to prevent drag capture
- Reduce window size to 300x140px
- Increase margin to 8px
- Enable window transparency in tauri.conf.json
- Compact UI for smaller size (smaller artwork, tighter controls)
2026-01-12 08:36:01 -06:00
vicrodh 2278d9b90e fix: MiniPlayer restore using localStorage and add 4px margin frame
- Use localStorage to persist original window state across navigation
- Add 4px margin frame around the player with rounded corners
- Darker background (#0f0f12) visible in the margin
- Box shadow for depth effect
2026-01-12 08:31:22 -06:00
vicrodh 0146852870 fix: MiniPlayer layout background color 2026-01-12 08:19:41 -06:00
vicrodh 86af410ab0 fix: MiniPlayer restore button, seekbar updates, and UI improvements
- Removed isMiniplayerMode guards that prevented restore
- Added startPolling/stopPolling for seekbar to update properly
- Removed border-radius to fix white corners issue
- Added queue button with track count badge
- Simplified CSS to solid background color
2026-01-12 08:19:27 -06:00
vicrodh 645fe8bb4e fix: Add missing window permissions for MiniPlayer resize operations 2026-01-12 07:51:42 -06:00
vicrodh 6d41741f76 feat: Redesign MiniPlayer to replace main window temporarily
- MiniPlayer now resizes the main window instead of creating a separate floating window
- Cider-inspired UI with large album art, track info, full playback controls
- Progress bar with current/remaining time display
- Shuffle, repeat, volume controls integrated
- Pin/restore buttons to control always-on-top and return to main view
- Fixed tray icon to use transparent PNG from static/icons
2026-01-12 07:28:14 -06:00
vicrodh 0a3ced23bf fix: add webview permissions for MiniPlayer window creation 2026-01-12 07:19:22 -06:00
vicrodh db1baa53ac docs: mark MiniPlayer as completed 2026-01-12 02:26:57 -06:00
vicrodh 79b030f8ee feat: add MiniPlayer floating window
- Create miniplayerService.ts for window management
- Add /miniplayer route with compact player UI
- Sync playback state from main window via events
- MiniPlayer features:
  - Draggable window (decorations disabled)
  - Always-on-top toggle (pin button)
  - Album art, track title, artist
  - Play/Pause, Next, Previous controls
  - Progress bar
  - Close button (hides window)
- Add PictureInPicture2 button to NowPlayingBar
- State synced via emitTo('miniplayer', ...) events
2026-01-12 02:26:29 -06:00
vicrodh 3d56053d58 docs: mark tray icon as completed 2026-01-12 02:08:14 -06:00
vicrodh 06fa565d84 feat: add system tray icon with playback controls
- Add tray-icon feature to Tauri dependencies
- Create tray.rs module with full tray implementation
- Tray menu: Play/Pause, Next, Previous, Show/Hide, Quit
- Left-click toggles window visibility
- Double-click always shows and focuses window
- Right-click shows context menu
- Frontend listens for tray:play_pause, tray:next, tray:previous events
- Tray icon uses app default icon with "QBZ - Music Player" tooltip
2026-01-12 02:07:51 -06:00
vicrodh 6c8f4298d6 docs: mark session persistence as completed 2026-01-12 02:01:39 -06:00
vicrodh fb0bd2b9cd fix: reliable session persistence during playback
- Enable debouncedSavePosition() during playback state updates
  (saves position every 5 seconds while playing)
- Flush position save immediately when pausing
- Add periodic full session save every 30 seconds during playback
- Persist volume changes to session immediately
- Persist shuffle/repeat mode changes to session immediately

This fixes the race condition where async saves in beforeunload
wouldn't complete before app close. Now we save frequently enough
that the worst case is losing only 5-30 seconds of progress.
2026-01-12 02:01:09 -06:00
vicrodh c43867d403 feat: cross-platform audio device listing and Mac Easter egg
- Add conditional compilation for get_pipewire_sinks():
  - Linux: Uses pactl to get PipeWire/PulseAudio sinks with volume info
  - macOS/Windows: Uses cpal to enumerate audio devices (no volume)
- AboutModal: Detect platform and show macOS or Linux label
- Easter egg: Tux penguin is 64px on Mac (asserts dominance)
2026-01-12 01:25:59 -06:00
vicrodh 8257e8866b feat: platform-specific dialog plugin (xdg-portal on Linux only) 2026-01-12 01:22:44 -06:00
vicrodh a6960769e6 docs: update roadmap - playlist management complete, ML suggestions removed 2026-01-12 01:03:15 -06:00
vicrodh ccdebfbbce fix(artist): remove top gap for jump nav 2026-01-12 00:57:25 -06:00
vicrodh 95bae2e036 feat(artist): restyle jump nav 2026-01-12 00:50:25 -06:00
vicrodh 0e682e9ca6 feat(artist): add jump-to anchors 2026-01-12 00:45:17 -06:00
vicrodh 19028ab232 feat(artist): enhance artist view sections 2026-01-12 00:37:03 -06:00
vicrodh c7cd09f3ec feat(artist): expand artist models for new sections 2026-01-12 00:36:57 -06:00
vicrodh 4e2491a9a6 feat(artist): add artist detail and similar endpoints 2026-01-12 00:36:52 -06:00
vicrodh 74f659e1bf feat(collage): implement classic 2x2 grid layout instead of overlap 2026-01-12 00:29:12 -06:00
vicrodh 6748842a82 fix(collage): correct Svelte 5 derived syntax 2026-01-12 00:26:45 -06:00
vicrodh 57591ca1d7 fix(collage): use CSS classes instead of attribute selectors for count 2026-01-12 00:21:19 -06:00
vicrodh ae39399a45 refactor: remove ML suggestions, fix collage layout
- Remove suggested tracks feature (no similarity algorithm)
- Fix collage to show 3-4 covers properly in square format
- Covers now fill full height, cropped on sides as needed
2026-01-12 00:09:32 -06:00
vicrodh c53a86e317 fix(collage): square container with properly sized overlapping covers 2026-01-12 00:06:53 -06:00
vicrodh db39173467 fix(collage): enforce 1:1 aspect ratio for playlist artwork 2026-01-12 00:04:29 -06:00
vicrodh 4949f89b46 feat(playlist-manager): improved grid layout and search
- Fixed grid card layout with header row (drag handle left, edit right)
- Fixed 180px card width with 160px artwork
- Added playlist search bar for both list and grid views
- Replaced hide/show button with edit button (opens PlaylistModal)
- Clean separation of clickable content area
2026-01-11 23:55:57 -06:00