Commit Graph
439 Commits
Author SHA1 Message Date
vicrodh d4716af0d2 feat(library): allow mp3 in local library 2026-01-14 01:47:34 -06:00
vicrodh 48c7649609 fix(queue): enforce play-next insertion at queue head 2026-01-14 01:44:01 -06:00
vicrodh c188b09a4d feat(library): improve artwork discovery and disc inference 2026-01-13 23:23:06 -06:00
vicrodh 72d265e086 fix: use std::fs::read instead of Image::from_path 2026-01-13 22:24:28 -06:00
vicrodh 6c7b42973c fix(flatpak): add tray icon and MPRIS permissions
- Add --filesystem=xdg-run/tray-icon:create for tray icon visibility
- Add --own-name=org.mpris.MediaPlayer2.qbz_nix for MPRIS registration
- Install additional icon sizes (32x32, symbolic)
- Add Flatpak detection to load icon from file path
2026-01-13 22:14:53 -06:00
vicrodh e6e86c29f7 chore(release): bump version to 1.1.2 2026-01-13 18:05:15 -06:00
vicrodh b3eacf7113 fix(rodio): avoid fixed ALSA buffer size 2026-01-13 17:56:30 -06:00
vicrodh a86dc5bcba fix: restore playback buffering and mpris controls 2026-01-13 15:06:49 -06:00
vicrodh 3e3cc4746d chore(release): bump version to 1.1.0 2026-01-13 12:06:11 -06:00
vicrodh e58b2aa9b4 fix(library): migrate album group index safely 2026-01-13 10:41:47 -06:00
vicrodh cdf55e1d34 fix(library): dedupe local tracks and propagate artwork 2026-01-13 10:31:12 -06:00
vicrodh b22dd9e7e4 feat(library): group multi-disc albums by folder 2026-01-13 10:19:12 -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 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 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 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 39f6907fc1 fix(cast): use target-local IP for media server 2026-01-12 13:56:33 -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 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 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 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 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