diff --git a/.changes/playback-embedded-mpv-seek-steps.md b/.changes/playback-embedded-mpv-seek-steps.md new file mode 100644 index 000000000..d8dd4bb7e --- /dev/null +++ b/.changes/playback-embedded-mpv-seek-steps.md @@ -0,0 +1,10 @@ +--- +type: fix +area: playback +--- + +Arrow keys and the ±10 s buttons in the Embedded MPV player now move by their +full step every time. Pressing an arrow repeatedly, or holding it, used to +advance only about a second per press because each step was computed from a +stale position; steps are now relative seeks executed by mpv itself, so rapid +presses add up. diff --git a/AGENTS.md b/AGENTS.md index ba683bc87..dc8d0321c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -289,6 +289,16 @@ Key files: commands are cancelled. Same-session IPC replies also yield to a broadcast snapshot received while the command was pending, preventing a successful recording acknowledgement from being rolled back by a stale reply. +- Embedded MPV seek steps (arrow keys, ±10 s buttons, `PlayerController.seekBy`) + go through the relative `seekEmbeddedMpvBy` IPC: every backend forwards the + delta as mpv `seek relative+exact` (addon export `seekBy`, helper + stdin command `seek-by`, Linux JSON IPC) and never advances the snapshot + position itself. Do not derive an absolute target from the renderer's + `positionSeconds`: it is floored to whole seconds, polled every 500 ms, and + a seek reply does not carry the new position, so rapid presses computed from + it collapse onto one target. Only the timeline scrub commits an absolute + `seek`. Contract: `docs/architecture/embedded-mpv-native.md` ("Resume And + Track Handling"). - DASH (`.mpd`) sources play through a lazily imported Shaka Player source engine (`libs/ui/playback/src/lib/shaka-engine/`) inside the HTML5 and ArtPlayer components; ClearKey keys come from KODIPROP-derived diff --git a/CLAUDE.md b/CLAUDE.md index 8b41b312b..02661c4aa 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1008,7 +1008,7 @@ app as a real argument, so it is not an option. API. Radio's `