Commit Graph

521 Commits

Author SHA1 Message Date
jeffvli 315d2c54c0 normalize playerbar config designs 2026-07-23 23:47:02 -07:00
Matt Van Horn 1ab0108654 fix: keep a seek control when the waveform fails to load (#2257)
The playerbar seek/progress bar could disappear entirely after switching
tracks, recoverable only by restarting the app. The waveform component
rendered the fallback `PlayerbarSeekSlider` only while `isLoading` was
true and cleared that flag on any wavesurfer `ready` event, with no
handling for a failed or superseded load: `wavesurfer.load()` had no
`.catch()` and there was no `error` listener, so a load failure left an
empty waveform canvas and no seek control.

Track an explicit `hasError` state and render the fallback slider whenever
the waveform `isLoading || hasError`, hiding the empty canvas in that case,
so a seek control is always present. Add an `error` listener and a
`.catch()` on `load()` that ignore `AbortError` (the expected result of a
rapid track switch) and surface only real failures. A per-load
`loadStarted` guard, together with the existing cleanup, ignores `ready`/
`error` events from a superseded load so they cannot clear the loading
state for the wrong track.

Closes #2193

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
2026-07-23 22:18:58 -07:00
jeffvli 207df236a3 support sidebar player in now playing route (#2134)
- add toggle to show/hide the queue in the sidebarplayer
2026-07-23 22:16:47 -07:00
jeffvli a0bae0ffb0 autodj fixes and enhancements (#2271)
- add setting to allow duplicates
- add setting to only prefer similar sogs
- fix autodj algorithm to match by the priority order instead of incorrectly grouping when limit not reached
2026-07-23 19:51:30 -07:00
jeffvli 390b231e06 fix web player resuming on queue modification (#2250)
- During queue edits, stream URL reloads briefly reported a bogus duration (~0.07s). The gapless handler treated that as near end-of-track and called .play() while the player was still paused
2026-07-21 00:29:20 -07:00
jeffvli cbf8037099 improve app logging
- consolidate electron-log and expand support-oriented logging
- consolidate log levels to info / trace only
- add system/server diagnostics exporter
2026-07-20 22:26:07 -07:00
jeffvli 749899cec0 fix inverted condition for progress scrobble after submission 2026-07-19 12:26:16 -07:00
jeffvli 235fb4d13f fix additional instances of JoinedArtists not truncating 2026-07-17 11:10:56 -07:00
Kevin d99fe8b8c6 feat: added playlist from queue creation (#2210)
* feat: added playlist from queue creation

- added functionality to create a playlist from queue
- prefilling is done as an extra function to be api agnostic since navidrome native api for example does not offer a parameter for filling a playlist with songs on creation

#2204

* fix: fixed wrong declaration
2026-07-16 22:54:42 -07:00
jeffvli ddc7f936a8 send timestamp update after Jellyfin scrobble submission 2026-07-16 13:41:22 -07:00
jeffvli e951fa696b fix: exclude Jellyfin stop event on song change (#2243) 2026-07-16 13:30:16 -07:00
Simon Slamka ddd45ad5ba feat(player): set right ctrl vol max to mpv's vol max if player==local (#2198) 2026-07-15 22:43:43 -07:00
Damien Erambert 5e79e385d9 Support using alt+click on prev/next to jump to previous/next album in queue (#2220) 2026-07-15 22:27:40 -07:00
York 4de9b21ff7 fix: sleep timer countdown (#2233) (#2235) 2026-07-15 21:45:10 -07:00
Anbar Saleem 96b71ad0be show system default audio device in device select when unset (#2216)
An unset audio device id means "follow the system default" (setSinkId is
skipped and mpv uses audio-device=auto), but the Audio device select in
the player settings popover and the playback settings page rendered
blank in that state. Make both selects controlled and fall back to the
enumerated default entry (browser 'default' / mpv 'auto') so the device
actually in use is always displayed. The stored setting stays unset, so
playback keeps following the OS default until a device is explicitly
chosen; clearing the select returns to the default entry instead of
going blank.
2026-07-14 19:27:03 -07:00
Kendall Garner 17dba85baf fix(pitch): % -> x 2026-07-12 08:38:52 -07:00
jeffvli bafc14b55a fix mpv playback resume on queue end / stop 2026-07-11 18:51:42 -07:00
jeffvli aea5a880ea reduce opacity of fullscreen player header when not hovered 2026-07-10 15:16:14 -07:00
Jeff 355b19c1cb Add support for OpenSubsonic enhanced lyrics (#2208) 2026-07-09 21:32:05 -07:00
mannansainidev 0c89fea1ea feat: add jukebox player engine for server-side playback (#2109)
* feat: add jukebox player engine for server-side playback

---------

Co-authored-by: jeffvli <jeffvictorli@gmail.com>
2026-07-09 21:29:22 -07:00
Logan Rupe dd136f91e6 feat(player): right-click volume icon to switch audio output device (#2189)
* feat(player): add right-click audio output device menu to volume icon

Right-clicking the volume/speaker icon in the player bar now opens a
context menu listing available audio output devices, with the active
device checkmarked and a System default reset option.

Selecting a device writes to the existing audioDeviceId (web) or
mpvAudioDeviceId (mpv) playback settings, so the choice is applied live
and persisted across restarts via the settings store. Unlike the
settings-page selector, the menu is not disabled during playback.

* refactor(player): drop redundant audio menu label, document wrapper div

Address review feedback: remove the self-explanatory ContextMenu.Label
from the audio output menu, and add a comment explaining why the volume
icon is wrapped in a div (Mantine Tooltip does not forward Radix's
asChild onContextMenu/ref to the button).
2026-07-09 21:11:10 -07:00
vimae c64807cf94 feat: musical speed controls (#2191)
* feat: musical speed controls
2026-07-09 21:06:46 -07:00
jeffvli e3c2605e1d trigger stop event on queue end 2026-07-09 20:51:19 -07:00
Maurits 2ad4c58dcd fix: startup resume-seek cancelled when shuffle is enabled (#2203)
applyStartupSeek() compared the armed target song against
getQueue().items[player.index], but player.index is a position in the
shuffled order while getQueue().items is always the default order. With
shuffle enabled the lookup resolves to the wrong song, the uniqueId
check fails, and the startup resume-seek is silently cancelled — the
track then plays from 0:00 and the progress poller overwrites the
persisted timestamp.

Use getCurrentSong() instead, which maps the index through
queue.shuffled, matching how the seek target is armed.

Fixes #2202

Co-authored-by: Maurits <WhoCarrot@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 01:10:36 +00:00
jeffvli 37ada07ee2 add "stopped" playback state and event handlers 2026-06-29 20:23:46 -07:00
Ryan Kupka 26eea7422d fix: recover mpv playback after the OS resumes from sleep (#2172)
mpv/ffmpeg had no network-level timeout or reconnect options, so a
network stream left open across a system sleep would block forever on
the now-dead TCP connection instead of failing or reconnecting. Since
Node-MPV's IPC commands only resolve when mpv replies, a wedged mpv
process also made quit()/restart hang indefinitely, so the only way
out was to kill the whole app.

- Add --network-timeout and ffmpeg reconnect options to mpv's default
  parameters so a stalled stream fails fast instead of hanging.
- Make the quit() helper resilient to an unresponsive mpv process by
  racing it against a timeout and force-killing as a fallback.
- Listen for Electron's powerMonitor 'resume' event and tell the
  renderer to reload mpv, so playback recovers automatically instead
  of requiring a manual app restart.
2026-06-26 19:18:27 -07:00
Norman 5ddbfcbfee Highlight the playlist in the left panel on play (#2025)
* Fixed bad smart playlist field s

* first try to add playlist highlight

* Simplified calls

* Now works for grids too.

* Derive the playlist highlight from the currently-playing track's origin instead of a stale global field.

* addressed comments
2026-06-24 03:18:02 +00:00
jeffvli 417365f091 fix replaygain volume jump (#1576) 2026-06-21 18:49:43 -07:00
jeffvli 61cc87e0b7 refactor song path replacement
- path replacement during runtime instead of during API normalization
- fix Navidrome API path not appending libraryPath which caused inconsistency between ND and Subsonic paths
2026-06-19 22:02:25 -07:00
keebsxd 2107d1c928 Added Graphic EQ and Compressor (#1972)
* Adding Graphic Eq and Compressor with presets
2026-06-16 00:38:40 -07:00
jeffvli 46b94a83f1 fix reportPlayback event chain (#2131)
- properly send stopped event on song change
- properly send both starting and playing evento n song change instead of only starting
2026-06-06 18:41:59 -07:00
jeffvli 0e24eeeb1c only show queue save toast on explicit request (#2090) 2026-06-03 00:28:12 -07:00
Overdrive deb69ef8ea Feature: Add sleep timer for end of current album (#2081)
* Add logic for stopping playback at end of current album, unless in shuffle mode.
2026-06-02 23:22:56 -07:00
jeffvli 7243ed7f15 fix timestamp restore when song switched before playback start (#2094) 2026-05-31 23:09:33 -07:00
Kendall Garner 6aab8d4121 fix(scrobble): use proper pause/unpause for seek, use ms for subsonic 2026-05-31 21:13:11 -07:00
jeffvli 9d53c53c54 fix queue end handling to prevent repeat 2026-05-28 02:06:07 -07:00
jeffvli 1f5907716f disable interval-based timeupdate scrobbles 2026-05-28 00:59:30 -07:00
jeffvli 1aa6b88cfa allow transcode on waveform streamURL (#2060) 2026-05-26 20:35:23 -07:00
jeffvli 329d028edd add open delay to scrobble status HoverCard 2026-05-26 20:05:01 -07:00
jeffvli 239ef4a4ec add album mode for autodj
- add selection modes: similar, random
- add autodj settings in playerbar popover
2026-05-25 19:23:37 -07:00
jeffvli 61c6036d41 cap scrobble status at max values 2026-05-25 13:26:12 -07:00
jeffvli 95ae474cc6 fix playerbar slider styles
- left / right values should be consistent width
2026-05-25 13:26:12 -07:00
jeffvli 504bbeed91 handle positional scrobbles for OS 2026-05-25 13:26:11 -07:00
Kendall Garner 7befd70e21 Apply additional security recommendations (#2050)
* enable sandbox

* enable CSP (umami tentatively works?) and reduce amount of ipc APIs exposed

* remove csp from index
2026-05-22 22:09:22 -07:00
jeffvli 755f0aab9d fix mediasession breaking on player repeat (#1472)
- switch to single web player instance for loop instead of dual-player
- this fixes the issue, but does have a breaking change if using the crossfade player
2026-05-22 01:32:22 -07:00
Tiago Simionato 8f40894926 feat: persist player timestamp (#2043)
* feat: persist player timestamp
2026-05-21 00:16:46 -07:00
jeffvli ffe59b2c78 refactor scrobbling to use duration instead of progress (#2010)
- add scrobble status debug and indicator
- add force / reset scrobble
2026-05-12 22:04:46 -07:00
Jeff e2a1d813a9 Use proper casing for i18n locales (#1998) 2026-05-11 19:42:07 -07:00
jeffvli 323130a877 add toggle for app-suspension for powersave block (#1992) 2026-05-01 21:24:45 -07:00
jeffvli 3b2aab74ac enforce web player seek by seconds when less than 1 (#1993) 2026-05-01 21:12:20 -07:00