Commit Graph
100 Commits
Author SHA1 Message Date
vicrodh 3e3cc4746d chore(release): bump version to 1.1.0 2026-01-13 12:06:11 -06:00
vicrodh e2625477ab copy(about): adjust signature line 2026-01-13 11:51:06 -06:00
vicrodh df272c3cbf fix(about): sync version with app and release 2026-01-13 11:50:10 -06:00
vicrodh 66110857a9 feat(search): autofocus input on view load 2026-01-13 11:38:24 -06:00
vicrodh 1b9a8bd0af fix(ui): group local tracks by album and pin library section 2026-01-13 11:35:00 -06:00
vicrodh 3b0b234523 feat(library): add disc sections to track grouping 2026-01-13 11:18:49 -06:00
vicrodh ed349b2304 fix(library): move album consts to block root 2026-01-13 11:16:03 -06:00
vicrodh 0a5e5e47eb fix(library): move album section consts 2026-01-13 11:13:18 -06:00
vicrodh c2c9e8f867 style(ui): cap headings to playlist title size 2026-01-13 11:00:58 -06:00
vicrodh 0eec21f5ee style(library): align album list title sizing 2026-01-13 10:53:42 -06:00
vicrodh 0ae8289074 feat(library): add disc headers and sort album tracks 2026-01-13 10:50:30 -06:00
vicrodh e58b2aa9b4 fix(library): migrate album group index safely 2026-01-13 10:41:47 -06:00
vicrodh 84e19c0a02 fix(library): use tauri file src for local artwork 2026-01-13 10:31:31 -06:00
vicrodh cdf55e1d34 fix(library): dedupe local tracks and propagate artwork 2026-01-13 10:31:12 -06:00
vicrodh 8c9779ede1 feat(library): add track search, grouping, and index 2026-01-13 10:24:44 -06:00
vicrodh f77b7c5052 fix(library): use album group key for album tracks 2026-01-13 10:19:32 -06:00
vicrodh b22dd9e7e4 feat(library): group multi-disc albums by folder 2026-01-13 10:19:12 -06:00
vicrodh 8d5940fc44 feat(library): add album grouping and alphabet index 2026-01-13 09:57:18 -06:00
vicrodh c6ff07c6f0 feat(library): add album list view and search 2026-01-13 09:41:21 -06:00
vicrodh 78170b4c88 fix(tauri): allow local library paths in asset scope 2026-01-13 09:41:01 -06:00
vicrodh 3bb6ab1264 fix(library): cache folder artwork and apply to cue tracks 2026-01-13 09:40:45 -06:00
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